Hướng Dẫn Từ A-Z: Cài Đặt n8n Self-hosted Trên Ubuntu VPS Cho Người Mới Bắt Đầu

21 tháng 6, 2026 Vinh Automation
Hướng Dẫn Từ A-Z: Cài Đặt n8n Self-hosted Trên Ubuntu VPS Cho Người Mới Bắt Đầu

Hướng Dẫn Từ A-Z: Cài Đặt n8n Self-hosted Trên Ubuntu VPS Cho Người Mới Bắt Đầu

Tác giả: Vinh Automation

Cấp độ: Người mới bắt đầu (Beginner)

Thời gian hoàn thành: 30–45 phút


Phần 1: Tổng Quan & Kiến Trúc Hệ Thống

1.1 Tại sao nên Self-host n8n?

n8n là một trong những công cụ tự động hóa (Automation) và AI Agent mạnh mẽ nhất hiện nay. Tuy nhiên, bản Cloud (n8n.cloud) có chi phí khá cao và bị giới hạn số lượng workflow — nhất là khi bạn cần chạy nhiều luồng tự động phức tạp.

Self-hosted n8n trên VPS cho bạn:

  • Toàn quyền kiểm soát dữ liệu — không có bên thứ ba chạm vào workflow của bạn.
  • Không giới hạn workflow, execution, hay user.
  • Chi phí thấp — chỉ từ $5–10/tháng cho một VPS Ubuntu.
  • Tích hợp không giới hạn — tự do cài package Python, Node.js tùy chỉnh.

1.2 Kiến trúc hệ thống

Dưới đây là kiến trúc bạn sẽ xây dựng:

[Máy tính của bạn]                    [VPS Ubuntu]
      │                                    │
      │  MobaXterm (SSH)                   │
      ├─────────────────────────────────►  │
      │                                    │
      │                             ┌──────┴─────────┐
      │                             │  Docker        │
      │                             │  ├─ n8n_app    │
      │                             │  │  (port 5678)│
      │                             │  └─ cloudflare │
      │                             │     _tunnel    │
      │                             └──────┬─────────┘
      │                                    │
      │  HTTPS (qua Cloudflare Tunnel)     │
      │  ─── Internet ───► Cloudflare ◄────┘
      │                        │
      │  https://n8n.your-domain.com
      │◄───────────────────────┘

Kiến trúc hệ thống n8n Self-hosted

Kiến trúc tổng thể — MobaXterm kết nối SSH đến VPS, n8n và Tunnel chạy trong Docker, người dùng truy cập qua Cloudflare Tunnel với HTTPS tự động

Luồng hoạt động:

  1. Bạn dùng MobaXterm (SSH client) để kết nối và quản lý VPS Ubuntu.
  2. Docker chạy 2 container: n8n_app (xử lý workflow) và cloudflare_tunnel (tạo đường hầm bảo mật).
  3. Cloudflare Tunnel tạo kết nối an toàn từ VPS → Cloudflare Edge, không cần mở port nào trên VPS.
  4. Người dùng truy cập n8n qua https://n8n.your-domain.com — HTTPS được Cloudflare cấp tự động.
Tại sao dùng Cloudflare Tunnel thay vì mở port? Mở port 5678 công khai trên VPS đồng nghĩa với việc lộ diện IP thật và dễ bị hacker quét quét tấn công. Cloudflare Tunnel tạo một đường hầm private — hacker không thấy VPS của bạn, dù có biết IP cũng không thể truy cập n8n.

Phần 2: Hướng Dẫn Từng Bước

Chuẩn bị

Trước khi bắt đầu, hãy đảm bảo bạn đã có:

Công cụYêu cầuGhi chú
VPS LinuxUbuntu 22.04 hoặc 24.04 LTS, 1–2 vCPU, ≥2GB RAMThị trường quốc tế: DigitalOcean, Vultr, Hetzner, Linode (thanh toán USD, phù hợp content global).
Tại Việt Nam: VPS Việt Nam ⚡ — thanh toán VND, dễ dàng, hỗ trợ nhanh, tôi đang dùng.
Tên miềnĐã trỏ DNS về CloudflareVí dụ: vinhautomation.com
MobaXtermPhiên bản mới nhất (tải từ mobaxterm.mobatek.net)Dùng bản Free là đủ, nên dùng bản Portable
Tài khoản CloudflareFree plan là đủ dùngĐăng ký tại cloudflare.com

Bước 1: Kết nối VPS lần đầu qua MobaXterm

MobaXterm là công cụ quản lý VPS mạnh mẽ với giao diện đồ họa trực quan. Đây là bước đầu tiên và quan trọng nhất cho người mới.

Giao diện MobaXterm với cửa sổ New Session

Cửa sổ tạo Session SSH trong MobaXterm — điền IP VPS và username root

  1. Mở MobaXterm → bấm nút Session (góc trên cùng bên trái).
  2. Chọn SSH.
  3. Điền thông tin:
    • Remote host: Địa chỉ IP của VPS.
    • Tích Specify username → gõ root.
  4. Bấm OK.
Lưu ý chí mạng cho người mới: Khi hệ thống yêu cầu nhập mật khẩu, màn hình sẽ im lìm, không hiện ký tự nào — đây là cơ chế bảo mật của Linux, máy không bị đơ đâu! Cứ dán mật khẩu vào (Ctrl+V hoặc click chuột phải) rồi nhấn **Enter** là vào được.

Mẹo tiết kiệm thời gian: Sau khi đăng nhập thành công, hãy lưu session để lần sau không cần gõ lại:

  • Nhìn sang cột Sessions bên trái → click chuột phải vào khoảng trống.
  • Chọn Add current terminal as a session → OK.

Sau đó, click chuột phải vào session vừa lưu → Edit session:

  • Tại ô Username (root), bấm vào icon hình người (cạnh chìa khóa vàng).
  • Bấm New → điền Username root và dán mật khẩu VPS → OK.

Cấu hình lưu mật khẩu MobaXterm

Cửa sổ MobaXterm Password Settings — bấm New để thêm credential, từ nay chỉ cần click đúp là vào thẳng VPS

Từ nay, bạn chỉ cần click đúp vào session là vào thẳng terminal, không cần gõ mật khẩu lần nào nữa.

Bước 2: Cài đặt Docker & Docker Compose

Chạy block lệnh sau trong terminal MobaXterm để cài Docker:

# Bước 2a: Cập nhật hệ thống
sudo apt update && sudo apt upgrade -y

# Bước 2b: Cài đặt các gói phụ trợ
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y

# Bước 2c: Tải và chạy script cài Docker chính thức
curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh

# Bước 2d: Kích hoạt Docker khởi động cùng VPS
sudo systemctl enable docker && sudo systemctl start docker

Giải thích từng lệnh:

LệnhTác dụng
apt update && apt upgradeCập nhật danh sách gói và nâng cấp toàn bộ phần mềm trên VPS — đảm bảo không bị lỗi dependency về sau.
apt install ... curl gnupg ...Cài các công cụ cần thiết để tải và xác thực gói Docker.
curl ... get.docker.sh && sh get-docker.shScript chính thức từ Docker Inc. — tự động nhận diện hệ điều hành và cài đặt phiên bản phù hợp.
systemctl enable dockerĐảm bảo Docker tự động chạy lại sau khi VPS reboot.

Kiểm tra: gõ docker --version — nếu thấy hiện phiên bản (vd: Docker version 27.x.x) là thành công.

Bước 3: Khởi chạy Container n8n

Chạy lệnh sau để kéo image n8n và khởi động:

docker run -d \
  --name n8n_app \
  --restart always \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  n8nio/n8n:latest

Phân tích chi tiết lệnh:

Tham sốÝ nghĩa
-dChạy ngầm (detached) — terminal không bị chiếm dụng.
--name n8n_appĐặt tên container là n8n_app để dễ quản lý.
--restart alwaysTự động khởi động lại nếu container bị crash hoặc VPS reboot.
-p 5678:5678Map port 5678 của VPS vào port 5678 của container.
-v n8n_data:/home/node/.n8nVolume lưu dữ liệu workflow — quan trọng nhất: khi xóa container, dữ liệu không mất.
n8nio/n8n:latestImage chính thức từ n8n, luôn là bản mới nhất.
Cảnh báo bảo mật nghiêm trọng: Lúc này, n8n có thể truy cập qua http://IP-VPS:5678. Tuyệt đối KHÔNG làm việc qua đường này vì:
  • Giao thức HTTP — mật khẩu và token bị gửi dưới dạng plain text.
  • Cổng 5678 mở công khai — hacker bot sẽ quét và tấn công ngay lập tức.
Chúng ta sẽ đóng cổng này lại ngay ở bước sau bằng Cloudflare Tunnel.

Bước 4: Tạo Cloudflare Tunnel kết nối Internet an toàn

Thay vì mở port cho hacker, Cloudflare Tunnel tạo một đường hầm private từ VPS ra thẳng tên miền của bạn.

Cloudflare Zero Trust Dashboard — Networks > Tunnels

Giao diện Cloudflare Zero Trust — vào Networks → Tunnels để tạo đường hầm mới

4.1. Lấy mã Token từ Cloudflare:

  1. Truy cập Cloudflare Zero TrustNetworksTunnels.
  2. Bấm Create a tunnel → đặt tên (vd: n8n-tunnel) → Save tunnel.
  3. Ở màn hình Choose your environment, chọn Docker.
  4. Copy chuỗi ký tự dài nằm sau --token — đó là Token của bạn.

4.2. Kích hoạt Tunnel trên VPS:

Quay lại MobaXterm, chạy lệnh sau (thay <TOKEN_CUA_BAN> bằng token vừa copy):

docker run -d \
  --name cloudflare_tunnel \
  --restart always \
  cloudflare/cloudflared:latest \
  tunnel run --token <TOKEN_CUA_BAN>

Giải thích:

  • cloudflare/cloudflared:latest — image chính thức của Cloudflare Tunnel.
  • tunnel run --token <TOKEN> — lệnh kết nối đến Cloudflare Edge sử dụng token xác thực. Token bắt buộc phải nằm cuối lệnh, không được đưa lên đầu.
Mẹo kỹ thuật: Tham số --token phải nằm ở cuối lệnh Docker. Nếu đưa lên trước tunnel run, Cloudflare sẽ nhận diện nhầm sang cơ chế dùng file chứng chỉ cũ (cert.pem) và báo lỗi "Error locating origin cert".

Bước 5: Trỏ tên miền & Hoàn tất

  1. Trong giao diện Cloudflare Zero Trust (đang ở trang cấu hình Tunnel), bấm Next.

  2. Chuyển sang tab Public Hostname → bấm Add a public hostname.

  3. Điền thông tin:

    • Subdomain: n8n
    • Domain: vinhautomation.com (tên miền của bạn)
    • Type: HTTP
    • URL: n8n_app:5678
  4. Bấm Save hostname.

Cấu hình Public Hostname cho Tunnel

Cấu hình Public Hostname — subdomain n8n, URL trỏ đến n8n_app:5678

Kiểm tra kết nối:

docker logs cloudflare_tunnel --tail 10

Nếu thấy dòng INF Connection registered hoặc HTTP/2 connection successful là thành công.

Bước 6: Đăng ký tài khoản Admin n8n

Mở trình duyệt, truy cập:

https://n8n.your-domain.com

Bạn sẽ thấy giao diện đăng ký tài khoản Admin đầu tiên của n8n. Điền email, mật khẩu (nhớ lưu lại) và bắt đầu sử dụng.

Giao diện đăng ký Admin n8n lần đầu

Trang đăng ký tài khoản Admin lần đầu — xuất hiện khi truy cập n8n lần đầu tiên qua HTTPS, chứng chỉ bảo mật đã được Cloudflare cấp tự động

🎉 Thành công! Bạn đã sở hữu một hệ thống n8n Self-hosted hoàn chỉnh với HTTPS bảo mật, không giới hạn workflow, và toàn quyền kiểm soát dữ liệu.

Phần 3: Troubleshooting & Best Practices

3.1 Các lỗi thường gặp khi setup

LỗiNguyên nhânCách xử lý
SSH: Permission denied (password)Sai mật khẩu hoặc VPS không cho phép đăng nhập root bằng passwordVào VPS Console (qua web hosting) → sửa /etc/ssh/sshd_config → set PermitRootLogin yessystemctl restart sshd
Docker: Cannot connect to Docker daemonUser chưa được thêm vào group dockerChạy sudo usermod -aG docker $USER, logout và login lại
Port 5678 already in useContainer cũ chưa xóaChạy docker rm -f n8n_app rồi chạy lại lệnh run
Cloudflare Tunnel: 404 Not FoundSai đường dẫn URL trong Public HostnameVào Tunnel → Edit → sửa URL thành n8n_app:5678
Lỗi: Error locating origin certToken đặt sai vị trí trong lệnh DockerĐảm bảo token nằm sau tunnel run --token

3.2 Debugging Checklist

# 1. Docker có chạy không?
docker ps -a

# 2. n8n app có log gì không?
docker logs n8n_app --tail 20

# 3. Tunnel có kết nối được không?
docker logs cloudflare_tunnel --tail 20

# 4. Thử curl n8n nội bộ
curl -I http://localhost:5678

# 5. Kiểm tra volume dữ liệu
docker volume inspect n8n_data

3.3 Best Practices ngay từ đầu

🔒 Bảo mật

  • Không mở port 5678 ra internet — chỉ dùng Cloudflare Tunnel.
  • Đặt mật khẩu Admin n8n mạnh (ít nhất 12 ký tự, có ký tự đặc biệt).
  • Cập nhật Docker image định kỳ: docker pull n8nio/n8n:latest && docker rm -f n8n_app && docker run ...

⚡ Hiệu năng

  • Dùng VPS có 2GB RAM trở lên — n8n với workflow AI rất tốn bộ nhớ.
  • Set SWAP (xem Bài 2) để tránh sập nguồn khi quá tải.
  • Giới hạn log Docker (xem Bài 2) để tránh đầy ổ cứng.

🏗️ Kiến trúc

  • Dùng volume riêng cho n8n_data — không dùng bind mount thư mục thường.
  • Gắn nhãn container: docker run ... --label "project=n8n-production" dễ quản lý.
  • Backup volume định kỳ — workflow là tài sản quý giá.

Kết luận

Bạn đã hoàn thành việc cài đặt n8n Self-hosted trên VPS Ubuntu với Docker và Cloudflare Tunnel. Toàn bộ quy trình chỉ gồm 6 bước và mất chưa đến 45 phút.

Những gì bạn đã làm được:

  • ✅ Kết nối và quản lý VPS qua MobaXterm với session lưu mật khẩu vĩnh viễn.
  • ✅ Cài đặt Docker và khởi chạy n8n container.
  • ✅ Thiết lập Cloudflare Tunnel bảo mật — không mở port, HTTPS tự động.
  • ✅ Trỏ tên miền và đăng ký Admin thành công.

🚀 Next steps: Hệ thống mới chỉ là nền móng. Để n8n chạy ổn định tháng năm không sập, bạn cần tối ưu RAM, giới hạn log, dọn rác tự động, và biết cách xử lý lỗi 502/1033 thực chiến. Tất cả có trong bài viết tiếp theo.


📖 Bài viết liên quan:

Bài viết này hữu ích? Cho Vinh 1 Like nhé!

#n8n #VPS #Ubuntu #Docker #Cloudflare

Nhận bản tin chuyên sâu từ Vinh Automation

Đăng ký để không bỏ lỡ các bài viết mới nhất về AI, Automation, Trading và tư duy hệ thống (Systematic Thinking). Cam kết không Spam, chỉ chia sẻ kiến thức thực chiến giúp bạn tối ưu hiệu suất.

Chúng tôi tôn trọng quyền riêng tư của bạn. Xem Chính sách bảo mật.