n8n là nền tảng tự động hóa workflow mã nguồn mở, có thể kết nối API, cơ sở dữ liệu, Telegram, Google Sheets, WordPress và hàng trăm dịch vụ khác. Nếu cần chủ động dữ liệu và tài nguyên, bạn có thể cài n8n trên VPS thay vì sử dụng n8n Cloud.
Quy trình cài n8n trên VPS trong bài sử dụng Ubuntu 24.04 LTS và Docker Compose. Traefik đứng phía trước làm reverse proxy, tự chuyển HTTP sang HTTPS và tự cấp chứng chỉ SSL Let’s Encrypt. Cổng nội bộ 5678 của n8n không được publish trực tiếp ra Internet.
Phạm vi: cấu hình phù hợp cho một máy n8n đơn lẻ sử dụng SQLite và volume Docker. Nếu vận hành nhiều người dùng, workflow nặng hoặc cần High Availability, nên chuyển sang PostgreSQL, queue mode và kiến trúc worker riêng.
Kiến trúc khi cài n8n trên VPS
Luồng truy cập sẽ như sau:
Người dùng → HTTPS 443 → Traefik → n8n:5678 → volume n8n_data
└─ Let's Encrypt tự cấp và gia hạn SSL
Chỉ Traefik mở cổng 80 và 443. Container n8n giao tiếp trong mạng Docker nên không cần khai báo 5678:5678 ở phần ports.

Yêu cầu chuẩn bị để cài n8n trên VPS
Bạn cần:
- VPS Ubuntu 22.04 hoặc 24.04 LTS, kiến trúc 64-bit;
- Khuyến nghị tối thiểu 2 vCPU, 4 GB RAM và 20 GB SSD;
- Quyền
roothoặc tài khoản cósudo; - Tên miền hoặc subdomain, ví dụ
n8n.example.com; - Bản ghi DNS
Acủa subdomain trỏ đúng về IPv4 của VPS; - Cổng TCP
80và443cho Traefik, cùng cổng SSH quản trị; - Không có Nginx, Apache, Caddy hoặc dịch vụ khác chiếm cổng
80/443.
Kiểm tra hệ điều hành và tài nguyên:
cat /etc/os-release
uname -m
free -h
df -h /
Kiểm tra dịch vụ đang nghe trên các cổng cần dùng:
sudo ss -lntp | grep -E ':(80|443)\s' || true
Trước khi cài n8n trên VPS, nếu có kết quả, hãy xác định dịch vụ đang dùng cổng. Không nên dừng hoặc gỡ web server đang phục vụ website khác chỉ để cài n8n.
Bước 1: Cấu hình DNS để cài n8n trên VPS
Tại nhà cung cấp DNS, tạo bản ghi:
Type: A
Name: n8n
Value: IP_VPS
Proxy: DNS only trong lần cấp SSL đầu tiên nếu dùng Cloudflare
Kiểm tra từ VPS:
sudo apt update
sudo apt install -y dnsutils
dig +short n8n.example.com A
Kết quả phải là IP public của VPS. Let’s Encrypt sẽ không cấp chứng chỉ nếu tên miền chưa trỏ đúng hoặc cổng 443 bị chặn.
Bước 2: Cài Docker Engine và Docker Compose
Khi cài n8n trên VPS, nên cài Docker từ kho APT chính thức thay vì dùng gói cũ trong kho mặc định của Ubuntu.
Cài các gói cần thiết và khóa ký:
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
Thêm repository Docker:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Cài Docker Engine và plugin Compose:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
Xác minh:
docker --version
docker compose version
sudo systemctl is-active docker
Kết quả cuối phải là active. Không dùng lệnh curl | sh trên máy production nếu bạn chưa kiểm tra nội dung script.
Bước 3: Tạo thư mục và file môi trường
Tạo thư mục dự án:
sudo mkdir -p /opt/n8n
cd /opt/n8n
Tạo file .env:
sudo nano .env
Nội dung mẫu:
DOMAIN_NAME=example.com
SUBDOMAIN=n8n
SSL_EMAIL=admin@example.com
N8N_VERSION=2.47.5
Để cài n8n trên VPS ổn định, hãy thay example.com, subdomain và email bằng thông tin thực tế. N8N_VERSION nên là phiên bản stable đã kiểm tra; tại thời điểm biên soạn ngày 13/11/2026, tài liệu n8n công bố stable 2.47.5.
Giới hạn quyền đọc file:
sudo chmod 600 /opt/n8n/.env

.env.Bước 4: Tạo Docker Compose để cài n8n trên VPS
Tạo file:
sudo nano /opt/n8n/compose.yml
Dán cấu hình sau:
services:
traefik:
image: traefik:v3.7
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
- --entrypoints.websecure.address=:443
- --certificatesresolvers.letsencrypt.acme.tlschallenge=true
- --certificatesresolvers.letsencrypt.acme.email=${SSL_EMAIL}
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
ports:
- 80:80
- 443:443
volumes:
- traefik_data:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
n8n:
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: unless-stopped
environment:
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
- N8N_PROXY_HOPS=1
- GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
- TZ=Asia/Ho_Chi_Minh
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
volumes:
- n8n_data:/home/node/.n8n
labels:
- traefik.enable=true
- traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
- traefik.http.routers.n8n.entrypoints=websecure
- traefik.http.routers.n8n.tls=true
- traefik.http.routers.n8n.tls.certresolver=letsencrypt
- traefik.http.services.n8n.loadbalancer.server.port=5678
volumes:
n8n_data:
traefik_data:
Các điểm quan trọng:
- Volume
n8n_datagiữ database SQLite, encryption key, workflow và thông tin cấu hình; - Volume
traefik_datagiữ tài khoản ACME và chứng chỉ Let’s Encrypt; N8N_PROXY_HOPS=1cho n8n biết có một reverse proxy phía trước;- Không có mục
portstrong service n8n, vì vậy cổng5678không bị mở trực tiếp; - Docker socket được mount read-only cho Traefik đọc label. Đây vẫn là tài nguyên nhạy cảm, không được mở dashboard Traefik công khai.
Bước 5: Kiểm tra cấu hình trước khi chạy
Docker Compose có thể phát hiện lỗi YAML hoặc biến môi trường thiếu:
cd /opt/n8n
sudo docker compose config -q
Trong quy trình cài n8n trên VPS, nếu lệnh không in lỗi và trả về exit code 0, cấu hình đã hợp lệ về cú pháp. Có thể xem bản cấu hình sau khi thay biến:
sudo docker compose config
Kiểm tra DNS lần cuối:
dig +short "${SUBDOMAIN}.${DOMAIN_NAME}" A
Lệnh trên chỉ hoạt động khi bạn đã export biến vào shell. Cách đơn giản hơn là thay trực tiếp bằng tên miền thật:
dig +short n8n.example.com A
Bước 6: Khởi động n8n
Tải image và chạy stack:
cd /opt/n8n
sudo docker compose pull
sudo docker compose up -d
Theo dõi trạng thái:
sudo docker compose ps
sudo docker compose logs --tail=100 traefik
sudo docker compose logs --tail=100 n8n

Sau khi cài n8n trên VPS, Traefik cần vài giây để hoàn thành TLS challenge và lưu chứng chỉ. Sau đó truy cập:
https://n8n.example.com/
Trong lần đầu, n8n sẽ yêu cầu tạo tài khoản owner. Hãy dùng mật khẩu riêng, dài và bật xác thực hai lớp sau khi đăng nhập.
Bước 7: Kiểm tra HTTPS sau khi cài n8n trên VPS
Kiểm tra HTTP chuyển sang HTTPS:
curl -I http://n8n.example.com/
Kỳ vọng nhận 301 hoặc 308 và header Location trỏ tới HTTPS.
Kiểm tra HTTPS:
curl -I https://n8n.example.com/
Kiểm tra chứng chỉ:
echo | openssl s_client \
-connect n8n.example.com:443 \
-servername n8n.example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
Issuer phải là Let’s Encrypt và subject phải chứa đúng subdomain. Kiểm tra container:
cd /opt/n8n
sudo docker compose ps

Backup dữ liệu n8n
Sau khi cài n8n trên VPS, không nên chỉ backup file compose.yml. Dữ liệu quan trọng nằm trong volume n8n_data.
Tạo thư mục backup:
sudo mkdir -p /root/n8n-backups
cd /opt/n8n
sudo docker compose stop n8n
Xác định tên volume:
sudo docker volume ls | grep n8n_data
Nếu project nằm tại /opt/n8n, tên thường là n8n_n8n_data. Backup volume:
sudo docker run --rm \
-v n8n_n8n_data:/data:ro \
-v /root/n8n-backups:/backup \
alpine sh -c 'tar -czf /backup/n8n-data-$(date +%F-%H%M).tar.gz -C /data .'
Khởi động lại n8n:
sudo docker compose start n8n
Ngoài file archive, nên lưu an toàn .env, compose.yml và kiểm tra khả năng restore định kỳ. Không đưa .env, volume hoặc file backup lên repository công khai.
Cập nhật an toàn sau khi cài n8n trên VPS
Trước khi cập nhật:
- Đọc release notes;
- Backup volume;
- Ghi lại phiên bản hiện tại;
- Chuẩn bị thời gian bảo trì;
- Không dùng tag beta trên production.
Sửa N8N_VERSION trong .env, sau đó chạy:
cd /opt/n8n
sudo docker compose config -q
sudo docker compose pull n8n
sudo docker compose up -d n8n
sudo docker compose logs --tail=100 n8n
Xem phiên bản đang chạy:
sudo docker compose exec n8n n8n --version
Nếu phiên bản mới gặp lỗi, đặt lại N8N_VERSION cũ rồi chạy docker compose pull và docker compose up -d lần nữa. Việc rollback image không thay thế rollback dữ liệu, vì migration database có thể không tương thích ngược.
Checklist bảo mật sau khi cài
- DNS trỏ đúng VPS;
- Chỉ mở cổng cần thiết: SSH, 80 và 443;
- Cổng
5678không xuất hiện trongdocker psdưới dạng0.0.0.0:5678; - HTTPS hợp lệ và HTTP tự chuyển hướng;
- Tài khoản owner dùng mật khẩu riêng và đã bật 2FA;
- File
.envcó quyền600; - Docker và Ubuntu được cập nhật định kỳ;
- Có backup volume và đã thử restore;
- Không mở Traefik dashboard ra Internet;
- Không cài community node không rõ nguồn gốc;
- Giới hạn dữ liệu nhạy cảm xuất hiện trong execution log.
Docker lưu ý rằng cổng container được publish có thể đi qua một số quy tắc UFW/firewalld. Vì vậy không nên xem UFW là lớp bảo vệ duy nhất cho cổng Docker; hãy chỉ publish đúng 80/443 như cấu hình trên và sử dụng chain DOCKER-USER nếu cần chính sách firewall nâng cao.
Một số lỗi thường gặp
Traefik vẫn trả chứng chỉ tự ký
Kiểm tra DNS, cổng 443, email ACME và log:
sudo docker compose logs --tail=200 traefik
Nếu thấy TRAEFIK DEFAULT CERT, Traefik chưa lấy được chứng chỉ cho hostname. Không cài Certbot chồng lên cổng 80/443 khi Traefik đang quản lý TLS.
Website báo 502 Bad Gateway
Kiểm tra n8n có chạy và Traefik có nhìn thấy service không:
sudo docker compose ps
sudo docker compose logs --tail=200 n8n
Cấu hình label phải khai báo đúng cổng nội bộ 5678.
Webhook tạo ra URL sai
Kiểm tra biến:
sudo docker compose exec n8n env | grep -E 'N8N_HOST|N8N_PROTOCOL|WEBHOOK_URL|N8N_PROXY_HOPS'
WEBHOOK_URL phải dùng HTTPS và hostname công khai. Sau khi sửa .env hoặc compose.yml, chạy lại:
sudo docker compose up -d
Kết luận
Quy trình cài n8n trên VPS bằng Docker Compose giúp tách n8n khỏi hệ điều hành, giữ cấu hình rõ ràng và hỗ trợ cập nhật có kiểm soát. Traefik giải quyết reverse proxy, redirect HTTPS và tự động gia hạn Let’s Encrypt. Quan trọng nhất là không mở trực tiếp cổng 5678, duy trì backup volume và kiểm tra release notes trước mỗi lần nâng cấp.
Nếu bạn đang dùng control panel thay vì VPS thuần, có thể xem thêm hướng dẫn cài n8n trên aaPanel. Sau khi cài xong, bài thiết lập nhận email qua Telegram với n8n là một workflow thực tế để bắt đầu.
Nguồn tham khảo
- Tài liệu n8n – Install with Docker
- Tài liệu n8n – Install using Docker Compose
- Tài liệu Docker – Install Docker Engine on Ubuntu
- Tài liệu Docker – Packet filtering and firewalls
- Tài liệu Traefik – ACME certificate resolver
