AI Automation

Tự dựng AI chatbot riêng với Ollama và Open WebUI trên VPS

Bạn muốn có một AI chatbot riêng, chạy trực tiếp trên VPS, không phụ thuộc vào OpenAI hay bất kỳ API cloud nào? Bài viết này sẽ hướng dẫn bạn chi tiết cách tự dựng AI chatbot riêng với Ollama và Open WebUI trên một VPS Linux. Sau 15-20 phút làm theo, bạn sẽ có một giao diện web ChatGPT-like, chạy các mô hình ngôn ngữ lớn (LLM) ngay trên máy chủ của mình, hoàn toàn miễn phí và bảo mật.

Yêu cầu trước khi bắt đầu

  • Một VPS chạy Ubuntu 24.04 LTS hoặc Debian 12 (bài này dùng Ubuntu 24.04). Bạn có thể thuê VPS Việt Nam với cấu hình tối thiểu 4GB RAM và 2 vCPU để chạy mượt các mô hình 7B-8B.
  • User sudo non-root (hoặc root).
  • DockerDocker Compose v2 đã được cài đặt. Nếu chưa có, hãy tham khảo bài cách cài Docker trên VPS Ubuntu trước.
  • Một domain (không bắt buộc nếu bạn chỉ dùng IP + port, nhưng khuyến khích có để bật HTTPS).

Vì sao nên tự host AI chatbot trên VPS?

Việc self-host một AI chatbot mang lại nhiều lợi thế rõ ràng. Thứ nhất, dữ liệu của bạn không rời khỏi máy chủ. Không có rủi ro về việc prompt hay lịch sử trò chuyện bị gửi lên cloud của bên thứ ba. Thứ hai, bạn có toàn quyền tùy chỉnh mô hình, từ llama3, Mistral, Qwen, cho đến các mô hình chuyên biệt. Thứ ba, chi phí vận hành thấp: bạn chỉ trả tiền VPS hàng tháng, không có phí token hay API. Với một VPS giá rẻ cấu hình 8GB RAM và NVMe SSD, bạn hoàn toàn có thể chạy được các mô hình mạnh mẽ như Llama 3 8B hay Qwen 2.5 7B.

Bước 1 - Tạo Docker network và thư mục dữ liệu

Đầu tiên, chúng ta sẽ tạo một Docker network riêng để Ollama và Open WebUI giao tiếp với nhau, và chuẩn bị thư mục lưu trữ dữ liệu.

docker network create ai-network
mkdir -p ~/ollama-data
mkdir -p ~/open-webui-data

Giải thích:

  • docker network create ai-network: tạo một bridge network tên ai-network để các container có thể kết nối với nhau bằng tên service.
  • mkdir -p: tạo thư mục để mount volume, ~/ollama-data lưu models, ~/open-webui-data lưu cơ sở dữ liệu của giao diện.

Bước 2 - Chạy container Ollama

Ollama là engine giúp tải và chạy các mô hình ngôn ngữ lớn. Chúng ta sẽ chạy nó trong một container Docker.

docker run -d \
  --name ollama \
  --network ai-network \
  -v ~/ollama-data:/root/.ollama \
  -p 11434:11434 \
  --restart unless-stopped \
  ollama/ollama:latest

Cờ -p 11434:11434 expose port API của Ollama. --restart unless-stopped đảm bảo container tự động khởi động lại khi VPS reboot. -v ~/ollama-data:/root/.ollama mount thư mục lưu model.

Verify: Kiểm tra container chạy thành công.

docker ps | grep ollama
# Output: ollama container "Up" và healthy
curl http://localhost:11434/api/tags
# Output: {"models":[]} (danh sách model rỗng, vì chưa tải model nào)

Bước 3 - Tải một mô hình AI về Ollama

Ollama có sẵn API để tải model. Bạn có thể tải bất kỳ model nào từ thư viện chính thức. Dưới đây là 3 lựa chọn phổ biến, yêu cầu RAM khác nhau:

