n8n là công cụ tự động hóa mã nguồn mở đang rất được ưa chuộng, cho phép bạn nối hàng trăm ứng dụng như Gmail, Telegram, Google Sheets, database… thành các workflow tự động mà không cần viết nhiều code. Thay vì trả phí cho bản cloud, bạn hoàn toàn có thể tự host n8n trên VPS của mình để chủ động dữ liệu và tiết kiệm chi phí.
Trong bài viết này, Hoidapwp sẽ hướng dẫn bạn cài đặt n8n trên VPS Ubuntu/Debian bằng Docker, kết hợp database PostgreSQL và dùng webserver Caddy làm reverse proxy. Điểm cộng lớn nhất của Caddy là cấu hình cực kỳ đơn giản và tự động cài SSL miễn phí (Let’s Encrypt) cho domain — rất hợp với những bạn chưa rành về Nginx.
Chuẩn bị trước khi bắt đầu:
- Một VPS chạy Ubuntu 22.04/24.04 hoặc Debian 11/12, có quyền root (hoặc user có sudo).
- Một subdomain (ví dụ
n8n.domain.com) đã trỏ bản ghi A về IP của VPS.
Bước 1 – Cập nhật hệ điều hành
Dù cài gì lên VPS, việc đầu tiên luôn là update hệ điều hành để vá lỗ hổng bảo mật và cập nhật các thư viện mới nhất, tránh lỗi vặt trong quá trình cài đặt:
apt -y update && apt -y upgrade
Bước 2 – Cài đặt Docker
Cài Docker nhanh bằng script chính thức của Docker:
curl -sSL "https://get.docker.com/" | bash
Sau khi cài xong, kiểm tra bằng hai lệnh docker --version và docker compose version. Nếu cả hai đều hiện số phiên bản thì Docker đã sẵn sàng.

Bước 3 – Triển khai n8n và PostgreSQL bằng Docker Compose
3.1. Tạo thư mục làm việc và file .env
Tạo thư mục chứa file cấu hình:
mkdir n8n cd n8n
Tạo file .env để khai báo thông tin domain và mật khẩu:
nano .env
Nhập nội dung sau (nhớ thay domain.com bằng domain thật của bạn):
SUBDOMAIN=n8n DOMAIN_NAME=domain.com GENERIC_TIMEZONE=Asia/Ho_Chi_Minh POSTGRES_PASSWORD=N8N_RUNNERS_ENABLED=true N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
Lưu ý: POSTGRES_PASSWORD là mật khẩu của database PostgreSQL. Bạn nên đặt mật khẩu mạnh, dài khoảng 16 ký tự gồm chữ hoa, chữ thường và số — có thể dùng công cụ tạo mật khẩu ngẫu nhiên.
3.2. Tạo file docker-compose.yml
Tạo file cấu hình Docker Compose:
nano docker-compose.yml
Dán nội dung sau vào file:
services:
postgres:
image: postgres:16
container_name: n8n-postgres
restart: always
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: n8n
TZ: ${GENERIC_TIMEZONE}
volumes:
- /root/n8n/postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 10s
timeout: 5s
retries: 5
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n-n8n
restart: always
depends_on:
postgres:
condition: service_healthy
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: ${SUBDOMAIN}.${DOMAIN_NAME}
N8N_PROTOCOL: https
WEBHOOK_URL: https://${SUBDOMAIN}.${DOMAIN_NAME}
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
NODE_ENV: production
N8N_RUNNERS_ENABLED: ${N8N_RUNNERS_ENABLED}
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: ${N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS}
volumes:
- /root/n8n/n8n_data:/home/node/.n8n
ports:
- "5678:5678"
Giải thích nhanh: file này tạo 2 container — postgres (PostgreSQL 16, lưu dữ liệu vào /root/n8n/postgres_data, có healthcheck để đảm bảo database sẵn sàng trước khi n8n khởi động) và n8n (bản mới nhất, chạy ở port 5678, timezone Asia/Ho_Chi_Minh). Dữ liệu n8n được lưu bền vững vào /root/n8n/n8n_data nên không sợ mất workflow khi restart container.
3.3. Tạo thư mục dữ liệu và khởi chạy
mkdir -p /root/n8n/n8n_data chown -R 1000:1000 /root/n8n/n8n_data chmod 700 /root/n8n/n8n_data
Các lệnh trên gán đúng quyền cho user node (UID 1000) bên trong container n8n, tránh lỗi permission denied khi n8n ghi dữ liệu.
Khởi chạy toàn bộ stack:
docker compose up -d
Chờ 1–2 phút rồi kiểm tra bằng docker ps — nếu thấy 2 container n8n-n8n và n8n-postgres đang chạy là thành công.
Bước 4 – Cài đặt và cấu hình Caddy
Lúc này n8n mới chỉ chạy ở port 5678 trên localhost. Ta dùng Caddy làm reverse proxy để truy cập qua domain với HTTPS.
4.1. Cài đặt Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy systemctl enable caddy --now

4.2. Cấu hình reverse proxy cho n8n
Mở file cấu hình của Caddy:
nano /etc/caddy/Caddyfile
Thêm vào cuối file (thay n8n.domain.com bằng subdomain thật của bạn):
n8n.domain.com {
reverse_proxy 127.0.0.1:5678
}
Chỉ với vài dòng như vậy, Caddy đã hiểu: mọi request tới subdomain sẽ được chuyển tiếp vào n8n đang chạy ở port 5678.
4.3. Kiểm tra và áp dụng cấu hình
caddy validate --config /etc/caddy/Caddyfile systemctl reload caddy
Nếu lệnh validate không báo lỗi, Caddy sẽ tự động xin chứng chỉ SSL miễn phí (Let’s Encrypt) cho subdomain trong vài phút. Sau đó bạn chỉ cần truy cập https://n8n.domain.com để tạo tài khoản admin và bắt đầu dùng n8n.
Một số lưu ý khi vận hành n8n
Bảo mật
Đặt mật khẩu database và tài khoản n8n thật mạnh. Nên bật firewall (UFW) và chỉ mở các port cần thiết 22, 80, 443.
Backup định kỳ
Backup hai thư mục /root/n8n/n8n_data và /root/n8n/postgres_data thường xuyên để không mất workflow khi VPS gặp sự cố.
Cập nhật phiên bản mới
Thỉnh thoảng chạy docker compose pull && docker compose up -d trong thư mục n8n để lên phiên bản n8n mới nhất với các tính năng và bản vá bảo mật.
Chúc bạn cài đặt thành công và xây dựng được những workflow tự động hóa thật hiệu quả!
👉 Cần VPS để thực hành? Đăng ký VPS BNIX tại đây: https://my.bnix.one/aff.php?aff=82
🏢 Chuyên thiết kế web cho doanh nghiệp và cá nhân
🤖 Giải pháp tự động hóa cho Doanh nghiệp và cá nhân
📞 0925045760 → https://zalo.me/0925045760
🌐 thietkewebdian.com → https://thietkewebdian.com
