# ─── eSIM Lifecycle Orchestrator ────────────────────────── # Docker Compose for all services services: # ── Database ────────────────────────────────────────── db: image: postgres:16-alpine environment: POSTGRES_USER: esim_user POSTGRES_PASSWORD: esim_pass POSTGRES_DB: esim_db ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U esim_user -d esim_db"] interval: 5s timeout: 5s retries: 5 # ── Redis / Celery Broker ──────────────────────────── redis: image: redis:7-alpine ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 # ── Backend API ────────────────────────────────────── backend: build: context: ./backend dockerfile: Dockerfile ports: - "8000:8000" env_file: - .env environment: DATABASE_URL: "postgresql+asyncpg://esim_user:esim_pass@db:5432/esim_db" REDIS_URL: "redis://redis:6379/0" CELERY_BROKER_URL: "redis://redis:6379/0" CELERY_RESULT_BACKEND: "redis://redis:6379/0" depends_on: db: condition: service_healthy redis: condition: service_healthy volumes: - ./backend:/app # ── Celery Worker ──────────────────────────────────── worker: build: context: ./backend dockerfile: Dockerfile command: celery -A app.services.celery_app worker --loglevel=info env_file: - .env environment: DATABASE_URL_SYNC: "postgresql+psycopg2://esim_user:esim_pass@db:5432/esim_db" REDIS_URL: "redis://redis:6379/0" CELERY_BROKER_URL: "redis://redis:6379/0" CELERY_RESULT_BACKEND: "redis://redis:6379/0" depends_on: db: condition: service_healthy redis: condition: service_healthy volumes: - ./backend:/app # ── Frontend ───────────────────────────────────────── frontend: build: context: ./frontend dockerfile: Dockerfile ports: - "80:80" depends_on: - backend # ── Monitoring ─────────────────────────────────────── prometheus: image: prom/prometheus:v2.53.1 ports: - "9090:9090" volumes: - ./infra/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - promdata:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" grafana: image: grafana/grafana:11.1.3 ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin - GF_INSTALL_PLUGINS= volumes: - grafanadata:/var/lib/grafana - ./infra/grafana/datasources:/etc/grafana/provisioning/datasources depends_on: - prometheus volumes: pgdata: promdata: grafanadata: