Cách cài n8n trên VPS bằng Docker chi tiết 2026

Bạn vừa thuê một VPS Linux mới, muốn tự host n8n để chạy workflow tự động hóa mà không phải trả phí cloud theo tháng. Cách nhanh và sạch nhất là cài bằng Docker Compose: một file cấu hình, một lệnh, mọi thứ chạy. Bài này mình đi từ VPS Ubuntu 24.04 trống trơn đến lúc có n8n chạy sau HTTPS, kèm reverse proxy Nginx và SSL miễn phí.
Bạn cần một VPS có ít nhất 2GB RAM, root access hoặc user sudo, và một domain trỏ về IP VPS nếu muốn dùng HTTPS. Nếu chưa có VPS, bạn có thể tham khảo gói VPS Linux NVMe của thueVPS, cấu hình KVM full root, IPv4 riêng tại Việt Nam, trả theo tháng không hợp đồng dài hạn. Bây giờ vào việc chính.
- n8n chạy trong container, cô lập với hệ điều hành, dễ nâng cấp và xóa sạch khi cần.
- Docker Compose quản lý các service: n8n, PostgreSQL (tùy chọn), và sau này thêm Redis nếu cần queue mode.
- Reverse proxy Nginx xử lý HTTPS, chuyển tiếp request tới container n8n.
Yêu cầu trước khi bắt đầu
- VPS chạy Ubuntu 24.04 LTS (hoặc Debian 12, các bước tương tự).
- User có quyền
sudo, không dùng root trực tiếp. - Tên miền trỏ A record về IP VPS (kiểm tra bằng
dig +short yourdomain.com). - Port 22, 80, 443 mở trên firewall.
Vì sao nên cài n8n bằng Docker thay vì cài trực tiếp
Cài n8n trực tiếp bằng npm rất nhanh hỏng khi nâng cấp Node.js, vì n8n yêu cầu đúng phiên bản Node. Docker gói toàn bộ runtime vào image, bạn chỉ cần kéo về và chạy. Khi có bản n8n mới, sửa tag version trong file compose rồi chạy docker compose pull && docker compose up -d là xong.
Một lý do nữa là dọn dẹp. Container và volume nằm gọn trong Docker, không vương vãi file ra hệ thống. Muốn xóa hẳn, chạy docker compose down -v là sạch, không để lại package hay thư mục cấu hình rải rác. Với một công cụ chạy dài hạn như n8n, đây là điểm cộng lớn so với cách cài thủ công.
Bước 1 - Cài đặt Docker và Docker Compose trên Ubuntu 24.04
Đầu tiên cập nhật package và cài các gói cần thiết:
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
Thêm GPG key và repository chính thức của Docker:
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
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Cài Docker Engine, CLI và plugin Compose v2:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Bật Docker tự khởi động cùng hệ thống và thêm user hiện tại vào group docker để không phải gõ sudo mỗi lần:
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
newgrp docker
VERIFY, kiểm tra phiên bản Docker và Compose:
docker --version
docker compose version
Kết quả mong đợi, ví dụ: Docker version 27.x.x và Docker Compose version v2.x.x. Nếu thấy hai dòng này nghĩa là Docker đã sẵn sàng.
Nếu bạn dùng VPS n8n cài sẵn của thueVPS thì bước này đã có sẵn, không cần làm lại. Nhưng tự cài vẫn giúp bạn hiểu rõ từng thành phần và chủ động nâng cấp sau này.
Bước 2 - Tạo cấu trúc thư mục và file docker-compose.yml
Tạo thư mục riêng cho n8n và file cấu hình:
mkdir -p ~/n8n
cd ~/n8n
nano docker-compose.yml
Dán nội dung sau vào file, thay yourdomain.com bằng domain thật của bạn:
services:
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678"
environment:
- N8N_HOST=yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://yourdomain.com/
- GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
- TZ=Asia/Ho_Chi_Minh
volumes:
- n8n_data:/home/node/.n8n
Thêm volume ở cuối file:
volumes:
n8n_data:
Lưu file bằng Ctrl+O, Enter, rồi Ctrl+X để thoát.
Giải thích vài biến môi trường quan trọng:
N8N_HOST, domain bạn sẽ truy cập n8n, dùng để tạo link webhook và URL trong email.N8N_PROTOCOL=https, báo n8n rằng nó chạy phía sau HTTPS, tránh lỗi redirect vòng lặp.WEBHOOK_URL, URL gốc cho webhook, phải khớp với domain và giao thức.127.0.0.1:5678:5678, chỉ bind trên localhost, không expose ra ngoài, an toàn hơn. Nginx sẽ là cửa ngõ riêng biệt.
Bạn có thể dùng PostgreSQL thay vì SQLite mặc định nếu có nhiều workflow hoặc dự định chạy queue mode. Cách làm mình đã hướng dẫn trong bài chuyển n8n từ SQLite sang PostgreSQL, có thể đọc thêm sau. Với giai đoạn đầu, SQLite gọn nhẹ và đủ dùng.
Bước 3 - Khởi động container n8n
Chạy lệnh sau trong thư mục ~/n8n:
docker compose up -d
Lệnh này kéo image n8n về và chạy container ở chế độ nền. VERIFY bằng cách kiểm tra trạng thái container và log:
docker compose ps
docker logs -f n8n
Bạn sẽ thấy dòng Editor is now accessible via: http://localhost:5678 trong log. Vì chúng ta bind trên localhost, thử truy cập ngay trên VPS bằng lệnh sau để chắc chắn n8n phản hồi:
curl -I http://127.0.0.1:5678
Nếu trả về mã 200 OK hoặc 302 Found, n8n đang chạy tốt.
Bước 4 - Cài Nginx làm reverse proxy và cấu hình SSL
Cài Nginx và Certbot:
sudo apt install -y nginx certbot python3-certbot-nginx
Tạo file cấu hình cho domain:
sudo nano /etc/nginx/sites-available/n8n
Dán nội dung sau, thay yourdomain.com:
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:5678;
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_buffering off;
}
}
Giải thích các dòng proxy_set_header:
UpgradevàConnection "upgrade", bắt buộc cho WebSocket, n8n dùng cho realtime update trên editor.X-Forwarded-Proto $scheme, cho n8n biết request gốc là HTTP hay HTTPS.proxy_buffering off, giảm độ trễ khi streaming phản hồi từ workflow.
Kích hoạt site và kiểm tra cấu hình:
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
Nếu output là syntax is ok và test is successful, reload Nginx:
sudo systemctl reload nginx
Bây giờ cấp SSL tự động bằng Certbot:
sudo certbot --nginx -d yourdomain.com
Certbot sẽ tự sửa cấu hình Nginx, thêm khối listen 443 và cấu hình redirect HTTP sang HTTPS. Sau khi chạy xong, truy cập https://yourdomain.com và bạn sẽ thấy trang tạo tài khoản admin của n8n.
Nếu chưa có domain hoặc chỉ muốn dùng IP tạm thời, bạn vẫn truy cập qua http://IP_VPS:5678 nếu mở port trên firewall. Nhưng đây chỉ là giải pháp tạm thời, không nên dùng cho production vì thiếu HTTPS và webhook sẽ gọi qua địa chỉ IP, dễ bị chặn bởi một số dịch vụ bên ngoài.
Bước 5 - Bảo mật và cấu hình firewall
Nếu dùng UFW, mở các port cần thiết:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Chỉ mở port 80 và 443, không cần mở 5678 vì n8n chỉ bind trên localhost. Điều này giảm bề mặt tấn công đáng kể. Bạn có thể kiểm tra lại bằng:
sudo ufw status
Nếu muốn siết chặt hơn nữa cho n8n self-host, mình có bài bảo mật n8n self-host: khóa webhook lạ và siết firewall với các mẹo cấu hình nâng cao như dùng API key cho webhook, hạn chế IP truy cập editor. Nên đọc nếu bạn dùng n8n cho việc quan trọng.
Xử lý lỗi thường gặp khi cài n8n trên VPS bằng Docker
Lỗi 1: Trang web bị redirect vòng lặp hoặc lỗi "Too Many Redirects"
Nguyên nhân thường do chưa đặt N8N_PROTOCOL=https trong file docker-compose. N8n nhận request HTTP từ Nginx rồi tự redirect sang HTTPS, gây vòng lặp. Sửa biến môi trường và restart:
docker compose up -d --force-recreate
Lỗi 2: Webhook trả về lỗi 404 khi gọi từ bên ngoài
Kiểm tra xem WEBHOOK_URL đã khớp domain chưa, và trong n8n bật Webhook URLs để production. Vào Settings → Workflow → Webhook URLs, chọn "Production". Sau đó kiểm tra log Nginx:
sudo tail -f /var/log/nginx/error.log
Lỗi 3: Container chết liên tục, log báo lỗi database
Volume dữ liệu n8n bị hỏng hoặc thiếu quyền ghi. Cách xử lý nhanh: dừng container, kiểm tra volume:
docker compose down
docker volume ls
docker volume inspect n8n_n8n_data
Nếu volume quá lớn hoặc sai quyền, bạn có thể xóa và tạo lại volume, nhưng sẽ mất toàn bộ workflow. Luôn backup trước khi động vào volume. Mình có bài backup n8n đúng cách: encryption key, database và credential hướng dẫn chi tiết cách sao lưu an toàn.
Nếu n8n chạy ổn nhưng bạn muốn theo dõi tài nguyên, lệnh đơn giản nhất là:
docker stats
Lệnh này hiển thị CPU, RAM thực tế của container. Để chọn cấu hình VPS hợp lý theo số workflow, có thể xem thêm gợi ý trong bài chọn RAM và CPU cho n8n theo số workflow thực tế.
Câu hỏi thường gặp
Cài n8n bằng Docker có tốn nhiều RAM hơn cài trực tiếp không?
Không đáng kể. Container n8n chiếm khoảng 300-500MB RAM tùy số workflow. Phần overhead của Docker so với cài trực tiếp rất nhỏ, thường dưới 50MB. Đổi lại bạn có môi trường sạch, dễ nâng cấp hơn.
Nên dùng SQLite hay PostgreSQL cho n8n trên Docker?
SQLite đủ dùng cho dưới vài chục workflow và vài nghìn executions mỗi ngày. Nếu bạn chạy nhiều workflow song song, có queue mode, hoặc cần độ tin cậy cao, hãy chuyển sang PostgreSQL. Cách chuyển đổi được hướng dẫn trong bài viết liên quan bên dưới.
Bao lâu nên cập nhật n8n bằng Docker?
Nên cập nhật khi có bản mới đáng chú ý, thường mỗi 2-4 tuần. Lệnh nâng cấp: docker compose pull && docker compose up -d. Trước khi nâng cấp, hãy sao lưu volume dữ liệu và encryption key vì một số bản cập nhật có thể thay đổi cấu trúc database.
Có thể cài n8n trên VPS 1GB RAM bằng Docker không?
Chạy được nhưng rất chật, dễ bị OOM khi có workflow nặng. Nếu dùng VPS 1GB, nên thêm swap hoặc tối ưu bằng bài hướng dẫn tối ưu n8n trên VPS 2GB RAM. Với 2GB RAM trở lên bạn sẽ thoải mái hơn nhiều.
Nên mua VPS nào để chạy n8n ở Việt Nam?
Nếu user, đối tác và workflow chủ yếu trong nước, một VPS Linux NVMe có IPv4 Việt Nam ở thueVPS là lựa chọn hợp lý: bandwidth nội địa 100 Mbps trên port 1 Gbps, full root KVM, trả theo tháng. Nếu cần gửi email từ workflow, nên dùng thêm VPS SMTP riêng để giữ reputation IP.
Bài viết liên quan
- Cài n8n trên VPS Ubuntu 24.04 bằng Docker Compose từ A-Z
- Cấu hình Nginx reverse proxy và SSL Let's Encrypt cho n8n
- Chuyển n8n từ SQLite sang PostgreSQL không mất workflow
- Bảo mật n8n self-host: khóa webhook lạ và siết firewall


