version: '3.8' services: # PostgreSQL Database postgres: image: postgres:15-alpine container_name: inboxconverge-postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: inbox_converge ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 # Redis for caching and Celery redis: image: redis:7-alpine container_name: inboxconverge-redis ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # FastAPI Backend backend: build: context: ./backend dockerfile: Dockerfile container_name: inboxconverge-backend ports: - "8000:8000" env_file: - ./backend/.env depends_on: postgres: condition: service_healthy redis: condition: service_healthy volumes: - ./backend:/app command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload restart: unless-stopped # Celery Worker for background email processing celery-worker: build: context: ./backend dockerfile: Dockerfile container_name: inboxconverge-celery-worker env_file: - ./backend/.env depends_on: - postgres - redis - backend volumes: - ./backend:/app command: celery -A app.workers.celery_app worker --loglevel=info restart: unless-stopped # Celery Beat for scheduling celery-beat: build: context: ./backend dockerfile: Dockerfile container_name: inboxconverge-celery-beat env_file: - ./backend/.env depends_on: - postgres - redis - backend volumes: - ./backend:/app command: celery -A app.workers.celery_app beat --loglevel=info restart: unless-stopped # Frontend (React/Next.js) frontend: build: context: ./frontend dockerfile: Dockerfile container_name: inboxconverge-frontend ports: - "3000:3000" environment: - BACKEND_URL=http://backend:8000 - CONTACT_EMAIL=christian@inboxconverge.com - APP_URL=https://inboxconverge.com - APP_NAME=InboxConverge depends_on: - backend restart: unless-stopped # Prometheus metrics collection prometheus: image: prom/prometheus:v2.51.2 container_name: inboxconverge-prometheus ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus_data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--storage.tsdb.retention.time=30d" - "--web.enable-lifecycle" depends_on: - backend restart: unless-stopped # Grafana dashboards grafana: image: grafana/grafana:10.4.3 container_name: inboxconverge-grafana ports: - "3001:3000" environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin - GF_USERS_ALLOW_SIGN_UP=false volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro - ./monitoring/grafana/dashboards:/etc/grafana/dashboards:ro depends_on: - prometheus restart: unless-stopped volumes: postgres_data: redis_data: prometheus_data: grafana_data: