version: '3.8' services: # PostgreSQL Database postgres: image: postgres:15-alpine container_name: scommetti-postgres environment: POSTGRES_DB: amici_scommesse POSTGRES_USER: admin POSTGRES_PASSWORD: admin ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./backend-node/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - scommetti-network healthcheck: test: ["CMD-SHELL", "pg_isready -U admin -d amici_scommesse"] interval: 10s timeout: 5s retries: 5 # MongoDB Database mongodb: image: mongo:7 container_name: scommetti-mongodb environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root@servovio MONGO_INITDB_DATABASE: amici-scommesse ports: - "27017:27017" volumes: - mongodb_data:/data/db networks: - scommetti-network healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 10s timeout: 5s retries: 5 # Keycloak Database keycloak-db: image: postgres:15-alpine container_name: scommetti-keycloak-db environment: POSTGRES_DB: keycloak POSTGRES_USER: keycloak POSTGRES_PASSWORD: keycloak volumes: - keycloak_db_data:/var/lib/postgresql/data networks: - scommetti-network healthcheck: test: ["CMD-SHELL", "pg_isready -U keycloak -d keycloak"] interval: 10s timeout: 5s retries: 5 # Keycloak Auth Server keycloak: image: quay.io/keycloak/keycloak:23.0.0 container_name: scommetti-keycloak command: start-dev --import-realm environment: KC_DB: postgres KC_DB_URL: jdbc:postgresql://keycloak-db:5432/keycloak KC_DB_USERNAME: keycloak KC_DB_PASSWORD: keycloak KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin KC_HEALTH_ENABLED: "true" KC_METRICS_ENABLED: "true" KC_HOSTNAME_STRICT: "false" KC_HTTP_ENABLED: "true" ports: - "8080:8080" volumes: - ./keycloak/realm-export.json:/opt/keycloak/data/import/realm.json:ro - ./keycloak/themes/scommettiapp:/opt/keycloak/themes/scommettiapp:ro depends_on: keycloak-db: condition: service_healthy networks: - scommetti-network healthcheck: test: ["CMD-SHELL", "exec 3<>/dev/tcp/localhost/8080 && printf 'GET /health/ready HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' >&3 && timeout 5 cat <&3 | grep -q 'UP'"] interval: 15s timeout: 15s retries: 10 start_period: 90s # Backend Node.js backend: build: context: ./backend-node dockerfile: Dockerfile container_name: scommetti-backend environment: NODE_ENV: development PORT: 3000 POSTGRES_URI: postgres://admin:admin@postgres:5432/amici_scommesse MONGO_URI: mongodb://mongodb:27017/amici-scommesse KEYCLOAK_JWKS_URI: http://keycloak:8080/realms/scommettiapp/protocol/openid-connect/certs ports: - "3000:3000" volumes: - ./backend-node:/app - /app/node_modules depends_on: postgres: condition: service_healthy mongodb: condition: service_healthy keycloak: condition: service_healthy networks: - scommetti-network command: npm start restart: unless-stopped # Frontend Angular frontend: build: context: ./frontend-angular-new dockerfile: Dockerfile container_name: scommetti-frontend environment: NODE_ENV: development ports: - "4200:4200" volumes: - ./frontend-angular-new:/app - /app/node_modules - /app/.angular depends_on: - backend - keycloak networks: - scommetti-network restart: unless-stopped volumes: postgres_data: driver: local mongodb_data: driver: local keycloak_db_data: driver: local networks: scommetti-network: driver: bridge