version: '3.8' services: # ======================================== # PostgreSQL Database # ======================================== postgres: image: postgres:16-alpine container_name: amici-scommesse-postgres restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-amici_scommesse} POSTGRES_USER: ${POSTGRES_USER:-admin} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-admin} PGDATA: /var/lib/postgresql/data/pgdata ports: - "${POSTGRES_PORT:-5432}:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-admin} -d ${POSTGRES_DB:-amici_scommesse}"] interval: 10s timeout: 5s retries: 5 networks: - amici-scommesse-network # ======================================== # MongoDB Database # ======================================== mongodb: image: mongo:7-jammy container_name: amici-scommesse-mongodb restart: unless-stopped environment: MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER:-root} MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-root@servovio} MONGO_INITDB_DATABASE: ${MONGO_DB:-amici-scommesse} ports: - "${MONGO_PORT:-27017}:27017" volumes: - mongodb_data:/data/db - mongodb_config:/data/configdb healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 10s timeout: 5s retries: 5 networks: - amici-scommesse-network # ======================================== # Backend Node.js (Production) # ======================================== backend: build: context: . dockerfile: Dockerfile target: production container_name: amici-scommesse-backend restart: unless-stopped depends_on: postgres: condition: service_healthy mongodb: condition: service_healthy environment: NODE_ENV: production PORT: ${PORT:-3000} # PostgreSQL connection (using service name as host) POSTGRES_HOST: postgres POSTGRES_PORT: 5432 POSTGRES_DB: ${POSTGRES_DB:-amici_scommesse} POSTGRES_USER: ${POSTGRES_USER:-admin} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-admin} POSTGRES_URI: postgres://${POSTGRES_USER:-admin}:${POSTGRES_PASSWORD:-admin}@postgres:5432/${POSTGRES_DB:-amici_scommesse} # MongoDB connection (using service name as host) MONGO_HOST: mongodb MONGO_PORT: 27017 MONGO_DB: ${MONGO_DB:-amici-scommesse} MONGO_USER: ${MONGO_USER:-root} MONGO_PASSWORD: ${MONGO_PASSWORD:-root@servovio} MONGO_AUTH_SOURCE: ${MONGO_AUTH_SOURCE:-admin} MONGO_URI: mongodb://${MONGO_USER:-root}:${MONGO_PASSWORD:-root@servovio}@mongodb:27017/${MONGO_DB:-amici-scommesse}?authSource=${MONGO_AUTH_SOURCE:-admin} # Application config LOG_LEVEL: ${LOG_LEVEL:-info} ENABLE_SQL_LOGGING: ${ENABLE_SQL_LOGGING:-false} CORS_ORIGIN: ${CORS_ORIGIN:-*} MOCK_USER_NAME: ${MOCK_USER_NAME:-Mario Rossi} DB_SYNC_FORCE: ${DB_SYNC_FORCE:-false} ports: - "${PORT:-3000}:3000" healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"] interval: 30s timeout: 10s start_period: 40s retries: 3 networks: - amici-scommesse-network # ======================================== # Networks # ======================================== networks: amici-scommesse-network: driver: bridge name: amici-scommesse-network # ======================================== # Volumes # ======================================== volumes: postgres_data: name: amici-scommesse-postgres-data mongodb_data: name: amici-scommesse-mongodb-data mongodb_config: name: amici-scommesse-mongodb-config