version: "3.9" services: # ── PostgreSQL ────────────────────────────────────────────────────────────── postgres: image: postgres:15-alpine container_name: bp_postgres restart: unless-stopped environment: POSTGRES_USER: bp_user POSTGRES_PASSWORD: bp_password POSTGRES_DB: bp_monitoring ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U bp_user -d bp_monitoring"] interval: 10s timeout: 5s retries: 5 # ── RabbitMQ ──────────────────────────────────────────────────────────────── rabbitmq: image: rabbitmq:3.13-management-alpine container_name: bp_rabbitmq restart: unless-stopped environment: RABBITMQ_DEFAULT_USER: guest RABBITMQ_DEFAULT_PASS: guest ports: - "5672:5672" # AMQP - "15672:15672" # Management UI → http://localhost:15672 volumes: - rabbitmq_data:/var/lib/rabbitmq healthcheck: test: ["CMD", "rabbitmq-diagnostics", "ping"] interval: 10s timeout: 5s retries: 5 # ── FastAPI (ETL #1) ──────────────────────────────────────────────────────── api: build: context: . dockerfile: Dockerfile container_name: bp_api restart: unless-stopped env_file: .env environment: DATABASE_URL: postgresql+asyncpg://bp_user:bp_password@postgres:5432/bp_monitoring RABBITMQ_URL: amqp://guest:guest@rabbitmq:5672/ ports: - "7860:7860" depends_on: postgres: condition: service_healthy rabbitmq: condition: service_healthy volumes: - ./models:/app/models # Mount model checkpoints volumes: postgres_data: rabbitmq_data: