Как я настраивала CI/CD на VPS с GitHub Actions и Docker

ГлавнаяКак я настраивала CI/CD на VPS с GitHub Actions и Docker

Содержание

Если вы всё ещё вручную заходите на сервер, делаете git pull, перезапускаете контейнер и надеетесь, что всё заработает — я вас понимаю. Я тоже так жила. А потом однажды ночью (не шучу) решила: хватит. Хочу пайплайн CI/CD, который сам деплоит, пока я сплю.

В этой статье расскажу, как я настроила CI/CD с GitHub на VPS с Docker. Никаких сложных терминов, Jenkins и «а вот тут вам надо поднять раннер». Только GitHub CI/CD, ssh-доступ и немного YAML.


Почему GitHub Actions, а не что-то модное?

Ответ простой: потому что он уже есть. Я и так всё храню на GitHub, зачем тащить что-то ещё?

GitHub pipelines работают прямо в репозитории, не надо ставить отдельный сервер. Подключила — и оно всё само: коммит — билд — деплой. Ну почти.

Что особенно нравится:

  • конфигурация рядом с кодом;
  • можно деплоить хоть на VPS, хоть на любую машину с SSH;
  • подходит для pet-проектов, фриланса, да и в команде работает.

Если коротко, CI/CD GitHub — это самый низкий порог входа в автоматизацию.


Что у меня было: минимальный стек, максимум боли

У меня — обычное Node.js-приложение в Docker. Сервер — VPS на CloudVPS.by, Ubuntu 22.04. Раньше деплой был такой: зайти по ssh → pull → пересобрать Docker → рестарт. И каждый раз — «ой, забыла env» или «а почему не обновилось».

Так продолжалось, пока я не настроила свой первый GitHub CI/CD pipeline.


Шаг 1. Готовим VPS к приёму кода

Устанавливаем Docker и docker-compose:

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

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

adduser deploy
usermod -aG docker deploy
su - deploy
ssh-keygen -t ed25519

Публичный ключ добавляем в GitHub (в Secrets). Приватный оставляем на сервере.


Шаг 2. Пишем GitHub pipeline

В корне репозитория создаём .github/workflows/deploy.yml. Внутри — самый обычный pipeline:

name: Deploy to VPS

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest

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

    - name: Deploy over 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/project
          git pull origin main
          docker compose down
          docker compose up -d --build

Никакой магии. Просто зашёл, обновил код, пересобрал, запустил.


Где брать переменные?

В настройках репозитория → Settings → Secrets → New repository secret.

Добавляю:

  • VPS_HOSTIP сервера,
  • VPS_USER — имя пользователя (deploy),
  • VPS_KEY — приватный ключ (без пароля, с ограничениями).

Так безопасно и всё работает через ssh.


Шаг 3. Проверка

Заливаю коммит в main. Смотрю на Actions. Через 1–2 минуты проект уже обновлён. Ни ручных телодвижений. Никаких «забыла docker restart». Просто пуш — и всё само.


Особенности и советы

  • Если не хотите, чтобы билд падал при ошибке, добавьте set -e в ssh-команду.
  • Делайте docker compose up -d --build, чтобы пересобирался свежий образ.
  • Разделите pipeline на build и deploy, если проект сложнее.
  • Не бойтесь YAML — он проще, чем кажется, особенно если копировать рабочие примеры.

CI/CD GitHub: не только для больших команд

Когда говорят «CI/CD», сразу кажется — это что-то для enterprise или команды в 10 человек. Нет. Это для тех, кто устал делать одно и то же руками. Даже для своего блога на WordPress можно сделать GitHub CI/CD, чтобы деплой шел автоматически.

Если вы до сих пор деплоите руками — я вас не виню, я тоже так делала. Но когда один раз настроишь нормальный CI/CD pipeline на GitHub — назад уже не хочется. Оно просто работает.

А с VPS от CloudVPS.by всё разворачивается за вечер. Я настроила — и теперь даже с телефона могу пушнуть код, и всё обновится само.

👉 Настройте свой пайплайн CI/CD. Пусть сервер работает за вас, а не наоборот.