version: '3.8' services: # PostgreSQL Database postgres: image: postgres:15-alpine container_name: vbm-postgres environment: POSTGRES_DB: vbm_db POSTGRES_USER: vbm_user POSTGRES_PASSWORD: vbm_password ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U vbm_user -d vbm_db"] interval: 10s timeout: 5s retries: 5 # Redis Cache redis: image: redis:7-alpine container_name: vbm-redis ports: - "6379:6379" volumes: - redis_data:/data command: redis-server --appendonly yes healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # Qdrant Vector Database qdrant: image: qdrant/qdrant:latest container_name: vbm-qdrant ports: - "6333:6333" - "6334:6334" volumes: - qdrant_data:/qdrant/storage environment: QDRANT__SERVICE__HTTP_PORT: 6333 QDRANT__SERVICE__GRPC_PORT: 6334 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:6333/health"] interval: 30s timeout: 10s retries: 3 # MinIO Object Storage minio: image: minio/minio:latest container_name: vbm-minio ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin volumes: - minio_data:/data command: server /data --console-address ":9001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 10s retries: 3 # Kafka Message Queue zookeeper: image: confluentinc/cp-zookeeper:latest container_name: vbm-zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ports: - "2181:2181" kafka: image: confluentinc/cp-kafka:latest container_name: vbm-kafka depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" KAFKA_DELETE_TOPIC_ENABLE: "true" healthcheck: test: ["CMD-SHELL", "kafka-topics --bootstrap-server localhost:9092 --list"] interval: 30s timeout: 10s retries: 3 # Prometheus Monitoring prometheus: image: prom/prometheus:latest container_name: vbm-prometheus ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--storage.tsdb.retention.time=200h' - '--web.enable-lifecycle' # Grafana Dashboard grafana: image: grafana/grafana:latest container_name: vbm-grafana ports: - "3000:3000" environment: GF_SECURITY_ADMIN_PASSWORD: admin GF_USERS_ALLOW_SIGN_UP: false volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources # Elasticsearch for Logging elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 container_name: vbm-elasticsearch environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - "9200:9200" volumes: - elasticsearch_data:/usr/share/elasticsearch/data healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"] interval: 30s timeout: 10s retries: 3 # Kibana for Log Analysis kibana: image: docker.elastic.co/kibana/kibana:8.11.0 container_name: vbm-kibana ports: - "5601:5601" environment: ELASTICSEARCH_HOSTS: http://elasticsearch:9200 depends_on: - elasticsearch # Jaeger for Distributed Tracing jaeger: image: jaegertracing/all-in-one:latest container_name: vbm-jaeger ports: - "16686:16686" - "14268:14268" environment: COLLECTOR_OTLP_ENABLED: true # Application (will be built from Dockerfile) app: build: context: . dockerfile: Dockerfile.dev container_name: vbm-app ports: - "8000:8000" environment: - DATABASE_URL=postgresql://vbm_user:vbm_password@postgres:5432/vbm_db - REDIS_URL=redis://redis:6379/0 - QDRANT_HOST=qdrant - QDRANT_PORT=6333 - MINIO_ENDPOINT=minio:9000 - KAFKA_BOOTSTRAP_SERVERS=kafka:9092 volumes: - .:/app - /app/__pycache__ depends_on: postgres: condition: service_healthy redis: condition: service_healthy qdrant: condition: service_healthy minio: condition: service_healthy kafka: condition: service_healthy command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload # Celery Worker for Background Tasks celery-worker: build: context: . dockerfile: Dockerfile.dev container_name: vbm-celery-worker environment: - DATABASE_URL=postgresql://vbm_user:vbm_password@postgres:5432/vbm_db - REDIS_URL=redis://redis:6379/1 - CELERY_BROKER_URL=redis://redis:6379/1 - CELERY_RESULT_BACKEND=redis://redis:6379/2 volumes: - .:/app depends_on: - postgres - redis command: celery -A app.core.celery worker --loglevel=info # Celery Beat for Scheduled Tasks celery-beat: build: context: . dockerfile: Dockerfile.dev container_name: vbm-celery-beat environment: - DATABASE_URL=postgresql://vbm_user:vbm_password@postgres:5432/vbm_db - REDIS_URL=redis://redis:6379/1 - CELERY_BROKER_URL=redis://redis:6379/1 - CELERY_RESULT_BACKEND=redis://redis:6379/2 volumes: - .:/app depends_on: - postgres - redis command: celery -A app.core.celery beat --loglevel=info volumes: postgres_data: redis_data: qdrant_data: minio_data: prometheus_data: grafana_data: elasticsearch_data: