Cho n8n chạy dưới domain riêng với SSL Let's Encrypt và Nginx

Vừa cài xong n8n trên VPS bằng Docker Compose, bạn truy cập bằng http://<IP_VPS>:5678 và thấy nó chạy ngon lành. Nhưng để dùng thực tế, tự động hóa quy trình làm việc, gọi Webhook từ bên ngoài, hoặc cho client dùng, bạn cần một domain riêng với HTTPS. Trình duyệt hiện đại chặn Webhook từ trang HTTP, và gửi credential qua kết nối không mã hóa là rủi ro bảo mật. Bài này hướng dẫn bạn đưa n8n ra domain riêng, gắn SSL Let's Encrypt tự động qua Nginx reverse proxy, bao gồm WebSocket và redirect HTTPS, trên Ubuntu 24.04 LTS.
Yêu cầu trước khi bắt đầu
- VPS đang chạy Ubuntu 24.04 LTS, đã cài Docker và Docker Compose (hoặc đã có n8n chạy bằng Docker Compose). Nếu chưa có, bạn có thể thuê một VPS Linux với cấu hình phù hợp, chẳng hạn gói VNLite 1 vCPU / 2 GB RAM / 20 GB NVMe từ các nhà cung cấp trong nước.
- Domain đã trỏ bản ghi A tới địa chỉ IPv4 của VPS. Ví dụ:
n8n.example.com. - User sudo (không dùng root trực tiếp, dùng
sudocho mọi lệnh cần quyền). - Port 80 (HTTP) và 443 (HTTPS) đã mở trên firewall của VPS trước khi bắt đầu, nếu không, Certbot sẽ thất bại khi xác thực domain.
Vì sao không chạy n8n kiểu HTTP thuần?
n8n yêu cầu HTTPS để các tính năng như Webhook hoạt động đúng trên môi trường production. Trình duyệt chặn navigator.mediaDevices và một số API trên trang HTTP. Thêm vào đó, nếu bạn dùng n8n để kết nối với các service bên ngoài (Slack, Google Sheets, v.v.), credential được trao đổi qua kết nối mã hóa là bắt buộc. Let's Encrypt cung cấp chứng chỉ SSL miễn phí, tự động gia hạn, tích hợp liền với Nginx qua Certbot.
Bước 1 - Cài đặt Nginx và Certbot
Nếu VPS của bạn chưa có Nginx, cài đặt trước:
sudo apt update
sudo apt install nginx certbot python3-certbot-nginx -y
Sau khi cài, kiểm tra Nginx đã chạy chưa:
sudo systemctl status nginx
Bạn sẽ thấy output tương tự ● nginx.service - A high performance web server and a reverse proxy server kèm dòng Active: active (running). Nếu chưa chạy, khởi động ngay:
sudo systemctl enable --now nginx
Bước 2 - Cấu hình Nginx reverse proxy cho n8n
Tạo file cấu hình Nginx cho n8n. File này sẽ đóng vai trò reverse proxy, chuyển tiếp request từ domain tới n8n đang chạy trên localhost:5678. Quan trọng: n8n dùng WebSocket cho real-time event (ví dụ: workflow execution stream), nên cần thêm header Upgrade và Connection.
sudo nano /etc/nginx/sites-available/n8n
Dán nội dung sau. Thay n8n.example.com bằng domain thật của bạn:
server {
listen 80;
server_name n8n.example.com;
location / {
proxy_pass http://localhost:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
}
Giải thích các header quan trọng:
proxy_set_header UpgradevàConnection "upgrade": cho phép Nginx chuyển tiếp WebSocket giữa client và n8n. Nếu thiếu, các workflow có Webhook sẽ bị lỗi 426 Upgrade Required.proxy_set_header Host $host: giữ nguyên hostname gốc, để n8n biết request đến từ domain đã cấu hình.proxy_set_header X-Forwarded-ForvàX-Real-IP: ghi lại IP thật của client. Dùng khi bạn cần log hoặc rate limit.X-Forwarded-ProtovàX-Forwarded-Host/Port: báo cho n8n biết giao thức và cổng gốc, giúp n8n tạo đúng URL redirect khi cần.
Kích hoạt site và kiểm tra cú pháp:
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
Nếu output hiện syntax is ok và test is successful, reload Nginx để áp dụng:
sudo systemctl reload nginx
VERIFY: Trỏ trình duyệt tới http://n8n.example.com, bạn sẽ thấy giao diện đăng nhập n8n. Nếu thấy lỗi 502 Bad Gateway, kiểm tra n8n đang chạy chưa (docker ps hoặc sudo systemctl status n8n nếu bạn không dùng Docker).
Bước 3 - Cài SSL Let's Encrypt tự động bằng Certbot
Certbot sẽ tự động lấy chứng chỉ và cập nhật file cấu hình Nginx. Chạy lệnh dưới, thay domain của bạn:
sudo certbot --nginx -d n8n.example.com
Quá trình sẽ hỏi email (để thông báo hết hạn), đồng ý điều khoản, và chọn có redirect HTTP → HTTPS hay không. Nhấn 2 để bật tự động redirect.
Sau khi hoàn tất, Certbot sẽ thêm block server cho HTTPS và cấu hình redirect vào file /etc/nginx/sites-available/n8n. File của bạn sẽ có thêm phần listen 443 ssl; và các dòng ssl_certificate.
Kiểm tra chứng chỉ vừa tạo:
sudo certbot certificates
Bạn sẽ thấy domain của mình với ngày hết hạn, ví dụ Expiry Date: 2026-05-15. Certbot tự động cài cron/timer cho gia hạn, bạn không cần làm gì thêm.
VERIFY trình duyệt: Truy cập https://n8n.example.com, thấy ổ khóa xanh và giao diện n8n. Truy cập http://n8n.example.com, tự động redirect sang HTTPS.
Bước 4 - Cấu hình n8n để nhận diện đúng domain (optional nhưng nên làm)
n8n cần biết domain thật để tạo URL chính xác trong Webhook, email, và các liên kết nội bộ. Dùng biến môi trường N8N_HOST và N8N_PROTOCOL.
Nếu bạn chạy n8n bằng Docker Compose, sửa file docker-compose.yml của n8n, thêm vào phần environment:
environment:
- N8N_HOST=n8n.example.com
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.example.com
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168
Giải thích: WEBHOOK_URL công khai là HTTPS để n8n gửi Webhook ra ngoài đúng domain bảo mật. EXECUTIONS_DATA_PRUNE và MAX_AGE giúp tự động dọn dẹp dữ liệu chạy cũ sau 7 ngày, tránh đầy ổ.
Restart container:
docker compose down && docker compose up -d
VERIFY: Vào n8n, tạo một workflow mới, thêm node Webhook. URL Webhook sẽ hiện https://n8n.example.com/webhook/… thay vì http://localhost:5678.
Bước 5 - Tăng cường bảo mật Nginx cho n8n
Thêm vài dòng vào block server HTTPS để chặn các request không cần thiết:
# Chỉ cho phép domain của bạn, tránh request lạ
if ($host !~ ^(n8n\.example\.com)$) {
return 444;
}
# Chặn truy cập trực tiếp vào các đường dẫn nhạy cảm
location ~ /\.(git|env|config) {
deny all;
return 404;
}
# Giới hạn request (rate limiting)
limit_req_zone $binary_remote_addr zone=n8n:10m rate=10r/s;
limit_req zone=n8n burst=20 nodelay;
Đặt vào trước dấu } cuối cùng của block server HTTPS 443. Reload Nginx:
sudo nginx -t && sudo systemctl reload nginx
Lưu ý: Rate limiting có thể chặn bạn nếu bạn thao tác nhanh. Nếu bị 503, bạn có thể tạm thời comment dòng limit_req để debug.
Xử lý lỗi thường gặp
Lỗi 502 Bad Gateway
Nginx không kết nối được tới n8n. Kiểm tra:
sudo journalctl -u nginx -f
Nếu thấy connection refused đến 127.0.0.1:5678, kiểm tra n8n có đang chạy không: docker ps | grep n8n. Nếu container không chạy, xem log: docker logs <container_id>. Thường do hết RAM, VPS 1 GB RAM (gói VNLite) có thể cần thêm swap hoặc nâng cấp lên gói cao hơn.
Certbot không xác thực domain
Lỗi phổ biến: port 80 chưa mở, hoặc domain chưa trỏ đúng. Kiểm tra:
sudo ss -tlnp | grep :80
Nếu không có dòng nào, kiểm tra firewall: sudo ufw status. Mở port 80 và 443: sudo ufw allow 80/tcp && sudo ufw allow 443/tcp. Nếu dùng cloud firewall (từ nhà cung cấp VPS), kiểm tra thêm ở giao diện quản lý. Đảm bảo bản ghi A của domain trỏ chính xác tới IP VPS: dig +short n8n.example.com.
WebSocket không kết nối (lỗi 426)
Nginx thiếu header Upgrade/Connection. Mở lại file cấu hình kiểm tra có dòng proxy_set_header Upgrade $http_upgrade; không. Nếu thiếu, thêm vào và reload.
Câu hỏi thường gặp
Có cần mua SSL riêng cho n8n không?
Không. Let's Encrypt (qua Certbot) cung cấp SSL miễn phí, tự động gia hạn, đáp ứng đầy đủ cho n8n production. Tuy nhiên, nếu bạn cần chứng chỉ Wildcard cho nhiều subdomain hoặc có yêu cầu đặc thù về thẩm định, bạn có thể dùng SSL trả phí từ các nhà cung cấp như GoGetSSL.
n8n có chạy được trên VPS chỉ 1 GB RAM khi dùng SSL không?
Có, nhưng cần tối ưu. n8n mặc định chiếm khoảng 300-500 MB RAM. Với VPS 2 GB RAM, bạn có thêm dư địa cho Nginx và hệ thống. Nếu dùng gói thấp hơn, cân nhắc tắt các workflow không cần thiết và tăng swap. Các gói VPS n8n có sẵn thường được cấu hình sẵn để chạy ổn định.
Làm sao kiểm tra SSL tự động gia hạn có hoạt động không?
Chạy sudo certbot renew --dry-run. Nếu không có lỗi, timer gia hạn mặc định của Certbot đã được cài (thường 2 lần/ngày) và gia hạn tự động. Bạn có thể kiểm tra timer: sudo systemctl status certbot.timer.
Tôi có thể dùng Apache thay Nginx không?
Có, nhưng Nginx nhẹ hơn và dễ cấu hình cho reverse proxy WebSocket hơn. Nếu đã quen Apache, bạn có thể dùng module mod_proxy_wstunnel để chuyển tiếp WebSocket. Hướng dẫn này tập trung vào Nginx vì là lựa chọn phổ biến và hiệu quả trên VPS Linux.
n8n có bảo mật credential khi chạy qua HTTPS không?
Có. HTTPS mã hóa toàn bộ traffic giữa trình duyệt và server, bao gồm credential đăng nhập và dữ liệu Webhook. Tuy nhiên, credential n8n (kết nối tới service khác) vẫn được lưu trong database n8n, hãy bảo vệ cơ sở dữ liệu bằng mật khẩu mạnh. Bạn cũng nên bật xác thực hai yếu tố (2FA) cho tài khoản admin n8n nếu có.
Domain trỏ đến VPS đặt tại Việt Nam có ảnh hưởng đến tốc độ n8n không?
VPS đặt trong nước với băng thông nội địa 100 Mbps giúp n8n phản hồi nhanh cho người dùng tại Việt Nam. Ra quốc tế, tốc độ phụ thuộc vào pool dùng chung (khoảng 4-10 Mbps) và routing mạng của đối tác. Nếu bạn có nhiều user quốc tế, hãy cân nhắc đặt thêm VPS ở region gần họ hoặc dùng CDN cho phần front-end tĩnh của n8n.
Bài viết liên quan
- Cài n8n trên VPS Ubuntu 24.04 bằng Docker Compose từ A-Z
- n8n là gì? Những ai nên sử dụng n8n?
- Thuê VPS n8n giá rẻ cài sẵn - Hướng dẫn chi tiết
- Backup n8n đúng cách: Encryption key, database và credential


