version: '3.8' services: postgres: image: postgres:16-alpine container_name: esim_postgres environment: POSTGRES_DB: esim_orchestrator POSTGRES_USER: orchestrator POSTGRES_PASSWORD: ${DB_PASSWORD:-orchestrator} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U orchestrator"] interval: 10s timeout: 5s retries: 5 ports: - "5432:5432" redis: image: redis:7-alpine container_name: esim_redis command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 ports: - "6379:6379" backend: build: context: ./backend dockerfile: Dockerfile container_name: esim_backend environment: DATABASE_URL: postgresql+asyncpg://orchestrator:${DB_PASSWORD:-orchestrator}@postgres:5432/esim_orchestrator REDIS_URL: redis://redis:6379/0 SECRET_KEY: ${SECRET_KEY:-change-me-in-production-use-strong-random-key} APP_NAME: "eSIM Orchestrator Lite" APP_VERSION: "1.0.0" DEBUG: "false" API_V1_PREFIX: "/api/v1" CORS_ORIGINS: "http://localhost:3000,http://localhost:80" ACCESS_TOKEN_EXPIRE_MINUTES: "30" REFRESH_TOKEN_EXPIRE_DAYS: "7" DEFAULT_SMDP_TIMEOUT: "30" depends_on: postgres: condition: service_healthy redis: condition: service_healthy ports: - "8000:8000" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 10s frontend: build: context: ./frontend dockerfile: Dockerfile container_name: esim_frontend depends_on: - backend ports: - "80:80" healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost/"] interval: 30s timeout: 10s retries: 3 prometheus: image: prom/prometheus:latest container_name: esim_prometheus volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' ports: - "9090:9090" grafana: image: grafana/grafana:latest container_name: esim_grafana environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin} GF_USERS_ALLOW_SIGN_UP: "false" volumes: - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources - grafana_data:/var/lib/grafana ports: - "3001:3000" depends_on: - prometheus volumes: postgres_data: redis_data: prometheus_data: grafana_data: