version: '3.8' services: postgres: image: pgvector/pgvector:pg16 container_name: revintel-postgres environment: POSTGRES_DB: revintel POSTGRES_USER: ${DB_USER:-revintel} POSTGRES_PASSWORD: ${DB_PASSWORD:-revintel} volumes: - postgres_data:/var/lib/postgresql/data - ./init-scripts:/docker-entrypoint-initdb.d healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-revintel}"] interval: 5s timeout: 5s retries: 5 ports: - "5432:5432" redis: image: redis:7-alpine container_name: revintel-redis volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 ports: - "6379:6379" minio: image: minio/minio:latest container_name: revintel-minio command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} volumes: - minio_data:/data ports: - "9000:9000" - "9001:9001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 10s timeout: 5s retries: 5 weaviate: image: cr.weaviate.io/semitechnologies/weaviate:1.25 container_name: revintel-weaviate environment: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: /var/lib/weaviate DEFAULT_VECTORIZER_MODULE: none ENABLE_MODULES: "" volumes: - weaviate_data:/var/lib/weaviate ports: - "8080:8080" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/v1/.well-known/ready"] interval: 10s timeout: 5s retries: 5 ollama: image: ollama/ollama:latest container_name: revintel-ollama volumes: - ollama_data:/root/.ollama environment: OLLAMA_HOST: 0.0.0.0 ports: - "11434:11434" healthcheck: test: ["CMD", "ollama", "list"] interval: 10s timeout: 5s retries: 5 api: build: context: ./backend dockerfile: Dockerfile container_name: revintel-api environment: DATABASE_URL: postgresql://${DB_USER:-revintel}:${DB_PASSWORD:-revintel}@postgres:5432/revintel REDIS_URL: redis://redis:6379/0 MINIO_ENDPOINT: http://minio:9000 MINIO_ACCESS_KEY: ${MINIO_ROOT_USER:-minioadmin} MINIO_SECRET_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin} MINIO_BUCKET: revintel-recordings WEAVIATE_URL: http://weaviate:8080 OLLAMA_BASE_URL: http://ollama:11434 SECRET_KEY: ${SECRET_KEY:-dev-secret-change-in-production} JWT_ALGORITHM: RS256 JWT_PRIVATE_KEY_PATH: /secrets/jwt_private.pem JWT_PUBLIC_KEY_PATH: /secrets/jwt_public.pem ENVIRONMENT: development DEBUG: "true" OPENAI_API_KEY: ${OPENAI_API_KEY:-} ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} # Meeting Platform OAuth ZOOM_CLIENT_ID: ${ZOOM_CLIENT_ID:-} ZOOM_CLIENT_SECRET: ${ZOOM_CLIENT_SECRET:-} ZOOM_WEBHOOK_SECRET: ${ZOOM_WEBHOOK_SECRET:-} TEAMS_CLIENT_ID: ${TEAMS_CLIENT_ID:-} TEAMS_CLIENT_SECRET: ${TEAMS_CLIENT_SECRET:-} TEAMS_TENANT_ID: ${TEAMS_TENANT_ID:-} MEET_CLIENT_ID: ${MEET_CLIENT_ID:-} MEET_CLIENT_SECRET: ${MEET_CLIENT_SECRET:-} # CRM SALESFORCE_CLIENT_ID: ${SALESFORCE_CLIENT_ID:-} SALESFORCE_CLIENT_SECRET: ${SALESFORCE_CLIENT_SECRET:-} HUBSPOT_CLIENT_ID: ${HUBSPOT_CLIENT_ID:-} HUBSPOT_CLIENT_SECRET: ${HUBSPOT_CLIENT_SECRET:-} PIPEDRIVE_CLIENT_ID: ${PIPEDRIVE_CLIENT_ID:-} PIPEDRIVE_CLIENT_SECRET: ${PIPEDRIVE_CLIENT_SECRET:-} # Slack SLACK_SIGNING_SECRET: ${SLACK_SIGNING_SECRET:-} SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN:-} SLACK_APP_TOKEN: ${SLACK_APP_TOKEN:-} # Email SENDGRID_API_KEY: ${SENDGRID_API_KEY:-} SENDGRID_FROM_EMAIL: ${SENDGRID_FROM_EMAIL:-} # Monitoring SENTRY_DSN: ${SENTRY_DSN:-} volumes: - ./backend:/app - ./secrets:/secrets:ro depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_healthy ollama: condition: service_healthy ports: - "8000:8000" command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload worker: build: context: ./backend dockerfile: Dockerfile container_name: revintel-worker command: celery -A app.workers.celery_app worker -l info -Q transcription,analysis,coaching,forecast,sync,search,alert,report,integration,admin,default --concurrency=4 environment: DATABASE_URL: postgresql://${DB_USER:-revintel}:${DB_PASSWORD:-revintel}@postgres:5432/revintel REDIS_URL: redis://redis:6379/0 MINIO_ENDPOINT: http://minio:9000 MINIO_ACCESS_KEY: ${MINIO_ROOT_USER:-minioadmin} MINIO_SECRET_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin} MINIO_BUCKET: revintel-recordings WEAVIATE_URL: http://weaviate:8080 OLLAMA_BASE_URL: http://ollama:11434 SECRET_KEY: ${SECRET_KEY:-dev-secret-change-in-production} OPENAI_API_KEY: ${OPENAI_API_KEY:-} ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} depends_on: postgres: condition: service_healthy redis: condition: service_healthy ollama: condition: service_healthy deploy: replicas: 2 worker-gpu: build: context: ./backend dockerfile: Dockerfile.gpu container_name: revintel-worker-gpu command: celery -A app.workers.celery_app worker -l info -Q transcription --concurrency=1 environment: DATABASE_URL: postgresql://${DB_USER:-revintel}:${DB_PASSWORD:-revintel}@postgres:5432/revintel REDIS_URL: redis://redis:6379/0 MINIO_ENDPOINT: http://minio:9000 MINIO_ACCESS_KEY: ${MINIO_ROOT_USER:-minioadmin} MINIO_SECRET_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin} MINIO_BUCKET: revintel-recordings WEAVIATE_URL: http://weaviate:8080 OLLAMA_BASE_URL: http://ollama:11434 SECRET_KEY: ${SECRET_KEY:-dev-secret-change-in-production} WHISPER_MODEL: large-v3 WHISPER_DEVICE: cuda WHISPER_COMPUTE_TYPE: float16 DIARIZATION_MODEL: pyannote/speaker-diarization-3.1 GPU_ENABLED: "true" depends_on: postgres: condition: service_healthy redis: condition: service_healthy ollama: condition: service_healthy deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] flower: build: context: ./backend dockerfile: Dockerfile container_name: revintel-flower command: celery -A app.workers.celery_app flower --port=5555 --basic_auth=admin:${FLOWER_PASSWORD:-admin} environment: CELERY_BROKER_URL: redis://redis:6379/1 CELERY_RESULT_BACKEND: redis://redis:6379/2 ports: - "5555:5555" depends_on: - redis frontend: build: context: ./frontend dockerfile: Dockerfile container_name: revintel-frontend ports: - "3000:80" depends_on: - api volumes: postgres_data: redis_data: minio_data: weaviate_data: ollama_data: