CI/CD своими руками: настройка пайплайна на VPS с GitHub Actions

ГлавнаяCI/CD своими руками: настройка пайплайна на VPS с GitHub Actions

Содержание

Сколько раз у меня было так: поправила пару строк кода, залила на GitHub — и сижу, руками деплою. Сначала git pull, потом пересобрать образ, потом перезапустить контейнер. И каждый раз ловила себя на мысли: почему я всё ещё делаю это вручную?

В один момент я села и настроила себе нормальный CI/CD с GitHub Actions и Docker — чтобы пуш в репозиторий автоматически обновлял приложение на моём сервере. Ни панелей, ни Jenkins — только GitHub и VPS. Ниже расскажу, как я это сделала — простым языком, без модных фреймворков.


Почему вообще GitHub Actions?

Я пробовала GitLab CI, Travis, Circle — всё классно, но для большинства задач мне хватает GitHub. У меня почти все репы там, и если можно построить GitHub pipeline прямо внутри репозитория — зачем тянуть что-то ещё?

Плюсы GitHub CI/CD лично для меня:

  • не надо настраивать отдельный CI-сервер;
  • всё в одном месте — и код, и пайплайн;
  • красиво, удобно, и работает по SSH;
  • бесплатно, если не используешь большие runner’ы.

Что в итоге я хотела от CI/CD

У меня простое приложение на Node.js, которое крутится в Docker-контейнере на VPS от CloudVPS.by. Цель — чтобы при пуше в ветку main:

  1. Приложение пересобиралось;
  2. Заливался образ на сервер;
  3. Контейнер перезапускался.

Готовим VPS к приёму CI/CD

У меня обычный VPS на Ubuntu 22.04. Сначала установила Docker и Docker Compose:

apt update && apt install docker.io docker-compose -y
systemctl enable docker

Создала пользователя deploy, дала ему SSH-ключи и добавила его в группу docker.

usermod -aG docker deploy

Дальше — стандартно: подняла docker-compose.yml для проекта и вручную проверила, что он запускается.


Добавляем GitHub Actions

Теперь переходим к GitHub CI/CD. Внутри репозитория создаю папку:

.github/workflows/deploy.yml

Вот мой минимальный deploy.yml (и он реально рабочий):

name: Deploy to VPS

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Deploy via SSH
        uses: appleboy/ssh-action@v0.1.6
        with:
          host: ${{ secrets.VPS_HOST }}
          username: ${{ secrets.VPS_USER }}
          key: ${{ secrets.VPS_KEY }}
          script: |
            cd /home/deploy/my-app
            git pull
            docker compose down
            docker compose up -d --build

Безопасность: как храню доступы

Все ключи и IP я добавляю через GitHub Secrets. Зачем палить данные в конфиге?

  • VPS_HOST — IP моего сервера;
  • VPS_USER — имя пользователя (deploy);
  • VPS_KEY — приватный SSH-ключ.

Ключ генерирую через ssh-keygen, добавляю паблик на сервер, а приватный — как секрет.


Как это работает в реальности

  • Пишу код → пуш в main;
  • Через пару минут на сервере: git pull, docker-compose up -d и всё работает;
  • Если где-то косяк — вижу логи прямо на GitHub.

У меня сейчас так крутятся два pet-проекта и клиентский лендинг. Всё обновляется, даже когда я в пути, с телефона заливаю коммит — и CI/CD сам всё решает.


Пару советов от себя

  • Используйте --build, чтобы Docker собирал свежие образы.
  • Разделите логику на staging и production — можно по разным веткам.
  • Проверяйте, что в .dockerignore нет важных файлов — у меня так однажды ушёл .env.

GitHub CI/CD с VPS и Docker — это не только для больших команд. Даже если вы работаете в одиночку, это экономит нервы и время. А если у вас есть VPS (у меня он на CloudVPS.by) — можно сделать себе удобную dev-to-prod-площадку без костылей.

👉 Попробуйте — настройка займёт вечер, а сэкономит десятки ценных бумаг.