name: sim-with-ollama services: # Main Sim Studio Application simstudio: build: context: . dockerfile: docker/app.Dockerfile ports: - '3000:3000' deploy: resources: limits: memory: 8G environment: - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-simstudio} - BETTER_AUTH_URL=${NEXT_PUBLIC_APP_URL:-http://localhost:3000} - NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL:-http://localhost:3000} - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET:-sim_auth_secret_$(openssl rand -hex 16)} - ENCRYPTION_KEY=${ENCRYPTION_KEY:-$(openssl rand -hex 32)} - COPILOT_API_KEY=${COPILOT_API_KEY} - SIM_AGENT_API_URL=${SIM_AGENT_API_URL} - OLLAMA_URL=http://ollama:11434 - NEXT_PUBLIC_SOCKET_URL=${NEXT_PUBLIC_SOCKET_URL:-http://localhost:3002} depends_on: db: condition: service_healthy migrations: condition: service_completed_successfully realtime: condition: service_healthy healthcheck: test: ['CMD', 'wget', '--spider', '--quiet', 'http://127.0.0.1:3000'] interval: 90s timeout: 5s retries: 3 start_period: 10s restart: unless-stopped # Realtime Socket Server realtime: build: context: . dockerfile: docker/realtime.Dockerfile environment: - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-simstudio} - NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL:-http://localhost:3000} - BETTER_AUTH_URL=${BETTER_AUTH_URL:-http://localhost:3000} - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET:-sim_auth_secret_$(openssl rand -hex 16)} depends_on: db: condition: service_healthy restart: unless-stopped ports: - '3002:3002' deploy: resources: limits: memory: 8G healthcheck: test: ['CMD', 'wget', '--spider', '--quiet', 'http://127.0.0.1:3002/health'] interval: 90s timeout: 5s retries: 3 start_period: 10s # Database Migrations migrations: build: context: . dockerfile: docker/db.Dockerfile environment: - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-simstudio} depends_on: db: condition: service_healthy command: ['bun', 'run', 'db:migrate'] restart: 'no' # PostgreSQL Database with Vector Extension db: image: pgvector/pgvector:pg17 restart: always ports: - '${POSTGRES_PORT:-5432}:5432' environment: - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres} - POSTGRES_DB=${POSTGRES_DB:-simstudio} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ['CMD-SHELL', 'pg_isready -U postgres'] interval: 5s timeout: 5s retries: 5 # Ollama with GPU support (default) ollama: profiles: - gpu image: ollama/ollama:latest pull_policy: always volumes: - ollama_data:/root/.ollama ports: - '11434:11434' environment: - NVIDIA_DRIVER_CAPABILITIES=all - OLLAMA_LOAD_TIMEOUT=-1 - OLLAMA_KEEP_ALIVE=-1 - OLLAMA_DEBUG=1 - OLLAMA_HOST=0.0.0.0:11434 command: 'serve' deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] healthcheck: test: ['CMD', 'ollama', 'list'] interval: 10s timeout: 5s retries: 5 start_period: 30s restart: unless-stopped # Ollama CPU-only version (use with --profile cpu profile) ollama-cpu: profiles: - cpu image: ollama/ollama:latest pull_policy: always volumes: - ollama_data:/root/.ollama ports: - '11434:11434' environment: - OLLAMA_LOAD_TIMEOUT=-1 - OLLAMA_KEEP_ALIVE=-1 - OLLAMA_DEBUG=1 - OLLAMA_HOST=0.0.0.0:11434 command: 'serve' healthcheck: test: ['CMD', 'ollama', 'list'] interval: 10s timeout: 5s retries: 5 start_period: 30s restart: unless-stopped networks: default: aliases: - ollama # Helper container to pull models automatically model-setup: image: ollama/ollama:latest profiles: - setup volumes: - ollama_data:/root/.ollama environment: - OLLAMA_HOST=ollama:11434 entrypoint: ["/bin/sh", "-lc"] command: > sh -c " echo 'Waiting for Ollama to be ready...' && until ollama list >/dev/null 2>&1; do echo 'Waiting for Ollama...'; sleep 2; done && echo 'Pulling gemma3:4b model (recommended starter model)...' && ollama pull gemma3:4b && echo 'Model setup complete! You can now use gemma3:4b in Sim.' && echo 'To add more models, run: docker compose -f docker-compose.ollama.yml exec ollama ollama pull ' " restart: 'no' volumes: postgres_data: ollama_data: