services: app: build: context: . dockerfile: Dockerfile depends_on: postgres: condition: service_healthy redis: condition: service_healthy pgbouncer: condition: service_healthy env_file: .env environment: DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD:-postgres}@pgbouncer:6432/liveserver REDIS_URL: redis://redis:6379 restart: unless-stopped postgres: image: postgres:16-alpine environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} POSTGRES_DB: liveserver volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 3s retries: 5 restart: unless-stopped minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} volumes: - minio_data:/data healthcheck: test: ["CMD-SHELL", "curl -sf http://localhost:9000/minio/health/live || exit 1"] interval: 10s timeout: 5s retries: 3 restart: unless-stopped redis: image: redis:7-alpine command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --save "" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 restart: unless-stopped pgbouncer: image: edoburu/pgbouncer:latest depends_on: postgres: condition: service_healthy environment: DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD:-postgres}@postgres:5432/liveserver POOL_MODE: transaction MAX_CLIENT_CONN: 500 DEFAULT_POOL_SIZE: 25 MIN_POOL_SIZE: 5 healthcheck: test: ["CMD-SHELL", "sh -c 'echo | nc -w 2 127.0.0.1 6432'"] interval: 5s timeout: 3s retries: 5 restart: unless-stopped ai-agent: build: ./ai-agent depends_on: postgres: condition: service_healthy env_file: .env environment: DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD:-postgres}@pgbouncer:6432/liveserver restart: unless-stopped volumes: postgres_data: minio_data: