From 164f055c5e42e1a7b7ee7735969997f1fb000e4c Mon Sep 17 00:00:00 2001 From: Lacky1234union Date: Fri, 16 Oct 2026 00:23:20 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=B4=D0=B5=D0=BF=D0=BB=D0=BE=D0=B9=20?= =?UTF-8?q?(DEPLOY.md),=20ADR-015=20=E2=80=94=20CI/CD=20=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20Gitea=20Actions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs #12 Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 1 + docs/DECISIONS.md | 8 ++++++++ docs/dev/DEPLOY.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 docs/dev/DEPLOY.md diff --git a/CLAUDE.md b/CLAUDE.md index 507bbe8..3faeb4a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,6 +49,7 @@ Telegram-бот «git в телеграме» для команды (учебн | [`docs/dev/ISSUE_TEMPLATE.md`](docs/dev/ISSUE_TEMPLATE.md) | Шаблон тела issue | | [`docs/dev/GITEA_API.md`](docs/dev/GITEA_API.md) | Gitea API: issue, PR, зависимости, зеркало | | [`docs/dev/SOURCECRAFT_API.md`](docs/dev/SOURCECRAFT_API.md) | SourceCraft API: CI-прогоны, логи, секреты | +| [`docs/dev/DEPLOY.md`](docs/dev/DEPLOY.md) | **Деплой:** сервер, окружения dev/prod, руками, откат | --- diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 4e0b4f0..86136de 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -129,3 +129,11 @@ **Решение:** первый куб задачи `check` в `tgit-uploads` — `meta`: `echo "TGIT_COMMIT_SHA=$SOURCECRAFT_COMMIT_SHA"`. Бот читает его лог (`SourceCraftClient.run_commit_sha`) и сопоставляет прогон с пушем. **Альтернативы:** запускать CI из бота вручную (`POST /cicd/runs` с `head.commit`) — номер прогона известен сразу, но push-триггер пришлось бы убрать, и ручные пуши в репозиторий остались бы без CI; сопоставление по времени — ломается при параллельных пушах. **Последствия:** +1 короткий куб на прогон; куб `meta` нельзя удалять или переименовывать (он в `.sourcecraft/`, который бот защищает от правок); прогоны старше этого решения sha не имеют. + +## ADR-015: CI/CD бота — на Gitea Actions (как в Vobot) +**Дата:** 2026-10-16 · **Статус:** принято (меняет ADR-010 в части CI/CD бота) + +**Контекст:** SourceCraft отложен: ключ бота там не принимается, триггеры зависят от основной ветки, раннеры с очередью до минут. Гейт и деплой нужны сейчас. +**Решение:** CI (`.gitea/workflows/ci.yml`: ruff, mypy, миграции на Postgres, pytest) и CD (`.gitea/workflows/deploy.yml` → `infra/deploy/deploy.sh`) — на Gitea Actions, как у Vobot и meditron, на общих раннерах Gitea. Деплой — на хост Vobot, `dev`/`prod` по веткам, через пользователя `tgit-deploy`. Репозиторий загрузок на сервере — временно `HSE/tgit-uploads` в Gitea. +**Альтернативы:** ждать SourceCraft — блокирует проверку и демо. +**Последствия:** `.sourcecraft/ci.yaml` бота остаётся для будущего возврата; при возврате к SourceCraft меняются `GIT_UPLOADS_URL` и ключ, код не трогаем. На RF-сервере Telegram — только через прокси (`TELEGRAM_PROXY_URL`). diff --git a/docs/dev/DEPLOY.md b/docs/dev/DEPLOY.md new file mode 100644 index 0000000..cec1b90 --- /dev/null +++ b/docs/dev/DEPLOY.md @@ -0,0 +1,45 @@ +# Деплой бота + +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` (только здесь, 600), `app/` (текущий релиз), `app.old/` (предыдущий), `REVISION` | +| Контейнеры | Compose-проект `tgit-`: `tgit--bot-1`, `tgit--postgres-1`; volumes `pgdata`, `uploads` | +| Telegram | с сервера напрямую недоступен → `TELEGRAM_PROXY_URL` (тот же прокси, что у meditron) | +| Репозиторий загрузок | временно `ssh://git@gitea.24studbank.ru:2222/HSE/tgit-uploads.git`, deploy key бота с записью | + +Секреты репозитория в Gitea (Settings → Actions → Secrets): `DEPLOY_SSH_KEY` (приватный ключ `tgit-cd@gitea`), `DEPLOY_HOST` (`tgit-deploy@72.56.247.166`). + +## Руками + +```bash +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`. + +## Проверить + +```bash +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 при деплое печатает команду; руками: + +```bash +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`). Пока файла нет, деплой `main` пропускается.