Перейти к содержанию

CI/CD — настройка GitHub Actions для микросервисов

Что это даёт

Push в services/auth-svc/** → автоматически: 1. Detect: «изменился auth-svc» 2. Build: Docker-образ → push в ghcr.io/<owner>/arkhyz-auth-svc:latest 3. Deploy: SSH в прод → git pull && docker compose up -d --no-deps --build auth-svc 4. Smoke test: curl /health

Остальные 6 сервисов и монолит НЕ трогаются. Время от push до прода — ~2 минуты.

Если поменялся packages/arkhyz-shared/ — пересобираются ВСЕ сервисы (зависят от него).


Шаг 1 — добавить secrets в GitHub

Settings → Secrets and variables → Actions → New repository secret:

Имя Значение Описание
PROD_HOST arkhyz.example.com или IP Куда ssh
PROD_USER root Пользователь SSH
PROD_SSH_KEY приватный SSH-ключ Авторизация без пароля

GITHUB_TOKEN подставляется автоматически — для пуша образов в ghcr.io.


Шаг 2 — подготовить SSH-ключ

На локальной машине:

# Сгенерировать новую пару (НЕ перезаписывая существующие)
ssh-keygen -t ed25519 -f ~/.ssh/arkhyz_ci -N ""

# Скопировать публичную часть на прод
ssh-copy-id -i ~/.ssh/arkhyz_ci.pub root@arkhyz-prod

# Приватную часть → в GitHub Secret PROD_SSH_KEY
cat ~/.ssh/arkhyz_ci


Шаг 3 — разрешить ghcr.io пакеты

Settings → Packages → public (или private если оплачено). Образы будут публиковаться как ghcr.io/<owner>/arkhyz-<svc>:latest.


Триггеры workflow'ов

services.yml — микросервисы

Срабатывает на: - push в main, изменивший services/**, packages/arkhyz-shared/**, infra/compose/docker-compose.services.yml или сам workflow - ручной запуск через GitHub UI («Run workflow» → выбрать конкретный сервис или all)

frontends.yml — фронты

Срабатывает на push в tourist-app/** или admin-web-v4/**.

Монолит (hotel_api_v2)

Отдельного workflow нет — пока правится в api-admin/**, деплой вручную:

ssh root@prod "cd /root/arkhyz-admin-main && git pull && \
              docker compose -f docker-compose.yml -f docker-compose.prod.yml \
                            up -d --no-deps --build hotel_api_v2"

(когда монолит совсем удалится — этот раздел можно вынести)


Локальный тест workflow без push

Установить act:

# Симулировать push с фильтром по services/auth-svc
act push -W .github/workflows/services.yml --eventpath <(echo '{"head_commit":{"modified":["services/auth-svc/app/main.py"]}}')


Откат (rollback)

Каждый билд тегается двумя тегами: :latest и :<sha>. Чтобы откатить:

ssh root@prod
cd /root/arkhyz-admin-main

# Указать старый SHA
docker pull ghcr.io/<owner>/arkhyz-auth-svc:<old-sha>
docker tag  ghcr.io/<owner>/arkhyz-auth-svc:<old-sha> arkhyz-auth-svc:latest

# Перезапустить
docker compose -f docker-compose.yml -f docker-compose.prod.yml \
              -f infra/compose/docker-compose.services.yml \
              up -d --no-deps auth-svc

Будущие улучшения (когда понадобятся)

  • [ ] Staging-окружение (отдельный compose + secret STAGE_HOST)
  • [ ] Slack/Telegram уведомления о деплое
  • [ ] Canary-релизы через label-роутинг в Caddy
  • [ ] Prometheus + Grafana для метрик per-service
  • [ ] Автоматический rollback при failed health check