diff --git a/README.md b/README.md
index 317aa02b9..aa25eda53 100644
--- a/README.md
+++ b/README.md
@@ -89,6 +89,36 @@ Wait for the model to download, then visit [http://localhost:3000](http://localh
docker compose -f docker-compose.ollama.yml exec ollama ollama pull llama3.1:8b
```
+#### Using an External Ollama Instance
+
+If you already have Ollama running on your host machine (outside Docker), you need to configure the `OLLAMA_URL` to use `host.docker.internal` instead of `localhost`:
+
+```bash
+# Docker Desktop (macOS/Windows)
+OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d
+
+# Linux (add extra_hosts or use host IP)
+docker compose -f docker-compose.prod.yml up -d # Then set OLLAMA_URL to your host's IP
+```
+
+**Why?** When running inside Docker, `localhost` refers to the container itself, not your host machine. `host.docker.internal` is a special DNS name that resolves to the host.
+
+For Linux users, you can either:
+- Use your host machine's actual IP address (e.g., `http://192.168.1.100:11434`)
+- Add `extra_hosts: ["host.docker.internal:host-gateway"]` to the simstudio service in your compose file
+
+#### Using vLLM
+
+Sim also supports [vLLM](https://docs.vllm.ai/) for self-hosted models with OpenAI-compatible API:
+
+```bash
+# Set these environment variables
+VLLM_BASE_URL=http://your-vllm-server:8000
+VLLM_API_KEY=your_optional_api_key # Only if your vLLM instance requires auth
+```
+
+When running with Docker, use `host.docker.internal` if vLLM is on your host machine (same as Ollama above).
+
### Self-hosted: Dev Containers
1. Open VS Code with the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
@@ -190,6 +220,46 @@ Copilot is a Sim-managed service. To use Copilot on a self-hosted instance:
- Go to https://sim.ai → Settings → Copilot and generate a Copilot API key
- Set `COPILOT_API_KEY` environment variable in your self-hosted apps/sim/.env file to that value
+## Environment Variables
+
+Key environment variables for self-hosted deployments (see `apps/sim/.env.example` for full list):
+
+| Variable | Required | Description |
+|----------|----------|-------------|
+| `DATABASE_URL` | Yes | PostgreSQL connection string with pgvector |
+| `BETTER_AUTH_SECRET` | Yes | Auth secret (`openssl rand -hex 32`) |
+| `BETTER_AUTH_URL` | Yes | Your app URL (e.g., `http://localhost:3000`) |
+| `NEXT_PUBLIC_APP_URL` | Yes | Public app URL (same as above) |
+| `ENCRYPTION_KEY` | Yes | Encryption key (`openssl rand -hex 32`) |
+| `OLLAMA_URL` | No | Ollama server URL (default: `http://localhost:11434`) |
+| `VLLM_BASE_URL` | No | vLLM server URL for self-hosted models |
+| `COPILOT_API_KEY` | No | API key from sim.ai for Copilot features |
+
+## Troubleshooting
+
+### Ollama models not showing in dropdown (Docker)
+
+If you're running Ollama on your host machine and Sim in Docker, change `OLLAMA_URL` from `localhost` to `host.docker.internal`:
+
+```bash
+OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d
+```
+
+See [Using an External Ollama Instance](#using-an-external-ollama-instance) for details.
+
+### Database connection issues
+
+Ensure PostgreSQL has the pgvector extension installed. When using Docker, wait for the database to be healthy before running migrations.
+
+### Port conflicts
+
+If ports 3000, 3002, or 5432 are in use, configure alternatives:
+
+```bash
+# Custom ports
+NEXT_PUBLIC_APP_URL=http://localhost:3100 POSTGRES_PORT=5433 docker compose up -d
+```
+
## Tech Stack
- **Framework**: [Next.js](https://nextjs.org/) (App Router)
diff --git a/apps/docs/content/docs/en/meta.json b/apps/docs/content/docs/en/meta.json
index 6b5bf74d4..235c7c506 100644
--- a/apps/docs/content/docs/en/meta.json
+++ b/apps/docs/content/docs/en/meta.json
@@ -13,7 +13,8 @@
"variables",
"execution",
"permissions",
- "sdks"
+ "sdks",
+ "self-hosting"
],
"defaultOpen": false
}
diff --git a/apps/docs/content/docs/en/self-hosting/docker.mdx b/apps/docs/content/docs/en/self-hosting/docker.mdx
new file mode 100644
index 000000000..4ee0450bf
--- /dev/null
+++ b/apps/docs/content/docs/en/self-hosting/docker.mdx
@@ -0,0 +1,150 @@
+---
+title: Docker
+description: Deploy Sim Studio with Docker Compose
+---
+
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
+import { Callout } from 'fumadocs-ui/components/callout'
+
+## Quick Start
+
+```bash
+# Clone and start
+git clone https://github.com/simstudioai/sim.git && cd sim
+docker compose -f docker-compose.prod.yml up -d
+```
+
+Open [http://localhost:3000](http://localhost:3000)
+
+## Production Setup
+
+### 1. Configure Environment
+
+```bash
+# Generate secrets
+cat > .env << EOF
+DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
+BETTER_AUTH_SECRET=$(openssl rand -hex 32)
+ENCRYPTION_KEY=$(openssl rand -hex 32)
+INTERNAL_API_SECRET=$(openssl rand -hex 32)
+NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
+BETTER_AUTH_URL=https://sim.yourdomain.com
+NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
+EOF
+```
+
+### 2. Start Services
+
+```bash
+docker compose -f docker-compose.prod.yml up -d
+```
+
+### 3. Set Up SSL
+
+
+
+Caddy automatically handles SSL certificates.
+
+```bash
+# Install Caddy
+sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
+curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
+curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
+sudo apt update && sudo apt install caddy
+```
+
+Create `/etc/caddy/Caddyfile`:
+```
+sim.yourdomain.com {
+ reverse_proxy localhost:3000
+
+ handle /socket.io/* {
+ reverse_proxy localhost:3002
+ }
+}
+```
+
+```bash
+sudo systemctl restart caddy
+```
+
+
+```bash
+# Install
+sudo apt install nginx certbot python3-certbot-nginx -y
+
+# Create /etc/nginx/sites-available/sim
+server {
+ listen 80;
+ server_name sim.yourdomain.com;
+
+ location / {
+ proxy_pass http://127.0.0.1:3000;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection 'upgrade';
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ }
+
+ location /socket.io/ {
+ proxy_pass http://127.0.0.1:3002;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ }
+}
+
+# Enable and get certificate
+sudo ln -s /etc/nginx/sites-available/sim /etc/nginx/sites-enabled/
+sudo certbot --nginx -d sim.yourdomain.com
+```
+
+
+
+## Ollama
+
+```bash
+# With GPU
+docker compose -f docker-compose.ollama.yml --profile gpu --profile setup up -d
+
+# CPU only
+docker compose -f docker-compose.ollama.yml --profile cpu --profile setup up -d
+```
+
+Pull additional models:
+```bash
+docker compose -f docker-compose.ollama.yml exec ollama ollama pull llama3.2
+```
+
+### External Ollama
+
+If Ollama runs on your host machine (not in Docker):
+
+```bash
+# macOS/Windows
+OLLAMA_URL=http://host.docker.internal:11434 docker compose -f docker-compose.prod.yml up -d
+
+# Linux - use your host IP
+OLLAMA_URL=http://192.168.1.100:11434 docker compose -f docker-compose.prod.yml up -d
+```
+
+
+ Inside Docker, `localhost` refers to the container, not your host. Use `host.docker.internal` or your host's IP.
+
+
+## Commands
+
+```bash
+# View logs
+docker compose -f docker-compose.prod.yml logs -f simstudio
+
+# Stop
+docker compose -f docker-compose.prod.yml down
+
+# Update
+docker compose -f docker-compose.prod.yml pull && docker compose -f docker-compose.prod.yml up -d
+
+# Backup database
+docker compose -f docker-compose.prod.yml exec db pg_dump -U postgres simstudio > backup.sql
+```
diff --git a/apps/docs/content/docs/en/self-hosting/environment-variables.mdx b/apps/docs/content/docs/en/self-hosting/environment-variables.mdx
new file mode 100644
index 000000000..6b105211a
--- /dev/null
+++ b/apps/docs/content/docs/en/self-hosting/environment-variables.mdx
@@ -0,0 +1,87 @@
+---
+title: Environment Variables
+description: Configuration reference for Sim Studio
+---
+
+import { Callout } from 'fumadocs-ui/components/callout'
+
+## Required
+
+| Variable | Description |
+|----------|-------------|
+| `DATABASE_URL` | PostgreSQL connection string |
+| `BETTER_AUTH_SECRET` | Auth secret (32 hex chars): `openssl rand -hex 32` |
+| `BETTER_AUTH_URL` | Your app URL |
+| `ENCRYPTION_KEY` | Encryption key (32 hex chars): `openssl rand -hex 32` |
+| `INTERNAL_API_SECRET` | Internal API secret (32 hex chars): `openssl rand -hex 32` |
+| `NEXT_PUBLIC_APP_URL` | Public app URL |
+| `NEXT_PUBLIC_SOCKET_URL` | WebSocket URL (default: `http://localhost:3002`) |
+
+## AI Providers
+
+| Variable | Provider |
+|----------|----------|
+| `OPENAI_API_KEY` | OpenAI |
+| `ANTHROPIC_API_KEY_1` | Anthropic Claude |
+| `GEMINI_API_KEY_1` | Google Gemini |
+| `MISTRAL_API_KEY` | Mistral |
+| `OLLAMA_URL` | Ollama (default: `http://localhost:11434`) |
+
+
+ For load balancing, add multiple keys with `_1`, `_2`, `_3` suffixes (e.g., `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`). Works with OpenAI, Anthropic, and Gemini.
+
+
+
+ In Docker, use `OLLAMA_URL=http://host.docker.internal:11434` for host-machine Ollama.
+
+
+### Azure OpenAI
+
+| Variable | Description |
+|----------|-------------|
+| `AZURE_OPENAI_API_KEY` | Azure OpenAI API key |
+| `AZURE_OPENAI_ENDPOINT` | Azure OpenAI endpoint URL |
+| `AZURE_OPENAI_API_VERSION` | API version (e.g., `2024-02-15-preview`) |
+
+### vLLM (Self-Hosted)
+
+| Variable | Description |
+|----------|-------------|
+| `VLLM_BASE_URL` | vLLM server URL (e.g., `http://localhost:8000/v1`) |
+| `VLLM_API_KEY` | Optional bearer token for vLLM |
+
+## OAuth Providers
+
+| Variable | Description |
+|----------|-------------|
+| `GOOGLE_CLIENT_ID` | Google OAuth client ID |
+| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret |
+| `GITHUB_CLIENT_ID` | GitHub OAuth client ID |
+| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret |
+
+## Optional
+
+| Variable | Description |
+|----------|-------------|
+| `API_ENCRYPTION_KEY` | Encrypts stored API keys (32 hex chars): `openssl rand -hex 32` |
+| `COPILOT_API_KEY` | API key for copilot features |
+| `ADMIN_API_KEY` | Admin API key for GitOps operations |
+| `RESEND_API_KEY` | Email service for notifications |
+| `ALLOWED_LOGIN_DOMAINS` | Restrict signups to domains (comma-separated) |
+| `ALLOWED_LOGIN_EMAILS` | Restrict signups to specific emails (comma-separated) |
+| `DISABLE_REGISTRATION` | Set to `true` to disable new user signups |
+
+## Example .env
+
+```bash
+DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
+BETTER_AUTH_SECRET=
+BETTER_AUTH_URL=https://sim.yourdomain.com
+ENCRYPTION_KEY=
+INTERNAL_API_SECRET=
+NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
+NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
+OPENAI_API_KEY=sk-...
+```
+
+See `apps/sim/.env.example` for all options.
diff --git a/apps/docs/content/docs/en/self-hosting/index.mdx b/apps/docs/content/docs/en/self-hosting/index.mdx
new file mode 100644
index 000000000..63ef74191
--- /dev/null
+++ b/apps/docs/content/docs/en/self-hosting/index.mdx
@@ -0,0 +1,50 @@
+---
+title: Self-Hosting
+description: Deploy Sim Studio on your own infrastructure
+---
+
+import { Card, Cards } from 'fumadocs-ui/components/card'
+import { Callout } from 'fumadocs-ui/components/callout'
+
+Deploy Sim Studio on your own infrastructure with Docker or Kubernetes.
+
+## Requirements
+
+| Resource | Minimum | Recommended |
+|----------|---------|-------------|
+| CPU | 2 cores | 4+ cores |
+| RAM | 12 GB | 16+ GB |
+| Storage | 20 GB SSD | 50+ GB SSD |
+| Docker | 20.10+ | Latest |
+
+## Quick Start
+
+```bash
+git clone https://github.com/simstudioai/sim.git && cd sim
+docker compose -f docker-compose.prod.yml up -d
+```
+
+Open [http://localhost:3000](http://localhost:3000)
+
+## Deployment Options
+
+
+
+ Deploy with Docker Compose on any server
+
+
+ Deploy with Helm on Kubernetes clusters
+
+
+ Railway, DigitalOcean, AWS, Azure, GCP guides
+
+
+
+## Architecture
+
+| Component | Port | Description |
+|-----------|------|-------------|
+| simstudio | 3000 | Main application |
+| realtime | 3002 | WebSocket server |
+| db | 5432 | PostgreSQL with pgvector |
+| migrations | - | Database migrations (runs once) |
diff --git a/apps/docs/content/docs/en/self-hosting/kubernetes.mdx b/apps/docs/content/docs/en/self-hosting/kubernetes.mdx
new file mode 100644
index 000000000..da7a78970
--- /dev/null
+++ b/apps/docs/content/docs/en/self-hosting/kubernetes.mdx
@@ -0,0 +1,127 @@
+---
+title: Kubernetes
+description: Deploy Sim Studio with Helm
+---
+
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
+import { Callout } from 'fumadocs-ui/components/callout'
+
+## Prerequisites
+
+- Kubernetes 1.19+
+- Helm 3.0+
+- PV provisioner support
+
+## Installation
+
+```bash
+# Clone repo
+git clone https://github.com/simstudioai/sim.git && cd sim
+
+# Generate secrets
+BETTER_AUTH_SECRET=$(openssl rand -hex 32)
+ENCRYPTION_KEY=$(openssl rand -hex 32)
+INTERNAL_API_SECRET=$(openssl rand -hex 32)
+
+# Install
+helm install sim ./helm/sim \
+ --set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
+ --set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
+ --set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
+ --namespace simstudio --create-namespace
+```
+
+## Cloud-Specific Values
+
+
+
+```bash
+helm install sim ./helm/sim \
+ --values ./helm/sim/examples/values-aws.yaml \
+ --set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
+ --set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
+ --set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
+ --set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
+ --namespace simstudio --create-namespace
+```
+
+
+```bash
+helm install sim ./helm/sim \
+ --values ./helm/sim/examples/values-azure.yaml \
+ --set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
+ --set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
+ --set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
+ --set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
+ --namespace simstudio --create-namespace
+```
+
+
+```bash
+helm install sim ./helm/sim \
+ --values ./helm/sim/examples/values-gcp.yaml \
+ --set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
+ --set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
+ --set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
+ --set app.env.NEXT_PUBLIC_APP_URL="https://sim.yourdomain.com" \
+ --namespace simstudio --create-namespace
+```
+
+
+
+## Key Configuration
+
+```yaml
+# Custom values.yaml
+app:
+ replicaCount: 2
+ env:
+ NEXT_PUBLIC_APP_URL: "https://sim.yourdomain.com"
+ OPENAI_API_KEY: "sk-..."
+
+postgresql:
+ persistence:
+ size: 50Gi
+
+ingress:
+ enabled: true
+ className: nginx
+ tls:
+ enabled: true
+ app:
+ host: sim.yourdomain.com
+```
+
+See `helm/sim/values.yaml` for all options.
+
+## External Database
+
+```yaml
+postgresql:
+ enabled: false
+
+externalDatabase:
+ enabled: true
+ host: "your-db-host"
+ port: 5432
+ username: "postgres"
+ password: "your-password"
+ database: "simstudio"
+ sslMode: "require"
+```
+
+## Commands
+
+```bash
+# Port forward for local access
+kubectl port-forward deployment/sim-sim-app 3000:3000 -n simstudio
+
+# View logs
+kubectl logs -l app.kubernetes.io/component=app -n simstudio --tail=100
+
+# Upgrade
+helm upgrade sim ./helm/sim --namespace simstudio
+
+# Uninstall
+helm uninstall sim --namespace simstudio
+```
diff --git a/apps/docs/content/docs/en/self-hosting/meta.json b/apps/docs/content/docs/en/self-hosting/meta.json
new file mode 100644
index 000000000..805cfb659
--- /dev/null
+++ b/apps/docs/content/docs/en/self-hosting/meta.json
@@ -0,0 +1,12 @@
+{
+ "title": "Self-Hosting",
+ "pages": [
+ "index",
+ "docker",
+ "kubernetes",
+ "platforms",
+ "environment-variables",
+ "troubleshooting"
+ ],
+ "defaultOpen": false
+}
diff --git a/apps/docs/content/docs/en/self-hosting/platforms.mdx b/apps/docs/content/docs/en/self-hosting/platforms.mdx
new file mode 100644
index 000000000..bcc3e7a09
--- /dev/null
+++ b/apps/docs/content/docs/en/self-hosting/platforms.mdx
@@ -0,0 +1,116 @@
+---
+title: Cloud Platforms
+description: Deploy Sim Studio on cloud platforms
+---
+
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
+import { Callout } from 'fumadocs-ui/components/callout'
+
+## Railway
+
+One-click deployment with automatic PostgreSQL provisioning.
+
+[](https://railway.com/new/template/sim-studio)
+
+After deployment, add environment variables in Railway dashboard:
+- `BETTER_AUTH_SECRET`, `ENCRYPTION_KEY`, `INTERNAL_API_SECRET` (auto-generated)
+- `OPENAI_API_KEY` or other AI provider keys
+- Custom domain in Settings → Networking
+
+## VPS Deployment
+
+For DigitalOcean, AWS EC2, Azure VMs, or any Linux server:
+
+
+
+**Recommended:** 16 GB RAM Droplet, Ubuntu 24.04
+
+```bash
+# Create Droplet via console, then SSH in
+ssh root@your-droplet-ip
+```
+
+
+**Recommended:** t3.xlarge (16 GB RAM), Ubuntu 24.04
+
+```bash
+ssh -i your-key.pem ubuntu@your-ec2-ip
+```
+
+
+**Recommended:** Standard_D4s_v3 (16 GB RAM), Ubuntu 24.04
+
+```bash
+ssh azureuser@your-vm-ip
+```
+
+
+
+### Install Docker
+
+```bash
+# Install Docker (official method)
+curl -fsSL https://get.docker.com | sudo sh
+sudo usermod -aG docker $USER
+
+# Logout and reconnect, then verify
+docker --version
+```
+
+### Deploy Sim Studio
+
+```bash
+git clone https://github.com/simstudioai/sim.git && cd sim
+
+# Create .env with secrets
+cat > .env << EOF
+DATABASE_URL=postgresql://postgres:postgres@db:5432/simstudio
+BETTER_AUTH_SECRET=$(openssl rand -hex 32)
+ENCRYPTION_KEY=$(openssl rand -hex 32)
+INTERNAL_API_SECRET=$(openssl rand -hex 32)
+NEXT_PUBLIC_APP_URL=https://sim.yourdomain.com
+BETTER_AUTH_URL=https://sim.yourdomain.com
+NEXT_PUBLIC_SOCKET_URL=https://sim.yourdomain.com
+EOF
+
+# Start
+docker compose -f docker-compose.prod.yml up -d
+```
+
+### SSL with Caddy
+
+```bash
+# Install Caddy
+sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
+curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
+curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
+sudo apt update && sudo apt install caddy
+
+# Configure (replace domain)
+echo 'sim.yourdomain.com {
+ reverse_proxy localhost:3000
+ handle /socket.io/* {
+ reverse_proxy localhost:3002
+ }
+}' | sudo tee /etc/caddy/Caddyfile
+
+sudo systemctl restart caddy
+```
+
+Point your domain's DNS A record to your server IP.
+
+## Kubernetes (EKS, AKS, GKE)
+
+See the [Kubernetes guide](/self-hosting/kubernetes) for Helm deployment on managed Kubernetes.
+
+## Managed Database (Optional)
+
+For production, use a managed PostgreSQL service:
+
+- **AWS RDS** / **Azure Database** / **Cloud SQL** - Enable pgvector extension
+- **Supabase** / **Neon** - pgvector included
+
+Set `DATABASE_URL` in your environment:
+```bash
+DATABASE_URL="postgresql://user:pass@host:5432/db?sslmode=require"
+```
diff --git a/apps/docs/content/docs/en/self-hosting/troubleshooting.mdx b/apps/docs/content/docs/en/self-hosting/troubleshooting.mdx
new file mode 100644
index 000000000..54e5224ce
--- /dev/null
+++ b/apps/docs/content/docs/en/self-hosting/troubleshooting.mdx
@@ -0,0 +1,110 @@
+---
+title: Troubleshooting
+description: Common issues and solutions
+---
+
+## Database Connection Failed
+
+```bash
+# Check database is running
+docker compose ps db
+
+# Test connection
+docker compose exec db psql -U postgres -c "SELECT 1"
+```
+
+Verify `DATABASE_URL` format: `postgresql://user:pass@host:5432/database`
+
+## Ollama Models Not Showing
+
+Inside Docker, `localhost` = the container, not your host machine.
+
+```bash
+# For host-machine Ollama, use:
+OLLAMA_URL=http://host.docker.internal:11434 # macOS/Windows
+OLLAMA_URL=http://192.168.1.x:11434 # Linux (use actual IP)
+```
+
+## WebSocket/Realtime Not Working
+
+1. Check `NEXT_PUBLIC_SOCKET_URL` matches your domain
+2. Verify realtime service is running: `docker compose ps realtime`
+3. Ensure reverse proxy passes WebSocket upgrades (see [Docker guide](/self-hosting/docker))
+
+## 502 Bad Gateway
+
+```bash
+# Check app is running
+docker compose ps simstudio
+docker compose logs simstudio
+
+# Common causes: out of memory, database not ready
+```
+
+## Migration Errors
+
+```bash
+# View migration logs
+docker compose logs migrations
+
+# Run manually
+docker compose exec simstudio bun run db:migrate
+```
+
+## pgvector Not Found
+
+Use the correct PostgreSQL image:
+```yaml
+image: pgvector/pgvector:pg17 # NOT postgres:17
+```
+
+## Certificate Errors (CERT_HAS_EXPIRED)
+
+If you see SSL certificate errors when calling external APIs:
+
+```bash
+# Update CA certificates in container
+docker compose exec simstudio apt-get update && apt-get install -y ca-certificates
+
+# Or set in environment (not recommended for production)
+NODE_TLS_REJECT_UNAUTHORIZED=0
+```
+
+## Blank Page After Login
+
+1. Check browser console for errors
+2. Verify `NEXT_PUBLIC_APP_URL` matches your actual domain
+3. Clear browser cookies and local storage
+4. Check that all services are running: `docker compose ps`
+
+## Windows-Specific Issues
+
+**Turbopack errors on Windows:**
+```bash
+# Use WSL2 for better compatibility
+wsl --install
+
+# Or disable Turbopack in package.json
+# Change "next dev --turbopack" to "next dev"
+```
+
+**Line ending issues:**
+```bash
+# Configure git to use LF
+git config --global core.autocrlf input
+```
+
+## View Logs
+
+```bash
+# All services
+docker compose logs -f
+
+# Specific service
+docker compose logs -f simstudio
+```
+
+## Getting Help
+
+- [GitHub Issues](https://github.com/simstudioai/sim/issues)
+- [Discord](https://discord.gg/Hr4UWYEcTT)