- app/pipeline: протокол CIProvider, клиент Gitea Actions (прогон по head_sha, упавший шаг, лог джоба, ретраи), PipelineWatcher — опрос только при незавершённых push, сообщение о push обновляется CI ⏳ → ✅/❌ → CD 🚀/⛔, автору — отдельные уведомления - деплой сервисов — только после зелёного CI; старый push не откатывает сервис, который развернёт более новый; после рестарта бот продолжает с того же места - CI_PROVIDER=none — прежнее поведение (деплой сразу после push) - шаблон tgit-uploads: .gitea/workflows/check.yml; .gitea/ защищён от правок из бота - миграция 0002: старые push помечены skipped, чтобы не слать им «таймаут CI» - ADR-016, ARCHITECTURE §2.5/§5.2, README, DEPLOY, .env.example Refs #11 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.7 KiB
Деплой бота
CD — .gitea/workflows/deploy.yml (Gitea Actions, ADR-015): push в dev → окружение dev, push в main → prod.
Под капотом — infra/deploy/deploy.sh, тот же скрипт работает руками и для любого Docker-хоста.
Сервер (хост Vobot, 72.56.247.166)
| Что | Где |
|---|---|
| Пользователь | tgit-deploy (группа docker), ключ CI в ~/.ssh/authorized_keys |
| Окружение | /srv/tgit/<env>/ — .env (только здесь, 600), app/ (текущий релиз), app.old/ (предыдущий), REVISION |
| Контейнеры | Compose-проект tgit-<env>: tgit-<env>-bot-1, tgit-<env>-postgres-1; volumes pgdata, uploads |
| Telegram | с сервера напрямую недоступен → TELEGRAM_PROXY_URL (тот же прокси, что у meditron) |
| Репозиторий загрузок | временно ssh://git@gitea.24studbank.ru:2222/HSE/tgit-uploads.git, deploy key бота с записью |
| CI загрузок | Gitea Actions HSE/tgit-uploads (check.yml); боту в .env — CI_PROVIDER=gitea, CI_TOKEN (чтение репозитория загрузок). Без них деплой сервисов идёт сразу после push, без CI |
Секреты репозитория в Gitea (Settings → Actions → Secrets): DEPLOY_SSH_KEY (приватный ключ tgit-cd@gitea), DEPLOY_HOST (tgit-deploy@72.56.247.166).
Руками
DEPLOY_SSH_OPTS="-F /dev/null -i ~/.ssh/tgit_ci_deploy -o IdentitiesOnly=yes" infra/deploy/deploy.sh dev HEAD
Другой сервер: DEPLOY_HOST=user@host, на нём — Docker, пользователь в группе docker, /srv/tgit/<env>/.env.
Проверить
ssh tgit-deploy@72.56.247.166 'cat /srv/tgit/dev/REVISION; docker ps --filter name=tgit-dev; docker logs --tail 20 tgit-dev-bot-1'
Откат
Ошибка health при деплое печатает команду; руками:
ssh tgit-deploy@72.56.247.166
cd /srv/tgit/dev && rm -rf app && mv app.old app && cd app && docker compose -p tgit-dev up -d --build
Завести prod
Нужен отдельный токен бота (один токен — один процесс polling): создать бота у @BotFather →
/srv/tgit/prod/.env по образцу dev (TELEGRAM_BOT_TOKEN, ADMIN_IDS, POSTGRES_PASSWORD, GIT_UPLOADS_URL,
GIT_SSH_KEY_B64, TELEGRAM_PROXY_URL, LLM_PROVIDER, CI_PROVIDER, CI_TOKEN, RUNNER_*). Пока файла нет, деплой main пропускается.