services: postgres: image: postgres:15-alpine environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}'] interval: 5s timeout: 5s retries: 10 deploy: resources: limits: memory: 512M cpus: '0.5' reservations: memory: 256M networks: - app-network api: build: context: . dockerfile: apps/api/Dockerfile environment: DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connection_limit=20&pool_timeout=30&connect_timeout=10 PORT: 3001 NODE_ENV: production ports: - "3001:3001" depends_on: postgres: condition: service_healthy restart: unless-stopped deploy: resources: limits: memory: 512M cpus: '1.0' reservations: memory: 256M networks: - app-network web: build: context: . dockerfile: apps/web/Dockerfile args: NEXT_PUBLIC_API_URL: http://localhost:3001 environment: NODE_ENV: production ports: - "3000:3000" depends_on: - api restart: unless-stopped deploy: resources: limits: memory: 512M cpus: '0.5' reservations: memory: 256M networks: - app-network gemini: build: context: . dockerfile: apps/gemini/Dockerfile environment: GEMINI_API_KEY: ${GEMINI_API_KEY} API_URL: http://api:3001 PORT: 3002 ports: - "3002:3002" depends_on: - api restart: unless-stopped deploy: resources: limits: memory: 256M cpus: '0.5' reservations: memory: 128M networks: - app-network networks: app-network: driver: bridge volumes: postgres_data: