Как я настраивала 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_HOST
    — IP сервера,
  • 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. Пусть сервер работает за вас, а не наоборот.