version: '3.8' services: postgres: image: postgres:16-alpine container_name: nick-tracker-postgres environment: POSTGRES_USER: ${DB_USERNAME:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} POSTGRES_DB: ${DB_DATABASE:-autoscheduler} volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME:-postgres}"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: nick-tracker-redis command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 backend: build: context: . dockerfile: packages/backend/Dockerfile container_name: nick-tracker-backend environment: NODE_ENV: ${NODE_ENV:-development} PORT: 3000 DB_HOST: postgres DB_PORT: 5432 DB_USERNAME: ${DB_USERNAME:-postgres} DB_PASSWORD: ${DB_PASSWORD:-postgres} DB_DATABASE: ${DB_DATABASE:-autoscheduler} REDIS_URL: redis://redis:6379 JWT_SECRET: ${JWT_SECRET:-development-secret-change-me} JWT_REFRESH_SECRET: ${JWT_REFRESH_SECRET:-refresh-secret-change-me} FRONTEND_URL: ${FRONTEND_URL:-http://localhost:5173} ports: - "3000:3000" depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s frontend: build: context: . dockerfile: packages/frontend/Dockerfile container_name: nick-tracker-frontend ports: - "80:80" depends_on: - backend volumes: postgres_data: redis_data: