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