version: '3.8' services: db: image: postgres:13-alpine container_name: solarbank_db restart: unless-stopped environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_INITDB_ROOT_PASSWORD=${POSTGRES_INITDB_ROOT_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data networks: - solarbank_network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: solarbank_redis restart: unless-stopped networks: - solarbank_network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 backend: build: context: ./backend dockerfile: Dockerfile.prod container_name: solarbank_backend restart: unless-stopped environment: - PROJECT_NAME=${PROJECT_NAME} - API_PREFIX=${API_PREFIX} - DEBUG=${DEBUG} - ENV=${ENV} - SECRET_KEY=${SECRET_KEY} - JWT_SECRET_KEY=${JWT_SECRET_KEY} - JWT_ALGORITHM=${JWT_ALGORITHM} - ACCESS_TOKEN_EXPIRE_MINUTES=${ACCESS_TOKEN_EXPIRE_MINUTES} - BACKEND_CORS_ORIGINS=${BACKEND_CORS_ORIGINS} - POSTGRES_SERVER=${POSTGRES_SERVER} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} - REDIS_HOST=${REDIS_HOST} - REDIS_PORT=${REDIS_PORT} - DEFAULT_IOT_SERVER_PORT=${DEFAULT_IOT_SERVER_PORT} - DEFAULT_IOT_ENDPOINT=${DEFAULT_IOT_ENDPOINT} - BATTERY_MIN_VOLTAGE=${BATTERY_MIN_VOLTAGE} - BATTERY_MAX_VOLTAGE=${BATTERY_MAX_VOLTAGE} - DEFAULT_GPS_TIMEOUT=${DEFAULT_GPS_TIMEOUT} - GPS_ACCURACY_THRESHOLD=${GPS_ACCURACY_THRESHOLD} depends_on: db: condition: service_healthy redis: condition: service_healthy networks: - solarbank_network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/health"] interval: 30s timeout: 10s retries: 3 frontend: build: context: ./frontend dockerfile: Dockerfile.prod args: - REACT_APP_API_URL=${REACT_APP_API_URL} - REACT_APP_MAPBOX_TOKEN=${REACT_APP_MAPBOX_TOKEN} container_name: solarbank_frontend restart: unless-stopped networks: - solarbank_network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:80/health"] interval: 30s timeout: 10s retries: 3 nginx: image: nginx:alpine container_name: solarbank_nginx restart: unless-stopped ports: - "80:80" volumes: - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - backend - frontend networks: - solarbank_network healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"] interval: 30s timeout: 10s retries: 3 networks: solarbank_network: driver: bridge volumes: postgres_data: