# Прод/test-контур: образы тянутся из Gitea Registry. # # Контуры разделяются именем compose-проекта (-p) и файлом окружения (ENV_FILE): # ENV_FILE=env/prod.env docker compose -p prod -f docker-compose.prod.yml up -d # ENV_FILE=env/test.env docker compose -p test -f docker-compose.prod.yml up -d # # Имя проекта задаёт отдельные volume'ы (pgdata) — у prod и test свои БД. services: postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: ${DB_NAME:-dispel_evil} POSTGRES_USER: ${DB_USER:-de_admin} POSTGRES_PASSWORD: ${DB_PASSWORD:?задайте DB_PASSWORD} volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-de_admin} -d ${DB_NAME:-dispel_evil}"] interval: 10s timeout: 5s retries: 10 migrate: image: flyway/flyway:10 command: ["migrate"] environment: FLYWAY_URL: jdbc:postgresql://postgres:5432/${DB_NAME:-dispel_evil} FLYWAY_USER: ${DB_USER:-de_admin} FLYWAY_PASSWORD: ${DB_PASSWORD:?задайте DB_PASSWORD} FLYWAY_LOCATIONS: filesystem:/flyway/sql FLYWAY_BASELINE_ON_MIGRATE: "true" FLYWAY_CONNECT_RETRIES: "10" volumes: - ./sql:/flyway/sql:ro depends_on: postgres: condition: service_healthy restart: "no" bot: image: ${REGISTRY:-git.mpakosrv.ru}/mpakobecex/dispelevilbot-bot:${IMAGE_TAG:-latest} restart: unless-stopped env_file: - ${ENV_FILE:-env/prod.env} environment: DB_HOST: postgres DB_PORT: "5432" CLICKHOUSE_HOST: clickhouse CLICKHOUSE_PORT: "8123" depends_on: postgres: condition: service_healthy migrate: condition: service_completed_successfully # Без ожидания здоровья: аналитика некритична, бот работает и при недоступном ClickHouse. clickhouse: condition: service_started logging: driver: json-file options: max-size: "10m" max-file: "3" # Аналитика событий (docs/events.md). Наружу не публикуется: # только loopback хоста для бэкапа/туннеля; бот ходит внутрь сети compose. clickhouse: image: clickhouse/clickhouse-server:25.3 restart: unless-stopped environment: CLICKHOUSE_DB: ${CLICKHOUSE_DB:-analytics} CLICKHOUSE_USER: ${CLICKHOUSE_USER:-de_bot} CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:?задайте CLICKHOUSE_PASSWORD} # Нужно для создания пользователей/грантов (в финале — read-only пользователь для Superset). CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1" volumes: - clickhousedata:/var/lib/clickhouse # DDL применяется один раз при первой инициализации (пустой data-каталог). - ./clickhouse/init:/docker-entrypoint-initdb.d:ro ports: # Порт контура задаётся в env (prod 8123, test 8124) — иначе конфликт на одной VPS. - "127.0.0.1:${CLICKHOUSE_HTTP_PORT:-8123}:8123" ulimits: nofile: soft: 262144 hard: 262144 healthcheck: test: ["CMD-SHELL", "wget --spider -q -T 5 http://127.0.0.1:8123/ping || exit 1"] interval: 15s timeout: 10s retries: 10 start_period: 20s # --- Reverse proxy и TLS (Блок 2.4) --- # Включается, когда появится админка/Mini App (Блоки 4–5). # Раскомментировать и положить deploy/Caddyfile: # # caddy: # image: caddy:2 # restart: unless-stopped # ports: # - "80:80" # - "443:443" # volumes: # - ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro # - caddy_data:/data # - caddy_config:/config volumes: pgdata: clickhousedata: # caddy_data: # caddy_config: