Nội dung
Bạn đã quyết định self-host n8n để tiết kiệm chi phí và kiểm soát hoàn toàn dữ liệu? Đây là lựa chọn đúng đắn. Tuy nhiên, nhiều người dùng gặp khó khăn với các lỗi như connection timeout, SSL certificate, hay cấu hình domain. Trong bài viết này, AZDIGI sẽ hướng dẫn bạn cài đặt n8n trên VPS từ A-Z, bao gồm cả cách xử lý các lỗi phổ biến mà cộng đồng thường gặp.

Tại sao nên self-host n8n trên VPS?
Trước khi bắt đầu cài đặt, hãy hiểu rõ lợi ích của việc tự host n8n so với sử dụng n8n Cloud.
So sánh Self-hosted vs Cloud
| Tiêu chí | n8n Self-hosted | n8n Cloud |
|---|---|---|
| Chi phí | Chỉ trả tiền VPS (~79.000đ/tháng) | Từ $20/tháng (~500.000đ) |
| Executions | Không giới hạn | Giới hạn theo plan |
| Dữ liệu | Lưu trên server của bạn | Lưu trên cloud n8n |
| Kiểm soát | Hoàn toàn | Hạn chế |
| Cập nhật | Tự quản lý | Tự động |
| Support | Community | Có team hỗ trợ |
Khi nào nên self-host?
Phù hợp nếu:
- Bạn có kiến thức cơ bản về Linux/Docker
- Cần chạy nhiều workflows không giới hạn
- Muốn tiết kiệm chi phí dài hạn
- Yêu cầu dữ liệu lưu trong nước (compliance)
- Tích hợp với hệ thống internal
Không phù hợp nếu:
- Chưa bao giờ dùng terminal/SSH
- Cần dùng ngay, không có thời gian setup
- Không có người quản lý server
Yêu cầu cấu hình VPS
n8n không đòi hỏi cấu hình quá cao. Tuy nhiên, cấu hình phù hợp sẽ đảm bảo hệ thống chạy ổn định.
Cấu hình tối thiểu
| Thông số | Cấu hình tối thiểu | Cấu hình khuyến nghị |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 2 GB | 4 GB |
| Storage | 20 GB SSD | 40 GB NVMe |
| OS | Ubuntu 20.04+ | Ubuntu 22.04 LTS |
| Network | 100 Mbps | 1 Gbps |
Lời khuyên chọn VPS
Với cấu hình phù hợp cho n8n với chi phí phù hợp, bạn có thể tham khảo VPS X-Platinum của AZDIGI:
| Gói VPS | Cấu hình | Giá/tháng | Phù hợp cho |
|---|---|---|---|
| X1 | 1 vCPU, 2GB RAM, 30GB NVMe | 79.000đ | Thử nghiệm, cá nhân |
| X2 | 2 vCPU, 4GB RAM, 50GB NVMe | 159.000đ | SMB, 10-50 workflows |
| X4 | 4 vCPU, 8GB RAM, 80GB NVMe | 299.000đ | Doanh nghiệp lớn |
Cách 1: Cài đặt n8n tự động (Khuyến nghị – áp dụng tại AZDIGI)
Nếu bạn là người mới không am hiểu về kỹ thuật thì có thể sử dụng cách cài đặt n8n tự động theo template được AZDIGI cung cấp sẵn. Chỉ cần chọn template n8n khi đăng ký VPS, hoặc dùng chức năng Reinstall (cài đặt lại) trong VPS và chọn template n8n.
Lưu ý: Không cài n8n bằng template với VPS đã có dữ liệu.
Xem chi tiết: Cách cài n8n tự động khi dùng VPS tại AZDIGI
Cách 2: Cài đặt n8n bằng Docker (Khuyến khích cho kỹ thuật)
Docker là cách đơn giản và an toàn nhất để cài đặt n8n, việc cập nhật phiên bản n8n cũng rất thuận tiện. Bạn không cần lo về sự phụ thuộc hay xung đột với các ứng dụng khác.
Để thuận tiện, AZDIGI sẽ hướng dẫn áp dụng với VPS/Server sử dụng hệ điều hành Ubuntu.
Bước 1: Cập nhật hệ thống và cài Docker
SSH vào VPS và chạy các lệnh sau:
# Cập nhật hệ thống
sudo apt update && sudo apt upgrade -y
# Cài đặt Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Thêm user hiện tại vào group docker
sudo usermod -aG docker $USER
# Khởi động Docker
sudo systemctl enable docker
sudo systemctl start docker
Logout và login lại để áp dụng group docker:
exit
# SSH lại vào server
Bước 2: Tạo thư mục lưu trữ dữ liệu
# Tạo thư mục cho n8n data
mkdir -p ~/.n8n
# Phân quyền (quan trọng để tránh lỗi permission)
sudo chown -R 1000:1000 ~/.n8n
Bước 3: Chạy n8n container
Cách đơn giản (development/test):
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n
Cách đầy đủ với biến môi trường (phù hợp khi chạy chính thức):
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
-e N8N_HOST="n8n.yourdomain.com" \
-e N8N_PORT=5678 \
-e N8N_PROTOCOL=https \
-e NODE_ENV=production \
-e WEBHOOK_URL="https://n8n.yourdomain.com/" \
-e GENERIC_TIMEZONE="Asia/Ho_Chi_Minh" \
-e TZ="Asia/Ho_Chi_Minh" \
n8nio/n8n
Bước 4: Kiểm tra n8n đã chạy
# Kiểm tra container đang chạy
docker ps
# Xem logs
docker logs n8n
# Kiểm tra port
curl http://localhost:5678
Nếu mọi thứ OK, bạn có thể truy cập http://YOUR_VPS_IP:5678 để thấy giao diện n8n.
Sử dụng Docker Compose (Khuyến nghị cho production)
Tạo file docker-compose.yml:
version: '3.8'
services:
n8n:
image: n8nio/n8n
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
volumes:
- n8n_data:/home/node/.n8n
environment:
- N8N_HOST=n8n.yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.yourdomain.com/
- GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
- TZ=Asia/Ho_Chi_Minh
# Tùy chọn: Database PostgreSQL thay vì SQLite
# - DB_TYPE=postgresdb
# - DB_POSTGRESDB_HOST=postgres
# - DB_POSTGRESDB_DATABASE=n8n
# - DB_POSTGRESDB_USER=n8n
# - DB_POSTGRESDB_PASSWORD=your_password
volumes:
n8n_data:
Chạy với:
docker compose up -d
Cập nhật phiên bản n8n khi sử dụng Docker / Docker Compose
Trường hợp 1: Chạy n8n bằng Docker (docker run)
# Kéo image n8n mới nhất
docker pull n8nio/n8n:latest
# Dừng container n8n hiện tại
docker stop n8n
# Xoá container cũ (KHÔNG xoá volume)
docker rm n8n
# Chạy lại container với image mới
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
-e N8N_HOST="n8n.yourdomain.com" \
-e N8N_PORT=5678 \
-e N8N_PROTOCOL=https \
-e NODE_ENV=production \
-e WEBHOOK_URL="https://n8n.yourdomain.com/" \
-e GENERIC_TIMEZONE="Asia/Ho_Chi_Minh" \
-e TZ="Asia/Ho_Chi_Minh" \
n8nio/n8n:latest
👉 Dữ liệu workflow, credentials vẫn được giữ nguyên vì đã mount volume ~/.n8n.
Trường hợp 2: Chạy n8n bằng Docker Compose (Khuyến nghị)
# Vào thư mục chứa docker-compose.yml
cd /path/to/n8n
# Kéo image mới nhất
docker compose pull
# Khởi động lại container với phiên bản mới
docker compose up -d
Nếu muốn đảm bảo container cũ được recreate hoàn toàn:
docker compose down
docker compose up -d
Kiểm tra phiên bản n8n sau khi cập nhật
docker logs n8n | head -n 20
Hoặc vào giao diện n8n → Settings → About n8n để kiểm tra version.
Lưu ý quan trọng khi cập nhật n8n
- Nên backup thư mục dữ liệu (
~/.n8nhoặc volume Docker) trước khi update:tar -czvf n8n-backup-$(date +%F).tar.gz ~/.n8n - Với môi trường production lớn:
- Tránh update ngay phiên bản major mới (ví dụ 1.x → 2.x) nếu chưa đọc changelog
- Test trước trên VPS staging nếu có
- Không nên dùng tag
latestnếu cần sự ổn định lâu dài → có thể pin version:image: n8nio/n8n:1.34.2
Cách này giúp bạn chủ động nâng cấp, rollback và vận hành n8n ổn định lâu dài trên VPS.
Cách 2: Cài đặt n8n bằng npm
Phương pháp này phù hợp nếu bạn muốn kiểm soát chi tiết hơn hoặc cần debug.
Hướng dẫn nay áp dụng trên hệ điều hành Ubuntu/Debian.
Bước 1: Cài đặt Node.js
n8n yêu cầu Node.js 18 trở lên:
# Cài đặt Node.js 20 LTS
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Kiểm tra version
node -v # Phải >= 18.x
npm -v
Bước 2: Cài đặt n8n global
sudo npm install n8n -g
Bước 3: Chạy n8n
# Chạy đơn giản
n8n start
# Chạy với các tùy chọn
N8N_HOST=0.0.0.0 N8N_PORT=5678 n8n start
Bước 4: Tạo systemd service (để chạy như service)
Tạo file /etc/systemd/system/n8n.service:
[Unit]
Description=n8n Workflow Automation
After=network.target
[Service]
Type=simple
User=root
Environment="N8N_HOST=0.0.0.0"
Environment="N8N_PORT=5678"
Environment="GENERIC_TIMEZONE=Asia/Ho_Chi_Minh"
ExecStart=/usr/bin/n8n start
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
Kích hoạt service:
sudo systemctl daemon-reload
sudo systemctl enable n8n
sudo systemctl start n8n
sudo systemctl status n8n
Cấu hình SSL với Let’s Encrypt
Bắt buộc cho production! Không có SSL, dữ liệu (bao gồm credentials) sẽ truyền không mã hóa.
Cách 1: Dùng Nginx làm Reverse Proxy (Khuyến nghị)
Bước 1: Cài đặt Nginx và Certbot
sudo apt install nginx certbot python3-certbot-nginx -y
Bước 2: Tạo cấu hình Nginx
Tạo file /etc/nginx/sites-available/n8n:
server {
listen 80;
server_name n8n.yourdomain.com;
location / {
proxy_pass http://localhost: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_cache_bypass $http_upgrade;
proxy_read_timeout 86400;
chunked_transfer_encoding off;
proxy_buffering off;
}
}
Bước 3: Kích hoạt site
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Bước 4: Lấy SSL certificate
sudo certbot --nginx -d n8n.yourdomain.com
Certbot sẽ tự động cập nhật cấu hình Nginx với SSL.
Cách 2: Dùng Caddy (Đơn giản hơn)
Caddy tự động xử lý SSL mà không cần cấu hình phức tạp.
Cài đặt Caddy:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
Tạo Caddyfile /etc/caddy/Caddyfile:
n8n.yourdomain.com {
reverse_proxy localhost:5678
}
Khởi động Caddy:
sudo systemctl restart caddy
Xong! Caddy tự động lấy SSL từ Let’s Encrypt.

Cấu hình Domain/Subdomain
Bước 1: Tạo DNS Record
Vào quản lý DNS của domain và tạo A record:
| Type | Name | Value | TTL |
|---|---|---|---|
| A | n8n | YOUR_VPS_IP | 300 |
Chờ 5-15 phút để DNS propagate.
Bước 2: Cập nhật biến môi trường n8n
Với Docker, cập nhật lại container:
docker stop n8n
docker rm n8n
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
-e N8N_HOST="n8n.yourdomain.com" \
-e N8N_PROTOCOL=https \
-e WEBHOOK_URL="https://n8n.yourdomain.com/" \
-e GENERIC_TIMEZONE="Asia/Ho_Chi_Minh" \
n8nio/n8n
Bước 3: Test webhook
Tạo một workflow đơn giản với Webhook trigger và test URL:
https://n8n.yourdomain.com/webhook/test-webhook
Backup dữ liệu n8n
Dữ liệu cần backup
n8n lưu trữ tất cả trong thư mục ~/.n8n:
database.sqlite– Workflows, credentials, executionsconfig– Cấu hình.n8n/– Encryption keys (quan trọng!)
Script backup tự động
Tạo file /root/backup-n8n.sh:
#!/bin/bash
# Cấu hình
BACKUP_DIR="/root/backups/n8n"
N8N_DATA="$HOME/.n8n"
KEEP_DAYS=7
# Tạo thư mục backup
mkdir -p $BACKUP_DIR
# Tên file backup với timestamp
BACKUP_FILE="$BACKUP_DIR/n8n-backup-$(date +%Y%m%d-%H%M%S).tar.gz"
# Tạo backup
tar -czvf $BACKUP_FILE $N8N_DATA
# Xóa backup cũ hơn 7 ngày
find $BACKUP_DIR -name "*.tar.gz" -mtime +$KEEP_DAYS -delete
echo "Backup completed: $BACKUP_FILE"
Đặt lịch chạy hàng ngày với cron:
chmod +x /root/backup-n8n.sh
# Thêm vào crontab (chạy lúc 3h sáng mỗi ngày)
(crontab -l 2>/dev/null; echo "0 3 * * * /root/backup-n8n.sh") | crontab -
Restore từ backup
# Dừng n8n
docker stop n8n
# Restore
tar -xzvf /root/backups/n8n/n8n-backup-YYYYMMDD.tar.gz -C /
# Khởi động lại
docker start n8n
Troubleshooting: 5 lỗi thường gặp
Dựa trên phản hồi từ các hội nhóm Facebook và n8n Community, đây là các lỗi phổ biến nhất:
Lỗi 1: Permission denied khi mount volume
Triệu chứng:
Error: EACCES: permission denied, open '/home/node/.n8n/database.sqlite'
Nguyên nhân: Container n8n chạy với user ID 1000, nhưng thư mục host không đúng quyền.
Cách sửa:
sudo chown -R 1000:1000 ~/.n8n
Lỗi 2: Webhook không hoạt động
Triệu chứng: Webhook URL không nhận được request từ bên ngoài.
Nguyên nhân thường gặp:
- Firewall chặn port
- WEBHOOK_URL không đúng
- SSL chưa cấu hình
Cách sửa:
# Mở port firewall
sudo ufw allow 5678
sudo ufw allow 80
sudo ufw allow 443
# Kiểm tra biến môi trường
docker exec n8n env | grep WEBHOOK
Lỗi 3: Connection timeout khi tạo workflow
Triệu chứng: Giao diện n8n load chậm hoặc timeout.
Nguyên nhân: VPS thiếu RAM hoặc CPU quá yếu.
Cách sửa:
- Upgrade VPS lên cấu hình cao hơn
- Hoặc tối ưu: tắt executions logging để giảm tải database
docker run <n8n_container_name> -e EXECUTIONS_DATA_SAVE_ON_ERROR=none \
-e EXECUTIONS_DATA_SAVE_ON_SUCCESS=none \
n8nio/n8n
Lỗi 4: SSL certificate không valid
Triệu chứng: Trình duyệt cảnh báo “Not Secure” dù đã cấu hình SSL.
Nguyên nhân: Certbot chưa renew hoặc cấu hình Nginx sai.
Cách sửa:
# Kiểm tra certificate
sudo certbot certificates
# Renew thủ công
sudo certbot renew --dry-run
# Nếu lỗi, xóa và tạo lại
sudo certbot --nginx -d n8n.yourdomain.com --force-renewal
Lỗi 5: n8n tự restart liên tục
Triệu chứng: Container restart loop, logs hiện lỗi memory.
Nguyên nhân: Out of memory (OOM killed).
Cách sửa:
# Kiểm tra memory usage
docker stats n8n
# Thêm swap nếu cần
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Cập nhật n8n lên version mới
Với Docker
# Pull image mới nhất
docker pull n8nio/n8n:latest
# Dừng container cũ
docker stop n8n
docker rm n8n
# Chạy lại với image mới (giữ nguyên data volume)
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n:latest
Với npm
sudo npm update -g n8n
sudo systemctl restart n8n
Lưu ý: Luôn backup trước khi update. n8n 2.0 có nhiều breaking changes.
Kết luận
Việc cài đặt n8n trên VPS không quá phức tạp nếu bạn làm theo từng bước. Tóm tắt các bước chính:
- Chuẩn bị VPS tối thiểu 2GB RAM, cài Docker
- Chạy n8n container với volume mount
- Cấu hình Nginx/Caddy làm reverse proxy với SSL
- Trỏ domain và cập nhật WEBHOOK_URL
- Setup backup tự động hàng ngày
Với chi phí chỉ từ 79.000đ/tháng cho VPS, bạn có thể chạy n8n không giới hạn workflows và executions – tiết kiệm đáng kể so với n8n Cloud hay Zapier.
Bước tiếp theo:
- Đọc n8n là gì? nếu bạn mới bắt đầu
- Tham khảo Top 10 Workflow n8n để có ý tưởng sử dụng
- Tham gia n8n Community Forum để được hỗ trợ
Nếu bạn cần VPS phù hợp để self-host n8n, AZDIGI cung cấp X-Platinum VPS với ổ cứng NVMe tốc độ cao và hỗ trợ kỹ thuật 24/7. Đội ngũ kỹ thuật sẵn sàng hỗ trợ bạn cấu hình n8n nếu gặp khó khăn.