Cách self-host n8n bằng Docker (hướng dẫn chi tiết từng bước)

Self-host n8n bằng Docker là một cách self-host hiệu quả và ổn định. Thay vì cài n8n trực tiếp lên VPS, Docker cung cấp một môi trường container hóa, giúp cách ly n8n khỏi hệ thống chính, dễ nâng cấp/hạ phiên bản và dễ di chuyển sang server khác khi cần.

Trong bài này, bạn sẽ học cách chạy n8n bằng Docker và Docker Compose, bao gồm các bước: cài đặt, cấu hình, bảo mật bằng SSL + NGINX, chỉnh biến môi trường và cập nhật n8n.

💡 Nếu bạn là người mới và muốn cài n8n nhanh nhất, ít rủi ro nhất, bạn có thể tham khảo hướng dẫn self-host n8n bằng VPS template của mình tại đây:

Phương án này không cần Docker, không cần terminal, phù hợp nếu bạn chỉ muốn n8n chạy ổn định càng sớm càng tốt.

Còn nếu bạn muốn cài đặt n8n với docker, hãy xem tiếp các bước bên dưới.


Cách self-host n8n với Docker

Tổng quan các bước

  1. Cài Docker và Docker Compose
  2. Chuẩn bị thư mục dữ liệu cho n8n
  3. Tạo file Docker Compose cho n8n
  4. Khởi chạy container n8n
  5. Bảo mật n8n bằng SSL và NGINX reverse proxy
  6. Truy cập n8n
  7. Chỉnh environment variables
  8. Cập nhật n8n lên phiên bản mới nhất

Nếu bạn chưa có VPS để self-host n8n, mình khuyến nghị dùng Hostinger VPS vì:

  • Docker được cài sẵn
  • Giá rẻ, ổn định
  • Dễ scale khi workflow nhiều lên

Bạn có thể mua Hostinger VPS tại đây (link referral của mình):

(Link trên là referral link — bạn được giảm 20% nếu mua trực tiếp từ link trên)

Cài Docker và Docker Compose

Trước tiên, bạn cần đảm bảo Docker đã được cài trên VPS.

Từ Docker phiên bản 20.10 trở lên, Docker Compose đã được tích hợp sẵn dưới dạng plugin, nên bạn không cần cài riêng.

Kiểm tra Docker bằng lệnh sau trong terminal:

docker -v

Nếu Docker đã được cài, terminal sẽ hiển thị phiên bản Docker.

docker-version

Chuẩn bị thư mục dữ liệu cho n8n

Tiếp theo, tạo thư mục để lưu dữ liệu và cấu hình của n8n.

Tạo thư mục chính và di chuyển vào thư mục đó:

mkdir ~/n8n &&cd ~/n8n

Tạo thư mục con có tên n8n_data để lưu dữ liệu n8n:

mkdir n8n_data

Thiết lập quyền sở hữu đúng cho thư mục dữ liệu (bắt buộc khi chạy n8n với Docker):

sudochown -R 1000:1000 n8n_data
Image Not Found

Tạo Docker Compose file cho n8n

Tạo file cấu hình Docker Compose:

sudo nano docker-compose.yml

Dán nội dung sau (thay yourUseryourPassword theo ý bạn):

services:
n8n:
image:n8nio/n8n
ports:
-"5678:5678"
environment:
-N8N_BASIC_AUTH_ACTIVE=true
-N8N_BASIC_AUTH_USER=yourUser
-N8N_BASIC_AUTH_PASSWORD=yourPassword
volumes:
-./n8n_data:/home/node/.n8n
docker-compose

Lưu file bằng Ctrl + X → Y → Enter.

Khởi chạy container n8n

Chạy lệnh sau để start container:

docker compose up -d

Sau khi container chạy xong, truy cập n8n bằng trình duyệt:

http://your_vps_ip:5678

Thay your_vps_ip bằng địa chỉ IP thực tế của VPS.

Cách xem địa chỉ IP VPS trong Hostinger (hPanel)

Nếu bạn dùng Hostinger VPS, bạn có thể tìm IP server theo các bước sau:

  1. Đăng nhập vào Hostinger hPanel
  2. Vào VPS
  3. Chọn VPS bạn đang dùng → Manage
  4. Vào tab Overview
  5. Kéo xuống mục VPS details
  6. Sao chép địa chỉ IPv4
ip4-vps-hostinger

👉 IP này chính là your_vps_ip dùng để truy cập:

http://your_vps_ip:5678

⚠️ Nếu trình duyệt hiển thị lỗi secure cookie error, điều này là bình thường — n8n vẫn đang chạy. Lỗi này sẽ được xử lý sau khi bạn cấu hình SSL và NGINX reverse proxy ở bước tiếp theo.

Bảo mật n8n bằng SSL và NGINX reverse proxy

Cài NGINX

sudo apt install nginx -y
sudo systemctl stop nginx

Cài Certbot

sudo apt install certbot -y

Lấy SSL certificate (thay yourdomain.tld bằng domain của bạn):

sudo certbot certonly --standalone -d yourdomain.tld

Khởi động lại NGINX:

sudo systemctl start nginx

Cấu hình NGINX cho n8n

Tạo file cấu hình:

sudo nano /etc/nginx/sites-available/n8n

Dán cấu hình sau:

server {
listen 443 ssl;
server_name yourdomain.tld;

ssl_certificate /etc/letsencrypt/live/yourdomain.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.tld/privkey.pem;

location / {
proxy_pass <http://localhost:5678>;
proxy_set_header Host$host;
proxy_set_header X-Real-IP$remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto$scheme;
    }
}

