Сколько раз у меня было так: поправила пару строк кода, залила на 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:
- Приложение пересобиралось;
- Заливался образ на сервер;
- Контейнер перезапускался.
Готовим 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-площадку без костылей.
👉 Попробуйте — настройка займёт вечер, а сэкономит десятки ценных бумаг.