n8n trên VPS: nền tảng tự động hóa của riêng bạn, không còn công việc thủ công
Một yêu cầu đến từ website. n8n xác thực dữ liệu, kiểm tra trùng lặp, tạo giao dịch, chuẩn bị bản trả lời nháp bằng AI và thông báo cho quản lý qua Telegram. Con người chỉ tham gia khi cần quyết định—không phải để chuyển dữ liệu giữa các tab trình duyệt.
Dưới đây, chúng ta sẽ xem n8n hoạt động như thế nào và cách cài đặt trên VPS bằng Docker Compose, PostgreSQL, HTTPS và thực thi mã được cô lập.
n8n trong bảy bước
Kế hoạch khởi chạy tối thiểu:
- Tạo VPS và trỏ tên miền phụ tới đó, chẳng hạn
n8n.example.com. - Cài Docker và Docker Compose.
- Chạy n8n cùng PostgreSQL, task runner bên ngoài và Caddy.
- Mở giao diện qua HTTPS và tạo tài khoản chủ sở hữu.
- Kết nối Telegram, CRM, email hoặc API bên ngoài.
- Cấu hình xử lý lỗi và thời gian lưu dữ liệu thực thi.
- Tự động sao lưu cơ sở dữ liệu, dữ liệu và khóa mã hóa.
Với bản cài đặt production nhỏ, bắt đầu từ 2 vCPU và 4 GB RAM là hợp lý. 2 GB thường đủ để kiểm thử, nhưng PostgreSQL, Docker và các quy trình đồng thời nhanh chóng dùng hết phần bộ nhớ còn lại.
n8n là gì và hoạt động ra sao?
n8n là nền tảng tự động hóa workflow. Một workflow được lắp ghép từ các node: một node bắt đầu quy trình, các node tiếp theo lấy và biến đổi dữ liệu, còn node cuối thực hiện hành động.
Một workflow đơn giản trông như sau:
Webhook → xác thực dữ liệu → CRM → Telegram → phản hồi website
Chuỗi có thể được kích hoạt bởi webhook, lịch, email, tin nhắn hoặc sự kiện trong dịch vụ bên ngoài. Giữa các node có điều kiện, vòng lặp, bộ lọc, thời gian chờ và xử lý lỗi.
Một trong những điểm mạnh của n8n là tự động hóa không bị giới hạn bởi các tích hợp dựng sẵn. Bạn có thể gọi bất kỳ dịch vụ nào có API qua HTTP Request, trong khi logic tùy chỉnh có thể viết trong Code node bằng JavaScript hoặc Python. Điều này đặt n8n ở khoảng giữa trình xây dựng no-code đơn giản và mã phía máy chủ tùy chỉnh.
Vì sao n8n không chỉ là chuyển tiếp dữ liệu?
n8n hữu ích khi một quy trình trải qua nhiều hệ thống và cần một quyết định:
biểu mẫu → xác thực → tìm trùng lặp → đánh giá AI → phê duyệt của quản lý → CRM
Con người chỉ cần xuất hiện tại điểm kiểm soát. Ví dụ, AI chuẩn bị câu trả lời, nhưng tin nhắn chỉ được gửi cho khách hàng sau khi nhân viên phê duyệt.
Các trường hợp sử dụng điển hình:
- bán hàng và hỗ trợ: thu thập yêu cầu, phân công lead và tạo giao dịch;
- nội dung và AI: soạn nháp, phân loại yêu cầu và xuất bản sau khi phê duyệt;
- DevOps: thông báo gián đoạn, Git webhook và kiểm tra API;
- vận hành nội bộ: đồng bộ bảng tính, email, lịch và hệ thống doanh nghiệp.
Bản cài đặt self-hosted cho bạn quyền kiểm soát quy trình và cơ sở dữ liệu, nhưng không biến các dịch vụ bên ngoài thành dịch vụ cục bộ. Dữ liệu gửi tới Telegram, CRM hoặc mô hình AI đám mây sẽ rời khỏi VPS.
n8n Cloud hay máy chủ riêng?
| Tham số | n8n Cloud | n8n trên VPS |
|---|---|---|
| Khởi chạy | Không cần thiết lập máy chủ | Cần tên miền, Docker và HTTPS |
| Cập nhật | n8n xử lý | Chủ sở hữu xử lý |
| Cơ sở dữ liệu và tệp | Trong hạ tầng dịch vụ | Trên máy chủ đã chọn |
| Mở rộng | Theo gói cloud | Tự cấu hình |
| Trách nhiệm | Ít việc quản trị hơn | Chủ sở hữu chịu trách nhiệm sao lưu, bảo mật và giám sát |
| Phù hợp nhất | Bắt đầu nhanh không cần DevOps | Kiểm soát, tùy chỉnh và quy trình luôn chạy |
Community Edition có thể được self-host miễn phí cho các quy trình cá nhân và nội bộ doanh nghiệp. Tuy nhiên, n8n không được phân phối theo giấy phép mã nguồn mở truyền thống mà theo Sustainable Use License dạng fair-code. Giấy phép cho phép sử dụng và sửa đổi nội bộ, nhưng không cho phép bạn chỉ cần triển khai n8n, thêm logo riêng rồi bán quyền truy cập như một SaaS độc lập. Với sản phẩm như vậy, cần xem xét riêng các điều khoản giấy phép.
Yêu cầu máy chủ n8n
Tải phụ thuộc vào khối lượng dữ liệu, mức đồng thời và loại thao tác. Tệp, danh sách dài, Code node và workflow AI cần nhiều bộ nhớ hơn việc truyền các payload JSON nhỏ giữa các API.
| Kịch bản | Cấu hình khởi đầu |
|---|---|
| Kiểm thử và workflow văn bản cá nhân | 1 vCPU, 2 GB RAM, 20 GB NVMe |
| Bản cài đặt production nhỏ | 2 vCPU, 4 GB RAM, 25–40 GB NVMe |
| Quy trình đồng thời, AI hoặc tệp | 4 vCPU, 8 GB RAM trở lên |
| Nhiều worker ở queue mode | Kích thước theo khối lượng thực thi |
SQLite phù hợp để học và cho thiết lập nhỏ một instance. PostgreSQL thuận tiện hơn cho production: sao lưu dễ hơn và sau này chuyển sang queue mode đơn giản hơn.
Cách cài n8n trên VPS
Ví dụ này sử dụng Ubuntu 24.04, PostgreSQL, Caddy và task runner bên ngoài. Thay n8n.example.com và múi giờ bằng giá trị của bạn.
1. Cấu hình DNS và chuẩn bị máy chủ
Tạo bản ghi DNS A trỏ tới địa chỉ IPv4 của VPS, sau đó kết nối qua SSH:
ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw opensslCài Docker Engine và plugin Compose từ kho chính thức:
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
cat > /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 compose versionChỉ cho phép SSH, HTTP và HTTPS:
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enableKhông đóng phiên SSH hiện tại cho đến khi xác nhận kết nối mới hoạt động.
2. Tạo biến môi trường
Chuẩn bị thư mục:
mkdir -p /opt/n8n
cd /opt/n8nTạo .env. Các lệnh dưới đây lập tức tạo các secret ngẫu nhiên riêng cho PostgreSQL, mã hóa n8n và task runner:
cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin
POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF
chmod 600 .envTag stable thuận tiện cho lần khởi chạy đầu tiên. Sau khi xác minh cài đặt, nên ghim một phiên bản n8n cụ thể để lần cập nhật image tiếp theo không xảy ra ngoài dự kiến.
Không được làm mất N8N_ENCRYPTION_KEY. n8n dùng khóa này để mã hóa mật khẩu, token và các thông tin xác thực khác đã lưu. Nếu chỉ khôi phục PostgreSQL mà không có khóa, các bản ghi vẫn còn trong cơ sở dữ liệu nhưng n8n sẽ không thể đọc chúng.
3. Tạo tệp Docker Compose
Tạo compose.yaml:
services:
postgres:
image: postgres:18-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
PGDATA: /var/lib/postgresql/data
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: unless-stopped
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: "5432"
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: ${N8N_HOST}
N8N_PORT: "5678"
N8N_PROTOCOL: https
N8N_EDITOR_BASE_URL: https://${N8N_HOST}
N8N_WEBHOOK_URL: https://${N8N_HOST}/
N8N_PROXY_HOPS: "1"
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
TZ: ${GENERIC_TIMEZONE}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"
N8N_RUNNERS_MODE: external
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: "168"
EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
volumes:
- n8n_data:/home/node/.n8n
expose:
- "5678"
depends_on:
postgres:
condition: service_healthy
n8n-runner:
image: n8nio/runners:${N8N_VERSION}
restart: unless-stopped
environment:
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
depends_on:
- n8n
caddy:
image: caddy:2-alpine
restart: unless-stopped
environment:
N8N_HOST: ${N8N_HOST}
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- n8n
volumes:
postgres_data:
name: n8n_postgres_data
n8n_data:
name: n8n_data
caddy_data:
name: n8n_caddy_data
caddy_config:
name: n8n_caddy_configTask runner bên ngoài thực thi mã tách khỏi tiến trình n8n chính. Cách này an toàn hơn chế độ nội bộ và giảm khả năng lỗi trong Code node ảnh hưởng đến editor và xử lý webhook.
4. Bật HTTPS
Tạo Caddyfile:
{$N8N_HOST} {
reverse_proxy n8n:5678
}Caddy sẽ tự động lấy chứng chỉ TLS nếu DNS đã trỏ tới VPS và port 80, 443 có thể truy cập. Port nội bộ 5678 không được mở ra internet: bên ngoài chỉ có port 80 và 443, còn Caddy truy cập n8n qua mạng Docker.
Cần có các biến N8N_WEBHOOK_URL và N8N_PROXY_HOPS để editor tạo đúng địa chỉ webhook công khai và tin cậy header từ một reverse proxy.
5. Khởi động n8n
Xác thực cấu hình cuối cùng rồi khởi động container:
docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddyMở:
https://n8n.example.comTạo tài khoản chủ sở hữu. Không chia sẻ mật khẩu với đồng nghiệp; khi làm việc nhóm, hãy dùng tài khoản riêng và chỉ cấp quyền mỗi người cần.
Workflow hữu ích đầu tiên
Một bài kiểm thử tốt là xử lý yêu cầu từ website:
- Thêm node
Webhookvới phương thứcPOST. - Dùng
Edit Fieldsđể chỉ giữ tên, địa chỉ email và nguồn. - Dùng node
Ifđể từ chối yêu cầu thiếu dữ liệu bắt buộc. - Tạo giao dịch trong CRM hoặc gửi yêu cầu qua
HTTP Request. - Thêm thông báo Telegram.
- Kết thúc chuỗi bằng node
Respond to Webhook. - Sau khi kiểm thử, kích hoạt workflow và thay webhook kiểm thử bằng URL production.
Ví dụ này kiểm tra ngay tên miền, HTTPS, yêu cầu đến, thông tin xác thực và tích hợp bên ngoài. Tiếp theo, hãy thêm Error Workflow riêng để thông báo khi chuỗi chính thất bại.
Bảo mật n8n sau khi cài đặt
Một instance n8n đã cài chưa chắc đã đáng tin cậy. Sau khi khởi chạy, hãy bảo đảm rằng:
- editor chỉ truy cập được qua HTTPS;
.envcó quyền600và không được commit vào Git;- khóa API bên ngoài có quyền tối thiểu cần thiết;
- mỗi webhook xác minh chữ ký hoặc secret của nguồn;
- lịch sử thực thi được tự động xóa;
- lỗi trong workflow quan trọng được gửi cho quản trị viên.
Community node được cài dưới dạng package và có thể truy cập dữ liệu workflow cùng máy chủ. Không thêm node không rõ nguồn gốc nếu chưa xem xét. Nếu không cần, hãy tắt bằng N8N_COMMUNITY_PACKAGES_ENABLED=false.
Chạy audit tích hợp sẵn:
docker compose exec n8n n8n auditLệnh giúp nhận diện webhook không được bảo vệ, node rủi ro và vấn đề thông tin xác thực, nhưng không thay thế việc kiểm tra thủ công.
Lịch sử thực thi và dữ liệu cá nhân
n8n lưu dữ liệu đầu vào và đầu ra để gỡ lỗi. Cùng với đó, tin nhắn email, số điện thoại, tài liệu và phản hồi API có thể còn trong cơ sở dữ liệu.
Trong cấu hình trên, các lần thực thi bị xóa sau bảy ngày và số lượng bị giới hạn ở 10.000. Với quy trình nhạy cảm, hãy chọn thời gian lưu theo chính sách lưu giữ dữ liệu và loại bỏ trường không cần thiết trước khi workflow kết thúc.
Sao lưu và cập nhật
Việc khôi phục cần dump PostgreSQL, volume n8n_data, các tệp cấu hình và .env chứa N8N_ENCRYPTION_KEY. Trước khi sao chép, dừng các bộ xử lý nhưng để PostgreSQL tiếp tục chạy. Điều này tạo ra gián đoạn ngắn trong việc thực thi workflow:
cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner
docker compose exec -T postgres sh -c \
'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
| gzip > "backup/n8n-db-$(date +%F).sql.gz"
docker run --rm \
-v n8n_data:/source:ro \
-v "$PWD/backup":/backup \
alpine sh -c \
'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'
tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
.env compose.yaml Caddyfile
docker compose start n8n n8n-runnerKho lưu trữ chứa .env có các secret: hãy mã hóa nó và lưu bên ngoài VPS. Định kỳ xác minh bản sao lưu bằng cách thực hiện khôi phục thử.
Trước khi cập nhật, hãy sao lưu và xem ghi chú phát hành:
cd /opt/n8n
docker compose pull
docker compose up -d
docker compose psTask runner và container chính phải sử dụng cùng một tag phiên bản.
Khi nào cần mở rộng?
Đừng bắt đầu với Redis và nhiều worker trước khi có tải thực tế. Một instance duy nhất cùng PostgreSQL dễ bảo trì hơn và thường đáp ứng các quy trình nội bộ nhỏ.
Queue mode trở nên cần thiết khi tác vụ chạy lâu làm chậm webhook, nhiều workflow bắt đầu cùng lúc hoặc xử lý tệp thường xuyên dùng hết bộ nhớ. Trong thiết lập đó, instance chính nhận sự kiện, Redis phân phối job và worker thực thi song song. Tất cả thành phần phải kết nối cùng cơ sở dữ liệu PostgreSQL và sử dụng cùng N8N_ENCRYPTION_KEY.
Nên chọn VPS nào cho n8n?
Đối với n8n, PostgreSQL, Caddy và task runner cùng chạy, bắt đầu từ 2 vCPU, 4 GB RAM và ổ NVMe là hợp lý. Trên tropic.host, gói Light phù hợp với cấu hình này: 2 vCPU, 4 GB RAM và 25 GB NVMe. Mức này đủ cho các workflow production đầu tiên nếu không xử lý tệp nặng.
Với tài liệu, bộ dữ liệu lớn và nhiều workflow AI đồng thời, 8 GB RAM sẽ phù hợp hơn. Mạng ổn định cũng quan trọng: webhook, callback OAuth và job theo lịch phải luôn sẵn sàng.
Kết luận
n8n biến các thao tác lặp lại thành những flow trực quan rõ ràng: node dựng sẵn giúp khởi chạy nhanh, HTTP Request kết nối gần như mọi API và Code node cho phép thêm logic riêng.
Phiên bản self-hosted cho bạn quyền kiểm soát máy chủ và cơ sở dữ liệu, nhưng cần HTTPS, khóa bị giới hạn, dọn lịch sử và bản sao lưu đã xác minh. Lưu N8N_ENCRYPTION_KEY cùng PostgreSQL: không có khóa này, thông tin xác thực được khôi phục sẽ không thể giải mã.
Câu hỏi thường gặp
n8n có thể dùng miễn phí không?
Có. Community Edition có thể được lưu trữ miễn phí trên máy chủ riêng cho các quy trình cá nhân và nội bộ. Việc bán lại n8n được host như một SaaS độc lập bị hạn chế bởi giấy phép fair-code.
Có thể cài n8n mà không cần tên miền không?
Để kiểm thử cục bộ thì có. Với webhook công khai và OAuth, tốt hơn nên dùng tên miền cùng HTTPS.
n8n cần bao nhiêu RAM?
Các workflow cá nhân đơn giản thường chạy với 2 GB RAM. Với n8n cùng PostgreSQL, Caddy và task runner, 4 GB hợp lý hơn; tệp và các lần thực thi đồng thời có thể cần 8 GB trở lên.
Tất cả dữ liệu có nằm trong VPS không?
Chỉ dữ liệu mà workflow không gửi đi nơi khác. Cơ sở dữ liệu và lịch sử thực thi được lưu trên VPS, nhưng node Telegram, CRM hoặc mô hình AI bên ngoài sẽ gửi dữ liệu đã chọn tới dịch vụ tương ứng.
Bản sao lưu n8n cần bao gồm những gì?
Một dump PostgreSQL, volume n8n_data, compose.yaml, Caddyfile và .env chứa N8N_ENCRYPTION_KEY. Lưu bản sao lưu ở dạng mã hóa bên ngoài VPS và xác minh bằng cách khôi phục thử.
