Production Environment

Текущий production runbook и canonical snapshot окружения.

Документ фиксирует фактическое состояние production-хоста на 2026-04-19, чтобы в следующих сессиях не восстанавливать topology по кускам из nginx, systemd, compose и чата.

Scope

Этот документ описывает:

  • внешний ingress и домены;
  • host-side сервисы и systemd units;
  • runtime layout на сервере;
  • blue/green правила для tracium и shared/auth;
  • ограничения, которые нельзя ломать без явной миграции.

Если нужен общий подход к deploy, env и compose-контурам, сначала посмотри deployment.md.
Если нужен pipeline flow и runner model, посмотри ../50-processes/gitlab-cicd.md.

Canonical Host State

Production-host обслуживает:

  • tracium.ru
  • docs.tracium.ru
  • api.tracium.ru
  • id.tracium.ru
  • server1c.1-fb.ru

Внешний ingress:

  • 80/tcp и 443/tcp проброшены на Ubuntu-хост;
  • edge ingress держит системный nginx на Ubuntu, не контейнер;
  • server1c.1-fb.ru работает по plain HTTP и не должен получать 80 -> 443 redirect.

Domain Routing

Tracium ingress

Системный nginx маршрутизирует:

  • tracium.ru $tracium_web_upstream
  • docs.tracium.ru $tracium_docs_upstream
  • api.tracium.ru $tracium_api_upstream
  • id.tracium.ru $tracium_auth_upstream

Актуальные upstream values лежат в:

/etc/nginx/snippets/tracium-active-upstreams.conf

На момент фиксации состояния snippet содержит:

set $tracium_web_upstream 127.0.0.1:18180;
set $tracium_docs_upstream 127.0.0.1:18181;
set $tracium_api_upstream 127.0.0.1:18182;
set $tracium_auth_upstream 127.0.0.1:18183;

1C ingress

server1c.1-fb.ru проксируется на:

192.168.1.190

Инварианты:

  • не добавлять redirect 80 -> 443;
  • не смешивать server1c.1-fb.ru с blue/green логикой tracium;
  • проверять его отдельно от application rollout.

Host Services

Systemd units

На production-хосте должны быть enabled:

  • nginx
  • docker
  • fail2ban
  • ssh
  • gitlab-runners.service
  • tracium-bluegreen.service

Назначение кастомных units:

  • gitlab-runners.service
    • поднимает dockerized runner stack из /home/belkanov/apps/gitlab-runners;
  • tracium-bluegreen.service
    • при старте хоста пересобирает active nginx snippet из runtime-state и делает nginx reload.

Active containers

Ожидаемое steady-state состояние:

  • tracium_green-web-1
  • tracium_green-docs-1
  • tracium_green-api-1
  • shared_auth_green-auth-1
  • deploy-rabbit-1
  • deploy-auth-mongodb-1
  • gitlab-runners-gitlab-runner-build-1
  • gitlab-runners-gitlab-runner-deploy-1

Нормально, если активный color будет blue, а не green; важно только, чтобы:

  • tracium.active и shared-auth.active совпадали с nginx snippet;
  • не оставались лишние предыдущие color-slots без причины;
  • mongo и rabbit были только общими production services, а не дублировались на color-slot.

Runtime Layout

/home/belkanov/apps/
├── gitlab-runners/
│   ├── .env
│   ├── docker-compose.yml
│   ├── build/config/config.toml
│   └── deploy/config/config.toml
├── production-runtime/
│   ├── bin/
│   ├── nginx/
│   └── systemd/
├── runtime-state/
│   ├── tracium.active
│   └── shared-auth.active
├── tracium/
│   ├── current -> releases/<sha>
│   ├── releases/<sha>
│   └── shared/
│       ├── tracium-root.env
│       └── tracium-deploy.env
└── shared-auth/
    ├── current -> releases/<sha>
    ├── releases/<sha>
    └── shared/.env

Blue/Green Model

Tracium

tracium blue/green использует два набора loopback ports:

  • blue
    • 18080 web
    • 18081 docs
    • 18082 api
  • green
    • 18180 web
    • 18181 docs
    • 18182 api

Compose file:

deploy/docker/docker-compose.prod-bluegreen.yml

Runtime scripts:

deploy/production-runtime/bin/deploy-tracium-color.sh
deploy/production-runtime/bin/retire-tracium-color.sh
deploy/production-runtime/bin/render-nginx-upstreams.sh
deploy/production-runtime/bin/restore-active-upstreams.sh

Shared Auth

shared/auth blue/green использует:

  • blue
    • 18083
  • green
    • 18183

Ключевой operational invariant:

  • production runtime для shared/auth поднимает только stateless auth container;
  • production runtime не должен клонировать mongo и rabbit на каждый color.

Для этого есть два compose-файла с разным смыслом:

  • deploy/docker-compose.bluegreen.yml
    • используется для smoke/verify и локальной проверки;
    • содержит auth + mongo + rabbit;
  • deploy/docker-compose.runtime.yml
    • используется для production rollout;
    • поднимает только auth;
    • подключает контейнер к существующей сети deploy_default.

Production auth обязан переиспользовать:

  • deploy-auth-mongodb-1
  • deploy-rabbit-1

через Docker network:

deploy_default

CI/CD Runner Model

На production-хосте живут два runner’а:

  • ci-build
  • ci-deploy

Оба работают в Docker, но имеют разные права:

  • ci-build
    • build/lint/test jobs;
    • Docker socket для docker compose config и image build;
  • ci-deploy
    • production deploy jobs;
    • Docker socket;
    • host mounts /home/belkanov/apps и /etc/nginx.

Runner configs лежат в:

/home/belkanov/apps/gitlab-runners/build/config/config.toml
/home/belkanov/apps/gitlab-runners/deploy/config/config.toml

Оба runner’а должны содержать:

request_concurrency = 2

Это уже применено и убирает warning про long polling.

Operational Rules

Перед любым изменением production ingress

Проверь:

  • /etc/nginx/snippets/tracium-active-upstreams.conf
  • /home/belkanov/apps/runtime-state/tracium.active
  • /home/belkanov/apps/runtime-state/shared-auth.active
  • systemctl status nginx gitlab-runners.service tracium-bluegreen.service

Нельзя делать

  • включать redirect 80 -> 443 для server1c.1-fb.ru;
  • переносить edge ingress в контейнер без отдельной миграции;
  • поднимать отдельные mongo/rabbit для production color-slot shared/auth;
  • править nginx upstream ports вручную, забыв обновить runtime-state;
  • использовать SSH deploy с внешнего runner’а, если deploy уже идет через ci-deploy на самом хосте.

Нормальный post-change smoke set

curl -I https://tracium.ru
curl https://api.tracium.ru/readyz
curl https://id.tracium.ru/readyz
curl -I http://server1c.1-fb.ru

Current Snapshot

На момент фиксации:

  • active color tracium = green
  • active color shared/auth = green
  • tracium слушает:
    • 127.0.0.1:18180
    • 127.0.0.1:18181
    • 127.0.0.1:18182
  • shared/auth слушает:
    • 127.0.0.1:18183
  • blue-порты 18080/18081/18082/18083 свободны для следующего rollout.

Если в будущем активным станет blue, это не проблема само по себе.
Проблема — когда active-state, nginx snippet и реально живые контейнеры расходятся.