Как настроить CI/CD на VPS с GitHub Actions и Docker

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

Содержание

Сколько раз у меня было так: поправила пару строк кода, залила на 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-площадку без костылей.

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