version: '3.8' services: # Backend API service backend: build: ./backend container_name: solarbank-backend restart: always volumes: - ./backend:/app env_file: - .env depends_on: - db - redis command: > sh -c "sleep 10 && uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload" networks: - solarbank-network # Frontend service frontend: build: ./frontend container_name: solarbank-frontend restart: always volumes: - ./frontend:/app - /app/node_modules env_file: - .env depends_on: - backend networks: - solarbank-network # Database service db: image: postgres:14-alpine container_name: solarbank-db restart: always volumes: - postgres_data:/var/lib/postgresql/data/ env_file: - .env networks: - solarbank-network # Redis for caching and job queuing redis: image: redis:alpine container_name: solarbank-redis restart: always volumes: - redis_data:/data networks: - solarbank-network # Nginx reverse proxy nginx: build: ./nginx container_name: solarbank-nginx restart: always ports: - "80:80" - "443:443" volumes: - ./nginx/conf:/etc/nginx/conf.d - ./nginx/certbot/conf:/etc/letsencrypt - ./nginx/certbot/www:/var/www/certbot depends_on: - backend - frontend networks: - solarbank-network # Certbot for SSL certificates certbot: image: certbot/certbot container_name: solarbank-certbot volumes: - ./nginx/certbot/conf:/etc/letsencrypt - ./nginx/certbot/www:/var/www/certbot entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'" volumes: postgres_data: redis_data: networks: solarbank-network: driver: bridge