The Problem: When Your Team Runs 5 AI Models and Nobody Knows What’s What
2:17 AM. A Slack ping from the team lead: “Why is Ollama on the server not responding?” I SSH’d in, checked the logs, and realized the problem wasn’t Ollama crashing — a new dev had accidentally restarted the wrong container because he had no idea which service was running what.
At the time, the team was running everything in parallel: Ollama with llama3.2 and codellama for the devs, OpenAI GPT-4o for content generation, Gemini Flash for batch summarization. Each one had a different API endpoint, a different auth method, and documentation scattered all over the place. New joiners spent a full week just figuring out the system.
After that night, I decided to deploy Open WebUI — a unified web interface to manage all AI models from one place. The team stopped getting confused, and I stopped getting pinged at 2 AM for the same reasons.
What Does Open WebUI Support?
Open WebUI (formerly Ollama WebUI) connects to:
- Ollama — run models locally: llama3.2, mistral, codellama, qwen…
- OpenAI-compatible APIs — GPT-4o, GPT-4o-mini, or any service using the OpenAI format
- Google Gemini — Gemini 1.5 Pro/Flash/2.0 via API
- Any self-hosted LLM endpoint — vLLM, LM Studio, Groq, OpenRouter…
What made me choose it over other alternatives: built-in user management — create individual accounts for each person and control which models each user can access. With a team of 10+, that’s a must-have.
Installing Open WebUI
System Requirements
Before installing, verify the following:
- Docker and Docker Compose (version >= 20.x)
- RAM: minimum 4GB, recommended 8GB+ if running Ollama on the same host
- Disk: 10GB+ for data and models
- Port 3000 (or a custom port) must be open
# Kiểm tra Docker đã cài chưa
docker --version
docker compose version
# Nếu chưa có Docker:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
Option 1: Docker Compose — Open WebUI Only (when Ollama is already running)
This is what I use in production when Ollama is already running on the host. Create a docker-compose.yml file:
version: '3.8'
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- open-webui:/app/backend/data
environment:
# Ollama đang chạy trên host (bare metal):
- OLLAMA_BASE_URL=http://host.docker.internal:11434
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
open-webui:
Option 2: Docker Compose — Including Ollama
Don’t have Ollama yet and want to deploy everything at once? Use this file:
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
volumes:
- ollama:/root/.ollama
# Bỏ comment phần dưới nếu có GPU NVIDIA:
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- open-webui:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
depends_on:
- ollama
volumes:
ollama:
open-webui:
# Khởi động
docker compose up -d
# Xem logs
docker compose logs -f open-webui
Option 3: pip install (no Docker required)
Not using Docker? Install directly via pip:
# Cần Python 3.11+
python3 --version
pip install open-webui
# Khởi động
open-webui serve --port 3000
This pulls about 2GB of dependencies. I still recommend Docker for easier updates and environment isolation.
Detailed Configuration
First Access — Creating the Admin Account
Once deployed, open your browser at http://your-server-ip:3000. The first time you visit, you’ll see a registration form — the first account created automatically becomes the Admin.
The first thing I do after creating the admin account: go to Admin Panel → Settings → General and disable Enable New Sign Up if you don’t want outsiders registering on their own. Alternatively, set Default User Role: Pending so every new account requires manual approval.
Connecting Ollama
Open WebUI usually auto-detects Ollama via the OLLAMA_BASE_URL variable. To verify, go to Admin Panel → Settings → Connections:
- Ollama API URL:
http://host.docker.internal:11434 - Click Verify Connection — green means it’s working
To download Ollama models directly from the Open WebUI interface, go to Admin Panel → Settings → Models, click the Pull a model from Ollama.com tab, and type the model name:
# Các model phổ biến có thể pull từ giao diện:
llama3.2:3b # Nhẹ, phù hợp chat thông thường
codellama:7b # Chuyên về code
mistral:7b # Cân bằng tốt giữa chất lượng và tốc độ
qwen2.5-coder:7b # Code, hỗ trợ tốt tiếng Việt
Adding the OpenAI API
Go to Admin Panel → Settings → Connections → OpenAI API:
API Base URL: https://api.openai.com/v1
API Key: sk-proj-xxxx...
After saving, head to the Models tab and you’ll see GPT-4o and GPT-4o-mini appear alongside your Ollama models. Users just pick a model from the dropdown as usual — no need to know whether it’s running locally or in the cloud.
Adding the Google Gemini API
Gemini is slightly different — Open WebUI connects to it via an OpenAI-compatible endpoint. Still under Connections → OpenAI API, add a second connection:
API Base URL: https://generativelanguage.googleapis.com/v1beta/openai/
API Key: AIzaSy...
Once saved, you’ll immediately see gemini-1.5-pro, gemini-1.5-flash, and gemini-2.0-flash in the model list.
Model Access Control per User
This is the feature I use most when managing the team — and the one new users ask about most. Go to Workspace → Models:
- Create a “model alias” — rename
gpt-4oto “GPT Production” for clarity - Set visibility: Public (all users) or Private (admins and selected users only)
- Assign a custom default system prompt to each model “version” — for example, a GPT for Dev with a code-focused system prompt, and a GPT for Content with a different context
Testing and Monitoring
Verify the Service Is Running Correctly
# Check container status
docker ps | grep open-webui
# Health check endpoint
curl http://localhost:3000/health
# Response: {"status":true}
# Xem realtime logs
docker logs -f open-webui --tail 50
Troubleshooting Common Errors
“Could not connect to Ollama” error: 9 times out of 10, it’s a network issue between the container and the host. The quickest way to check:
# Từ bên trong container Open WebUI, curl tới Ollama
docker exec open-webui curl http://host.docker.internal:11434/api/tags
# Nếu fail, lấy IP của docker bridge và thử trực tiếp
ip addr show docker0
# Thường là 172.17.0.1 — thử dùng IP này thay vì host.docker.internal
403 error with the OpenAI API: Your API key is wrong or you’ve run out of quota. Go to Connections and click Verify to see the detailed error message instead of guessing.
Container keeps restarting right after launch:
# Xem logs ngay sau khi start
docker logs open-webui 2>&1 | head -50
# Thường do thiếu biến môi trường hoặc volume mount bị lỗi permission
Backing Up Your Data
All data — conversations, settings, user accounts — lives inside the Docker volume. Here’s the backup script I run via cron every night:
# Backup volume ra file tar.gz
docker run --rm \
-v open-webui:/data \
-v $(pwd):/backup \
alpine tar czf /backup/open-webui-backup-$(date +%Y%m%d).tar.gz /data
# Restore khi cần
docker run --rm \
-v open-webui:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/open-webui-backup-20240201.tar.gz -C /
Automatic Updates
Open WebUI ships updates fairly often — new features, bug fixes. With Docker Compose, updating won’t touch your data since everything is stored in a named volume:
# Pull image mới và restart — data giữ nguyên
docker compose pull && docker compose up -d
# Hoặc thêm vào crontab để tự động check update hàng tuần:
# 0 3 * * 1 cd /path/to/open-webui && docker compose pull && docker compose up -d
Two weeks after deploying, onboarding time for new team members dropped from roughly a week down to about 30 minutes. No need to document endpoints, no need to explain how to authenticate — just share the URL, create an account, done. What the team was missing wasn’t a more powerful model, but a single place to manage everything. Open WebUI solves exactly that.

