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:
👉 Cách self-host n8n trên Hostinger VPS bằng template (cho người mới)
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
- Cài Docker và Docker Compose
- Chuẩn bị thư mục dữ liệu cho n8n
- Tạo file Docker Compose cho n8n
- Khởi chạy container n8n
- Bảo mật n8n bằng SSL và NGINX reverse proxy
- Truy cập n8n
- Chỉnh environment variables
- 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):
👉 Mua Hostinger VPS để self-host n8n
(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.

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

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 yourUser và yourPassword 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

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:
- Đăng nhập vào Hostinger hPanel
- Vào VPS
- Chọn VPS bạn đang dùng → Manage
- Vào tab Overview
- Kéo xuống mục VPS details
- Sao chép địa chỉ IPv4

👉 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;
}

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.

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

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.
🔗 Xem khóa học n8n Automation (Early Access)
Sau khi self-host xong, nên làm gì tiếp?
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
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).
🔗 Xem chi tiết khóa học tại đây
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.
