- Auto-expiry: expired events auto-end on GET /events via task manager - Height: _estimate_markdown_height adapted to unit=8px scale with padding detection - CRITICAL-1: removed dead import remove_chart_from_position (QA finding) - CRITICAL-2: added chart alive check in ensure_banner_chart (QA finding) - CRITICAL-3: fixed test assertions update_markdown_chart → update_banner_on_dashboard - @POST contract: fixed return range [2,12] → [19,200] - Tests: 8 new tests (auto-expiry + layout height)
78 lines
5.6 KiB
YAML
78 lines
5.6 KiB
YAML
# #region docker.compose.enterprise-clean [C:4] [TYPE Module] [SEMANTICS docker,compose,enterprise]
|
||
# @BRIEF Enterprise docker compose — сборка backend + frontend из исходников, внешний Postgres, корп. сертификаты.
|
||
# @PRE Docker и docker compose установлены. Файлы .env.enterprise-clean настроены.
|
||
# Postgres: внешний, доступный по POSTGRES_HOST:POSTGRES_PORT.
|
||
# Сертификаты: опциональные .crt файлы в CERTS_PATH монтируются в /opt/certs.
|
||
# @POST Сервисы backend и frontend запущены. SSL терминация в nginx опциональна.
|
||
# @SIDE_EFFECT backend использует ENTRYPOINT для установки сертификатов и bootstrap admin.
|
||
# frontend автоопределяет наличие SSL сертификатов и переключает nginx конфиг.
|
||
# @LAYER Infrastructure
|
||
# @RELATION DEPENDS_ON -> [docker/backend.Dockerfile]
|
||
# @RELATION DEPENDS_ON -> [docker/frontend.Dockerfile]
|
||
# @RELATION DEPENDS_ON -> [docker/nginx.conf]
|
||
# @RELATION DEPENDS_ON -> [docker/nginx.ssl.conf]
|
||
# @RELATION DEPENDS_ON -> [docker/frontend.entrypoint.sh]
|
||
# @RELATION DEPENDS_ON -> [docker/backend.entrypoint.sh]
|
||
# @DATA_CONTRACT Input: .env.enterprise-clean + ./certs/*.crt -> Output: запущенные контейнеры
|
||
# @INVARIANT Внешний Postgres НЕ требует healthcheck внутри compose — ответственность оператора.
|
||
# @INVARIANT Если CERTS_PATH пуст или не содержит .crt файлов, entrypoint не падает.
|
||
# @INVARIANT nginx слушает порт 80 всегда. Порт 443 включается только если есть server.crt + server.key.
|
||
# @RATIONALE Отказ от встроенного postgres-container: корпоративный стандарт — внешний PostgreSQL
|
||
# с TLS, бэкапами и мониторингом на уровне инфраструктуры.
|
||
# @RATIONALE Build из исходников вместо pre-built images: предприятие контролирует версии кода
|
||
# и может патчить зависимости. Не подходит для air-gapped — для этого есть bundle:light.
|
||
# @REJECTED Использование `image:` + `pull_policy: never` отвергнуто — не работает для сборки
|
||
# из исходников на целевой машине. Гибридный `build: + image:` тоже отвергнут — усложняет
|
||
# логику build.sh и сбивает с толку оператора.
|
||
|
||
services:
|
||
backend:
|
||
build:
|
||
context: .
|
||
dockerfile: docker/backend.Dockerfile
|
||
restart: unless-stopped
|
||
environment:
|
||
DATABASE_URL: postgresql+psycopg2://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env.enterprise-clean}@${POSTGRES_HOST:?Set POSTGRES_HOST in .env.enterprise-clean}:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-ss_tools}
|
||
TASKS_DATABASE_URL: postgresql+psycopg2://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env.enterprise-clean}@${POSTGRES_HOST:?Set POSTGRES_HOST in .env.enterprise-clean}:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-ss_tools}
|
||
AUTH_DATABASE_URL: postgresql+psycopg2://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env.enterprise-clean}@${POSTGRES_HOST:?Set POSTGRES_HOST in .env.enterprise-clean}:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-ss_tools}
|
||
BACKEND_PORT: 8000
|
||
ENABLE_BELIEF_STATE_LOGGING: ${ENABLE_BELIEF_STATE_LOGGING:-true}
|
||
TASK_LOG_LEVEL: ${TASK_LOG_LEVEL:-INFO}
|
||
INITIAL_ADMIN_CREATE: ${INITIAL_ADMIN_CREATE:-false}
|
||
INITIAL_ADMIN_USERNAME: ${INITIAL_ADMIN_USERNAME:-admin}
|
||
INITIAL_ADMIN_PASSWORD: ${INITIAL_ADMIN_PASSWORD:-}
|
||
INITIAL_ADMIN_EMAIL: ${INITIAL_ADMIN_EMAIL:-}
|
||
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
|
||
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
|
||
FEATURES__DATASET_REVIEW: ${FEATURES__DATASET_REVIEW:-true}
|
||
FEATURES__HEALTH_MONITOR: ${FEATURES__HEALTH_MONITOR:-true}
|
||
# Путь до сертификатов внутри контейнера — всегда /opt/certs
|
||
CERTS_PATH: /opt/certs
|
||
ports:
|
||
- "${BACKEND_HOST_PORT:-8001}:8000"
|
||
volumes:
|
||
# Единая точка хранения: бэкапы → /app/storage/backups/, git-repos → /app/storage/repositories/, LLM-скриншоты → /app/storage/screenshots/
|
||
- ./storage:/app/storage
|
||
# Корпоративные CA-сертификаты (.crt файлы). Монтируются в /opt/certs,
|
||
# entrypoint.sh установит их в системное хранилище доверия.
|
||
- ${CERTS_PATH:-./certs}:/opt/certs:ro
|
||
|
||
frontend:
|
||
build:
|
||
context: .
|
||
dockerfile: docker/frontend.Dockerfile
|
||
restart: unless-stopped
|
||
depends_on:
|
||
- backend
|
||
ports:
|
||
- "${FRONTEND_HOST_PORT:-8000}:80"
|
||
# Если в CERTS_PATH есть server.crt + server.key — nginx включит HTTPS на 443.
|
||
# Если cert-файлов нет — порт 443 не открывается, entrypoint использует HTTP-only конфиг.
|
||
- "${FRONTEND_SSL_PORT:-443}:443"
|
||
volumes:
|
||
# Для frontend тоже можно смонтировать сертификаты — nginx entrypoint
|
||
# автоматически установит CA-сертификаты в Alpine и переключит SSL конфиг.
|
||
- ${CERTS_PATH:-./certs}:/opt/certs:ro
|
||
|
||
# #endregion docker.compose.enterprise-clean
|