version: "3.9" services: postgres: image: postgres:16-alpine container_name: privacy-bridge-db environment: POSTGRES_USER: ${POSTGRES_USER:-bridge} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} POSTGRES_DB: ${POSTGRES_DB:-privacy_bridge} volumes: - postgres_data:/var/lib/postgresql/data ports: - "5433:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U bridge -d privacy_bridge"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: privacy-bridge-redis ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 backend: build: context: ./backend dockerfile: Dockerfile container_name: privacy-bridge-backend depends_on: postgres: condition: service_healthy redis: condition: service_healthy env_file: - .env.local healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/status/health"] interval: 30s timeout: 10s retries: 3 start_period: 30s environment: DATABASE_URL: postgresql://${POSTGRES_USER:-bridge}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-privacy_bridge} REDIS_URL: redis://redis:6379 ports: - "3000:3000" volumes: - backend_data:/app/data frontend: build: context: ./frontend dockerfile: Dockerfile container_name: privacy-bridge-frontend depends_on: - backend environment: NEXT_PUBLIC_API_URL: http://localhost:3000 NEXT_PUBLIC_DEFAULT_NETWORK: testnet ports: - "3001:3000" volumes: postgres_data: redis_data: backend_data: