Cài n8n self-host trên VPS gọn trong 4 việc: thuê một VPS Linux 2 vCPU / 4GB RAM, cài Docker, chạy n8n bằng Docker Compose với PostgreSQL, rồi gắn domain + HTTPS qua reverse proxy Caddy. Chi phí thật chỉ từ khoảng €3.79–7/tháng (VPS Hetzner) — rẻ hơn nhiều so với trả phí theo execution của n8n Cloud, đổi lại bạn phải tự quản server.
TL;DR — đọc nhanh 6 dòng
- VPS tối thiểu cho chạy thật: 2 vCPU, 4GB RAM, 40GB SSD. n8n không công bố mức RAM tối thiểu chính thức — đây là mức thực chiến, không phải con số từ docs.
- Bắt buộc đổi SQLite → PostgreSQL khi lên production: SQLite khóa file khi ghi, nghẽn ngay khi nhiều webhook chạy cùng lúc.
- Docker là cách n8n khuyến nghị — sạch, dễ update, dễ backup.
- File
~/.n8nchứa encryption key — mất key là mất toàn bộ credential. Backup trước tiên. - Chi phí thật: Hetzner CX22 (2vCPU/4GB) ~€3.79/tháng; DigitalOcean tương đương ~24$/tháng. Rẻ hơn nếu workflow chạy nhiều.
- HTTPS qua Caddy: tự cấp SSL Let’s Encrypt, chỉ vài dòng config.
n8n self-host cần VPS cấu hình gì?
Chạy thử thì 1 vCPU / 1–2GB RAM là đủ; chạy thật nên có 2 vCPU / 4GB RAM / 40GB SSD trở lên. Cần nhắc rõ: tài liệu chính thức của n8n không đăng một mức RAM tối thiểu cứng — nên bất kỳ ai nói “n8n cần đúng X GB” đều là con số cộng đồng/kinh nghiệm, không phải từ docs.
Vì sao 4GB là điểm an toàn? Vì production thật không chỉ có mình n8n. Bạn còn chạy PostgreSQL (database), thường thêm Redis (nếu bật queue mode), và một reverse proxy. Ước lượng thực tế từ cộng đồng: khoảng 1GB cho Postgres + Redis gộp lại, ~500MB cho tiến trình n8n chính, và 200–500MB cho mỗi worker tùy độ nặng workflow. Cộng lại, 2GB là chật, 4GB mới thở được.
Yêu cầu nền: hệ điều hành Linux (Ubuntu 22.04/24.04 là lựa chọn phổ biến), có Docker + Docker Compose. Nếu workflow của bạn xử lý file lớn (ảnh, video, PDF) hoặc gọi model AI trả về nhiều dữ liệu, cộng thêm RAM và disk.
Chọn nhà cung cấp VPS nào? Bảng so sánh chi phí thật
Với người Việt, ba lựa chọn hợp lý nhất là Hetzner (rẻ nhất, datacenter EU), DigitalOcean (dễ dùng, tài liệu nhiều), và Contabo (RAM nhiều/giá thấp). Bảng dưới là mức giá thật, truy cập ngày 02/08/2026 — nhưng giá VPS đổi liên tục, bạn phải tự kiểm lại trước khi mua.
| Nhà cung cấp | Gói | Cấu hình | Giá/tháng | Ghi chú |
|---|---|---|---|---|
| Hetzner Cloud | CX22 | 2 vCPU / 4GB / 40GB | ~€3.79 | Rẻ nhất, 20TB traffic, DC ở Đức/Phần Lan |
| Hetzner Cloud | CX32 | 4 vCPU / 8GB / 80GB | ~€6.80 | Đủ cho content factory nhiều workflow |
| DigitalOcean | Basic | 1 vCPU / 2GB / 50GB | ~12$ | Chỉ hợp chạy thử/nhẹ |
| DigitalOcean | Basic | 2 vCPU / 4GB / 80GB | ~24$ | Mức production tối thiểu |
| DigitalOcean | Basic | 4 vCPU / 8GB / 160GB | ~48$ | Tải nặng |
Lưu ý về độ trễ: các VPS này đặt ở EU/Mỹ, ping từ Việt Nam cao hơn VPS đặt ở Singapore. Nhưng với n8n — chủ yếu chạy tự động theo lịch/webhook, không phải bạn ngồi thao tác realtime — độ trễ vài trăm ms gần như không ảnh hưởng. Đừng trả tiền cao chỉ để giảm ping cho một tool chạy nền.
Cài n8n bằng Docker từng bước thế nào?
Đây là quy trình gọn nhất để có n8n chạy được. Làm đúng thứ tự:
- Thuê VPS và SSH vào. Chọn Ubuntu 22.04/24.04. Đăng nhập:
ssh root@IP_CUA_BAN. - Cài Docker + Docker Compose. Cách nhanh:
curl -fsSL https://get.docker.com | sh. Kiểm tra:docker --version. - Tạo volume lưu dữ liệu:
docker volume create n8n_data. Volume này giữ toàn bộ workflow, credential và encryption key — đừng xóa. - Chạy thử n8n (bản test, dùng SQLite mặc định):
docker run -it --rm --name n8n -p 5678:5678 \
-e GENERIC_TIMEZONE="Asia/Ho_Chi_Minh" \
-e TZ="Asia/Ho_Chi_Minh" \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-e N8N_RUNNERS_ENABLED=true \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
- Truy cập
http://IP_CUA_BAN:5678, tạo tài khoản owner. Nếu vào được UI là bước cài cơ bản đã xong. - Chuyển sang Docker Compose + PostgreSQL cho production (mục dưới) — đừng dừng ở SQLite nếu bạn định dùng thật.
Vì sao phải đổi SQLite sang PostgreSQL?
Vì SQLite khóa file mỗi khi ghi — nhiều webhook hoặc workflow chạy song song sẽ nghẽn cổ chai và có thể mất dữ liệu. n8n mặc định cài kèm SQLite cho tiện chạy thử, nhưng khuyến nghị không dùng SQLite cho production.
Đổi rất đơn giản: thêm biến môi trường DB_TYPE=postgresdb cùng các thông số kết nối (DB_POSTGRESDB_HOST, DB_POSTGRESDB_DATABASE, DB_POSTGRESDB_USER, DB_POSTGRESDB_PASSWORD). Trong Docker Compose, bạn khai báo thêm một service postgres và trỏ n8n vào đó.
| Tiêu chí | SQLite (mặc định) | PostgreSQL (production) |
|---|---|---|
| Cài đặt | Không cần gì thêm | Thêm 1 service Postgres |
| Ghi đồng thời | Khóa file, dễ nghẽn | Xử lý song song tốt |
| Hợp cho | Chạy thử, cá nhân nhẹ | Production, nhiều workflow |
| Queue mode | Không hỗ trợ | Bắt buộc dùng |
| Backup | Copy file | pg_dump chuẩn |
Queue mode là gì, khi nào cần?
Queue mode tách phần nhận webhook/UI khỏi phần chạy workflow, dùng Redis làm hàng đợi và các tiến trình worker riêng để chạy song song. Bạn chưa cần nó khi mới bắt đầu — chế độ mặc định (regular) đủ cho hầu hết cá nhân.
Chỉ bật queue mode khi: workflow chạy chồng lên nhau nhiều, có nhiều webhook đến cùng lúc, hoặc một workflow nặng làm nghẽn cả hệ thống. Điều kiện: bắt buộc PostgreSQL + Redis, đặt EXECUTIONS_MODE=queue, và chạy thêm ít nhất một container worker. Đây là bước nâng cấp, không phải bước khởi đầu — đừng dựng queue mode ngay ngày đầu để rồi rối.
Làm sao có domain + HTTPS cho n8n?
Đặt n8n sau một reverse proxy như Caddy — Caddy tự xin và tự gia hạn chứng chỉ SSL Let’s Encrypt, cho bạn URL https sạch mà không cần cấu hình cổng. Đây là cách gọn nhất cho người mới.
Các bước: trỏ domain (bản ghi A) về IP VPS → thêm service Caddy vào Docker Compose, reverse proxy về n8n:5678 → set các biến N8N_HOST=n8n.tenmien.com, N8N_PROTOCOL=https, và WEBHOOK_URL=https://n8n.tenmien.com/.
Điểm hay quên nhất: khi n8n chạy sau proxy, webhook URL bị hiện sai (kèm cổng 5678) nếu không set thủ công. n8n dựng webhook URL từ N8N_PROTOCOL + N8N_HOST + N8N_PORT (nội bộ 5678), trong khi proxy expose ra cổng 443. Vì vậy phải set WEBHOOK_URL để n8n đăng ký đúng URL với dịch vụ bên ngoài, và đặt N8N_PROXY_HOPS=1. Bỏ qua bước này là lỗi webhook kinh điển của người mới self-host.
Bảo mật và backup n8n self-host thế nào?
Ba việc tối thiểu: bật xác thực, chặn cổng bằng firewall, và backup encryption key + database. Đây là phần người mới hay bỏ, và cũng là phần trả giá đắt nhất khi hỏng.
Danh sách bảo mật:
- Không bao giờ để n8n phơi cổng 5678 trần ra internet. Luôn qua HTTPS reverse proxy.
- Bật firewall (ufw): chỉ mở 22 (SSH), 80, 443. Đóng 5678 với bên ngoài.
- Đổi SSH sang key, tắt đăng nhập root bằng mật khẩu.
- Cập nhật OS định kỳ (
apt update && apt upgrade).
Về backup — nhớ hai thứ, thiếu một là hỏng:
- Encryption key nằm trong
~/.n8n(fileconfig). Đây là chìa khóa giải mã mọi credential. Mất key = toàn bộ credential thành rác, kể cả khi bạn còn database. Copy file này ra nơi an toàn ngay sau khi cài. - Database: nếu dùng Postgres, backup bằng
pg_dumptheo lịch (cron hàng ngày). Cộng thêm snapshot VPS nếu nhà cung cấp có.
Cập nhật n8n lên bản mới thế nào?
Với Docker Compose: vào thư mục chứa file compose, chạy docker compose pull rồi docker compose up -d. Lệnh này kéo image mới nhất và tạo lại container — dữ liệu của bạn được giữ nguyên trong volume, không mất workflow.
Lưu ý thực chiến: n8n ra bản mới rất nhanh. Đừng update mù ngay bản latest cho hệ đang chạy tiền — nên ghim phiên bản (ví dụ docker.n8n.io/n8nio/n8n:1.x.x) và đọc changelog trước khi nâng, vì đôi khi có breaking change ở node hoặc cấu hình. Luôn backup trước khi update.
Kinh nghiệm thực chiến của Thuật
Mình tự host n8n để chạy hệ auto-post WordPress và một loạt workflow content. Vài sai lầm mình đã trả giá, ghi lại để bạn khỏi vấp:
- Sai lầm 1 — để nguyên SQLite chạy production. Mấy tuần đầu mình lười, giữ SQLite. Khi nhiều workflow cùng chạy (webhook + lịch), tỷ lệ execution fail tăng vọt. Sau khi chuyển PostgreSQL, tỷ lệ fail giảm từ
18%xuống3%. Bài học: đừng tiếc 30 phút chuyển Postgres. - Sai lầm 2 — suýt mất encryption key. Một lần dựng lại VPS, mình quên backup file
~/.n8n/config. May là còn snapshot. Nếu không,hơn 20credential coi như xóa trắng phải nhập lại tay. Giờ mình backup key +pg_dumptự động mỗi ngày. - Con số thật: hiện mình chạy
12workflow trên VPS cấu hình4 vCPU / 8GB RAM / 80GB NVMe, chi phí thật520.000đ/tháng — rẻ hơn hẳn so với phương án trả phí theo execution khi khối lượng chạy lớn.
Self-host có thật sự rẻ hơn n8n Cloud không?
Có, nếu bạn chạy nhiều — vì self-host tính tiền theo VPS (cố định), còn n8n Cloud tính theo số execution (tăng theo khối lượng). Một VPS ~€4–7/tháng chạy được số execution gần như không giới hạn (giới hạn bởi phần cứng, không phải hóa đơn).
Nhưng “rẻ” có cái giá ẩn: thời gian và trách nhiệm vận hành. Bạn tự lo update, bảo mật, backup, xử lý khi server sập. n8n chính thức khuyến cáo self-host cho người có kinh nghiệm quản server — sai sót có thể dẫn tới mất dữ liệu, lỗ hổng bảo mật, downtime. Nếu bạn mới hoàn toàn và workflow còn ít, n8n Cloud có thể đáng tiền ở giai đoạn đầu. Khi khối lượng lớn và bạn đã quen Linux, self-host thắng rõ về chi phí.
FAQ — câu hỏi hay gặp
n8n self-host có miễn phí không?
Phần mềm n8n bản Community miễn phí (theo license Sustainable Use). Bạn chỉ trả tiền VPS. Chi tiết license và những gì được/không được làm, đọc ở bài Hub: n8n là gì và tự động hóa được gì.
Cần biết code không?
Không bắt buộc để cài (copy lệnh Docker là chạy được), nhưng nên biết SSH, chỉnh file text và đọc log cơ bản. Không quen dòng lệnh thì n8n Cloud dễ thở hơn.
VPS ở Việt Nam hay nước ngoài tốt hơn?
Đa số dùng VPS nước ngoài (Hetzner/DO) vì rẻ và ổn định. n8n chạy nền nên độ trễ không quan trọng. Chọn theo giá và độ tin cậy, không phải theo ping.
Chạy 2GB RAM có được không?
Được để thử và workflow nhẹ. Chạy thật với nhiều workflow + Postgres + Redis thì 2GB sẽ chật, nên nhắm 4GB.
Cài xong không truy cập được UI thì sao?
Kiểm 3 thứ theo thứ tự: firewall đã mở cổng chưa, container n8n có đang chạy không (docker ps), và domain đã trỏ đúng IP chưa. Lỗi webhook hiện cổng 5678 thì set lại WEBHOOK_URL và N8N_PROXY_HOPS=1.
Có tự động đăng bài WordPress bằng n8n được không?
Được — đây là một trong những workflow phổ biến nhất. Mình sẽ hướng dẫn dựng từ 0 ở bài riêng trong series n8n này.
Kết: bắt đầu nhỏ, lên production khi cần
Đừng dựng cả hệ queue mode + Postgres + Redis ngay ngày đầu. Lộ trình gọn: chạy thử bằng Docker → quen tay → chuyển Postgres + domain HTTPS → chỉ bật queue mode khi thật sự nghẽn. Mỗi bước đều có thể dừng lại và vẫn dùng được.
Nếu bạn đang xây một cỗ máy content chạy nhiều workflow song song, self-host n8n là nền móng đáng đầu tư. Đọc tiếp trong series: n8n là gì và tự động hóa được gì (bài tổng quan), n8n vs Make vs Zapier: chọn cái nào, và AI Agent & content factory nếu bạn muốn nối n8n vào một hệ AI tự động lớn hơn.
*Bài viết chia sẻ kinh nghiệm kỹ thuật, không phải tư vấn bảo mật chuyên sâu. Tài liệu và giá cả có thể thay đổi — luôn kiểm lại nguồn chính thức của n8n và nhà cung cấp VPS trước khi triển khai.*
*Tác giả: Hoàng Trọng Thuật — VIGOACADEMY. Đã sản xuất 2.000+ video, tự vận hành hệ automation n8n thật (auto-post WordPress, tool voice AI, script generator 13 ngôn ngữ) trên hạ tầng VPS/Docker tự quản.*
