Cấu hình VPS cho n8n production giúp bạn chạy workflow tự động với main, worker, PostgreSQL và Redis riêng vai trò. n8n nhận dữ liệu từ ứng dụng, xử lý theo workflow và gửi kết quả tới dịch vụ đích. Bài viết này sẽ hướng dẫn bạn chọn cấu hình, dựng queue mode bằng Docker Compose và kiểm tra từng bước trên Ubuntu 24.04.
Những điểm chính
- Kiến trúc: Main nhận yêu cầu, Redis giữ hàng đợi, worker xử lý và PostgreSQL lưu dữ liệu.
- Code node: Mỗi worker ghép một task runner cùng phiên bản.
- Tài nguyên: Chọn CPU, RAM theo dữ liệu và số execution chạy cùng lúc.
- Khôi phục: Giữ database, volume và khóa mã hóa ở nơi an toàn ngoài VPS.
- Góc nhìn VPSMMO: Nên tách tác vụ nặng khỏi tiến trình giao diện trước khi tăng lượng workflow production.
n8n production là gì?
n8n production là môi trường chạy workflow phục vụ công việc thực tế, có theo dõi lỗi, sao lưu và quy trình khôi phục. Khác với bản chạy thử, bạn cần giữ dữ liệu và credential an toàn trong suốt quá trình vận hành.
Bạn có thể dùng n8n để nhận webhook, đồng bộ dữ liệu hoặc chạy lịch gọi API. Khi nhiều tác vụ cùng hoạt động, việc tách vai trò xử lý giúp giao diện dễ sử dụng và thuận tiện kiểm tra từng thành phần.
Các thành phần chính của cấu hình VPS cho n8n gồm:
- Main: Quản lý editor, lịch chạy và nhận webhook.
- Worker: Thực thi workflow từ hàng đợi.
- Task runner: Xử lý tác vụ Code node theo cấu hình external mode.
- PostgreSQL: Lưu workflow, credential và dữ liệu execution.
- Redis: Điều phối hàng đợi giữa main và worker.
Bài dùng n8n 2.43.7 và runner cùng phiên bản. Trước khi cài, bạn nên kiểm tra bản stable mới nhất cùng release notes để chọn bộ image phù hợp.

Queue mode trong n8n hoạt động như thế nào?
n8n queue mode chuyển việc thực thi từ main sang worker thông qua Redis. Main tạo execution, đưa mã execution vào hàng đợi; worker lấy mã đó, đọc dữ liệu từ PostgreSQL rồi chạy workflow.
Theo tài liệu queue mode của n8n, main và các worker cùng dùng database, Redis và khóa mã hóa. n8n worker ghi kết quả vào PostgreSQL, sau đó báo trạng thái hoàn thành qua hàng đợi.
Ví dụ, bạn nhận dữ liệu đơn hàng qua webhook. Main nhận yêu cầu, worker lấy workflow để gọi API kế toán, còn kết quả được lưu trong database để bạn xem lại trên giao diện.
Với Code node, mỗi worker kết nối tới một task runner riêng. Bạn giữ cùng phiên bản image và token runner cho các cặp này để việc thực thi mã diễn ra đúng thành phần.
Khi nào bạn nên dùng queue mode?
Bạn nên dùng queue mode khi nhiều workflow cùng chạy, tác vụ nặng làm editor chậm hoặc cần mở rộng tiến trình thực thi. Nếu đang chạy ít workflow tuần tự và hệ thống đáp ứng tốt, bạn có thể giữ kiến trúc gọn trước.
Benchmark của n8n ghi nhận một instance đạt tới khoảng 220 execution mỗi giây với workflow đơn giản. Workflow gọi API, xử lý tệp hoặc Code node cần được đo trên dữ liệu thực tế trước khi chọn tải production.
Cấu hình VPS cho n8n cần đi cùng cách viết workflow. Khi API đích chậm hoặc giới hạn request, hãy chỉnh luồng xử lý và mức song song trước khi tăng thêm worker.

Yêu cầu hệ thống và cấu hình VPS cho n8n
VPSMMO gợi ý khởi điểm 4 vCPU, 8 GB RAM để dựng main, 2 worker, PostgreSQL, Redis và Nginx. Đây là mức gợi ý để bạn bắt đầu đánh giá, sau đó điều chỉnh bằng số đo workflow của bạn.
Trước khi cài, bạn cần chuẩn bị:
- Hệ điều hành: Ubuntu 24.04 mới, chưa có stack hoặc panel xung đột.
- CPU và RAM: Đủ cho main, worker, runner và các dịch vụ dữ liệu.
- Ổ lưu trữ: NVMe còn chỗ cho database, execution, log và backup.
- Quyền quản trị: Root hoặc tài khoản sudo; có sẵn nano, openssl và ufw.
- Tên miền: Một tên miền như n8n.tenmien.vn cùng quyền sửa DNS.
- Kết nối: Internet để tải image, cổng SSH và cổng HTTP/HTTPS để quản trị, cấp SSL.
Lưu ý: Bạn nên dùng máy mới cho bộ lệnh trong bài. Nếu VPS đã có workflow, hãy sao lưu database, khóa mã hóa và volume trước khi thay đổi kiến trúc.
Chọn RAM và concurrency
RAM tăng theo JSON, binary data, số node, Code node và số workflow chạy đồng thời. Chạy thủ công còn cần dữ liệu cho editor, vì vậy bạn nên đo cả lúc chỉnh workflow lẫn khi chạy production.
Worker mặc định có concurrency 10; tài liệu khuyên từ 5 trở lên. VPSMMO gợi ý bắt đầu trong khoảng 5 đến 10, rồi xem RAM, CPU và thời gian chờ để điều chỉnh.
Bạn cần để RAM cho database, Redis, runner và hệ điều hành. Số worker không tính bằng một công thức cố định theo vCPU; hãy tăng theo hàng đợi và mức tài nguyên còn trống.
Các gói dưới bắt đầu từ 12 GB RAM để còn bộ nhớ cho tải phát sinh. Bố trí trong bảng là gợi ý khởi đầu của VPSMMO:
3 gói VPS n8n tại VPSMMO cho queue mode
Các bước cài đặt và cấu hình VPS cho n8n
Bạn sẽ lần lượt trỏ tên miền, cài Docker, tạo biến môi trường, khai báo các dịch vụ rồi khởi động. Làm từng bước và kiểm tra kết quả trước khi chuyển sang phần tiếp theo.
Bước 1: Trỏ tên miền về IP của VPS
Tạo bản ghi A cho n8n trong trang DNS đang sử dụng. Giá trị bản ghi là IPv4 của VPS, không thêm giao thức hoặc đường dẫn vào ô địa chỉ.
Khi tên miền đã trỏ đúng IP, bạn có thể cấp SSL ở phần Nginx. Xem thêm hướng dẫn chọn gói, tên miền và SSL nếu bạn cần chuẩn bị từ bước đặt dịch vụ.
Bước 2: Cài Docker Engine và Compose plugin
Bạn dùng kho Docker chính thức theo hướng dẫn Docker cho Ubuntu. Quá trình tải gói và image có thể mất vài phút, tùy mạng và cấu hình VPS.
Lưu ý: Khối dưới có lệnh gỡ gói Docker xung đột. Với máy đang chạy dịch vụ, bạn cần kiểm tra kế hoạch chuyển đổi và backup trước khi thực hiện.
Trước tiên, hãy mở phiên root và cài Docker cùng Compose plugin:
sudo -i
apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)
apt update
apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker run hello-world
docker compose version
systemctl status docker --no-pagerLệnh này sẽ thêm kho Docker, cài các gói cần thiết rồi chạy kiểm tra. Khi hoàn tất, bạn sẽ thấy phiên bản Compose và trạng thái dịch vụ Docker.
Nếu bạn muốn làm quen với luồng cài đơn giản trước, xem hướng dẫn Docker và n8n cơ bản. Trong bài này, bạn tiếp tục dựng PostgreSQL, Redis và các worker.
Bước 3: Tạo .env và script khởi tạo PostgreSQL
Bạn cần tạo .env trước lần chạy đầu tiên. Tệp này chứa phiên bản image, mật khẩu database, khóa mã hóa credential và token kết nối runner.
Lưu ý: Chạy khối dưới từng dòng. Khi nano mở init-data.sh, dán script ngay bên dưới; khi mở docker-compose.yml, dán cấu hình tại Bước 4. Chỉ chạy kiểm tra Compose sau khi đã lưu cả hai tệp.
Tạo thư mục và các tệp cấu hình theo thứ tự sau:
mkdir -p /opt/n8n/backup cd /opt/n8n cat > .env <<EOF N8N_VERSION=2.43.7 POSTGRES_USER=n8n_admin POSTGRES_PASSWORD=DoiMatKhauManh@2026 POSTGRES_DB=n8n POSTGRES_NON_ROOT_USER=n8n_app POSTGRES_NON_ROOT_PASSWORD=DoiMatKhauKhac@2026 N8N_ENCRYPTION_KEY=$(openssl rand -hex 32) RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32) EOF chmod 600 .env cat .env nano init-data.sh chmod 755 init-data.sh nano docker-compose.yml docker compose config --quiet && echo OK
- Thay DoiMatKhauManh@2026 bằng mật khẩu quản trị PostgreSQL của bạn.
- Thay DoiMatKhauKhac@2026 bằng mật khẩu riêng cho user ứng dụng.
Lệnh này sẽ tạo khóa ngẫu nhiên và đặt quyền đọc .env cho chủ tệp. Dòng kiểm tra cuối chỉ in OK khi Compose đọc được cấu hình.
Lưu ý: Giữ mật khẩu mẫu mới không có dấu đô la hoặc nháy đơn để tránh thay biến Compose và lỗi SQL. Tệp .env có bí mật; không gửi ảnh hoặc log chứa nội dung tệp này.
Tiếp theo, dán script sau vào init-data.sh đang mở:
#!/bin/bash
set -e
if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<EOSQL
CREATE USER ${POSTGRES_NON_ROOT_USER} WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}';
GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_NON_ROOT_USER};
GRANT CREATE ON SCHEMA public TO ${POSTGRES_NON_ROOT_USER};
EOSQL
fiScript sẽ tự động:
- Tạo user n8n_app theo biến đã khai báo.
- Cấp quyền database và quyền tạo đối tượng trong schema public cho ứng dụng.
- Dừng khởi tạo khi câu lệnh SQL báo lỗi.
Lưu ý: Script chỉ chạy khi volume PostgreSQL còn trống. Nếu database đã tồn tại, thay mật khẩu trong .env sẽ không tự đổi mật khẩu của user đã tạo.
Bạn hãy lưu N8N_ENCRYPTION_KEY ở nơi an toàn ngoài VPS. Main, worker và bản khôi phục phải dùng đúng khóa để đọc credential.
Bước 4: Khai báo main, worker và task runner
Bạn sẽ chạy main, PostgreSQL, Redis và 2 cặp worker/runner bằng một tệp Compose. Mỗi worker có runner và đường dẫn event log riêng.
Dán cấu hình sau vào docker-compose.yml đang mở:
name: n8n
x-n8n-env: &n8n-env
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_NON_ROOT_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_NON_ROOT_PASSWORD}
EXECUTIONS_MODE: queue
QUEUE_BULL_REDIS_HOST: redis
QUEUE_BULL_REDIS_PORT: 6379
QUEUE_HEALTH_CHECK_ACTIVE: "true"
OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS: "true"
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_HOST: n8n.tenmien.vn
N8N_PROTOCOL: https
N8N_EDITOR_BASE_URL: https://n8n.tenmien.vn/
N8N_WEBHOOK_URL: https://n8n.tenmien.vn/
N8N_PROXY_HOPS: 1
GENERIC_TIMEZONE: Asia/Ho_Chi_Minh
TZ: Asia/Ho_Chi_Minh
N8N_DEFAULT_BINARY_DATA_MODE: database
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: 168
EXECUTIONS_DATA_PRUNE_MAX_COUNT: 50000
N8N_RUNNERS_MODE: external
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
x-worker: &worker
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: always
command: ["worker", "--concurrency=10"]
stop_grace_period: 40s
volumes:
- n8n_storage:/home/node/.n8n
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:5678/healthz/readiness || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
n8n:
condition: service_started
x-runner: &runner
image: n8nio/runners:${N8N_VERSION}
restart: always
services:
postgres:
image: postgres:18
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_NON_ROOT_USER: ${POSTGRES_NON_ROOT_USER}
POSTGRES_NON_ROOT_PASSWORD: ${POSTGRES_NON_ROOT_PASSWORD}
PGDATA: /var/lib/postgresql/data
volumes:
- db_storage:/var/lib/postgresql/data
- ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
healthcheck:
test: ["CMD-SHELL", "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
redis:
image: redis:7-alpine
restart: always
volumes:
- redis_storage:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: always
ports:
- "127.0.0.1:5678:5678"
environment:
<<: *n8n-env
volumes:
- n8n_storage:/home/node/.n8n
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:5678/healthz || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
n8n-runner:
<<: *runner
environment:
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
depends_on:
- n8n
n8n-worker-1:
<<: *worker
environment:
<<: *n8n-env
N8N_EVENTBUS_LOGWRITER_LOGFULLPATH: /home/node/.n8n/n8nEventLog-worker-1.log
n8n-worker-1-runner:
<<: *runner
environment:
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_TASK_BROKER_URI: http://n8n-worker-1:5679
depends_on:
- n8n-worker-1
n8n-worker-2:
<<: *worker
environment:
<<: *n8n-env
N8N_EVENTBUS_LOGWRITER_LOGFULLPATH: /home/node/.n8n/n8nEventLog-worker-2.log
n8n-worker-2-runner:
<<: *runner
environment:
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_TASK_BROKER_URI: http://n8n-worker-2:5679
depends_on:
- n8n-worker-2
volumes:
db_storage:
n8n_storage:
redis_storage:- Thay n8n.tenmien.vn bằng tên miền bạn đã trỏ về VPS.
- Giữ cùng N8N_VERSION cho main, worker và runner.
Cấu hình này sẽ giữ PostgreSQL và Redis trong mạng nội bộ Docker. Cổng n8n chỉ mở trên 127.0.0.1 để Nginx đứng phía trước.
Bạn lưu tệp rồi chạy dòng kiểm tra Compose ở cuối Bước 3. Nếu có lỗi thụt dòng hoặc biến môi trường, sửa đúng vị trí được báo trước khi khởi động.

Lưu ý: Giữ PGDATA và tên project n8n như mẫu để dữ liệu PostgreSQL và tên volume khớp phần backup. Khi đổi tên project, bạn phải đối chiếu lại tên volume.
Bước 5: Khởi động và kiểm tra cấu hình VPS cho n8n
Bạn hãy đợi tải xong các image rồi kiểm tra từng container. Với lệnh theo dõi log liên tục, nhấn Ctrl+C để thoát chế độ xem trước khi chạy dòng tiếp theo; container vẫn tiếp tục hoạt động.
Khởi động hệ thống và kiểm tra trạng thái bằng các lệnh sau:
cd /opt/n8n docker compose pull docker compose up -d docker compose ps docker compose logs -f n8n docker compose logs -f n8n-worker-1 docker compose logs --tail=100 n8n-worker-1-runner curl -s http://127.0.0.1:5678/healthz docker compose exec n8n-worker-1 wget -qO- http://localhost:5678/healthz/readiness docker stats --no-stream
Lệnh này sẽ tải image, tạo container và hiển thị log, healthcheck cùng tài nguyên sử dụng. Readiness của worker cần xác nhận kết nối được PostgreSQL và Redis.

Main chạy được là bước đầu. Bạn còn cần kiểm tra worker và runner trước khi nhận workflow production; nếu một thành phần báo lỗi, chuyển tới mục xử lý sự cố ở cuối bài.
Cấu hình tường lửa, Nginx và SSL
Bạn cần mở đúng cổng SSH và web, đặt Nginx làm reverse proxy rồi cấp SSL cho tên miền. Trong ví dụ, chỉ Nginx tiếp nhận kết nối công khai, còn n8n nghe trên localhost.
Bước 6: Mở cổng, tạo reverse proxy và cấp SSL
Lưu ý: Nếu SSH dùng cổng riêng, hãy cho phép cổng đó trước khi bật UFW. Giữ phiên SSH hiện tại và kiểm tra thêm một phiên đăng nhập mới để chắc chắn còn đường quản trị.
Cài Nginx, cho phép các kết nối cần thiết và mở tệp site:
apt install -y nginx ufw allow OpenSSH ufw allow 'Nginx Full' ufw enable nano /etc/nginx/sites-available/n8n.tenmien.vn
Lệnh này sẽ cài Nginx, cho phép nhóm cổng web và bật UFW. Bạn nhập xác nhận khi được hỏi, rồi tiếp tục sửa tệp cấu hình tên miền.
Dán nội dung reverse proxy vào tệp Nginx vừa mở:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name n8n.tenmien.vn;
client_max_body_size 200m;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $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-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}- Thay n8n.tenmien.vn bằng tên miền của bạn.
Cấu hình này sẽ chuyển request tới n8n, giữ các header tên miền và HTTPS, đồng thời hỗ trợ kết nối WebSocket.
Lưu ý: Mẫu dùng N8N_PROXY_HOPS=1 cho một tầng Nginx. Nếu bạn có proxy khác phía trước, cần chỉnh theo số tầng thực tế. Kiểm tra khối map đã có ở site khác để tránh khai báo trùng.
Sau khi lưu tệp, hãy bật site và cấp chứng chỉ bằng Certbot:
ln -s /etc/nginx/sites-available/n8n.tenmien.vn /etc/nginx/sites-enabled/ nginx -t systemctl reload nginx apt install -y certbot python3-certbot-nginx certbot --nginx -d n8n.tenmien.vn certbot renew --dry-run curl -I https://n8n.tenmien.vn/healthz
- Thay n8n.tenmien.vn ở cả đường dẫn cấu hình và tên miền cấp chứng chỉ.
Lệnh này sẽ kiểm tra Nginx, cài Certbot bản apt và cấp SSL cho tên miền. Lượt dry-run giúp bạn kiểm tra quy trình gia hạn.

