version: "3.9" services: db: image: postgres:16 environment: POSTGRES_DB: chat POSTGRES_USER: chat POSTGRES_PASSWORD: chat volumes: - db-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U chat -d chat"] interval: 5s timeout: 3s retries: 20 ports: - "5432:5432" keycloak: image: quay.io/keycloak/keycloak:26.1 command: ["start-dev", "--import-realm"] environment: KC_DB: postgres KC_DB_URL: jdbc:postgresql://db:5432/chat KC_DB_USERNAME: chat KC_DB_PASSWORD: chat KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin # Optional hostname settings for local dev KC_HTTP_ENABLED: "true" depends_on: db: condition: service_healthy ports: - "8081:8080" volumes: - keycloak-data:/opt/keycloak/data - ./keycloak/realm-export:/opt/keycloak/data/import healthcheck: test: ["CMD-SHELL", "curl -fsS http://localhost:8080/health/ready || exit 1"] interval: 5s timeout: 5s retries: 40 start_period: 30s backend: build: context: ./backend environment: PORT: 8080 DATASOURCE_URL: jdbc:postgresql://db:5432/chat DATASOURCE_USERNAME: chat DATASOURCE_PASSWORD: chat KEYCLOAK_ISSUER_URI: http://keycloak:8080/realms/chat CORS_ALLOWED_ORIGINS: http://localhost:8082 depends_on: db: condition: service_healthy keycloak: condition: service_healthy restart: unless-stopped ports: - "8080:8080" frontend: build: context: ./frontend args: VITE_API_URL: http://localhost:8080 VITE_WS_URL: ws://localhost:8080/ws VITE_KEYCLOAK_URL: http://localhost:8081 VITE_KEYCLOAK_REALM: chat VITE_KEYCLOAK_CLIENT_ID: chat-web depends_on: - backend ports: - "8082:80" volumes: db-data: keycloak-data: