services: dev: build: context: .. dockerfile: .devcontainer/Dockerfile image: fastapi-modulith:dev restart: unless-stopped environment: APP_ENV: development DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-devpass}@db:5432/${POSTGRES_DB:-todo_db} REDIS_URL: redis://:${REDIS_PASSWORD:-devpass}@redis:6379/0 OTEL_ENABLED: "true" OTEL_SERVICE_NAME: "fastapi-modulith" OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4318/v1/traces" env_file: - ../.env volumes: - ..:/app:cached ports: - "${APP_PORT:-8000}:8000" depends_on: db: condition: service_healthy redis: condition: service_healthy command: sleep infinity prometheus: image: prom/prometheus:latest restart: unless-stopped ports: - "${PROMETHEUS_PORT:-9090}:9090" volumes: - ./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" otel-collector: image: otel/opentelemetry-collector-contrib:latest restart: unless-stopped ports: - "${OTEL_COLLECTOR_PORT:-4318}:4318" volumes: - ../docker/otel-collector/config.yaml:/etc/otelcol-contrib/config.yaml:ro db: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-devpass} POSTGRES_DB: ${POSTGRES_DB:-todo_db} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 redis: image: redis:8-alpine restart: unless-stopped command: [ "redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD:-devpass}", ] volumes: - redis_data:/data healthcheck: test: [ "CMD", "redis-cli", "-a", "${REDIS_PASSWORD:-devpass}", "ping", ] interval: 10s timeout: 5s retries: 5 volumes: postgres_data: redis_data: prometheus_data: