Hướng dẫn cài đặt n8n trên VPS từ A-Z: Docker, NPM, SSL & Backup
Nếu bạn đang tìm giải pháp tự vận hành n8n trên VPS để tối ưu chi phí so với bản Cloud đắt đỏ, thì đây chính là bài viết dành cho bạn. Mình sẽ hướng dẫn cài đặt chi tiết từ A-Z, đồng thời chia sẻ kinh nghiệm xử lý những những lỗi thường gặp.

Tại sao nên cài đặt n8n trên VPS (Self-hosted) thay vì dùng Cloud?
- Tiết kiệm chi phí: Chỉ cần trả phí thuê VPS cơ bản hàng tháng thay vì trả theo lượt thực thi (executions).
- Quyền riêng tư: Toàn bộ dữ liệu, thông tin đăng nhập và các luồng công việc (workflows) được lưu trữ cục bộ trên máy chủ của bạn.
- Không giới hạn: Tự do tạo số lượng workflow và lượt chạy tùy theo sức mạnh phần cứng của VPS.
- Khả năng tùy biến: Dễ dàng cài đặt thêm các thư viện hoặc tùy chỉnh biến môi trường theo nhu cầu.
Khi nào thì nên tự host?
Theo kinh nghiệm của mình, tự host n8n phù hợp nếu bạn:
- Có kiến thức cơ bản về Linux và Docker (không cần giỏi lắm, biết SSH và chạy được vài lệnh là đủ)
- Cần chạy nhiều workflow mà không muốn lo về giới hạn
- Muốn tiết kiệm chi phí trong dài hạn
- Làm việc với dữ liệu phải lưu trong nước (tuân thủ quy định về dữ liệu)
- Cần tích hợp với hệ thống nội bộ của công ty
Còn nếu bạn chưa từng dùng terminal, không có nhiều thời gian để tự setup và vận hành hệ thống, hoặc cần dùng ngay lập tức thì n8n Cloud vẫn là lựa chọn hợp lý hơn.
Cấu hình VPS tối thiểu để chạy n8n
n8n không đòi hỏi cấu hình quá cao. Dưới đây là những gì bạn cần:
| Thông số | Cấu hình tối thiểu | Cấu hình khuyến nghị |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU trở lên |
| RAM | 2 GB | 4 GB |
| Ổ cứng | 20 GB SSD | 40 GB SSD/NVMe |
| Hệ điều hành | Ubuntu 20.04+ | Ubuntu 22.04 LTS |
Cách 1: Cài đặt n8n bằng Docker (Khuyên dùng nhất)
Docker là cách đơn giản và an toàn nhất. Bạn không cần lo về việc xung đột thư viện hay các vấn đề phụ thuộc. Việc nâng cấp phiên bản cũng rất dễ dàng.
Bước 1: Cài Docker và chuẩn bị môi trường
Đầu tiên, SSH vào VPS của bạn và chạy lần lượt các lệnh sau:
# Cập nhật hệ thống trước
sudo apt update && sudo apt upgrade -y
# Cài Docker bằng script tự động
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Thêm user hiện tại vào nhóm docker để không phải dùng sudo
sudo usermod -aG docker $USER
# Bật Docker tự khởi động cùng hệ thống
sudo systemctl enable docker
sudo systemctl start dockerSau khi chạy xong, bạn cần logout rồi SSH lại để cập nhật quyền:
exit
# Sau đó SSH lại vào serverBước 2: Tạo thư mục lưu trữ dữ liệu
# Tạo thư mục cho dữ liệu n8n
mkdir -p ~/.n8n
# Phân quyền (rất quan trọng để tránh lỗi permission denied)
sudo chown -R 1000:1000 ~/.n8nBước 3: Chạy n8n container
Nếu bạn chỉ muốn test nhanh:
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8nCòn nếu chạy chính thức (production), nên thêm các biến môi trường:
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
-e N8N_HOST="n8n.domain-cua-ban.com" \
-e N8N_PORT=5678 \
-e N8N_PROTOCOL=https \
-e NODE_ENV=production \
-e WEBHOOK_URL="https://n8n.domain-cua-ban.com/" \
-e GENERIC_TIMEZONE="Asia/Ho_Chi_Minh" \
-e TZ="Asia/Ho_Chi_Minh" \
n8nio/n8nBước 4: Kiểm tra xem n8n đã chạy chưa
# Xem danh sách container đang chạy
docker ps
# Xem log để check có lỗi gì không
docker logs n8n
# Test thử port
curl http://localhost:5678Nếu mọi thứ OK, bạn mở trình duyệt và truy cập http://IP_VPS:5678 để thấy giao diện n8n.
Sử dụng Docker Compose (Cách chuyên nghiệp hơn)
Thay vì chạy lệnh docker run dài dòng, bạn có thể dùng Docker Compose. 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.domain-cua-ban.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.domain-cua-ban.com/
- GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
- TZ=Asia/Ho_Chi_Minh
volumes:
n8n_data:Sau đó chạy:
docker compose up -dCách này đơn giản và dễ quản lý hơn nhiều.
Cách cập nhật n8n lên phiên bản mới
Khi có phiên bản mới, bạn update như sau:
Với Docker run:
docker pull n8nio/n8n:latest
docker stop n8n
docker rm n8n
# Chạy lại lệnh docker run như ban đầu
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:latestVới Docker Compose (đơn giản hơn):
cd /path/to/n8n
docker compose pull
docker compose up -dDữ liệu workflow, credentials của bạn vẫn được giữ nguyên vì đã mount volume ~/.n8n.
Lưu ý quan trọng: Luôn backup trước khi update:
tar -czvf n8n-backup-$(date +%F).tar.gz ~/.n8nCách 2: Cài đặt n8n bằng npm
Cách 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 sâu.
Bước 1: Cài Node.js
n8n yêu cầu Node.js phiên bản 18 trở lên:
# Cài 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 -vBước 2: Cài n8n
sudo npm install n8n -gBước 3: Chạy n8n
# Chạy đơn giản
n8n start
# Hoặc với tùy chọn
N8N_HOST=0.0.0.0 N8N_PORT=5678 n8n startBước 4: Tạo systemd service để chạy như service
Để n8n tự động chạy khi server khởi động lại, 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.targetKích hoạt:
sudo systemctl daemon-reload
sudo systemctl enable n8n
sudo systemctl start n8n
sudo systemctl status n8nCấu hình SSL với Let’s Encrypt (Bắt buộc!)
Nếu chạy production mà không có SSL thì rất nguy hiểm. Dữ liệu (kể cả credentials) sẽ truyền đi dạng plain text.
Cách 1: Dùng Nginx làm Reverse Proxy (Khuyên dùng)
Bước 1: Cài Nginx và Certbot
sudo apt install nginx certbot python3-certbot-nginx -yBước 2: Tạo cấu hình Nginx
Tạo file /etc/nginx/sites-available/n8n:
server {
listen 80;
server_name n8n.domain-cua-ban.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
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxBước 4: Lấy SSL certificate
sudo certbot --nginx -d n8n.domain-cua-ban.comCertbot sẽ tự động cấu hình SSL cho bạn.
Cách 2: Dùng Caddy (đơn giản hơn Nginx)
Caddy tự động xử lý SSL mà không cần config phức tạp.
Cài 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 caddyTạo Caddyfile tại /etc/caddy/Caddyfile:
n8n.domain-cua-ban.com {
reverse_proxy localhost:5678
}Khởi động:
sudo systemctl restart caddyCaddy tự lấy SSL từ Let’s Encrypt luôn, không cần config gì thêm.
Cấu hình Domain/Subdomain
Bước 1: Tạo DNS Record
Vào trang quản lý DNS của domain và tạo A record:
- Type: A
- Name: n8n
- Value: IP_VPS_CUA_BAN
- TTL: 300
Đợi 5-15 phút để DNS cập nhật.
Bước 2: Cập nhật biến môi trường n8n
Với Docker:
docker stop n8n
docker rm n8n
# Chạy lại với domain mới
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
-e N8N_HOST="n8n.domain-cua-ban.com" \
-e N8N_PROTOCOL=https \
-e WEBHOOK_URL="https://n8n.domain-cua-ban.com/" \
-e GENERIC_TIMEZONE="Asia/Ho_Chi_Minh" \
n8nio/n8nBước 3: Test webhook
Tạo một workflow đơn giản với Webhook trigger và test URL:
https://n8n.domain-cua-ban.com/webhook/test-webhookBackup dữ liệu n8n tự độ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 tự động mỗi ngày:
chmod +x /root/backup-n8n.sh
# Thêm vào crontab (chạy lúc 3h sáng)
(crontab -l 2>/dev/null; echo "0 3 * * * /root/backup-n8n.sh") | crontab -Restore từ backup
Khi cần restore:
# 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 n8n5 lỗi thường gặp và cách xử lý
Dựa trên kinh nghiệm thực tế, dưới đây là những lỗi mọi người hay gặp nhất:
Lỗi 1: Permission denied khi mount volume
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 ~/.n8nLỗi 2: Webhook không hoạt động
Webhook URL không nhận được request từ bên ngoài.
Nguyên nhân: Firewall chặn port, WEBHOOK_URL không đúng, hoặc chưa có SSL.
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 WEBHOOKLỗi 3: Connection timeout khi tạo workflow
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:
Option 1: Upgrade VPS lên cấu hình cao hơn
Option 2: Tắt executions logging để giảm tải database:
docker run <tên_container> \
-e EXECUTIONS_DATA_SAVE_ON_ERROR=none \
-e EXECUTIONS_DATA_SAVE_ON_SUCCESS=none \
n8nio/n8nLỗi 4: SSL certificate không valid
Trình duyệt cảnh báo “Not Secure” dù đã cấu hình SSL.
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.domain-cua-ban.com --force-renewalLỗi 5: n8n tự restart liên tục
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/fstabKết luận
Cài đặt n8n trên VPS không khó lắm nếu bạn làm theo từng bước. Tóm lại 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 đúng quyền
- Cấu hình Nginx hoặc 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
Chúc bạn cài đặt thành công!


0 bình luận
Để lại bình luận
Bạn phải đăng nhập để gửi bình luận.