Self-hosting n8n là lựa chọn tối ưu giúp bạn tiết kiệm đến 75% chi phí so với sử dụng n8n Cloud, đồng thời có toàn quyền kiểm soát dữ liệu và cấu hình hệ thống. Nếu bạn hoàn toàn mới với việc quản lý server và chưa từng sử dụng terminal, đừng lo lắng. Hướng dẫn này được thiết kế dành riêng cho người mới bắt đầu, với mọi bước đều có thể thực hiện bằng cách copy-paste các lệnh có sẵn.
Mục lục
Quy trình triển khai n8n self-hosted chỉ gồm 5 bước chính: mua VPS → kết nối SSH → cài Docker và Portainer → deploy n8n → trỏ domain. Thời gian hoàn thành dự kiến là 60-90 phút, và sau khi hoàn tất, bạn sẽ có một hệ thống n8n chạy 24/7 với SSL/HTTPS, sẵn sàng xử lý workflows và webhooks chuyên nghiệp.
![[nguyenthieutoan.com] Kiến trúc hệ thống n8n self-hosted bao gồm VPS, Docker, PostgreSQL, Redis, Nginx Proxy Manager và Portainer](https://nguyenthieutoan.com/wp-content/uploads/2025/12/nguyenthieutoan-an-engaging-clean-infographic-illustrating-the-n8-1-lpt2v2.webp)
I. VPS – CHỌN VÀ MUA MÁY CHỦ ẢO
1. VPS là gì và tại sao cần VPS để chạy n8n?
VPS (Virtual Private Server) là một máy chủ ảo chạy 24/7 trên internet, hoạt động như một máy tính độc lập nhưng nằm trong data center của nhà cung cấp dịch vụ. n8n cần chạy liên tục để xử lý workflows, webhooks và các tác vụ tự động hóa, do đó bạn không thể sử dụng máy tính cá nhân mà cần một server ổn định luôn trực tuyến.
So với các giải pháp cloud như n8n Cloud hoặc AWS, VPS mang lại lợi ích về chi phí và quyền kiểm soát. Với n8n Cloud, bạn phải trả khoảng $20/tháng (~540k VNĐ/tháng hoặc 6.5 triệu VNĐ/năm), trong khi VPS chỉ từ 135k-400k VNĐ/tháng, giúp tiết kiệm đến 75% chi phí hàng năm. Thêm vào đó, bạn có toàn quyền với server, tùy chỉnh cấu hình, cài thêm các dịch vụ khác và không bị giới hạn về số lượng workflows hay executions.
2. Yêu cầu cấu hình VPS cho n8n
Cấu hình VPS cần thiết phụ thuộc vào quy mô sử dụng của bạn. n8n tiêu tốn RAM nhiều hơn CPU, đặc biệt khi chạy với Queue Mode và PostgreSQL, do đó bạn nên ưu tiên chọn gói có RAM cao hơn là CPU mạnh. Dưới đây là bảng khuyến nghị cấu hình cho các mức độ sử dụng khác nhau:
| Mức độ sử dụng | RAM | CPU | Storage | Chi phí/tháng |
|---|---|---|---|---|
| Cá nhân/Test (3-5 workflows) | 2 GB | 1-2 vCPU | 25 GB | $5-10 (~135-270k VNĐ) |
| Kinh doanh nhỏ (10-20 workflows) | 4 GB | 2 vCPU | 50 GB | $12-20 (~324-540k VNĐ) |
| Production (workflows phức tạp) | 8 GB | 4 vCPU | 80 GB | $20-40 (~540k-1.08tr VNĐ) |
Nếu bạn mới bắt đầu và chưa chắc chắn về nhu cầu, hãy chọn gói 2-4 GB RAM. Bạn có thể nâng cấp sau khi đã hiểu rõ hơn về khối lượng công việc thực tế của workflows.
3. Nhà cung cấp VPS khuyến nghị
Việc chọn nhà cung cấp VPS phụ thuộc vào ngân sách và nhu cầu hỗ trợ của bạn. Các nhà cung cấp quốc tế thường có giá rẻ hơn nhưng thanh toán phức tạp hơn (cần thẻ Visa/Mastercard), trong khi các nhà cung cấp Việt Nam dễ thanh toán và có support tiếng Việt.
Nhà cung cấp quốc tế (Server Singapore/Tokyo – gần Việt Nam)
| Provider | Gói khuyến nghị | RAM | Giá/tháng |
|---|---|---|---|
| Contabo | VPS S | 8 GB | ~$7 (~189k VNĐ) |
| Hetzner | CX22 | 4 GB | ~$5 (~135k VNĐ) |
| Vultr | Cloud Compute | 2 GB | $10 (~270k VNĐ) |
Nhà cung cấp Việt Nam (Support tiếng Việt, thanh toán dễ dàng)
| Provider | Gói khuyến nghị | RAM | Giá/tháng |
|---|---|---|---|
| AZDIGI | Cloud Pro SSD | 4 GB | ~350k VNĐ |
| Mắt Bão | Cloud VPS | 4 GB | ~400k VNĐ |
| iNET | Cloud Server | 4 GB | ~380k VNĐ |
Khuyến nghị của mình: Nếu bạn ưu tiên giá rẻ và không ngại thanh toán quốc tế, chọn Contabo hoặc Hetzner. Nếu bạn muốn hỗ trợ tiếng Việt và thanh toán dễ dàng bằng chuyển khoản ngân hàng, chọn AZDIGI, Mắt Bão hoặc iNET.
![[nguyenthieutoan.com] So sánh các nhà cung cấp VPS phù hợp cho n8n self-hosted bao gồm Contabo, Hetzner, Vultr, AZDIGI, Mắt Bão và iNET](https://nguyenthieutoan.com/wp-content/uploads/2025/12/nguyenthieutoan-a-creative-and-dynamic-comparison-infographic-show-2-lwlxi1.webp)
4. Thông tin cần lưu lại sau khi mua VPS
Sau khi hoàn tất thanh toán và VPS được kích hoạt, nhà cung cấp sẽ gửi cho bạn thông tin đăng nhập qua email hoặc hiển thị trên dashboard. Bạn cần lưu lại 3 thông tin quan trọng sau:
- IP Address: Địa chỉ IP công khai của server (ví dụ: 103.45.67.89)
- Username: Thường là root (tài khoản quản trị viên)
- Password: Mật khẩu root được gửi qua email hoặc hiển thị trên dashboard
Quan trọng: Khi mua VPS, hãy chọn hệ điều hành Ubuntu 24.04 LTS. Đây là phiên bản Ubuntu ổn định dài hạn, được hỗ trợ bảo mật đến năm 2029 và tương thích tốt nhất với Docker cũng như các công cụ chúng ta sẽ sử dụng.
II. KẾT NỐI VÀO SERVER BẰNG SSH
1. Giới thiệu về SSH và PuTTY
SSH (Secure Shell) là giao thức mạng cho phép bạn điều khiển server từ xa một cách an toàn thông qua dòng lệnh. Mọi thao tác trên server đều được mã hóa, đảm bảo bảo mật thông tin. Thay vì phải ngồi trước server vật lý, bạn có thể quản lý server từ bất kỳ đâu chỉ cần kết nối internet.
PuTTY là phần mềm SSH client miễn phí và phổ biến nhất trên Windows, giúp bạn kết nối SSH một cách dễ dàng thông qua giao diện đơn giản. Bạn có thể hình dung việc sử dụng PuTTY giống như việc “chat” với server: bạn gửi lệnh, server thực hiện và trả về kết quả.
2. Tải và cài đặt PuTTY
Để bắt đầu, bạn cần tải và cài đặt PuTTY trên máy tính Windows của mình:
- Truy cập trang chủ PuTTY: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
- Tải file putty-64bit-0.83-installer.msi (phù hợp với hầu hết máy tính hiện nay)
- Double-click file vừa tải về → Chọn Next → Next → Install → Finish
Quá trình cài đặt rất đơn giản và chỉ mất khoảng 30 giây. Sau khi hoàn tất, bạn có thể tìm PuTTY trong Start Menu.
3. Kết nối và đăng nhập vào server
Sau khi cài đặt PuTTY, bạn sẽ tiến hành kết nối đến VPS của mình. Đây là bước quan trọng để bạn có thể bắt đầu cài đặt n8n:
Bước 1: Mở PuTTY từ Start Menu
Bước 2: Trong cửa sổ PuTTY Configuration, điền thông tin như sau:
- Host Name (or IP address): Nhập địa chỉ IP của VPS bạn vừa mua
- Port: Giữ nguyên là 22 (port mặc định cho SSH)
- Connection type: SSH (đã được chọn sẵn)
Bước 3: Tuỳ chọn – Lưu session để dùng lại sau này. Trong ô “Saved Sessions”, gõ tên như n8n-server rồi click Save. Lần sau bạn chỉ cần double-click vào session đã lưu thay vì phải nhập lại IP.
Bước 4: Click nút Open để bắt đầu kết nối
Bước 5: Lần đầu kết nối, PuTTY sẽ hiển thị cảnh báo “PuTTY Security Alert”. Đây là cảnh báo bình thường, click Accept để tiếp tục. Cảnh báo này chỉ xuất hiện lần đầu tiên kết nối đến một server mới.
Bước 6: Màn hình terminal màu đen sẽ xuất hiện với dòng chữ login as:. Gõ root và nhấn Enter.
Bước 7: Khi được yêu cầu nhập password, gõ mật khẩu root mà nhà cung cấp VPS đã gửi cho bạn. Lưu ý quan trọng: Khi gõ mật khẩu, màn hình sẽ không hiển thị gì cả – không có dấu sao (*), không có dấu chấm (•). Đây là tính năng bảo mật chuẩn của Linux/Unix. Bạn cứ gõ bình thường và nhấn Enter khi xong.
Nếu kết nối thành công, bạn sẽ thấy màn hình chào mừng của Ubuntu và dấu nhắc lệnh root@server:~#. Đây là dấu hiệu bạn đã đăng nhập thành công và có thể bắt đầu thực hiện các lệnh.
![[nguyenthieutoan.com] Giao diện PuTTY khi kết nối SSH thành công đến VPS Ubuntu với terminal hiển thị welcome message và command prompt](https://nguyenthieutoan.com/wp-content/uploads/2025/12/nguyenthieutoan-a-stylized-illustration-of-a-computer-screen-displ-3-48x7cs.webp)
4. Các lệnh cơ bản cần biết
Trước khi bắt đầu cài đặt, bạn nên biết 2 lệnh cơ bản để điều khiển terminal:
- clear: Xóa màn hình terminal để gọn gàng hơn. Dùng khi màn hình có quá nhiều chữ và bạn muốn làm sạch
- exit: Thoát khỏi session SSH và ngắt kết nối. Dùng khi bạn đã hoàn thành công việc
Mẹo sử dụng PuTTY: Trong terminal PuTTY, bạn có thể copy text bằng cách bôi đen (tự động copy vào clipboard), và paste bằng cách click chuột phải. Điều này rất hữu ích khi bạn cần copy-paste các lệnh dài.
III. CÀI ĐẶT DOCKER VÀ PORTAINER
1. Docker và Portainer là gì?
Docker là nền tảng containerization giúp đóng gói ứng dụng và tất cả dependencies vào các containers độc lập. Bạn có thể hình dung Docker như những “container vận chuyển” trong logistics: mỗi container chứa đầy đủ mọi thứ cần thiết để chạy một ứng dụng, và có thể di chuyển dễ dàng giữa các môi trường khác nhau mà không gặp vấn đề tương thích.
Thay vì phải cài đặt thủ công n8n, Node.js, PostgreSQL, Redis và hàng chục thư viện phụ thuộc, Docker cho phép bạn chạy tất cả những thứ này bằng vài dòng lệnh đơn giản. Đây là lý do tại sao Docker trở thành công cụ phổ biến nhất cho việc deploy ứng dụng hiện đại.
Portainer là giao diện quản lý Docker bằng web UI, giúp bạn quản lý containers, images, networks và volumes thông qua giao diện đồ họa thay vì phải nhớ các lệnh terminal phức tạp. Portainer đặc biệt phù hợp cho người mới bắt đầu, giúp quá trình quản lý n8n trở nên dễ dàng và trực quan hơn rất nhiều.
Xem thêm về tối ưu n8n với Queue Mode tại: Hướng dẫn toàn diện về Queue Mode để mở rộng hệ thống n8n self-hosted bền vững
2. Cập nhật hệ thống
Trước khi cài đặt bất kỳ phần mềm nào, bạn cần cập nhật hệ thống Ubuntu để đảm bảo có các bản vá bảo mật và package mới nhất. Copy lệnh sau và paste vào PuTTY (click chuột phải để paste), sau đó nhấn Enter:
apt update && apt upgrade -y
Lệnh này sẽ cập nhật danh sách packages và nâng cấp tất cả packages đã cài đặt lên phiên bản mới nhất. Quá trình này có thể mất 1-2 phút. Đợi cho đến khi thấy dấu nhắc root@server:~# xuất hiện trở lại thì bạn có thể tiếp tục.
3. Cài đặt Docker
Bây giờ bạn sẽ cài đặt Docker. Chạy từng lệnh sau một theo thứ tự (copy → paste → Enter → đợi xong → chuyển sang lệnh tiếp theo):
Lệnh 1: Cài đặt các dependencies cần thiết
apt install ca-certificates curl -y
Lệnh 2: Tạo thư mục cho keyrings
install -m 0755 -d /etc/apt/keyrings
Lệnh 3: Tải GPG key của Docker và cấp quyền đọc
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
Lệnh 4: Thêm Docker repository vào sources list
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
Lệnh 5: Cập nhật lại package list
apt update
Lệnh 6: Cài đặt Docker và các components
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Bước này sẽ mất khoảng 1-2 phút. Sau khi hoàn tất, bạn cần kiểm tra xem Docker đã được cài đặt thành công chưa bằng lệnh:
docker --version
Nếu thành công, bạn sẽ thấy kết quả tương tự như Docker version 27.x.x (hoặc phiên bản cao hơn). Đây là dấu hiệu Docker đã sẵn sàng sử dụng.
4. Cài đặt Portainer
Bây giờ bạn sẽ cài đặt Portainer để có giao diện quản lý Docker. Chạy 2 lệnh sau:
Lệnh 1: Tạo Docker volume để lưu dữ liệu Portainer
docker volume create portainer_data
Lệnh 2: Chạy Portainer container
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts
Lệnh này sẽ tải và chạy Portainer. Quá trình có thể mất 30-60 giây tùy vào tốc độ mạng của VPS.
5. Truy cập và thiết lập Portainer
Sau khi Portainer đã chạy, bạn có thể truy cập giao diện web của nó:
- Mở trình duyệt web (Chrome, Firefox, Edge…)
- Truy cập: https://[IP-VPS-CỦA-BẠN]:9443 (ví dụ: https://103.45.67.89:9443)
- Trình duyệt sẽ cảnh báo “Your connection is not private” hoặc “Not secure”. Đây là cảnh báo bình thường vì Portainer chưa có SSL certificate. Click Advanced → Proceed to [IP] để tiếp tục
- Trang đăng ký admin sẽ xuất hiện. Tạo tài khoản với username admin và mật khẩu mạnh (tối thiểu 12 ký tự)
- Click Create user
- Chọn Get Started → Click vào local để quản lý Docker trên server này
Chúc mừng! Bạn đã có giao diện quản lý Docker đẹp mắt và dễ sử dụng. Từ giờ, bạn có thể quản lý tất cả containers, images và volumes thông qua giao diện web thay vì phải gõ lệnh.
![[nguyenthieutoan.com] Dashboard của Portainer hiển thị tổng quan về containers, images, volumes và networks trong Docker](https://nguyenthieutoan.com/wp-content/uploads/2025/12/nguyenthieutoan-a-vibrant-and-simplified-illustration-of-the-porta-4-ch5y4p.webp)
IV. DEPLOY N8N BẰNG PORTAINER
1. Tạo file cấu hình trên server
Quay lại cửa sổ PuTTY, bạn sẽ tạo thư mục và file cấu hình cho n8n. Chạy lệnh sau để tạo thư mục và di chuyển vào đó:
mkdir -p /opt/n8n && cd /opt/n8n
Tiếp theo, tạo file .env để chứa các biến môi trường và mật khẩu:
nano .env
Lệnh này sẽ mở trình soạn thảo văn bản nano. Bây giờ bạn cần copy toàn bộ nội dung sau và paste vào (click chuột phải để paste). Quan trọng: Bạn phải thay đổi các giá trị như domain, mật khẩu theo hướng dẫn bên dưới:
# ===========================================
# 🔧 CẤU HÌNH CƠ BẢN - BẮT BUỘC PHẢI SỬA
# ===========================================
# Domain của bạn (sửa thành domain thật)
N8N_DOMAIN=n8n.yourdomain.com
# ===========================================
# 🔐 MẬT KHẨU - TẠO MẬT KHẨU MẠNH CHO MỖI DÒNG
# ===========================================
# Mật khẩu PostgreSQL
DB_POSTGRES_PASSWORD=YOUR_POSTGRES_PASSWORD_HERE
# Mật khẩu Redis
N8N_REDIS_PASSWORD=YOUR_REDIS_PASSWORD_HERE
# Encryption Key (32 ký tự ngẫu nhiên - RẤT QUAN TRỌNG)
# Tạo tại: https://generate-random.org/string-generator?length=32
N8N_ENCRYPTION_KEY=YOUR_32_CHARACTER_RANDOM_STRING
# Mật khẩu đăng nhập n8n
N8N_BASIC_AUTH_PASSWORD=YOUR_N8N_LOGIN_PASSWORD
# ===========================================
# ⚙️ CẤU HÌNH KHÁC (KHÔNG CẦN SỬA)
# ===========================================
N8N_VERSION=latest
TIMEZONE=Asia/Ho_Chi_Minh
GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
# Database
DB_TYPE=postgresdb
DB_POSTGRES_HOST=postgres
DB_POSTGRES_PORT=5432
DB_POSTGRES_DB=n8n
DB_POSTGRES_USER=n8n
# Queue Mode
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
QUEUE_BULL_REDIS_DB=0
EXECUTIONS_MODE=queue
# n8n Configuration
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_HOST=0.0.0.0
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.yourdomain.com/
N8N_RUNNERS_ENABLED=true
N8N_RUNNERS_MODE=internal
# Execution Settings
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=336
EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000
# Payload
N8N_PAYLOAD_SIZE_MAX=134217728
# External Modules
NODE_FUNCTION_ALLOW_EXTERNAL=*
Sau khi paste xong:
- Sửa N8N_DOMAIN thành domain thật của bạn (ví dụ: n8n.mydomain.com)
- Sửa WEBHOOK_URL để khớp với domain
- Tạo mật khẩu mạnh cho DB_POSTGRES_PASSWORD, N8N_REDIS_PASSWORD và N8N_BASIC_AUTH_PASSWORD
- Truy cập https://generate-random.org/string-generator?length=32 để tạo chuỗi ngẫu nhiên 32 ký tự, copy và paste vào N8N_ENCRYPTION_KEY
Sau khi chỉnh sửa xong, nhấn Ctrl + O để lưu file, nhấn Enter để xác nhận tên file, sau đó nhấn Ctrl + X để thoát khỏi nano.
Cảnh báo quan trọng: N8N_ENCRYPTION_KEY là mã hóa cho tất cả credentials trong n8n. Nếu bạn mất key này, bạn sẽ không thể truy cập các API keys, passwords đã lưu. Hãy backup file .env này ở nơi an toàn như Google Drive hoặc email cho chính mình.
2. Tạo Docker Compose file
Tiếp theo, bạn cần tạo file docker-compose.yml để định nghĩa cấu trúc hệ thống n8n. Chạy lệnh:
nano docker-compose.yml
Copy và paste toàn bộ nội dung sau vào:
services:
postgres:
image: postgres:16-alpine
container_name: n8n-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${DB_POSTGRES_USER}
POSTGRES_PASSWORD: ${DB_POSTGRES_PASSWORD}
POSTGRES_DB: ${DB_POSTGRES_DB}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_POSTGRES_USER} -d ${DB_POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: n8n-redis
restart: unless-stopped
command: redis-server --requirepass ${N8N_REDIS_PASSWORD}
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
interval: 10s
timeout: 5s
retries: 5
n8n:
image: n8nio/n8n:${N8N_VERSION}
container_name: n8n-app
restart: unless-stopped
ports:
- "5678:5678"
environment:
- DB_TYPE=${DB_TYPE}
- DB_POSTGRESDB_HOST=${DB_POSTGRES_HOST}
- DB_POSTGRESDB_PORT=${DB_POSTGRES_PORT}
- DB_POSTGRESDB_DATABASE=${DB_POSTGRES_DB}
- DB_POSTGRESDB_USER=${DB_POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${DB_POSTGRES_PASSWORD}
- QUEUE_BULL_REDIS_HOST=${QUEUE_BULL_REDIS_HOST}
- QUEUE_BULL_REDIS_PORT=${QUEUE_BULL_REDIS_PORT}
- QUEUE_BULL_REDIS_DB=${QUEUE_BULL_REDIS_DB}
- QUEUE_BULL_REDIS_PASSWORD=${N8N_REDIS_PASSWORD}
- EXECUTIONS_MODE=${EXECUTIONS_MODE}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- N8N_HOST=${N8N_HOST}
- N8N_PORT=${N8N_PORT}
- N8N_PROTOCOL=${N8N_PROTOCOL}
- WEBHOOK_URL=${WEBHOOK_URL}
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${TIMEZONE}
- N8N_RUNNERS_ENABLED=${N8N_RUNNERS_ENABLED}
- N8N_RUNNERS_MODE=${N8N_RUNNERS_MODE}
- EXECUTIONS_DATA_PRUNE=${EXECUTIONS_DATA_PRUNE}
- EXECUTIONS_DATA_MAX_AGE=${EXECUTIONS_DATA_MAX_AGE}
- EXECUTIONS_DATA_PRUNE_MAX_COUNT=${EXECUTIONS_DATA_PRUNE_MAX_COUNT}
- N8N_PAYLOAD_SIZE_MAX=${N8N_PAYLOAD_SIZE_MAX}
- NODE_FUNCTION_ALLOW_EXTERNAL=${NODE_FUNCTION_ALLOW_EXTERNAL}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
nginx-proxy:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- "80:80"
- "81:81"
- "443:443"
volumes:
- nginx_data:/data
- nginx_letsencrypt:/etc/letsencrypt
volumes:
postgres_data:
redis_data:
n8n_data:
nginx_data:
nginx_letsencrypt:
Lưu file bằng cách nhấn Ctrl + O, Enter, sau đó Ctrl + X để thoát.
File Docker Compose này định nghĩa 4 services: PostgreSQL (database), Redis (queue), n8n (ứng dụng chính) và Nginx Proxy Manager (reverse proxy và SSL). Tất cả các services này sẽ hoạt động cùng nhau tạo thành một hệ thống n8n hoàn chỉnh.
3. Deploy trong Portainer
Bây giờ bạn sẽ sử dụng Portainer để deploy n8n thay vì chạy lệnh terminal:
- Mở Portainer tại https://[IP-VPS]:9443
- Đăng nhập bằng tài khoản admin
- Click vào Stacks ở menu bên trái
- Click Add stack
- Đặt tên stack: n8n
- Trong phần “Web editor”, copy toàn bộ nội dung file docker-compose.yml bạn vừa tạo và paste vào
- Kéo xuống phần Environment variables, click Load variables from .env file
- Quay lại PuTTY, chạy lệnh cat .env để hiển thị nội dung file .env, copy toàn bộ và paste vào Portainer
- Click Deploy the stack
Portainer sẽ bắt đầu tải images và khởi động containers. Quá trình này mất khoảng 2-3 phút. Bạn có thể theo dõi tiến trình trong phần Containers của Portainer.
Xem thêm về các bản cập nhật mới của n8n tại: n8n phiên bản 2.0.0: Bản cập nhật lớn nhất kể từ v1.0 với Autosave, Canvas mới và các Breaking Changes quan trọng
4. Cấu hình Nginx Proxy Manager
Nginx Proxy Manager sẽ giúp bạn cấu hình reverse proxy và SSL cho n8n một cách dễ dàng thông qua giao diện web. Truy cập Nginx Proxy Manager tại http://[IP-VPS]:81 và đăng nhập với thông tin mặc định:
- Email: admin@example.com
- Password: changeme
Ngay sau khi đăng nhập, hệ thống sẽ yêu cầu bạn đổi thông tin. Nhập email thật của bạn và tạo mật khẩu mới mạnh.
Tạo Proxy Host cho n8n:
1. Vào Hosts → Proxy Hosts → Add Proxy Host
2. Trong tab Details:
- Domain Names: n8n.yourdomain.com (domain thật của bạn)
- Scheme: http
- Forward Hostname / IP: n8n (tên container)
- Forward Port: 5678
- Bật Cache Assets
- Bật Block Common Exploits
- BẮT BUỘC bật Websockets Support (nếu không n8n sẽ không hoạt động đúng)
3. Trong tab SSL:
- SSL Certificate: Chọn Request a new SSL Certificate
- Bật Force SSL
- Bật HTTP/2 Support
- Email Address: Nhập email thật của bạn
- Bật I Agree to the Let’s Encrypt Terms of Service
4. Click Save
Đợi 1-2 phút để Let’s Encrypt cấp SSL certificate miễn phí. Nếu thành công, bạn sẽ thấy biểu tượng ổ khóa màu xanh bên cạnh domain.
Lưu ý quan trọng: Domain phải đã được trỏ về IP server (xem phần tiếp theo) TRƯỚC khi bạn tạo Proxy Host và request SSL. Nếu chưa, Let’s Encrypt sẽ không thể verify domain và SSL sẽ thất bại.
![[nguyenthieutoan.com] Giao diện Nginx Proxy Manager với Proxy Host đã được cấu hình SSL thành công cho n8n domain](https://nguyenthieutoan.com/wp-content/uploads/2025/12/nguyenthieutoan-a-sleek-modern-illustration-of-the-nginx-proxy-ma-5-gyliz6.webp)
V. MUA VÀ CẤU HÌNH DOMAIN
1. Tại sao cần domain cho n8n?
Domain không chỉ làm cho n8n trông chuyên nghiệp hơn, mà còn là yêu cầu kỹ thuật cho nhiều tính năng quan trọng. Webhooks từ các dịch vụ như Telegram, Facebook Messenger, Slack đều yêu cầu HTTPS URL để gọi đến, và bạn không thể sử dụng địa chỉ IP trần như http://103.45.67.89:5678. SSL/HTTPS là bắt buộc để đảm bảo bảo mật dữ liệu truyền tải, và Let’s Encrypt chỉ cấp SSL certificate miễn phí cho domain, không cấp cho địa chỉ IP.
Thêm vào đó, việc sử dụng domain như n8n.yourname.com giúp bạn dễ dàng nhớ và chia sẻ URL với team, đồng thời tạo ấn tượng chuyên nghiệp hơn nhiều so với một chuỗi số IP khó nhớ.
2. Nhà cung cấp domain Việt Nam
Bạn có thể mua domain từ các nhà cung cấp quốc tế như Namecheap, GoDaddy, hoặc chọn nhà cung cấp Việt Nam để dễ thanh toán và có support tiếng Việt. Dưới đây là các nhà cung cấp domain phổ biến tại Việt Nam:
| Nhà cung cấp | Giá .com/năm | Giá domain rẻ nhất |
|---|---|---|
| Tenten | ~230k VNĐ | từ 40k VNĐ/năm (.online, .site) |
| iNET | ~250k VNĐ | từ 45k VNĐ/năm |
| Mắt Bão | ~240k VNĐ | từ 39k VNĐ/năm |
Mẹo tiết kiệm: Các đuôi domain như .online, .site, .xyz, .click rất rẻ (chỉ 40-50k VNĐ/năm) và hoàn toàn phù hợp cho n8n cá nhân. Bạn không cần phải mua domain .com đắt tiền nếu chỉ sử dụng cho mục đích tự động hóa nội bộ.
3. Cấu hình DNS
Sau khi mua domain, bạn cần cấu hình DNS để trỏ domain về IP VPS của mình. Đây là bước quan trọng để Nginx Proxy Manager có thể request SSL certificate từ Let’s Encrypt.
Các bước cấu hình DNS:
- Đăng nhập vào trang quản lý domain của nhà cung cấp
- Tìm mục Quản lý DNS hoặc DNS Management
- Tạo A Record mới với thông tin sau:
- Type: A
- Host/Name: n8n
- Value/Points to: [IP VPS của bạn]
- TTL: 300 (hoặc để mặc định)
Ví dụ cụ thể: Nếu domain của bạn là mydomain.com và IP VPS là 103.45.67.89, sau khi tạo A Record với Host = n8n và Value = 103.45.67.89, domain n8n.mydomain.com sẽ trỏ về server của bạn.
DNS có thể mất từ 5 phút đến 24 giờ để cập nhật toàn cầu, nhưng thường chỉ dưới 1 giờ. Bạn có thể kiểm tra DNS đã hoạt động chưa bằng cách truy cập https://www.whatsmydns.net/, nhập domain của bạn và xem kết quả. Nếu hiển thị đúng IP VPS, DNS đã hoạt động.
4. Mở firewall
Để các services có thể truy cập được từ internet, bạn cần mở các ports cần thiết trong firewall. Quay lại PuTTY và chạy lệnh sau:
ufw allow 22 && ufw allow 80 && ufw allow 81 && ufw allow 443 && ufw allow 9443 && ufw --force enable
Giải thích các ports:
- Port 22: SSH – để bạn có thể kết nối PuTTY
- Port 80: HTTP – tự động chuyển hướng sang HTTPS
- Port 81: Nginx Proxy Manager web UI
- Port 443: HTTPS – n8n và các services với SSL
- Port 9443: Portainer web UI
Lệnh này sẽ mở tất cả ports cần thiết và kích hoạt firewall. Firewall sẽ tự động khởi động lại mỗi khi server reboot.
VI. TRUY CẬP VÀ QUẢN LÝ N8N
1. Đăng nhập lần đầu
Sau khi hoàn tất tất cả các bước trên và đợi DNS cập nhật, bạn đã sẵn sàng truy cập n8n của mình:
- Mở trình duyệt web
- Truy cập: https://n8n.yourdomain.com (thay bằng domain thật của bạn)
- Trình duyệt sẽ hiển thị hộp thoại đăng nhập Basic Auth
- Đăng nhập với:
- Username: admin
- Password: Mật khẩu bạn đã đặt trong N8N_BASIC_AUTH_PASSWORD
Chúc mừng! Bạn đã triển khai thành công n8n self-hosted. Bây giờ bạn có thể bắt đầu tạo workflows, kết nối các services và tự động hóa công việc của mình.
![[nguyenthieutoan.com] Dashboard của n8n sau khi đăng nhập lần đầu tiên với giao diện sạch sẽ và nút Create workflow](https://nguyenthieutoan.com/wp-content/uploads/2025/12/nguyenthieutoan-a-welcoming-and-clean-illustration-of-the-n8n-dash-6-6ts29x.webp)
Xem thêm các workflow n8n thực tế tại: [Share n8n Workflow] Tạo Facebook Chatbot thông minh hơn với Gemini AI, n8n Data Table và kỹ thuật Gộp tin nhắn
2. Các lệnh quản lý thường dùng
Bạn có thể quản lý n8n thông qua Portainer (giao diện đồ họa) hoặc terminal (PuTTY). Portainer khuyến nghị cho người mới vì dễ sử dụng hơn.
Quản lý qua Portainer (Khuyến nghị)
- Khởi động lại n8n: Containers → n8n-app → Click Restart
- Xem logs: Containers → n8n-app → Click Logs
- Dừng n8n: Stacks → n8n → Click Stop
- Cập nhật n8n: Stacks → n8n → Click Pull and redeploy
Quản lý qua Terminal (PuTTY)
Nếu bạn muốn sử dụng lệnh terminal, hãy cd vào thư mục n8n trước:
cd /opt/n8n
Các lệnh quản lý:
# Xem logs theo thời gian thực
docker compose logs -f n8n
# Khởi động lại n8n
docker compose restart
# Cập nhật lên phiên bản mới
docker compose pull && docker compose up -d
# Dừng tất cả services
docker compose down
# Khởi động lại tất cả services
docker compose up -d
3. Backup quan trọng
Backup là bước cực kỳ quan trọng để bảo vệ dữ liệu workflows và credentials của bạn. Có 3 thứ bạn cần backup định kỳ:
- File .env: Chứa encryption key và các mật khẩu
- Database PostgreSQL: Chứa tất cả workflows và credentials
- n8n data folder: Chứa các cấu hình bổ sung
Lệnh backup nhanh:
cd /opt/n8n
mkdir -p backups
# Backup PostgreSQL database
docker exec n8n-postgres pg_dump -U n8n n8n > backups/n8n-db-$(date +%Y%m%d).sql
# Backup .env file
cp .env backups/.env-$(date +%Y%m%d)
Cảnh báo nghiêm trọng: Nếu bạn mất N8N_ENCRYPTION_KEY, bạn sẽ KHÔNG THỂ truy cập các credentials đã lưu trong n8n, bao gồm API keys, passwords của các services. Không có cách nào phục hồi nếu mất key này. Hãy backup file .env ở ít nhất 2 nơi khác nhau (Google Drive, Dropbox, email cho chính mình…).
Khuyến nghị của mình là bạn nên tạo cronjob để tự động backup database hàng ngày. Điều này đảm bảo bạn luôn có bản backup mới nhất trong trường hợp xảy ra sự cố.
VII. XỬ LÝ LỖI VÀ TỐI ƯU
1. Xử lý lỗi thường gặp
Dưới đây là bảng tổng hợp các lỗi phổ biến và cách khắc phục:
| Lỗi | Nguyên nhân | Cách sửa |
|---|---|---|
| Không truy cập được https://IP:9443 | Firewall chặn port | Chạy: ufw allow 9443 |
| Không truy cập được http://IP:81 | Firewall chặn port | Chạy: ufw allow 81 |
| SSL không hoạt động trong NPM | DNS chưa cập nhật | Đợi DNS propagate, kiểm tra A Record |
| NPM báo “Internal Error” khi tạo SSL | Domain chưa trỏ đúng | Kiểm tra: nslookup n8n.yourdomain.com |
| Container không start | Sai cấu hình env | Kiểm tra logs trong Portainer |
| n8n báo “Encryption key error” | Sai hoặc thiếu encryption key | Kiểm tra N8N_ENCRYPTION_KEY trong .env |
| n8n không load (trang trắng) | Thiếu Websockets Support | Bật Websockets Support trong NPM Proxy Host |
Nếu bạn gặp lỗi không có trong bảng trên, hãy kiểm tra logs của containers trong Portainer. Logs thường cung cấp thông tin chi tiết về nguyên nhân lỗi và cách khắc phục.
2. Giải thích các biến môi trường quan trọng
Hiểu rõ các biến môi trường giúp bạn tùy chỉnh n8n phù hợp với nhu cầu:
| Biến | Giải thích |
|---|---|
DB_TYPE=postgresdb |
Sử dụng PostgreSQL thay vì SQLite – ổn định hơn cho production |
EXECUTIONS_MODE=queue |
Chạy workflows qua Redis queue – hiệu suất tốt hơn và xử lý đồng thời nhiều workflows |
N8N_ENCRYPTION_KEY |
Mã hóa tất cả credentials – MẤT KEY = MẤT DỮ LIỆU |
N8N_RUNNERS_ENABLED=true |
Cho phép chạy code trong sandbox an toàn |
EXECUTIONS_DATA_PRUNE=true |
Tự động xóa lịch sử execution cũ để tiết kiệm dung lượng database |
EXECUTIONS_DATA_MAX_AGE=336 |
Giữ lịch sử execution trong 336 giờ (14 ngày) |
N8N_PAYLOAD_SIZE_MAX=134217728 |
Cho phép payload lên đến 128MB – hữu ích khi xử lý files lớn |
WEBHOOK_URL |
URL đầy đủ cho webhooks – quan trọng cho tích hợp bên ngoài |
Bạn có thể tùy chỉnh các giá trị này trong file .env nếu cần. Sau khi sửa, nhớ restart n8n bằng Portainer hoặc lệnh docker compose restart.
3. Tổng chi phí ước tính
Dưới đây là tổng chi phí bạn cần bỏ ra để vận hành n8n self-hosted:
| Hạng mục | Chi phí |
|---|---|
| VPS (Contabo/Hetzner) | ~135k – 400k VNĐ/tháng |
| Domain (.online, .site) | ~40k – 250k VNĐ/năm |
| Tổng năm đầu tiên | từ 1.7 triệu VNĐ/năm |
So sánh với n8n Cloud: n8n Cloud gói starter có giá ~$20/tháng = 6.5 triệu VNĐ/năm. Self-hosting giúp bạn tiết kiệm được khoảng 75% chi phí, đồng thời có toàn quyền kiểm soát server và không bị giới hạn về số lượng workflows hay executions.
Nếu bạn đang chạy nhiều workflows hoặc có nhu cầu tự động hóa quy mô lớn, việc self-host sẽ tiết kiệm được một khoản chi phí đáng kể trong dài hạn.
![[nguyenthieutoan.com] Biểu đồ so sánh chi phí giữa n8n self-hosted và n8n Cloud cho thấy self-host tiết kiệm đến 75% chi phí hàng năm](https://nguyenthieutoan.com/wp-content/uploads/2025/12/nguyenthieutoan-a-dynamic-and-visually-striking-infographic-possi-7-1y0xev.webp)
VIII. CHECKLIST HOÀN CHỈNH
Để đảm bảo bạn không bỏ sót bước nào, hãy sử dụng checklist sau:
1. Chuẩn bị
- ☐ Thẻ Visa/Mastercard hoặc tài khoản ngân hàng để thanh toán VPS và domain
- ☐ Email để đăng ký và nhận thông tin VPS, domain
- ☐ Đã đọc kỹ hướng dẫn trước khi bắt đầu
2. Các bước thực hiện
- ☐ Bước 1: Mua VPS Ubuntu 24.04 → Lưu lại IP, username (root), password
- ☐ Bước 2: Tải và cài PuTTY
- ☐ Bước 3: SSH vào server bằng PuTTY
- ☐ Bước 4: Cài Docker:
apt update && apt upgrade -yrồi chạy các lệnh Docker - ☐ Bước 5: Cài Portainer → Truy cập
https://IP:9443và tạo tài khoản - ☐ Bước 6: Mua domain (Tenten/iNET/Mắt Bão) → Tạo A Record trỏ về IP VPS
- ☐ Bước 7: Tạo file .env với các mật khẩu mạnh và encryption key
- ☐ Bước 8: Tạo file docker-compose.yml
- ☐ Bước 9: Deploy Stack trong Portainer với file docker-compose.yml và env variables
- ☐ Bước 10: Mở firewall:
ufw allow 22 && ufw allow 80 && ufw allow 81 && ufw allow 443 && ufw allow 9443 && ufw --force enable - ☐ Bước 11: Cấu hình Nginx Proxy Manager tại
http://IP:81– Tạo Proxy Host và request SSL - ☐ Bước 12: Truy cập
https://n8n.yourdomain.comvà đăng nhập
3. Sau khi hoàn thành
- ☐ Backup file .env ở nơi an toàn (Google Drive, email cho chính mình…)
- ☐ Test tạo một workflow đơn giản để đảm bảo n8n hoạt động bình thường
- ☐ Test webhook nếu bạn có kế hoạch sử dụng webhooks từ các services bên ngoài
- ☐ Thiết lập cronjob để backup database định kỳ (khuyến nghị hàng ngày)
Nếu bạn đã hoàn thành tất cả các bước trong checklist, xin chúc mừng! Bạn đã có một hệ thống n8n self-hosted hoàn chỉnh, chạy 24/7 với SSL/HTTPS, sẵn sàng phục vụ nhu cầu tự động hóa của bạn.
KẾT LUẬN
Việc tự host n8n tuy có vẻ phức tạp nhưng thực chất rất đơn giản nếu bạn làm theo từng bước trong hướng dẫn này. Với chi phí chỉ khoảng 1.7 triệu VNĐ/năm (tiết kiệm 75% so với n8n Cloud), bạn có được một hệ thống tự động hóa mạnh mẽ, không giới hạn workflows và executions, đồng thời có toàn quyền kiểm soát dữ liệu và cấu hình.
Hệ thống n8n self-hosted này có thể phục vụ bạn trong nhiều năm với hiệu suất ổn định. Bạn có thể tích hợp với hàng trăm services, xây dựng các workflows phức tạp, và mở rộng hệ thống khi cần thiết mà không lo về chi phí tăng đột biến như khi sử dụng cloud services. Thêm vào đó, với Queue Mode, PostgreSQL và Redis, hệ thống của bạn có khả năng xử lý hàng trăm workflows đồng thời mà vẫn đảm bảo hiệu suất cao.
Xem thêm về các công cụ và hướng dẫn liên quan tại:
- Giải đáp các câu hỏi về n8n – nền tảng tự động hóa lớn nhất toàn cầu – Từ n8n Verified Creator
- Hướng dẫn toàn tập AI Agent trong n8n: Chọn model, thiết lập prompt, các lưu ý để workflow hoạt động chính xác
- Make vs n8n vs Google Apps Script: Nên chọn ‘vũ khí’ tự động hóa nào cho nhu cầu của bạn?
Nếu bạn gặp khó khăn trong quá trình triển khai hoặc cần hỗ trợ về automation và AI chatbot cho doanh nghiệp, đừng ngần ngại liên hệ với GenStaff – công ty chuyên cung cấp giải pháp tự động hóa và “nhân viên AI” tại Việt Nam. Chúng mình đã giúp hơn 100 doanh nghiệp triển khai thành công các hệ thống automation và AI chatbot.
Nếu hướng dẫn này hữu ích với bạn, hãy chia sẻ cho những người có nhu cầu tự host n8n. Bạn cũng có thể đăng ký nhận thông báo bài viết mới từ nguyenthieutoan.com ở phần dưới để không bỏ lỡ các hướng dẫn và bài viết về AI, Automation và Marketing trong tương lai.
