---
title: CI/CD и deployment rules
impact: CRITICAL
impactDescription: Фиксирует текущий production contour и целевой docker/image-based переход без ложных допущений
tags: ci, cd, deployment, systemd, nginx, docker
---
## Паспорт документа

- Статус документа: living standard
- Актуально на: 30 марта 2026 года
- Владелец: backend/platform-команда
- Пересмотр: при изменении инженерной практики, CI/CD, архитектурных правил или локального workflow
- Область применения: внутренние rule/reference-card документы для инженерной команды
- Связанные документы:
  - [Индекс Agents](../README.md)
  - [Команды разработки](../commands.md)
  - [Инженерные принципы](../../governance/engineering-principles.md)

## CI/CD и deployment rules

**Impact: CRITICAL**

Нельзя опираться на старые предположения про GitHub Actions + GHCR + Docker Compose как на текущий production truth. На 30 марта 2026 года канонический runtime другой.

## 1. Текущее состояние production

- Production работает из двух репозиториев: `qadam-core` и `qadam-web`.
- API запускается через `systemd` unit `qadam-api`.
- Web запускается через `systemd` unit `qadam-web`.
- Roadmap-портал запускается через отдельный `systemd` unit `qadam-roadmap`.
- Внешний ingress обслуживает host-level `nginx`.
- TLS завершается на Let’s Encrypt / certbot.
- Docker/image-based delivery пока является целевым направлением, но не текущим каноническим runtime.

## 2. Текущий quality gate

Для `qadam-core`:

```bash
pnpm check-types
pnpm test
pnpm build
pnpm export:openapi
```

Repo-side workflow для этого gate живёт в `.gitea/workflows/quality-gate.yml` и должен оставаться зеркалом локального minimum gate.

Первый workflow run `Quality Gate` для `qadam-core` уже подтверждён в Gitea со статусом `success` на self-hosted runner `qadam-core-runner-01`.

Runner baseline теперь включает и disk-safety правило:

- runner cache и hostexecutor workspace должны жить в `/tmp`, а не на корневом разделе;
- канонические значения: `XDG_CACHE_HOME=/tmp/act_runner-cache`, `TMPDIR=/tmp/act_runner-tmp`;
- `/opt/act_runner/.cache` допускается только как symlink в `/tmp/act_runner-cache`, а не как реальный cache-dir на `/`.

Для `qadam-web`:

```bash
pnpm generate:api-contract
pnpm check:api-contract
pnpm check-types
pnpm build
```

## 3. PR review и security gate

- Нетривиальные change packages в `qadam-core` должны идти через `.gitea/PULL_REQUEST_TEMPLATE.md`.
- Repo-side quality gate не заменяет human review.
- Для auth/tokens/cookies, permissions, uploads/files, secrets/env, proxy/rate-limit и Prisma migrations обязателен отдельный security impact review.
- Если пакет меняет API-контракт, одновременно обязательны OpenAPI, `frontend-change-log.md` и checkpoints/changelog.

## 4. Текущий production deploy package

Backend/package change:

1. Обновить checkout `qadam-core`
2. Применить Prisma migrations
3. Пересобрать backend
4. Обновить OpenAPI artifact
5. Перезапустить `qadam-api`

Frontend/package change:

1. Обновить checkout `qadam-web`
2. Если менялся контракт — синхронизировать `openapi/openapi.json`
3. Запустить `pnpm generate:api-contract`
4. Пересобрать `apps/web` и, если change package затрагивает портал документации, `apps/roadmap`
5. Перезапустить `qadam-web`
6. Если change package затрагивает портал документации — перезапустить `qadam-roadmap`

## 5. Проверки после деплоя

- `systemctl status qadam-api qadam-web qadam-roadmap nginx`
- `curl https://qadam.2fab.app/api/v1/health`
- `curl -I https://qadam.2fab.app/api/docs`
- `curl -I https://qadam.2fab.app`
- `curl -I https://qadam.2fab.app/roadmap`
- `curl -I -u <login>:<password> https://qadam-roadmap.2fab.app`
- `curl -u <login>:<password> https://qadam-roadmap.2fab.app/api/health`

## 6. Канонические production paths

- API checkout: `/data/qadam-core`
- Web checkout: `/data/qadam-web`
- Repo-side CI workflow: `/data/qadam-core/.gitea/workflows/quality-gate.yml`
- PR review template: `/data/qadam-core/.gitea/PULL_REQUEST_TEMPLATE.md`
- Repo-side runner: `/opt/act_runner/qadam-core`
- Runner unit: `/etc/systemd/system/qadam-core-runner.service`
- Runner cache symlink: `/opt/act_runner/.cache -> /tmp/act_runner-cache`
- Env: `/etc/qadam/qadam.env`
- Roadmap env: `/etc/qadam/qadam-roadmap.env`
- API unit: `/etc/systemd/system/qadam-api.service`
- Web unit: `/etc/systemd/system/qadam-web.service`
- Roadmap unit: `/etc/systemd/system/qadam-roadmap.service`

## 7. Что является целевым, но ещё не production truth

- Docker runtime для `qadam-core` и `qadam-web`
- Image registry и versioned images
- Automated image-based rollback
- Полностью оформленный CI/CD pipeline для split-репозиториев с deployment automation поверх уже подтверждённого runner baseline

До завершения этого перехода нельзя писать rule-документы так, будто Docker Compose уже является каноническим production-контуром.
