Dựng luồng AI không code với Flowise trên VPS

Bạn muốn dựng một chatbot AI để trả lời dựa trên tài liệu nội bộ, nhưng không muốn chạm vào code Python hay JavaScript? Flowise là công cụ cho phép kéo-thả các khối LLM, vector store, và tool để tạo thành một luồng AI hoàn chỉnh, ngay trên giao diện web. Bài này sẽ hướng dẫn bạn cài Flowise trên VPS Ubuntu 24.04 bằng Docker Compose, mở qua domain với Nginx và giữ cho nó an toàn trước khi đưa vào sử dụng thật.
Yêu cầu trước khi bắt đầu
Để làm theo hướng dẫn này, bạn cần chuẩn bị sẵn một số thứ. Mình giả định bạn đã có một VPS chạy Ubuntu 24.04 LTS với quyền truy cập root hoặc một user có quyền sudo. Nếu chưa có, bạn có thể thuê VPS Linux với full root, sau đó tự cài lại OS bằng image Ubuntu 24.04 từ control panel.
- VPS chạy Ubuntu 24.04 LTS, tối thiểu 2 GB RAM và 20 GB NVMe (khuyến nghị 4 GB nếu định chạy model nhúng hoặc nhiều luồng cùng lúc).
- User sudo không phải root (cách tạo user sudo trong bài viết quản lý user và phân quyền sudo an toàn trên Linux).
- Tên miền trỏ bản ghi A về IP của VPS (ví dụ
flowise.tenmien.com). - Kiến thức cơ bản về SSH, Docker và Nginx.
Vì sao nên tự host Flowise trên VPS thay vì dùng bản cloud?
Flowise có bản cloud chạy sẵn, nhưng khi bạn muốn gắn nó vào dữ liệu nội bộ, gọi API từ hệ thống khác hoặc chạy model qua Ollama trên cùng máy, việc tự host trên VPS mang lại nhiều lợi ích rõ rệt. Bạn toàn quyền cài thêm các package tùy chỉnh, không bị giới hạn số luồng hay số lần gọi API, và chi phí hàng tháng thấp hơn so với trả phí theo đầu người dùng.
Một lý do thực tế nữa là tốc độ. Khi Flowise nằm cùng hạ tầng với dữ liệu của bạn, không có độ trễ mạng khi gọi qua internet. Chưa kể, bạn có thể cài Ollama trên cùng VPS để chạy model mã nguồn mở hoàn toàn miễn phí, biến chiếc VPS Linux giá rẻ thành một máy chủ AI riêng. Hướng này mình đã đề cập trong bài self host API LLM với Ollama trên VPS, bạn có thể đọc thêm nếu muốn.
Bước 1 - Cài đặt Docker và Docker Compose
Flowise phân phối chính thức dưới dạng Docker image, vì vậy việc đầu tiên là cài Docker Engine và plugin Compose v2. Trên Ubuntu 24.04, bạn cài từ kho chính thức của Docker để luôn có bản mới.
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Đoạn trên thêm GPG key, thêm kho apt của Docker rồi cài đầy đủ bộ công cụ. Sau khi cài xong, kiểm tra phiên bản để chắc chắn Compose v2 đã hoạt động:
docker --version
docker compose version
Output mong đợi sẽ hiện thị phiên bản Docker và Compose, ví dụ Docker version 27.x.x và Docker Compose version v2.x.x. Tiếp theo, thêm user hiện tại vào group docker để không phải gõ sudo mỗi lần:
sudo usermod -aG docker $USER
newgrp docker
Bước 2 - Tạo file docker-compose cho Flowise
Flowise chạy trên Node.js và sử dụng SQLite làm database mặc định. Bạn chỉ cần một volume để lưu dữ liệu, mọi thứ khác Docker lo. Tạo thư mục làm việc và file cấu hình:
mkdir -p ~/flowise
cd ~/flowise
nano docker-compose.yml
Dán nội dung sau vào file. Lưu ý thay FLOWISE_USERNAME và FLOWISE_PASSWORD bằng thông tin đăng nhập mạnh của bạn:
services:
flowise:
image: flowiseai/flowise:latest
restart: unless-stopped
container_name: flowise
ports:
- "127.0.0.1:3000:3000"
environment:
- PORT=3000
- FLOWISE_USERNAME=admin
- FLOWISE_PASSWORD=mat_khau_rat_manh
- DATABASE_PATH=/root/.flowise
- APIKEY_PATH=/root/.flowise
- SECRETKEY_PATH=/root/.flowise
- LOG_PATH=/root/.flowise/logs
volumes:
- ~/.flowise:/root/.flowise
command: /bin/sh -c "sleep 3; flowise start"
Có một điểm quan trọng trong file trên: mình bind cổng 3000 vào 127.0.0.1 thay vì 0.0.0.0. Điều này có nghĩa Flowise chỉ nghe trên giao diện loopback, không lộ ra ngoài internet. Lý do là mình sẽ đặt Nginx phía trước để xử lý HTTPS và xác thực, thay vì để Flowise tự lộ ra với mật khẩu mặc định. Cách này giảm diện tích tấn công đáng kể, nếu sau này bạn không kịp cấu hình Nginx thì Flowise cũng không bị lộ.
Môi trường FLOWISE_USERNAME và FLOWISE_PASSWORD bắt buộc phải đặt, nếu không Flowise sẽ chạy ở chế độ không xác thực, ai biết IP và cổng đều vào được. Khởi động container:
docker compose up -d
Kiểm tra trạng thái:
docker compose ps
Output mong đợi có dòng flowise với trạng thái Up. Xem log để chắc chắn không có lỗi:
docker compose logs -f
Lần đầu chạy sẽ mất khoảng 20-30 giây để tải image và khởi động. Khi thấy dòng Flowise Server hoặc Listening on port 3000 trong log, nghĩa là nó đã sẵn sàng.
Bước 3 - Cài Nginx và cấu hình reverse proxy
Bây giờ bạn cần một reverse proxy để đưa Flowise ra ngoài qua domain với HTTPS. Cài Nginx:
sudo apt install -y nginx
Tạo file cấu hình cho site Flowise:
sudo nano /etc/nginx/sites-available/flowise
Dán nội dung sau, thay flowise.tenmien.com bằng domain thật của bạn:
server {
listen 80;
server_name flowise.tenmien.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;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
Ba dòng đầu trong block location rất quan trọng. Flowise dùng WebSocket để cập nhật luồng theo thời gian thực, thiếu các header upgrade thì kéo-thả vẫn chạy nhưng các thao tác realtime như nhận response từng chữ của LLM sẽ bị treo. Dòng proxy_read_timeout và proxy_send_timeout tăng lên 300 giây vì model LLM có thể mất hơn một phút để trả lời một prompt dài.
Kích hoạt site và kiểm tra cấu hình:
sudo ln -s /etc/nginx/sites-available/flowise /etc/nginx/sites-enabled/
sudo nginx -t
Nếu output hiện syntax is ok và test is successful, nạp lại Nginx:
sudo systemctl reload nginx
Bây giờ mở firewall cho HTTP và HTTPS. Nếu dùng UFW (mặc định trên Ubuntu):
sudo ufw allow 'Nginx Full'
sudo ufw status
Quay lại trình duyệt, truy cập http://flowise.tenmien.com, bạn sẽ thấy trang đăng nhập Flowise. Đăng nhập bằng username và password đã đặt trong file docker-compose, rồi bắt đầu tạo luồng đầu tiên.
Bước 4 - Cài SSL miễn phí với Certbot
HTTPS là bắt buộc nếu bạn định dùng Flowise để xử lý dữ liệu nhạy cảm, hoặc kết nối từ các ứng dụng bên ngoài. Cài Certbot:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d flowise.tenmien.com
Certbot sẽ tự động phát hiện cấu hình Nginx, cài chứng chỉ Let's Encrypt và cấu hình redirect từ HTTP sang HTTPS. Làm theo hướng dẫn trên màn hình, chọn redirect khi được hỏi.
Kiểm tra chứng chỉ đã được gia hạn tự động chưa:
sudo systemctl status certbot.timer
Output mong đợi hiện trạng thái active (running). Certbot tạo một systemd timer để tự động gia hạn chứng chỉ trước khi hết hạn, bạn không cần can thiệp thủ công. Với những ai muốn tìm hiểu sâu hơn về cơ chế này, bài viết tự động cấp và gia hạn SSL Wildcard với acme.sh mình đã viết khá kỹ.
Bước 5 - Dựng luồng AI chatbot đầu tiên không cần code
Sau khi đăng nhập thành công, bạn vào giao diện chính của Flowise. Bên trái là danh sách các node, chia theo nhóm: LLMs, Vector Stores, Chains, Agents, Tools, Memory. Bên phải là canvas để kéo thả và nối các node lại với nhau.
Để dựng một chatbot hỏi đáp đơn giản dựa trên tài liệu (RAG), bạn cần 4 node cơ bản:
- Chat Model: chọn model LLM (ví dụ OpenAI, hoặc Ollama nếu bạn muốn chạy local).
- Document Store: tải lên file PDF, DOCX hoặc TXT chứa dữ liệu nội bộ.
- Vector Store: lưu vector nhúng của tài liệu, ví dụ Chroma hoặc Pinecone. Kéo node
Chromatừ nhóm Vector Stores vào canvas. - Conversational Retrieval QA Chain: node trung tâm kết nối tất cả lại, cho phép chat với dữ liệu đã nhúng.
Nối theo thứ tự: kéo từ Chat Model vào node chain, từ Document Store vào Vector Store, rồi từ Vector Store vào chain. Sau đó nhấn nút chat ở góc phải để thử nghiệm chatbot ngay trên canvas. Không cần viết một dòng code nào. Quá trình này giống hệt những gì mình đã trình bày trong bài tự host RAG trên VPS với vector DB và LLM, chỉ khác là ở đây bạn làm bằng giao diện kéo thả thay vì code Python.
Bước 6 - Bảo mật VPS và Flowise
Flowise lộ ra internet đồng nghĩa với việc ai cũng có thể thử đăng nhập. Hai biện pháp mình khuyến nghị: đổi cổng SSH và bật xác thực bằng API key nếu bạn định gọi API từ bên ngoài.
Đổi cổng SSH giúp giảm lượng bot quét tự động. Mở file /etc/ssh/sshd_config, sửa dòng #Port 22 thành một cổng khác, ví dụ:
sudo nano /etc/ssh/sshd_config
Tìm dòng #Port 22, đổi thành Port 2222, rồi khởi động lại SSH:
sudo systemctl restart ssh
Trước khi thoát session hiện tại, hãy mở một terminal mới và thử SSH vào cổng mới. Nếu không vào được, bạn vẫn còn session cũ để sửa lại. Đây là mẹo an toàn mà dân sysadmin hay dùng, tránh tự khóa mình ngoài VPS. Sau đó cập nhật UFW để chỉ cho phép cổng 2222 thay vì 22:
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp
Nếu bạn gọi API Flowise từ ứng dụng khác (ví dụ website WordPress), hãy tạo API key trong mục API Keys của Flowise. Dùng key này trong header Authorization: Bearer <api_key> thay vì gửi username/password. Mọi luồng trong Flowise đều có endpoint riêng dạng /api/v1/prediction/<chatflow-id>, và có API key thì mới gọi được.
Cuối cùng, nếu bạn có nhu cầu gắn Flowise vào hệ thống giám sát để nhận cảnh báo khi VPS đầy RAM hoặc CPU, đọc thêm bài giám sát VPS với Prometheus và Grafana tự host để có góc nhìn tổng thể.
Xử lý lỗi thường gặp
Lỗi 502 Bad Gateway từ Nginx. Nguyên nhân thường là Flowise chưa khởi động xong hoặc đã crash. Kiểm tra:
docker compose ps
docker compose logs --tail=50
Nếu container đã thoát, xem log để biết lý do. Lỗi hay gặp là thiếu RAM, container bị OOM kill. Kiểm tra bằng dmesg | grep -i oom. Giải pháp: tăng RAM VPS lên 4 GB, hoặc thêm swap. Cách cấu hình swap mình đã viết trong bài cấu hình swap và tối ưu bộ nhớ cho VPS RAM thấp.
WebSocket không kết nối, luồng bị treo khi chat. Kiểm tra lại cấu hình Nginx, đặc biệt ba dòng header Upgrade, Connection và proxy_read_timeout. Nếu bạn dùng Cloudflare trước Nginx, vào phần Network của Cloudflare bật WebSockets lên.
Không đăng nhập được Flowise. Kiểm tra biến môi trường FLOWISE_USERNAME và FLOWISE_PASSWORD trong file docker-compose. Sau khi sửa file, chạy lại:
docker compose up -d
Khi bạn tạo luồng AI thật sự phục vụ người dùng, hãy cài Nginx cho nhiều domain trên cùng một VPS, tham khảo bài chạy nhiều site trên 1 VPS với Docker và Nginx proxy để tối ưu hạ tầng. Với nhu cầu làm công cụ AI riêng, một VPS Linux Ubuntu 2 GB RAM là đủ để bắt đầu, chạy ổn định với vài luồng đơn giản và một model nhúng nhỏ.
Câu hỏi thường gặp
Flowise có miễn phí không?
Có, Flowise là phần mềm mã nguồn mở theo giấy phép Apache 2.0. Bạn tự host trên VPS sẽ không tốn phí bản quyền, chỉ tốn chi phí thuê VPS và phí API của model LLM nếu dùng dịch vụ đám mây như OpenAI.
Cấu hình VPS tối thiểu để chạy Flowise là gì?
Tối thiểu 2 GB RAM và 20 GB NVMe cho Ubuntu 24.04. Nếu định chạy cả Ollama để mô hình chạy local, nên dùng 4 GB RAM trở lên vì model nhúng và LLM nhỏ cũng ngốn 1-2 GB.
Chạy Flowise bằng Docker Compose có khó không?
Không, toàn bộ cấu hình nằm trong một file riêng biệt. Bạn chỉ cần cài Docker, dán file compose, chạy hai lệnh docker compose up -d và docker compose logs -f là xong.
Dùng model LLM nào với Flowise?
Flowise hỗ trợ hầu hết nhà cung cấp: OpenAI, Anthropic, Google Gemini, Mistral, và cả model local qua Ollama. Nếu dữ liệu nhạy cảm hoặc muốn tiết kiệm chi phí, dùng Ollama chạy local là lựa chọn tối ưu.
Làm sao để gọi luồng AI từ website?
Mỗi luồng bạn tạo có một ID riêng và endpoint dạng /api/v1/prediction/<id>. Gửi POST request kèm API key trong header là gọi được, không cần viết backend phức tạp.
Bài viết liên quan
- Self host API LLM với Ollama trên VPS
- Tự host RAG trên VPS với vector DB và LLM
- Xây chatbot RAG bằng n8n và vector store trên VPS riêng


