# Базовый compose для локального запуска и разработки. # Секреты берутся из .env (см. .env.example). # # docker compose up --build # name: dispelevilbot 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 в .env} 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 # ports: # - "5432:5432" # раскомментировать для доступа к БД с хоста # Накат миграций Flyway перед стартом бота (идемпотентно). 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 в .env} 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: build: . image: dispelevilbot-bot:local restart: unless-stopped env_file: - .env environment: # Внутри сети compose БД доступна по имени сервиса. 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" # Админка (FastAPI + HTMX). Порт — только loopback: наружу выйдет через reverse proxy # вместе с TLS и доменом (Блок 2.4/4.2). admin: build: context: . dockerfile: admin/Dockerfile image: dispelevilbot-admin:local restart: unless-stopped env_file: - .env environment: DB_HOST: postgres DB_PORT: "5432" ADMIN_HOST: 0.0.0.0 ADMIN_PORT: "8000" ports: - "127.0.0.1:${ADMIN_HTTP_PORT:-8000}:8000" depends_on: postgres: condition: service_healthy migrate: condition: service_completed_successfully logging: driver: json-file options: max-size: "10m" max-file: "3" # Аналитика событий (Блок 3). DDL — в clickhouse/init/. 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 в .env} CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1" volumes: - clickhousedata:/var/lib/clickhouse - ./clickhouse/init:/docker-entrypoint-initdb.d:ro ports: - "127.0.0.1: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 volumes: pgdata: clickhousedata: