Initial commit: Virtual Board Member AI System foundation

This commit is contained in:
Jonathan Pressnell
2025-08-07 16:11:14 -04:00
commit fbfe940a45
47 changed files with 7332 additions and 0 deletions

249
docker-compose.dev.yml Normal file
View File

@@ -0,0 +1,249 @@
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: