Если вы всё ещё вручную заходите на сервер, делаете 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. Пусть сервер работает за вас, а не наоборот.