Đối với VPS 4GB RAM: dùng Qwen 2.5 0.5B, nhẹ, khả năng tiếng Việt ổn.

docker exec -it ollama ollama pull qwen2.5:0.5b

Đối với VPS 8GB RAM: dùng Llama 3.2 3B hoặc Mistral 7B (nên dùng phiên bản lượng tử hóa).

docker exec -it ollama ollama pull llama3.2:3b

Đối với VPS 16GB RAM trở lên: dùng Llama 3.1 8B hoặc Qwen 2.5 7B.

docker exec -it ollama ollama pull llama3.1:8b

Quá trình tải có thể mất vài phút tùy tốc độ mạng và kích thước model (khoảng 4-8GB mỗi model). Bạn có thể kiểm tra tiến độ bằng lệnh docker logs -f ollama hoặc chỉ cần đợi.

Verify: Sau khi tải xong, gọi API để xem model đã sẵn sàng.

curl http://localhost:11434/api/tags
# Output: {"models":[{"name":"llama3.2:3b",...}]}

Bạn cũng có thể test thử bằng lệnh:

curl -X POST http://localhost:11434/api/generate -d '{
  "model": "llama3.2:3b",
  "prompt": "Xin chào, hãy nói một câu chào bằng tiếng Việt.",
  "stream": false
}' | jq .response

Bước 4 - Chạy container Open WebUI

Open WebUI là giao diện web đẹp mắt, tương tự ChatGPT, kết nối trực tiếp đến Ollama. Container này sẽ chạy ở port 3000.

docker run -d \
  --name open-webui \
  --network ai-network \
  -v ~/open-webui-data:/app/backend/data \
  -p 3000:8080 \
  --restart unless-stopped \
  ghcr.io/open-webui/open-webui:main

Giải thích: container Open WebUI lắng nghe ở port 8080 bên trong, chúng ta map ra port 3000 ở host. Biến OLLAMA_BASE_URL không cần set vì mặc định container sẽ tự động tìm Ollama qua Docker DNS (tên container là ollama).

Verify: Kiểm tra cả hai container đều chạy.

docker ps
# Output: cả ollama và open-webui đều "Up"
curl http://localhost:3000
# Output: HTML của giao diện web (không lỗi 502)

Bước 5 - Cấu hình Nginx Reverse Proxy với HTTPS (tùy chọn nhưng khuyến nghị)

Để truy cập chatbot từ trình duyệt một cách an toàn, bạn nên đặt một reverse proxy Nginx với chứng chỉ SSL. Giả sử domain bạn dùng là chatbot.example.com trỏ IP VPS.

Đầu tiên, cài Nginx và Certbot (nếu chưa có).

sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx

Tạo file cấu hình cho Nginx.

sudo nano /etc/nginx/sites-available/chatbot.example.com

Nội dung:

server {
    listen 80;
    server_name chatbot.example.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-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Kích hoạt site và cấp SSL.

sudo ln -s /etc/nginx/sites-available/chatbot.example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d chatbot.example.com

Sau khi chạy certbot, file cấu hình sẽ tự động được sửa để thêm block HTTPS. Bạn chỉ cần reload Nginx là xong.

sudo systemctl reload nginx

Verify: Truy cập https://chatbot.example.com trên trình duyệt. Bạn sẽ thấy giao diện Open WebUI. Đăng ký tài khoản quản trị đầu tiên (tài khoản này sẽ là admin). Sau đó vào Settings > Admin Settings > Connections, kiểm tra Ollama Base URL là http://ollama:11434 (container tự nhận diện được).

Bước 6 - Sử dụng chatbot và tải thêm model

Khi đã có giao diện web, bạn có thể chọn model ở dropdown góc trên bên trái (ví dụ llama3.2:3b) và bắt đầu chat. Để tải thêm model khác, bạn có thể dùng lệnh docker exec như bước 3, hoặc vào Settings trong giao diện WebUI -> Models -> Pull a model và gõ tên model.

# Tải thêm model Qwen 2.5 7B ngay từ terminal
docker exec -it ollama ollama pull qwen2.5:7b

Lưu ý: mỗi model chiếm dung lượng đáng kể (3-8GB). Hãy đảm bảo VPS của bạn có đủ RAM và dung lượng ổ. Với một VPS NVMe 16GB RAM, bạn có thể chạy đồng thời 2-3 model 7B mà không gặp vấn đề.

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

Lỗi: Error: connection refused khi truy cập giao diện WebUI.
Nguyên nhân: container chưa chạy. Hãy kiểm tra docker ps và xem log: docker logs open-webui. Đảm bảo bạn đã map đúng port 3000:8080.

Lỗi: Không tìm thấy model sau khi tải.
Kiểm tra bằng lệnh: curl http://localhost:11434/api/tags. Nếu model có trong danh sách nhưng WebUI không thấy, hãy vào Settings > Connections > kiểm tra Ollama Base URL có phải http://ollama:11434 không. Nếu chạy không cùng Docker network, bạn phải dùng IP thật của VPS.

Lỗi: chatbot phản hồi rất chậm hoặc trả lời cụt.
VPS không đủ RAM để chạy model. Giải pháp: dùng model nhỏ hơn (qwen2.5:0.5b) hoặc nâng cấp VPS. Bạn có thể giám sát RAM bằng htop. Với VPS 4GB, chỉ nên chạy model 0.5B-1.5B. Với 8GB, chạy 3B-7B. Với 16GB, chạy 8B-14B.

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

Tôi có cần GPU để chạy Ollama không?

Không bắt buộc. Ollama có hỗ trợ GPU (CUDA/ROCm) để tăng tốc, nhưng vẫn chạy được trên CPU. Tuy nhiên, suy luận trên CPU sẽ chậm hơn, trên VPS 4 vCPU, mô hình 7B có thể mất 20-40 giây cho một câu trả lời dài. Nếu cần tốc độ nhanh, hãy thuê VPS có GPU hoặc dùng model nhỏ.

Tôi có thể dùng mô hình tiếng Việt hàng đầu cho chatbot này không?

Có. Các mô hình như Qwen 2.5 (0.5B, 1.5B, 7B), Gemma 2 (2B, 9B), và Mistral (7B) đều hỗ trợ tiếng Việt tốt. Qwen 2.5 7B là lựa chọn cân bằng giữa chất lượng và yêu cầu tài nguyên. Bạn chỉ cần tải model đó về bằng lệnh ollama pull.

Làm sao để chatbot nhớ lịch sử trò chuyện qua các phiên?

Open WebUI tự động lưu lịch sử trò chuyện vào cơ sở dữ liệu SQLite trong thư mục ~/open-webui-data. Khi bạn quay lại, lịch sử vẫn còn. Bạn có thể xóa hoặc export từng cuộc trò chuyện trong giao diện Settings.

Tôi có thể chia sẻ chatbot này cho người khác truy cập không?

Có. Sau khi cấu hình domain và HTTPS, bạn có thể tạo tài khoản cho người khác từ trang Admin Settings > Users. Mỗi người có lịch sử riêng. Lưu ý: tài nguyên VPS sẽ bị chia sẻ, nếu nhiều người cùng chat với model lớn, VPS có thể bị quá tải.

Chi phí vận hành một chatbot AI thế này là bao nhiêu?

Chỉ bao gồm tiền VPS hàng tháng. Ví dụ: một VPS 8GB RAM, 4 vCPU, NVMe 50GB thuê VPS Linux giá khoảng vài trăm nghìn đồng/tháng. Bạn không phải trả thêm phí API hay token nào khác. So với dùng ChatGPT Plus (20 USD/tháng), self-host là lựa chọn kinh tế hơn nếu bạn chỉ cần chat và xử lý dữ liệu nhạy cảm.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.