services: postgres: image: postgres:16-alpine container_name: sarvamdesk-postgres environment: POSTGRES_USER: ${POSTGRES_USER:-sarvamdesk} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sarvamdesk_secret} POSTGRES_DB: ${POSTGRES_DB:-sarvamdesk_auth} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./docker/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U sarvamdesk"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: sarvamdesk-redis ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 zookeeper: image: confluentinc/cp-zookeeper:7.5.3 container_name: sarvamdesk-zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ports: - "2181:2181" healthcheck: test: ["CMD", "nc", "-z", "localhost", "2181"] interval: 10s timeout: 5s retries: 5 kafka: image: confluentinc/cp-kafka:7.5.3 container_name: sarvamdesk-kafka depends_on: zookeeper: condition: service_healthy environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" ports: - "9092:9092" healthcheck: test: ["CMD", "kafka-broker-api-versions", "--bootstrap-server", "localhost:9092"] interval: 10s timeout: 10s retries: 5 # --- Spring Boot Services (optional - run with: docker-compose --profile apps up) --- auth-service: build: context: ./auth-service dockerfile: Dockerfile container_name: sarvamdesk-auth depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: docker,observability OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4318 POSTGRES_USER: ${POSTGRES_USER:-sarvamdesk} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sarvamdesk_secret} VAULT_URI: http://vault:8200 VAULT_TOKEN: ${VAULT_TOKEN:-root} ports: - "8081:8081" profiles: - apps api-gateway: build: context: ./api-gateway dockerfile: Dockerfile container_name: sarvamdesk-gateway depends_on: auth-service: condition: service_started redis: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: docker,observability OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4318 ports: - "8080:8080" profiles: - apps ticket-service: build: context: ./ticket-service dockerfile: Dockerfile container_name: sarvamdesk-ticket depends_on: postgres: condition: service_healthy redis: condition: service_healthy kafka: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: docker,observability OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4318 POSTGRES_USER: ${POSTGRES_USER:-sarvamdesk} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sarvamdesk_secret} ports: - "8082:8082" profiles: - apps asset-service: build: context: ./asset-service dockerfile: Dockerfile container_name: sarvamdesk-asset depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: docker,observability OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4318 POSTGRES_USER: ${POSTGRES_USER:-sarvamdesk} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sarvamdesk_secret} ports: - "8083:8083" profiles: - apps notification-service: build: context: ./notification-service dockerfile: Dockerfile container_name: sarvamdesk-notification depends_on: kafka: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: docker,observability OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4318 ports: - "8084:8084" profiles: - apps knowledge-base-service: build: context: ./knowledge-base-service dockerfile: Dockerfile container_name: sarvamdesk-kb depends_on: postgres: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: docker,observability OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4318 POSTGRES_USER: ${POSTGRES_USER:-sarvamdesk} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sarvamdesk_secret} ports: - "8085:8085" profiles: - apps frontend: build: context: ./frontend dockerfile: Dockerfile args: VITE_API_URL: http://localhost:8080 container_name: sarvamdesk-frontend depends_on: - api-gateway ports: - "3000:80" profiles: - apps # --- Observability (run with: docker-compose --profile observability up) --- prometheus: image: prom/prometheus:v2.48.0 container_name: sarvamdesk-prometheus volumes: - ./docker/prometheus.yml:/etc/prometheus/prometheus.yml - ./docker/prometheus-alerts.yml:/etc/prometheus/alerts.yml - prometheus_data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--web.enable-lifecycle" ports: - "9090:9090" profiles: - observability alertmanager: image: prom/alertmanager:v0.26.0 container_name: sarvamdesk-alertmanager volumes: - ./docker/alertmanager.yml:/etc/alertmanager/alertmanager.yml command: - "--config.file=/etc/alertmanager/alertmanager.yml" ports: - "9093:9093" profiles: - observability grafana: image: grafana/grafana:10.2.2 container_name: sarvamdesk-grafana environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin GF_USERS_ALLOW_SIGN_UP: "false" GF_SERVER_HTTP_PORT: 3001 volumes: - grafana_data:/var/lib/grafana - ./docker/grafana/provisioning:/etc/grafana/provisioning ports: - "3001:3001" depends_on: - prometheus profiles: - observability loki: image: grafana/loki:2.9.2 container_name: sarvamdesk-loki ports: - "3100:3100" command: -config.file=/etc/loki/local-config.yaml volumes: - loki_data:/loki profiles: - observability promtail: image: grafana/promtail:2.9.2 container_name: sarvamdesk-promtail volumes: - /var/run/docker.sock:/var/run/docker.sock - ./docker/promtail-config.yml:/etc/promtail/config.yml command: -config.file=/etc/promtail/config.yml depends_on: - loki profiles: - observability jaeger: image: jaegertracing/all-in-one:1.52 container_name: sarvamdesk-jaeger environment: COLLECTOR_OTLP_ENABLED: "true" ports: - "16686:16686" - "4317:4317" - "4318:4318" profiles: - observability vault: image: hashicorp/vault:1.15 container_name: sarvamdesk-vault cap_add: - IPC_LOCK environment: VAULT_DEV_ROOT_TOKEN_ID: root VAULT_DEV_LISTEN_ADDRESS: 0.0.0.0:8200 ports: - "8200:8200" command: server -dev profiles: - vault volumes: postgres_data: prometheus_data: grafana_data: loki_data: