Аудитория: ИТ-администратор, суперадминистратор. Сценарий: день-в-день эксплуатация стенда/пилота: поднять, проверить «живость», снять бэкап, разобрать инцидент.
Эта статья собирает самое частое в эксплуатации в одном месте: поднять стенд, проверить «живость», снять бэкап, разобрать инцидент. Полные регламенты установки и восстановления ведутся отдельными эксплуатационными документами поставки.
cd licenziar
# чистый том ОБЯЗАТЕЛЕН, если менялись миграции (иначе already_seeded их пропустит):
docker compose -f docker-compose.phase1.yml down -v
ANON_SALT=test-salt docker compose -f docker-compose.phase1.yml up --build -d
# web: http://localhost:3007 api: http://localhost:8001 /docs — OpenAPIСервисы: db (Postgres) · dbinit (разовый: роль, миграции, сид, Vault) · api (FastAPI) · collector (планировщик сбора) · web (Next).
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8001/api/health # 200 = ок/api/health — глубокая проверка: реально ходит в БД и отдаёт 503, если БД недоступна (а не «ок, пока приложение живо»). В compose настроен healthcheck api; статус виден в docker compose ps (healthy/unhealthy).
Быстрый смоук по экранам:
for p in / /efficiency /risks /collectors /settings /systems; do
printf "%-12s " "$p"; curl -s -o /dev/null -w "%{http_code}\n" "http://localhost:3007$p"; doneJSON-логи (stdlib, без внешней зависимости), у каждой строки и в заголовке ответа — X-Request-ID (contextvar-middleware). Ключевые события: auth.login.ok/failed, collector.run.ok.
docker logs licenziar-api-1 | tail -50
docker logs licenziar-collector-1 | grep collector.run.ok # прогоны сбораbash deploy/backup.sh # pg_dump именованного тома pgdata + ротация по ретенцииДанные лежат в именованном томе `pgdata` — он переживает пересоздание контейнеров (но не down -v, который том стирает). Полный регламент восстановления ведётся отдельным эксплуатационным документом поставки.
| Механизм | Где | Поведение |
|---|---|---|
| Fail-fast секретов | validate_prod_secrets | при APP_ENV=prod запуск падает, если JWT_SECRET/ANON_SALT/APP_DB_PASSWORD дефолтные/слабые |
| Rate-limit | slowapi (middleware) | login 10/мин, ingest 120/мин; глушится RATELIMIT_ENABLED=0 в тестах |
| Cookie/CSRF | модуль аутентификации | AUTH_COOKIE_MODE=1 → httpOnly-cookie + CSRF double-submit |
| CORS-замок | CORS_ORIGINS | конкретные origin вместо * |
Прод-профиль — отдельный compose-файл и nginx-конфиг (same-origin web+api, APP_ENV=prod, секреты обязательны).
| Симптом | Причина | Что делать |
|---|---|---|
api = unhealthy | БД не поднялась / нет миграций | docker logs licenziar-db-1, dbinit; при смене миграций — down -v и заново |
| «Поправил код — на стенде по-старому» | BuildKit молча не пересобрал web | собирать DOCKER_BUILDKIT=0 ... up --build |
Vault resolve не находит id | разная ANON_SALT на сиде и сейчас | держать одну соль (стенд — test-salt) |
| Миграция не применилась | already_seeded на старом томе | down -v перед up |
pytest пишет в /home/app отказ | юзер контейнера | гонять тесты -u root; пути в git-bash — MSYS_NO_PATHCONV=1 |
| Playwright не находит браузер | путь кэша | PLAYWRIGHT_BROWSERS_PATH машинный (D:\DevCaches\ms-playwright), не переопределять |
- `down -v` стирает данные — это инструмент чистого пересева, не «перезапуск».
- Стендовые секреты в проде = отказ старта — это защита (
validate_prod_secrets). - `collector_runs` растут — журнал событий сбора, чистится регламентно.
Связанные статьи: 04 — Механизм сбора · 05 — Автономность и стек.