# CRITICALversion: "3.9" services: postgres: image: postgres:16 container_name: vllm-studio-postgres ports: - "5432:5432" environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=litellm volumes: - ./data/postgres:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 # LiteLLM - API gateway (handles routing, format translation, cost tracking) litellm: image: ghcr.io/berriai/litellm:main-latest container_name: vllm-studio-litellm ports: - "4100:4000" volumes: - ./config/litellm.yaml:/app/config.yaml - ./config/tool_call_handler.py:/app/tool_call_handler.py - ./data:/app/data environment: - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY:-sk-master} - DATABASE_URL=postgresql://postgres:postgres@vllm-studio-postgres:5432/litellm?connect_timeout=10&pool_pre_ping=true&pool_size=5&max_overflow=10 - INFERENCE_API_BASE=${INFERENCE_API_BASE:-http://host.docker.internal:8000/v1} - INFERENCE_API_KEY=${INFERENCE_API_KEY:-sk-placeholder} - PYTHONPATH=/app extra_hosts: - "host.docker.internal:host-gateway" command: ["--config", "/app/config.yaml", "--port", "4000"] restart: unless-stopped depends_on: postgres: condition: service_started healthcheck: test: ["CMD-SHELL", "python -c \"import urllib.request, urllib.error, sys; req = urllib.request.Request('http://localhost:4000/health');\ntry:\n urllib.request.urlopen(req, timeout=5)\n sys.exit(0)\nexcept urllib.error.HTTPError as e:\n sys.exit(0 if e.code == 401 else 1)\nexcept Exception:\n sys.exit(1)\n\""] interval: 30s timeout: 10s retries: 3 start_period: 40s # Redis - Caching and rate limiting for LiteLLM redis: image: redis:7-alpine container_name: vllm-studio-redis ports: - "6379:6379" volumes: - ./data/redis:/data command: redis-server --appendonly yes --save 60 1 restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 # Prometheus - Time-series metrics collection prometheus: image: prom/prometheus:latest container_name: vllm-studio-prometheus ports: - "9090:9090" volumes: - ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./data/prometheus:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=30d' - '--web.enable-lifecycle' restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" # Frontend - Next.js web UI frontend: build: context: ./frontend args: NEXT_PUBLIC_API_URL: "" container_name: vllm-studio-frontend network_mode: host volumes: - ./data:/app/data environment: - BACKEND_URL=http://localhost:8080 - LITELLM_URL=http://localhost:4100 - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY:-sk-master} - API_KEY=${VLLM_STUDIO_API_KEY:-} - NEXT_PUBLIC_LITELLM_URL=${NEXT_PUBLIC_LITELLM_URL:-http://localhost:4100} - EXA_API_KEY=${EXA_API_KEY:-} - RAG_ENDPOINT=${RAG_ENDPOINT:-http://localhost:3002} restart: unless-stopped
# CRITICAL
version: "3.9"
services:
postgres:
image: postgres:16
container_name: vllm-studio-postgres
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=litellm
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
# LiteLLM - API gateway (handles routing, format translation, cost tracking)
litellm:
image: ghcr.io/berriai/litellm:main-latest
container_name: vllm-studio-litellm
ports:
- "4100:4000"
volumes:
- ./config/litellm.yaml:/app/config.yaml
- ./config/tool_call_handler.py:/app/tool_call_handler.py
- ./data:/app/data
environment:
- LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY:-sk-master}
- DATABASE_URL=postgresql://postgres:postgres@vllm-studio-postgres:5432/litellm?connect_timeout=10&pool_pre_ping=true&pool_size=5&max_overflow=10
- INFERENCE_API_BASE=${INFERENCE_API_BASE:-http://host.docker.internal:8000/v1}
- INFERENCE_API_KEY=${INFERENCE_API_KEY:-sk-placeholder}
- PYTHONPATH=/app
extra_hosts:
- "host.docker.internal:host-gateway"
command: ["--config", "/app/config.yaml", "--port", "4000"]
restart: unless-stopped
depends_on:
postgres:
condition: service_started
healthcheck:
test: ["CMD-SHELL", "python -c \"import urllib.request, urllib.error, sys; req = urllib.request.Request('http://localhost:4000/health');\ntry:\n urllib.request.urlopen(req, timeout=5)\n sys.exit(0)\nexcept urllib.error.HTTPError as e:\n sys.exit(0 if e.code == 401 else 1)\nexcept Exception:\n sys.exit(1)\n\""]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Redis - Caching and rate limiting for LiteLLM
redis:
image: redis:7-alpine
container_name: vllm-studio-redis
ports:
- "6379:6379"
volumes:
- ./data/redis:/data
command: redis-server --appendonly yes --save 60 1
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
# Prometheus - Time-series metrics collection
prometheus:
image: prom/prometheus:latest
container_name: vllm-studio-prometheus
ports:
- "9090:9090"
volumes:
- ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./data/prometheus:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
restart: unless-stopped
extra_hosts:
- "host.docker.internal:host-gateway"
# Frontend - Next.js web UI
frontend:
build:
context: ./frontend
args:
NEXT_PUBLIC_API_URL: ""
container_name: vllm-studio-frontend
network_mode: host
volumes:
- ./data:/app/data
environment:
- BACKEND_URL=http://localhost:8080
- LITELLM_URL=http://localhost:4100
- LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY:-sk-master}
- API_KEY=${VLLM_STUDIO_API_KEY:-}
- NEXT_PUBLIC_LITELLM_URL=${NEXT_PUBLIC_LITELLM_URL:-http://localhost:4100}
- EXA_API_KEY=${EXA_API_KEY:-}
- RAG_ENDPOINT=${RAG_ENDPOINT:-http://localhost:3002}
restart: unless-stopped