Cài đặt Open WebUI: Quản lý Ollama, OpenAI và Gemini trên một giao diện duy nhất

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

Bối cảnh: Khi team dùng 5 AI model và không ai quản được ai

2:17 sáng. Slack ping từ team lead: “Cái Ollama trên server sao không trả lời?” Mình SSH vào, check logs, rồi phát hiện ra vấn đề không phải Ollama bị lỗi — mà là thằng dev mới vừa restart nhầm container vì không biết service nào đang chạy gì.

Lúc đó team đang chạy song song: Ollama với llama3.2 và codellama cho dev, OpenAI GPT-4o cho content generation, Gemini Flash cho batch summarization. Mỗi cái một API endpoint khác nhau, một cách auth khác nhau, document rải rác khắp nơi. Người mới join mất cả tuần mới hiểu được hệ thống.

Sau cái đêm đó, mình quyết định deploy Open WebUI — một giao diện web thống nhất để manage tất cả AI model từ một chỗ. Từ đó team không còn nhầm lẫn nữa, và mình cũng không bị ping lúc 2 giờ sáng vì lý do tương tự.

Open WebUI hỗ trợ những gì?

Open WebUI (trước đây là Ollama WebUI) kết nối được với:

  • Ollama — chạy model local: llama3.2, mistral, codellama, qwen…
  • OpenAI-compatible API — GPT-4o, GPT-4o-mini, hoặc bất kỳ service nào dùng OpenAI format
  • Google Gemini — Gemini 1.5 Pro/Flash/2.0 qua API
  • Bất kỳ LLM endpoint tự host nào — vLLM, LM Studio, Groq, OpenRouter…

Cái làm mình chọn nó thay vì mấy alternative khác: user management tích hợp sẵn — tạo account riêng cho từng người, control xem ai được dùng model nào. Với team 10+ người, cái này là must-have.

Cài đặt Open WebUI

Yêu cầu hệ thống

Trước khi cài, kiểm tra những thứ này:

  • Docker và Docker Compose (version >= 20.x)
  • RAM: tối thiểu 4GB, khuyến nghị 8GB+ nếu chạy Ollama cùng host
  • Disk: 10GB+ cho data và models
  • Port 3000 (hoặc port tùy chỉnh) phải mở
# 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

Cách 1: Docker Compose — chỉ Open WebUI (khi đã có Ollama sẵn)

Đây là cách mình dùng trên production khi Ollama đã chạy sẵn trên host. Tạo file docker-compose.yml:

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:

Cách 2: Docker Compose — bao gồm cả Ollama

Chưa có Ollama và muốn deploy tất cả cùng một lúc? Dùng file này:

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

Cách 3: pip install (không cần Docker)

Không dùng Docker? Cài thẳng qua pip:

# Cần Python 3.11+
python3 --version

pip install open-webui

# Khởi động
open-webui serve --port 3000

Cách này kéo về khoảng 2GB dependencies. Mình vẫn khuyến nghị Docker để dễ update và isolate environment.

Cấu hình chi tiết

Lần đầu truy cập — tạo admin account

Sau khi deploy xong, mở trình duyệt tại http://your-server-ip:3000. Lần đầu tiên sẽ có form đăng ký — account đầu tiên tạo ra sẽ tự động là Admin.

Việc đầu tiên mình làm sau khi tạo admin: vào Admin Panel → Settings → General và tắt Enable New Sign Up nếu không muốn người ngoài tự đăng ký. Hoặc set Default User Role: Pending để phải approve từng account mới.

Kết nối Ollama

Open WebUI thường tự detect Ollama qua biến OLLAMA_BASE_URL. Để chắc chắn, vào Admin Panel → Settings → Connections:

  • Ollama API URL: http://host.docker.internal:11434
  • Click Verify Connection — nếu xanh là OK

Để download model Ollama từ chính Open WebUI, vào Admin Panel → Settings → Models, tab Pull a model from Ollama.com, gõ tên model:

# 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

Thêm OpenAI API

Vào Admin Panel → Settings → Connections → OpenAI API:

API Base URL: https://api.openai.com/v1
API Key: sk-proj-xxxx...

Save xong, vào tab Models sẽ thấy GPT-4o, GPT-4o-mini xuất hiện cùng với các model Ollama. User chọn model trong dropdown bình thường — không cần biết model đó chạy local hay cloud.

Thêm Google Gemini API

Gemini thì hơi đặc biệt — Open WebUI kết nối qua OpenAI-compatible endpoint. Vẫn ở Connections → OpenAI API, thêm connection thứ hai:

API Base URL: https://generativelanguage.googleapis.com/v1beta/openai/
API Key: AIzaSy...

Xong là thấy ngay gemini-1.5-pro, gemini-1.5-flash, gemini-2.0-flash trong danh sách model.

Phân quyền model theo user

Tính năng mình dùng nhiều nhất khi quản lý team — và cũng là thứ người mới hỏi nhiều nhất. Vào Workspace → Models:

  • Tạo “model alias” — rename gpt-4o thành “GPT Production” cho dễ nhận biết
  • Set visibility: Public (mọi user) hoặc Private (chỉ admin và người được chọn)
  • Gắn system prompt mặc định riêng cho từng “phiên bản” model — ví dụ GPT cho Dev với system prompt về code, GPT cho Content với context khác

Kiểm tra và Monitoring

Verify service đang chạy đúng

# 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

Xử lý lỗi thường gặp

Lỗi “Could not connect to Ollama”: 9/10 trường hợp là network issue giữa container và host. Cách check nhanh nhất:

# 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

Lỗi 403 khi dùng OpenAI API: API key sai hoặc hết quota. Vào Connections, click Verify để xem error message chi tiết thay vì đoán mò.

Container restart liên tục ngay sau khi khởi động:

# 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

Backup data

Toàn bộ data — conversations, settings, user accounts — đều nằm trong Docker volume. Script backup mình chạy qua cron mỗi đêm:

# 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 /

Tự động update

Open WebUI update khá thường xuyên — tính năng mới, fix bug. Với Docker Compose, việc update không làm mất data vì data lưu trong 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

Hai tuần sau khi deploy, thời gian onboarding member mới giảm từ ~1 tuần xuống còn khoảng 30 phút. Không cần document endpoint, không cần giải thích cách auth — share URL, tạo account, xong. Cái team mình thiếu lúc đó không phải model xịn hơn, mà là một chỗ quản lý tập trung. Open WebUI giải quyết đúng cái đó.

Share: