# Базовый 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" volumes: - media:/app/media depends_on: postgres: condition: service_healthy migrate: condition: service_completed_successfully 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" volumes: - media:/app/media ports: - "${ADMIN_BIND_IP:-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" volumes: pgdata: media: