services: pip-api: build: context: . dockerfile: Dockerfile restart: unless-stopped ports: - "8000:8000" environment: DATABASE_URL: postgresql+asyncpg://pip:${PG_PASSWORD:-pip-secret}@postgres:5432/pip REDIS_URL: redis://redis:6379/0 RABBITMQ_URL: amqp://pip:${RABBITMQ_PASSWORD:-pip-secret}@rabbitmq:5672/pip JWT_SECRET_KEY: ${JWT_SECRET_KEY:-change-me-in-production} NODE_ENV: production LOG_LEVEL: INFO LOG_JSON_FORMAT: "true" CORS_ORIGINS: '["*"]' OTEL_EXPORTER_OTLP_ENDPOINT: http://host.docker.internal:4317 OTEL_TRACES_ENABLED: "true" depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import httpx; r = httpx.get('http://localhost:8000/api/v1/system/health'); exit(0 if r.status_code == 200 else 1)"] interval: 30s timeout: 5s retries: 3 start_period: 10s deploy: resources: limits: cpus: "2.0" memory: 1G reservations: cpus: "0.5" memory: 256M postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: pip POSTGRES_USER: pip POSTGRES_PASSWORD: ${PG_PASSWORD:-pip-secret} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U pip -d pip"] interval: 10s timeout: 5s retries: 5 start_period: 10s command: > postgres -c max_connections=200 -c shared_buffers=256MB -c effective_cache_size=768MB -c work_mem=4MB -c maintenance_work_mem=64MB -c checkpoint_completion_target=0.9 -c wal_buffers=16MB -c default_statistics_target=100 -c random_page_cost=1.1 -c effective_io_concurrency=200 -c max_worker_processes=8 redis: image: redis:7-alpine restart: unless-stopped ports: - "6380:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 command: > redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes --appendfsync everysec rabbitmq: image: rabbitmq:3-management-alpine restart: unless-stopped environment: RABBITMQ_DEFAULT_USER: pip RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-pip-secret} RABBITMQ_DEFAULT_VHOST: pip ports: - "5672:5672" - "15672:15672" volumes: - rabbitmq_data:/var/lib/rabbitmq healthcheck: test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] interval: 30s timeout: 10s retries: 5 start_period: 30s volumes: postgres_data: redis_data: rabbitmq_data: