# Tự host ChatGPT riêng với Open WebUI trên VPS: hướng dẫn đầy đủ

> Cách tự host ChatGPT riêng bằng Open WebUI trên VPS: Docker, nginx, HTTPS, kết nối API OpenAI hoặc Ollama, làm tay hoặc một cú bấm với ZoPanel.

Source: https://zopanel.net/vi/blog/self-host-chatgpt-open-webui  
Updated: 2026-10-21

## Ý chính

- Open WebUI là giao diện chat mã nguồn mở, kết nối được API tương thích OpenAI và mô hình Ollama chạy tại chỗ.
- Dùng API thì một VPS khoảng 2 GB RAM là đủ; chạy mô hình tại chỗ cần nhiều RAM hơn và tốt nhất là GPU.
- Tài khoản đầu tiên tạo trên Open WebUI là quản trị viên, nên hãy tạo ngay sau khi cài và khoá đăng ký tự do.
- Cổng Docker publish ra ngoài có thể đi vòng qua UFW; hãy bind 127.0.0.1 và để nginx lo HTTPS.

Để tự host ChatGPT riêng, cách phổ biến nhất hiện nay là cài **Open WebUI** trên một VPS: một giao diện chat mã nguồn mở giống ChatGPT, chạy trong Docker, đặt sau nginx với tên miền và HTTPS của bạn, rồi kết nối với API của OpenAI (hoặc nhà cung cấp tương thích OpenAI) hay với mô hình chạy tại chỗ qua Ollama. Cả nhóm dùng chung một chỗ, lịch sử chat nằm trên server của bạn, và bạn trả tiền API theo mức dùng thay vì phí thuê bao theo từng người.

Bài này hướng dẫn cách cài thủ công trên Ubuntu 24.04 / Debian 12 (Docker, nginx, SSL, các thiết lập an toàn), cách làm với ZoPanel, và giải thích thẳng những điều cần biết trước: chi phí, quyền riêng tư dữ liệu, chạy mô hình tại chỗ có thực tế không, và giấy phép của Open WebUI.

## Open WebUI là gì và vì sao nên tự host?

[Open WebUI](https://docs.openwebui.com/) là giao diện web cho mô hình ngôn ngữ: chat, lưu lịch sử, nhiều người dùng có phân quyền, tải tài liệu lên để hỏi đáp, chọn mô hình cho từng cuộc chat. Nó không phải là mô hình AI; nó là "vỏ" kết nối tới mô hình qua API.

Lý do để tự host:

- **Một chỗ dùng chung cho cả nhóm** với tài khoản riêng, quản trị viên duyệt người mới.
- **Trả theo mức dùng.** Bạn dùng API key của chính mình; người dùng ít không tốn phí thuê bao cố định.
- **Chọn mô hình tự do.** Dùng song song mô hình của OpenAI, các nhà cung cấp tương thích OpenAI, hoặc mô hình mở chạy qua Ollama.
- **Lịch sử chat và tài liệu nằm trên server của bạn**, không phải trong tài khoản SaaS của từng nhân viên.

Nói rõ một điều về quyền riêng tư: khi dùng API của OpenAI hay nhà cung cấp khác, nội dung bạn gửi vẫn đi tới nhà cung cấp đó và chịu chính sách dữ liệu của họ. Chỉ khi chạy mô hình tại chỗ, dữ liệu mới hoàn toàn không rời server.

## Cần VPS cấu hình bao nhiêu để tự host ChatGPT riêng?

| Cách dùng | RAM gợi ý | Ghi chú |
| --- | --- | --- |
| Open WebUI + API (OpenAI hoặc tương thích) | Khoảng 2 GB cho Open WebUI, cộng phần cho hệ thống | Không cần GPU, VPS phổ thông là đủ |
| Open WebUI + mô hình nhỏ chạy bằng CPU qua Ollama | Nhiều hơn đáng kể, tuỳ kích thước mô hình | Chạy được nhưng chậm; hợp để thử nghiệm |
| Mô hình lớn tại chỗ cho cả nhóm | Server có GPU | Chi phí cao hơn nhiều so với VPS thường |

Với phần lớn cá nhân và nhóm nhỏ, cách thực tế là Open WebUI trên VPS 2-4 GB kết nối API. Thêm khoảng 2 vCPU và vài GB ổ đĩa cho dữ liệu chat và tài liệu.

## Cách tự host Open WebUI thủ công

### Bước 1: Chuẩn bị tên miền và cài Docker

Trỏ bản ghi A của tên miền (ví dụ `chat.example.com`) về IP của VPS. Rồi cài Docker từ kho chính thức của Docker theo [hướng dẫn của Docker](https://docs.docker.com/engine/install/ubuntu/):

```bash
sudo apt update && sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

Trên Debian, thay `ubuntu` bằng `debian` trong hai đường dẫn.

### Bước 2: Chạy Open WebUI bằng Docker Compose

Tạo thư mục `/opt/open-webui` và file `compose.yaml`:

```yaml
services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:8080"
    volumes:
      - open-webui:/app/backend/data
    env_file: .env
volumes:
  open-webui:
```

Tạo file `.env` với một khoá bí mật cố định (không có khoá cố định, mỗi lần tạo lại container mọi người sẽ bị đăng xuất):

```bash
cd /opt/open-webui
echo "WEBUI_SECRET_KEY=$(openssl rand -hex 32)" | sudo tee .env >/dev/null
sudo chmod 600 .env
sudo docker compose up -d
sudo docker compose logs -f   # chờ tới khi thấy server đã khởi động
```

Chú ý dòng `127.0.0.1:3000:8080`. Hướng dẫn nhanh của Open WebUI dùng `-p 3000:8080`, tức publish trên mọi địa chỉ IP. Theo [tài liệu của Docker](https://docs.docker.com/engine/network/packet-filtering-firewalls/), cổng publish theo cách đó được Docker định tuyến **trước khi** tới luật của UFW, nên mở cổng 3000 ra internet dù UFW đang chặn. Bind vào `127.0.0.1` để chỉ nginx trên cùng server truy cập được.

Muốn ghim phiên bản ổn định để cập nhật có kiểm soát, thay `:main` bằng một tag phiên bản cụ thể.

### Bước 3: nginx, HTTPS và streaming

```bash
sudo apt install -y nginx certbot python3-certbot-nginx
```

Tạo `/etc/nginx/sites-available/open-webui`:

```nginx
server {
    listen 80;
    server_name chat.example.com;

    client_max_body_size 50m;   # cho phép tải tài liệu lên (mặc định nginx chỉ 1 MB)

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_buffering off;        # để câu trả lời hiện ra dần, không phải chờ hết
        proxy_read_timeout 600s;    # câu trả lời dài không bị cắt sau 60 giây
    }
}
```

```bash
sudo ln -s /etc/nginx/sites-available/open-webui /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d chat.example.com
```

`proxy_buffering off` và hỗ trợ WebSocket là hai thứ hay bị quên: thiếu chúng, câu trả lời chỉ hiện ra khi đã xong hoặc gửi tin nhắn bị lỗi.

### Bước 4: Tạo tài khoản quản trị và kết nối mô hình

1. **Mở tên miền ngay sau khi cài** và tạo tài khoản đầu tiên. Tài khoản đầu tiên là quản trị viên. Nếu để trang mở công khai, người lạ có thể tạo trước bạn.
2. Vào **Admin Panel → Settings → Connections**, thêm kết nối OpenAI với URL `https://api.openai.com/v1` và API key của bạn, hoặc URL của một nhà cung cấp tương thích OpenAI.
3. Theo tài liệu Open WebUI, sau khi có tài khoản quản trị, đăng ký mới bị tắt; nếu bật lại cho cả nhóm, tài khoản mới ở trạng thái chờ cho tới khi bạn duyệt. Giữ chế độ duyệt này.
4. Đặt **hạn mức chi tiêu** cho API key ở trang của nhà cung cấp, để một vòng lặp hay một người dùng không làm hoá đơn tăng vọt.

### Bước 5: Muốn chạy mô hình tại chỗ với Ollama?

Bạn có thể thêm container Ollama vào cùng file compose và trỏ Open WebUI tới nó qua mạng nội bộ của Compose (`OLLAMA_BASE_URL=http://ollama:11434`). Đừng publish cổng 11434 của Ollama ra internet: API của Ollama không có xác thực. Trên VPS không có GPU, mô hình nhỏ chạy được nhưng chậm, và mô hình lớn cần nhiều RAM hơn hẳn chính Open WebUI. Hãy thử với một mô hình nhỏ trước khi mua server lớn.

### Cập nhật và sao lưu

```bash
cd /opt/open-webui
sudo docker compose pull && sudo docker compose up -d
```

Toàn bộ người dùng, lịch sử chat và cài đặt nằm trong volume `open-webui`. Sao lưu volume này **trước mỗi lần cập nhật** và theo lịch, ví dụ bằng restic như trong bài [backup VPS lên S3](/vi/blog/backup-vps-to-s3).

## Tự host Open WebUI với ZoPanel

Trên ZoPanel, Open WebUI có sẵn trong **Kho ứng dụng**:

1. Cài Docker nếu chưa có: **Kho ứng dụng → Cài Docker**.
2. Chọn **Open WebUI**, nhập tên miền và bấm cài. ZoPanel tạo website cho tên miền, khởi động container và proxy tên miền vào nó; chứng chỉ SSL được cấp tự động khi tên miền đã trỏ về server. Ứng dụng có giới hạn bộ nhớ 2048 MB.
3. **Ứng dụng được khoá riêng cho bạn cho tới khi thiết lập xong**: người khác chỉ thấy trang "đang được thiết lập". Ở tab **Docker** của app, bấm **Mở ứng dụng (chỉ mình tôi)**, tạo tài khoản quản trị, rồi bấm **Đã thiết lập xong — mở công khai**. Như vậy không ai giành được tài khoản quản trị đầu tiên.
4. Thêm API key ở **Admin Panel → Settings → Connections** của Open WebUI. Bạn trả tiền trực tiếp cho nhà cung cấp mô hình; ZoPanel không thấy key.

Container chạy với user namespace, chỉ nghe trên 127.0.0.1, có giới hạn RAM và CPU, và bị chặn khỏi mạng nội bộ của server. Hệ quả cần biết: container không gọi được dịch vụ trên loopback hay mạng riêng, nên Open WebUI cài từ Kho ứng dụng dùng API qua internet (OpenAI hoặc nhà cung cấp tương thích), không dùng được Ollama chạy ngay trên cùng server. Cập nhật bằng **Cập nhật bản mới** ở tab **Docker** (dữ liệu được giữ), và dữ liệu app nằm trong thư mục mà chỉ root và container đọc được. Xem thêm [Kho ứng dụng và lưu trữ S3](/vi/docs/apps) và [Mỗi ứng dụng dùng để làm gì](/vi/docs/app-catalog).

## Giấy phép Open WebUI: cần biết gì?

Từ bản v0.6.6 (tháng 4/2025), theo [trang giấy phép của Open WebUI](https://docs.openwebui.com/license/), dự án dùng giấy phép kiểu BSD-3 kèm điều khoản thương hiệu: bạn không được sửa, xoá hay che thương hiệu "Open WebUI", trừ khi triển khai có tối đa 50 người dùng trong 30 ngày, có văn bản cho phép, hoặc có giấy phép doanh nghiệp. Với dùng nội bộ thông thường, điều này không ảnh hưởng; nếu bạn định bán dịch vụ chat mang thương hiệu riêng cho nhiều khách, hãy đọc kỹ điều khoản.

## Những lỗi thường gặp

- **Publish cổng 3000 ra internet** và tin rằng UFW đang chặn. Bind 127.0.0.1.
- **Để trang mới cài mở công khai**, người lạ tạo tài khoản quản trị trước.
- **Không đặt `WEBUI_SECRET_KEY` cố định**, mọi người bị đăng xuất sau mỗi lần cập nhật.
- **Quên `client_max_body_size`**, tải tài liệu lên bị lỗi 413.
- **Không đặt hạn mức chi tiêu API.**
- **Không sao lưu volume** trước khi cập nhật lên bản mới.

## Kết luận

Tự host ChatGPT riêng với Open WebUI là một trong những dự án tự host đáng làm nhất: chi phí VPS thấp, cả nhóm có một chỗ chat AI chung, bạn chọn mô hình và giữ lịch sử trên server của mình. Làm tay cần Docker, nginx, SSL và vài thiết lập an toàn dễ quên; với ZoPanel, đó là một ứng dụng trong Kho ứng dụng, kèm khoá thiết lập ban đầu và cách ly container. Bạn có thể [bắt đầu với gói Free](/vi/pricing) và chạy Open WebUI bên cạnh website trên cùng VPS.

## Câu hỏi thường gặp

### Tự host Open WebUI có miễn phí không?

Phần mềm Open WebUI miễn phí. Bạn trả tiền VPS và tiền API theo mức dùng cho nhà cung cấp mô hình (OpenAI hoặc nhà cung cấp khác). Nếu chạy mô hình tại chỗ bằng Ollama thì không tốn phí API, nhưng cần server mạnh hơn.

### Open WebUI có dùng được với Claude hoặc DeepSeek không?

Open WebUI kết nối với mọi API tương thích OpenAI. Nhiều nhà cung cấp có điểm cuối tương thích OpenAI; thêm URL và key của họ ở Admin Panel → Settings → Connections. Kiểm tra tài liệu của nhà cung cấp để lấy đúng URL.

### Dữ liệu chat có hoàn toàn riêng tư không?

Lịch sử chat, tài khoản và tài liệu lưu trên server của bạn. Nhưng nội dung mỗi câu hỏi vẫn được gửi tới nhà cung cấp API để xử lý, theo chính sách dữ liệu của họ. Chỉ khi chạy mô hình tại chỗ, dữ liệu mới không rời server.

### VPS không có GPU có chạy được mô hình AI không?

Chạy được mô hình nhỏ bằng CPU qua Ollama, nhưng chậm và tốn RAM, phù hợp để thử nghiệm. Cho cả nhóm dùng hằng ngày, kết nối API hoặc dùng server có GPU sẽ cho trải nghiệm tốt hơn nhiều.

### Làm sao cho nhiều người cùng dùng Open WebUI?

Tạo tài khoản quản trị trước, rồi bật đăng ký mới trong phần quản trị: tài khoản mới ở trạng thái chờ cho tới khi bạn duyệt. Bạn có thể phân nhóm người dùng và giới hạn mô hình mà từng nhóm được dùng.
