Trang chủHướng dẫnCài n8n lên VPS bằng Docker: tên miền, SSL tự động, webhook đầu tiên (từng lệnh, thử thật)
Cài n8n lên VPS bằng Docker: tên miền, SSL tự động, webhook đầu tiên (từng lệnh, thử thật)
Hướng dẫn CloudNest Team 03 tháng 11, 2026 7 lượt xem
n8n là công cụ tự động hoá kiểu kéo thả: nối Google Sheets, Telegram, email, webhook, AI… thành các "workflow" chạy tự động. Bản n8n Cloud tính phí theo số lần chạy; tự cài lên VPS thì không giới hạn workflow và số lần chạy, dữ liệu nằm trên máy của bạn. Bài này cài n8n bằng Docker theo đúng tài liệu chính thức, có https tự động — chạy thật trên VPS Ubuntu 24.04 · 1 vCPU · 2 GB ngày 03/11/2026, từ máy trống tới webhook trả lời qua internet.
TỪ VPS TRỐNG TỚI WEBHOOK HTTPS · ĐO THẬTUbuntu 24.04 · 1 vCPU · 2 GB
36 giây
Cài Docker
→
73 giây
Kéo ảnh + chạy n8n
→
tự động
SSL Let's Encrypt
→
0,17–0,32 s
Webhook trả lời
RAM n8n
~490 MB
+ Traefik ~120 MB
Cả máy
~850–935 MB / 2 GB
sau khi chạy
Khởi động lại VPS
62 giây
là webhook trả lời lại
Sao lưu dữ liệu
2,2 giây
dừng → nén → chạy lại
1. Chuẩn bị: VPS và tên miền
✓VPS Linux Ubuntu 24.04, từ 2 GB RAM. Đo thật: riêng n8n dùng ~490 MB, Traefik ~120 MB, cả máy ~850–935 MB. Gói 1 GB chạy được nhưng sát, workflow nặng hay xử lý tệp lớn dễ thiếu RAM. Ổ cứng: ảnh n8n nặng 1,94 GB, sau khi cài cả máy dùng 6,3 GB.
✓Một tên miền để có https: tạo bản ghi A (ví dụ n8n.tenmien.vn) trỏ về IP của VPS — cách làm ở bài cài WordPress.
✓Chưa có tên miền? Dùng dịch vụ miễn phí sslip.io: tên n8n.<IP-gạch-ngang>.sslip.io tự trỏ về đúng IP đó (IP 203.0.113.25 ⇒ n8n.203-0-113-25.sslip.io), không phải cài đặt gì. Bài này dùng cách đó; chạy thật thì nên dùng tên miền của bạn.
2. Cài Docker từ kho chính thức
SSH vào VPS bằng tài khoản root và chạy lần lượt (theo hướng dẫn cài Docker cho Ubuntu của Docker):
Tạo thư mục làm việc, rồi tạo hai tệp (nano .env, nano compose.yaml). Nội dung theo đúng tài liệu cài bằng Docker Compose của n8n: Traefik đứng trước nhận cổng 80/443 và tự xin chứng chỉ SSL, n8n chỉ mở cổng 5678 trong máy.
tạo thư mục
mkdir -p /root/n8n-compose/local-files && cd /root/n8n-compose
/root/n8n-compose/.env
DOMAIN_NAME=tenmien.vnSUBDOMAIN=n8nGENERIC_TIMEZONE=Asia/Ho_Chi_Minh[email protected]# địa chỉ n8n = SUBDOMAIN.DOMAIN_NAME, ví dụ https://n8n.tenmien.vn# dùng sslip.io: DOMAIN_NAME=203-0-113-25.sslip.io (IP của VPS, dấu chấm thành gạch ngang)
Giữ đúng thụt lề bằng dấu cách (YAML không nhận phím Tab). GENERIC_TIMEZONE quyết định giờ chạy của các node hẹn giờ — để Asia/Ho_Chi_Minh thì "8 giờ sáng" là 8 giờ giờ Việt Nam. Dữ liệu n8n (workflow, tài khoản, khoá mã hoá) nằm trong volume n8n_data.
Chờ khoảng một phút để Traefik xin chứng chỉ, rồi mở https://n8n.tenmien.vn. Kiểm tra thật: truy cập http:// được chuyển 301 sang https://, chứng chỉ do Let's Encrypt cấp, hạn 90 ngày và Traefik tự gia hạn.
Không lên https? Kiểm tra theo thứ tự: tên miền đã trỏ đúng IP chưa (nslookup), cổng 80 và 443 có bị tường lửa chặn không (cách kiểm tra cổng), và xem docker compose logs traefik có dòng lỗi ACME.
5. Tạo tài khoản chủ
Lần đầu mở, n8n hiện form Set up owner account: email, họ tên, mật khẩu (tối thiểu 8 ký tự, có chữ hoa và số) → Next. Đây là tài khoản quản trị — n8n đang công khai trên internet nên đặt mật khẩu mạnh, khác mọi mật khẩu khác. Các bảng khảo sát và mời nhận khoá tính năng sau đó có thể bỏ qua.
https://n8n..sslip.io/setup
Form tạo tài khoản chủ khi mở n8n lần đầu.
6. Workflow đầu tiên: webhook trả lời qua internet
Thử một workflow hai node: Webhook (nhận yêu cầu GET ở đường /webhook/xin-chao) → Respond to Webhook (trả JSON có lời chào và giờ hiện tại). Trên giao diện: Create workflow → thêm node Webhook, đặt Path xin-chao, mục Respond chọn Using 'Respond to Webhook' Node → thêm node Respond to Webhook, chọn Respond With JSON.
Workflow hai node, đã Published.
Cấu hình node Webhook (IP trong địa chỉ đã che).
Để webhook chạy thật, bấm Publish góc trên phải (n8n 2.x dùng "Publish" thay cho công tắc "Active" của bản cũ), đặt tên phiên bản → Publish. Từ lúc này địa chỉ Production URL (/webhook/…) nhận yêu cầu; địa chỉ Test URL (/webhook-test/…) chỉ dùng khi bấm "Listen for test event" trong lúc sửa.
Hộp Publish: đặt tên phiên bản rồi bấm Publish.
gọi thử từ một máy khác (đo thật từ TP.HCM tới VPS ở Hà Nội)
curl "https://n8n.tenmien.vn/webhook/xin-chao?ten=CloudNest"{"loi_chao":"Xin chào từ n8n trên VPS","thoi_gian":"03/11/2026 22:39:31","ten":"CloudNest"} 0,32 s{"loi_chao":"Xin chào từ n8n trên VPS","thoi_gian":"03/11/2026 22:39:32","ten":"CloudNest"} 0,19 s{"loi_chao":"Xin chào từ n8n trên VPS","thoi_gian":"03/11/2026 22:39:32","ten":"CloudNest"} 0,17 s
Ba lần gọi đều Success, mỗi lần n8n xử lý 34–65 ms.
Giờ trong JSON là giờ Việt Nam nhờ GENERIC_TIMEZONE. Từ đây thay node Respond bằng bất cứ thứ gì: ghi vào Google Sheets, nhắn Telegram, gọi AI, gửi email…
7. Khởi động lại, cập nhật, sao lưu
Khởi động lại VPS thật — n8n tự lên nhờ restart: always
22:43:27
Ra lệnh khởi động lại
22:43:43
Máy lên lại
22:44:31
Webhook trả lời 200 qua https
62 giây sau lệnh khởi động lại, không phải chạy lệnh gì.
cập nhật n8n lên bản mới
cd /root/n8n-composedocker compose pulldocker compose up -d# đọc ghi chú phát hành của n8n trước khi nâng bản lớn (ví dụ 1.x lên 2.x); sao lưu trước khi nâng
Sao lưu: dữ liệu nằm trong volume n8n-compose_n8n_data (cơ sở dữ liệu SQLite + khoá mã hoá thông tin đăng nhập). Dừng n8n trong chốc lát để chép cho nhất quán:
sao lưu — đo thật 2,2 giây, tệp 512 KB
cd /root/n8n-composedocker compose stop n8ndocker run --rm -v n8n-compose_n8n_data:/data:ro -v $PWD:/backup alpine tar czf /backup/n8n-data-$(date +%F).tar.gz -C /data .docker compose start n8n
khôi phục — đo thật 2,3 giây, webhook chạy lại bình thường
docker compose stop n8ndocker run --rm -v n8n-compose_n8n_data:/data -v $PWD:/backup alpine sh -c "rm -rf /data/* /data/.[!.]* 2>/dev/null; tar xzf /backup/n8n-data-2026-11-03.tar.gz -C /data"docker compose start n8n
compose.yaml mở 127.0.0.1:5678 — bên ngoài chỉ vào được qua Traefik (https). Đừng đổi thành 5678:5678.
Docker và ufw
Cổng Docker mở (80, 443) đi vòng qua ufw. Bật ufw vẫn nên làm để chặn các dịch vụ khác, nhưng nhớ: muốn đóng cổng của container thì sửa ports trong compose.yaml.
Mật khẩu và khoá
Tài khoản chủ mật khẩu mạnh; dùng 10 việc bảo mật VPS (khoá SSH, fail2ban, đổi cổng SSH).
Thông tin đăng nhập trong n8n
Các credential (Google, Telegram…) được n8n mã hoá bằng khoá trong volume n8n_data — mất volume là mất khả năng giải mã, nên phải sao lưu.
9. Câu hỏi thường gặp
Tự cài n8n có mất phí không?
Bản Community tự cài miễn phí, không giới hạn workflow và số lần chạy; một số tính năng doanh nghiệp cần giấy phép riêng của n8n. Chi phí của bạn là VPS.
VPS 1 GB chạy n8n được không?
Chạy được với vài workflow nhẹ, nhưng n8n + Traefik đã dùng ~610 MB, cả máy ~850 MB. Workflow xử lý nhiều dữ liệu hoặc gọi AI dễ thiếu RAM — nên chọn từ 2 GB.
Có cần tên miền riêng không?
Nên có: webhook dán vào các dịch vụ khác (Telegram, cổng thanh toán…) sẽ gắn với tên miền. sslip.io tiện để thử, nhưng đổi IP VPS là đổi luôn địa chỉ.
Cài n8n không dùng Docker được không?
Được (cài bằng npm), nhưng tài liệu n8n khuyên dùng Docker cho máy chủ: cập nhật một lệnh, tách biệt khỏi hệ thống, dễ sao lưu.
Webhook báo 404?
Workflow chưa Publish (Production URL chỉ chạy khi đã Publish), hoặc đang gọi nhầm /webhook-test/ thay vì /webhook/.
VPS Linux cho n8n và tự động hoá
Ubuntu 24.04 cài sẵn, IPv4 riêng, từ 2 GB RAM cho n8n chạy thoải mái, giao máy sau vài phút.