# #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