server {
listen80;
server_name yourdomain.tld;
return301 https://$host$request_uri;
}
nginx-config

Sau khi lưu và thoát khỏi bảng editor trên, kích hoạt cấu hình:

sudoln -sf /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/n8n

Test và reload NGINX:

sudo nginx -t
sudo systemctl reload nginx

Truy cập n8n

Truy cập vào máy chủ n8n của bạn bằng tên miền hoặc hostname mà bạn đã cấu hình trước đó.:

<https://yourdomain.tld>

Bạn sẽ thấy màn hình đăng ký owner account của n8n. Sau khi tạo tài khoản, bạn có thể bắt đầu build workflow.

n8n-registration-page

Nếu bạn không muốn tự xây workflow từ con số 0, bạn có thể:

  • Import workflow template có sẵn
  • Tham khảo các workflow n8n mình đã build sẵn để dùng ngay: 👉 Thư viện workflow n8n

Chỉnh environment variables cho n8n

Khi quản lý phiên bản n8n của bạn, bạn có thể cần sửa đổi các biến môi trường để thiết lập kết nối cơ sở dữ liệu, bật xác thực, tích hợp các dịch vụ của bên thứ ba hoặc tăng cường bảo mật.

Mở lại file Docker Compose:

sudo nano docker-compose.yml

Thêm các biến sau vào phần environment:

-N8N_ENCRYPTION_KEY=yourStrongRandomString
-N8N_HOST=yourdomain.tld
-N8N_PORT=5678
-N8N_PROTOCOL=https
-WEBHOOK_URL=https://yourdomain.tld
-TZ=UTC

Khi self-host n8n bằng Docker, bạn cần cấu hình một số environment variables để đảm bảo hệ thống hoạt động đúng, an toàn và ổn định — đặc biệt khi chạy sau reverse proxy (NGINX) và HTTPS.

🔐 N8N_ENCRYPTION_KEY

N8N_ENCRYPTION_KEY=yourStrongRandomString
  • Dùng để mã hóa credentials (API keys, tokens…) trong database của n8n.
  • Nếu không set, n8n sẽ tự sinh key tạm thời → rủi ro mất dữ liệu khi restart container.
  • Khuyến nghị: dùng một chuỗi ngẫu nhiên dài (32+ ký tự), chỉ set 1 lần và không thay đổi.

🌐 N8N_HOST

N8N_HOST=yourdomain.tld
  • Domain hoặc hostname public của n8n.
  • Dùng để n8n tạo link chính xác cho webhook, OAuth callback, internal URL.
  • Bắt buộc khi chạy sau reverse proxy hoặc HTTPS.

🔌 N8N_PORT

N8N_PORT=5678
  • Port nội bộ mà n8n lắng nghe trong container.
  • Thường không đổi, vì n8n mặc định dùng 5678.

🔒 N8N_PROTOCOL

N8N_PROTOCOL=https
  • Khai báo protocol public của n8n.
  • Nếu dùng HTTPS qua NGINX → bắt buộc set là https.
  • Nếu không set đúng, webhook và OAuth rất dễ lỗi.

🔁 WEBHOOK_URL

WEBHOOK_URL=https://yourdomain.tld
  • URL public dùng cho tất cả webhook của n8n.
  • Rất quan trọng với:
    • Webhook Trigger
    • Third-party services (Zalo, Telegram, Meta, v.v.)
  • Nên trùng với domain + protocol đã cấu hình SSL.

🕒 TZ

TZ=UTC
  • Timezone của n8n.
  • Ảnh hưởng đến:
    • Cron Trigger
    • Schedule Trigger
    • Log timestamp
  • Nếu bạn ở Việt Nam, có thể dùng:
TZ=Asia/Ho_Chi_Minh

Sau khi chọn xong các biến environment variables, khởi động lại container:

docker compose down
docker compose up -d

Cập nhật n8n lên phiên bản mới nhất

Pull image mới:

docker pull n8nio/n8n

Chạy lại container:

docker compose up -d

update-n8n

Best practices khi chạy n8n với Docker

  • Luôn mount volume để không mất dữ liệu
  • Luôn bật authentication
  • Luôn chạy HTTPS
  • Backup thư mục n8n_data định kỳ
  • Theo dõi log khi có lỗi:
docker compose logs n8n

Lưu ý quan trọng

Việc self-host n8n bằng Docker giúp bạn có một hệ thống ổn định và an toàn.
Tuy nhiên, phần khó nhất thường không nằm ở kỹ thuật setup, mà là:
– Tư duy thiết kế workflow
– Cách chia nhỏ logic automation
– Cách build workflow áp dụng cho marketing, sales và vận hành thực tế

Nếu bạn muốn học cách tư duy và tự build workflow n8n từ đầu (không chỉ import và chỉnh sửa), mình đang mở Early Access cho khóa học n8n Automation thực chiến.

Sau khi self-host xong, nên làm gì tiếp?

Bạn có thể:

Hoặc nếu bạn muốn hiểu cách tư duy, thiết kế và tự build workflow n8n cho công việc thực tế, bạn có thể xem khóa học n8n Automation thực chiến (Early Access).

Kết luận

Docker là cách ổn định, linh hoạt và an toàn để self-host n8n lâu dài, đặc biệt nếu bạn chạy automation cho công việc thật.

Giỏ hàng