Nếu Nginx báo lỗi cú pháp, hãy dừng để sửa rồi mới nạp lại. Sau khi SSL hoàn tất, mở địa chỉ HTTPS của tên miền để tạo tài khoản chủ sở hữu và kiểm tra giao diện.
Bước 7: Kiểm tra worker nhận và thực thi workflow
Bạn hãy tạo một workflow nhỏ gồm webhook và Code node, kích hoạt rồi gửi yêu cầu thử. Đối chiếu execution trên giao diện với log worker, runner để xác nhận công việc đi đúng thành phần.
Mẫu đặt OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true để đưa cả chạy thủ công sang worker. Khi cấu hình VPS cho n8n, bạn nên kiểm cả thao tác thử, webhook production và lịch chạy theo múi giờ đã chọn.
Thêm worker và theo dõi tải
Bạn thêm worker bằng cách bổ sung cả cặp worker/runner, sau đó theo dõi RAM, CPU và hàng đợi. Tăng số tiến trình khi còn tài nguyên và hàng đợi tiếp tục dồn việc.
Thêm cặp worker thứ 3
Chép hai khối worker-2 và worker-2-runner thành cặp mới. Đổi số ở tên dịch vụ, địa chỉ broker và đường dẫn event log; giữ cùng phiên bản image, khóa mã hóa và kết nối database.
Sau khi lưu tệp Compose, cập nhật các dịch vụ:
docker compose up -d docker compose ps
Lệnh này sẽ tạo dịch vụ mới và hiển thị trạng thái container. Bạn kiểm tra runner đã trỏ tới đúng worker trước khi cho cặp mới nhận việc.
Lưu ý: Không dùng cách scale một dịch vụ worker trong mẫu ghép cặp này. Mỗi runner phải kết nối đúng worker; phương án internal runner không được khuyên dùng cho production.
Điều chỉnh concurrency theo tải
Bạn dùng số liệu tài nguyên ở bước kiểm tra để đối chiếu thời gian execution. Nếu tăng concurrency làm RAM tăng mạnh hoặc API báo quá giới hạn, hãy giảm mức song song rồi đo lại.
N8N_CONCURRENCY_PRODUCTION_LIMIT khi khác -1 sẽ ghi đè concurrency của worker. Kiểm tra biến này trước khi kết luận tham số worker không có tác dụng.
Với workflow xử lý nhiều JSON hoặc tệp, bạn nên chia lô và bỏ dữ liệu không cần giữ. Với công việc gọi API, hãy xét giới hạn dịch vụ đích để tránh tăng worker rồi dồn nhiều lỗi hơn.
Khi nào nên tách webhook processor?
Bạn nên tách khi webhook production làm main bận hoặc cần thêm lớp nhận request. Bộ Compose trong bài vẫn dùng main nhận webhook; chỉ bổ sung lớp riêng khi số đo đầu vào cho thấy cần thiết.
Khi tách, các đường /webhook/ và /webhook-waiting/ đi tới cụm webhook; đường khác, kể cả /webhook-test/, về main. Bạn cần kiểm riêng các trigger đang dùng trước khi chuyển định tuyến.
Sao lưu và nâng cấp n8n an toàn
Bạn cần giữ database, .env chứa khóa và volume n8n_storage trước khi nâng cấp. Sao thêm bản backup ra ngoài VPS để có thể dựng lại hệ thống khi máy chủ gặp sự cố.
Tạo script sao lưu tự động
Tạo tệp /opt/n8n/backup.sh rồi dán script sau:
#!/bin/bash set -e cd /opt/n8n NGAY=$(date +%F) docker compose exec -T postgres pg_dump -U n8n_admin -d n8n -Fc > /opt/n8n/backup/n8n-db-$NGAY.dump cp /opt/n8n/.env /opt/n8n/backup/n8n-env-$NGAY.txt chmod 600 /opt/n8n/backup/n8n-env-$NGAY.txt docker run --rm -v n8n_n8n_storage:/data:ro -v /opt/n8n/backup:/backup alpine tar czf /backup/n8n-storage-$NGAY.tar.gz -C /data . find /opt/n8n/backup -name 'n8n-db-*.dump' -mtime +7 -delete find /opt/n8n/backup -name 'n8n-storage-*.tar.gz' -mtime +7 -delete find /opt/n8n/backup -name 'n8n-env-*.txt' -mtime +7 -delete
Script sẽ tự động:
- Tạo bản dump database theo ngày.
- Chép .env và đặt quyền bảo vệ tệp có khóa, mật khẩu.
- Nén volume n8n_storage vào thư mục backup.
- Dọn các bản cũ theo điều kiện đã đặt trong script.
Lưu ý: Bạn nên giữ thư mục backup chỉ cho người quản trị đọc. Tên volume trong script gắn với project n8n; nếu đổi tên project, đối chiếu volume trước khi chạy.
Cấp quyền, chạy thử script rồi mở lịch cron:
chmod 700 /opt/n8n/backup.sh /opt/n8n/backup.sh ls -lh /opt/n8n/backup docker volume ls crontab -e
Lệnh này sẽ tạo một lượt backup để bạn kiểm tra trước khi đặt lịch. Bạn cần thấy file dump, .env và archive volume trong thư mục đích.
Thêm dòng sau vào crontab đang mở:
30 2 * * * /opt/n8n/backup.sh >> /var/log/n8n-backup.log 2>&1
Dòng này sẽ gọi script theo lịch và ghi kết quả vào log. Bạn kiểm tra cả log lẫn file backup sau lượt chạy đầu tiên.
Script tạo các bản sao nối tiếp khi ứng dụng vẫn có thể ghi dữ liệu. Trước nâng cấp lớn, bạn nên chặn nguồn việc mới, đợi các execution đang chạy kết thúc rồi tạo backup theo một mốc thống nhất.
Khôi phục database trước khi mở lại workflow
Lệnh dưới sẽ thay dữ liệu database đích. Bạn cần chọn đúng file và dừng các tiến trình n8n trước khi thực hiện.
Giữ PostgreSQL chạy và phục hồi database bằng các lệnh sau:
cd /opt/n8n docker compose stop n8n n8n-runner n8n-worker-1 n8n-worker-1-runner n8n-worker-2 n8n-worker-2-runner docker compose exec -T postgres pg_restore -U n8n_admin -d n8n --clean --if-exists --no-owner --role=n8n_app < /opt/n8n/backup/n8n-db-2026-10-18.dump docker compose up -d
- Thay ngày 2026-10-18 trong tên tệp bằng ngày của bản dump cần khôi phục.
Lệnh này sẽ dừng main, worker, runner, khôi phục bản dump rồi khởi động dịch vụ. Bạn kiểm tra log và một lượt execution trước khi nhận lại công việc.
Lưu ý: Đây là phần khôi phục database. Khi phục hồi cả máy, bạn còn phải đặt lại .env với khóa cũ và volume tương ứng trước khi khởi động. Mất N8N_ENCRYPTION_KEY sẽ không đọc được credential.
Ghim phiên bản trước khi nâng cấp
Bạn hãy tạo backup và đọc release notes trước khi sửa N8N_VERSION. Main, worker và runner cần dùng cùng phiên bản để tránh lệch thành phần.
Đổi phiên bản trong .env rồi cập nhật image:
cd /opt/n8n nano .env docker compose pull docker compose up -d docker compose logs -f n8n
Lệnh này sẽ tải image theo phiên bản mới và tạo lại container. Bạn xem log, kiểm tra credential và chạy workflow mẫu trước khi xác nhận nâng cấp hoàn tất.
Nếu cần quay lại, sử dụng bản sao tương thích trước nâng cấp. Không chỉ đổi tag image khi database đã có migration của phiên bản mới.
Bản Community và chi phí n8n production
Community dùng được queue mode, worker, PostgreSQL, Redis và task runner theo giấy phép n8n. Bạn trả thêm khi cần các tính năng như multi-main HA, SSO hoặc quản trị doanh nghiệp.
Main là điểm lỗi duy nhất trong bản Community dù có nhiều worker. Bạn cần backup, giám sát và phương án phục hồi; nhiều main hoạt động song song thuộc phương án Enterprise.
Xem bảng tính năng và giá n8n khi chọn license. Phí VPS và phí bản quyền n8n là hai khoản riêng:
Phân biệt Community và tính năng trả phí
Các khoản chi phí cần chuẩn bị
Bạn cần dự toán gói VPS, tên miền, lưu trữ backup, thời gian quản trị và API bên ngoài. Nếu workflow gọi AI, phí model được tính theo nhà cung cấp API, tách khỏi giá thuê máy.
Bảng dưới giúp bạn ghi rõ khoản đã có trong dịch vụ và khoản cần mua thêm:
Các khoản chi cần kiểm trước khi vận hành
Một số mẹo và lưu ý
Bạn nên bảo vệ khóa, dọn dữ liệu đúng lịch và theo dõi ổ đĩa ngay từ lúc cấu hình VPS cho n8n. Các việc nhỏ này giúp giảm lỗi sau khi workflow đã chạy thường xuyên.
- Giữ khóa mã hóa: Lưu khóa cũ ngoài VPS, dùng cùng khóa trên main và các worker.
- Dọn execution: Mặc định n8n giữ 336 giờ và giới hạn 10.000 bản; mẫu trong bài dùng 168 giờ, 50.000 bản để minh họa chính sách.
- Lưu binary data: Mẫu queue mode dùng database. Tính dữ liệu tệp vào dung lượng PostgreSQL và backup.
- Chọn nơi lưu backup: Giữ thêm bản sao độc lập, thử khôi phục để biết dữ liệu sử dụng được.
- Giới hạn log Docker: Đặt max-size và max-file cho log driver; bộ Compose trong bài chưa có cấu hình xoay vòng log.
- Giữ cổng nội bộ: Chỉ Nginx nhận truy cập bên ngoài; PostgreSQL, Redis và task broker nằm trong mạng Docker.
Khi dùng reverse proxy khác phía trước Nginx, hãy kiểm lại header và số proxy hops. Với máy nhiều dịch vụ, kiểm thêm dung lượng ổ và lịch backup để tránh các tác vụ nặng chạy cùng lúc.
Xử lý sự cố khi cấu hình VPS cho n8n
Bạn kiểm tra theo thứ tự cấu hình, trạng thái container, log và kết nối. Tìm thành phần lỗi trước khi khởi động lại toàn bộ hệ thống để tránh bỏ mất dấu vết cần chẩn đoán.
Lỗi Compose không đọc được tệp cấu hình
Bạn kiểm tra thụt dòng, dấu nháy và tên biến .env. Sửa lỗi được báo trước khi khởi động lại.
Trong thư mục /opt/n8n, kiểm tra cấu hình Compose:
docker compose config --quiet && echo OK
Lệnh này sẽ in OK nếu cấu hình hợp lệ; nếu có lỗi, bạn sửa đúng dòng được báo. Không gửi bản cấu hình đã nội suy mật khẩu lên kênh công khai.
Lỗi không truy cập được giao diện web
Bạn kiểm tra main ở localhost và cấu hình Nginx, sau đó đối chiếu DNS, cổng web và chứng chỉ.
Kiểm tra phản hồi main và cú pháp Nginx:
curl -s http://127.0.0.1:5678/healthz nginx -t
Lệnh này sẽ giúp phân biệt main không phản hồi với lỗi cú pháp proxy. Nếu main hoạt động, bạn tiếp tục kiểm đường truy cập bên ngoài và tên miền.
Lỗi worker hoặc Code node không nhận việc
Bạn đối chiếu phiên bản image, token runner, địa chỉ broker, khóa mã hóa và kết nối Redis/PostgreSQL. Kiểm tra trạng thái cùng log runner.
Xem trạng thái dịch vụ và log runner đầu tiên:
docker compose ps docker compose logs --tail=100 n8n-worker-1-runner
Lệnh này sẽ cho bạn thông tin container và lỗi kết nối runner. Sửa giá trị sai trong .env hoặc Compose rồi cập nhật dịch vụ theo phần hướng dẫn.
Lỗi bộ nhớ khi chạy nhiều execution
Bạn kiểm tra container nào tăng RAM, dữ liệu đầu vào và concurrency. Giảm công việc đồng thời hoặc chia lô dữ liệu trước khi thử lại.
Xem mức dùng tài nguyên của các container:
docker stats --no-stream
Lệnh này sẽ hiển thị số liệu tại thời điểm kiểm tra. Đối chiếu lúc workflow nặng chạy để chọn điều chỉnh RAM, worker hay dữ liệu xử lý.
Kết luận
Bạn đã đi qua cách chọn cấu hình VPS cho n8n, dựng queue mode, ghép worker với runner, cấp SSL và chuẩn bị backup. Trước khi chạy workflow quan trọng, hãy thử một vòng webhook, Code node và khôi phục trên dữ liệu kiểm tra.
VPSMMO cung cấp Cloud VPS, VPS Linux, VPS giá rẻ, VPS hiệu năng cao và Dedicated Server tại Việt Nam, trên hạ tầng KVM, NVMe Enterprise và hệ thống quản trị trực tuyến Portal VPSMMO. Thuê VPS tại VPSMMO phù hợp cho website, WordPress, SEO, ứng dụng, API, Docker, DevOps và AI Agent.
Khi chọn VPS n8n, bạn có thể dùng N8N Install hoặc N8ndocker-Template để khởi tạo môi trường Docker. Với quyền root, bạn chủ động mở rộng queue mode; đội kỹ thuật VPSMMO hỗ trợ hạ tầng khi cần.

Hạ tầng sử dụng Intel Xeon Platinum Series 8, RAM DDR4 ECC và NVMe Enterprise U.2. Backup hằng ngày, thao tác tự sao lưu và khôi phục giúp bạn chuẩn bị trước mỗi lần cập nhật.

Đội kỹ thuật VPSMMO hỗ trợ 24/7. Khi thuê VPS n8n, bạn được ưu đãi thuê 12 tháng tặng 3 tháng, thuê 3 năm tặng 12 tháng; hãy chọn gói theo dữ liệu, tải đồng thời và kế hoạch vận hành.
CÔNG TY TNHH VPSMMO
- VP: 8B đường B31, KDC 91B, Phường Tân An, Thành phố Cần Thơ
- Tel: 0589549338
- Email: info@vpsmmo.vn







