Add production deployment guide and harden compose for it
Some checks failed
CI/CD / build-test-deploy (push) Has been cancelled

- docker-compose.yml: bind client/server ports to 127.0.0.1 only — the
  client container is the sole intended public entry point (it proxies
  /api/* to the server itself), a host-level nginx sits in front of it in
  production. Client__Origin now configurable via CLIENT_ORIGIN env var.
- docs/DEPLOY.md: step-by-step for a fresh Linux target (Docker install,
  clone, .env secrets, nginx + certbot).
- docs/CI-CD.md: runner registration for that same target machine, in
  "host" mode so the deploy step's `docker compose up -d` acts on the
  actual running stack.
This commit is contained in:
danamir
2026-08-06 14:18:22 +03:00
parent dfbc43a43e
commit 773dbb493e
4 changed files with 187 additions and 7 deletions

51
docs/CI-CD.md Normal file
View File

@@ -0,0 +1,51 @@
# CI/CD (Gitea Actions)
Пайплайн — `.gitea/workflows/ci-cd.yml`. На каждый push/PR: юнит-тесты `Domain.Tests` +
`docker compose build` (проверка, что весь стек собирается). На push в `master` — дополнительно
`docker compose up -d` (реальный редеплой).
Раннер выполняет джобы **прямо на целевом сервере** (`ruvdstest.danamir.site`, тот же, что описан
в `docs/DEPLOY.md`) — это и есть логика деплоя: шаг "Deploy" в workflow просто выполняет
`docker compose up -d` в том же каталоге `/opt/ruvdstests`, поверх уже поднятого стека.
## Регистрация раннера
Выполняется один раз, на целевом сервере (там же, где разворачивали приложение), после того как
шаги 16 из `docs/DEPLOY.md` пройдены.
**1. Убедиться, что Actions включены** на вашем Gitea (Site Administration → пункт "Actions" должен
быть виден; если Gitea развёрнута в докере — переменная `GITEA__actions__ENABLED=true` в её
конфиге/окружении).
**2. Получить токен регистрации**: Site Administration → Actions → Runners → **Create new runner**
(или в настройках именно этого репозитория: Settings → Actions → Runners).
**3. Запустить раннер** (заполните токен и запустите сами — секрет никому больше не передаётся):
```bash
docker volume create gitea-runner-data
docker run -d --name gitea-ci-runner --restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-v gitea-runner-data:/data \
-e GITEA_INSTANCE_URL=https://git.danamir.su \
-e GITEA_RUNNER_REGISTRATION_TOKEN=ВАШ_ТОКЕН_СЮДА \
-e GITEA_RUNNER_NAME=ruvdstest-prod \
-e GITEA_RUNNER_LABELS=host:host \
gitea/runner:latest
```
`host:host` — раннер выполняет джобы напрямую в своём собственном контейнере (никаких вложенных
контейнеров на каждый джоб), у него смонтирован docker.sock хоста — поэтому `docker compose`
внутри джоба управляет реальными контейнерами на этой машине. Джоб сам ставит себе `docker-cli` и
.NET SDK через `apk`/`dotnet-install.sh` (см. workflow) — образ раннера намеренно голый, чтобы не
поддерживать отдельный кастомный образ.
Проверить, что раннер подключился: Site Administration → Actions → Runners — должен появиться
`ruvdstest-prod` со статусом Idle/Online.
## Проверка
Сделайте любой коммит и запушьте в `master` — во вкладке **Actions** репозитория должен появиться
запуск, пройти тесты, сборку и деплой. После завершения `https://ruvdstest.danamir.site` уже
обслуживает обновлённую версию.