services: db: image: postgres:16-alpine container_name: eeg-database restart: unless-stopped environment: - POSTGRES_DB=${POSTGRES_DB:-eegportal} - POSTGRES_USER=${POSTGRES_USER:-eeg} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set} volumes: - pg-data:/var/lib/postgresql/data networks: - eeg-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-eeg} -d ${POSTGRES_DB:-eegportal}"] interval: 10s timeout: 5s retries: 5 start_period: 30s backend: build: context: . dockerfile: Dockerfile container_name: eeg-backend restart: unless-stopped depends_on: db: condition: service_healthy environment: - SPRING_PROFILES_ACTIVE=prod - JWT_SECRET=${JWT_SECRET:?JWT_SECRET must be set} - APP_FRONTEND_URL=${APP_FRONTEND_URL:?APP_FRONTEND_URL must be set} - APP_BACKEND_URL=${APP_BACKEND_URL:?APP_BACKEND_URL must be set} - CORS_ORIGINS=${CORS_ORIGINS:?CORS_ORIGINS must be set} - DATABASE_URL=jdbc:postgresql://db:5432/${POSTGRES_DB:-eegportal} - DATABASE_DRIVER=org.postgresql.Driver - DATABASE_USERNAME=${POSTGRES_USER:-eeg} - DATABASE_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set} - MAIL_HOST=${MAIL_HOST:-} - MAIL_PORT=${MAIL_PORT:-587} - MAIL_USERNAME=${MAIL_USERNAME:-} - MAIL_PASSWORD=${MAIL_PASSWORD:-} - JAVA_OPTS=${JAVA_OPTS:--Xms256m -Xmx512m} networks: - eeg-network healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8080/actuator/health || exit 1"] interval: 30s timeout: 5s retries: 3 start_period: 60s frontend: image: nginx:alpine container_name: eeg-frontend restart: unless-stopped ports: - "${APP_PORT:-80}:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro depends_on: backend: condition: service_healthy networks: - eeg-network volumes: pg-data: driver: local networks: eeg-network: driver: bridge