Cấu hình n8n với Nginx và Docker Compose để đảm bảo độ tin cậy của webhook
Một hướng dẫn đã được kiểm chứng chi tiết cách tự host n8n phía sau Nginx trên Ubuntu, giải quyết các vấn đề phổ biến khi dùng proxy như hỗ trợ WebSocket và chuyển tiếp header chính xác.
Bài được dịch tự động từ bản gốc tiếng Anh.
Việc tự host các nền tảng tự động hóa đòi hỏi cấu hình mạng cẩn thận để đảm bảo các dịch vụ bên ngoài có thể giao tiếp đáng tin cậy với các quy trình làm việc nội bộ. Một hướng dẫn kỹ thuật gần đây phác thảo phương pháp cụ thể để triển khai n8n phiên bản 2.42.4 sử dụng Docker Compose và Nginx trên Ubuntu 24.04.5 LTS. Cách tiếp cận này tập trung vào việc giải quyết các sự cố kết nối thường gặp khi đặt ứng dụng phía sau một reverse proxy, đặc biệt liên quan đến việc gửi webhook và độ ổn định của trình chỉnh sửa.
Điều gì đã xảy ra
Hướng dẫn cung cấp quy trình từng bước để chạy n8n trong một container được liên kết với localhost, được bảo vệ khỏi truy cập công khai trực tiếp bởi một reverse proxy Nginx. Khác với tài liệu chính thức thường mặc định sử dụng Traefik hoặc Caddy, phương pháp này nhắm mục tiêu đến các quản trị viên đã quản lý máy chủ Nginx hoặc ưa thích hệ sinh thái của nó. Quy trình bao gồm việc tạo một thư mục dự án chuyên dụng, cấu hình các biến môi trường và thiết lập một tệp Docker Compose loại trừ các dịch vụ không cần thiết như sandbox AI Assistant để tiết kiệm tài nguyên.
Một phần quan trọng của quá trình triển khai là cấu hình khối server (server block) của Nginx. Hướng dẫn nhấn mạnh nhu cầu về các header cụ thể để hỗ trợ kết nối WebSocket, vốn rất cần thiết cho các bản cập nhật thời gian thực của trình chỉnh sửa n8n. Nó cũng chi tiết hóa việc tích hợp chứng chỉ Let’s Encrypt thông qua Certbot để áp dụng HTTPS. Tác giả lưu ý rằng bỏ qua các cài đặt proxy cụ thể này thường dẫn đến URL webhook bị lỗi hoặc mất kết nối trong giao diện người dùng, khiến cấu hình này trở nên thiết yếu cho sự ổn định trong môi trường sản xuất.
Chi tiết chính
- Phiên bản phần mềm: Thiết lập đã được thử nghiệm với n8n 2.42.4 trên Ubuntu 24.04.5 LTS.
- Sử dụng tài nguyên: Trên một máy chủ thử nghiệm có 4 GB RAM, n8n tiêu thụ khoảng 353 MB khi nhàn rỗi, chiếm khoảng 9% tổng bộ nhớ.
- Liên kết mạng: Cổng 5678 của container Docker được liên kết chặt chẽ với
127.0.0.1, đảm bảo nó không bị phơi bày trực tiếp ra internet. - Header bắt buộc: Nginx phải truyền các header
UpgradevàConnectionđể duy trì sự ổn định của WebSocket cho giao diện trình chỉnh sửa. - Biến môi trường:
WEBHOOK_URLvàN8N_PROXY_HOPS=1là bắt buộc để tạo URL chính xác và phát hiện địa chỉ IP. - Quyền tệp: Thư mục tệp cục bộ phải thuộc sở hữu của user ID 1000 để cho phép container đọc và ghi dữ liệu đúng cách.
Bối cảnh
Reverse proxy hoạt động như các trung gian giữa client và máy chủ backend, xử lý các tác vụ như chấm dứt SSL và cân bằng tải. Khi một ứng dụng như n8n nằm phía sau proxy như vậy, nó mất khả năng nhìn thấy địa chỉ IP gốc của client và giao thức được sử dụng trừ khi các header cụ thể được chuyển tiếp. Nếu thiếu X-Forwarded-For và X-Forwarded-Proto, ứng dụng có thể tạo ra các liên kết HTTP sai hoặc thất bại trong các kiểm tra bảo mật. Ngoài ra, các ứng dụng web hiện đại thường sử dụng WebSocket cho giao tiếp hai chiều, bền vững. Cấu hình proxy HTTP tiêu chuẩn không tự động hỗ trợ cơ chế nâng cấp cần thiết cho WebSocket, dẫn đến các kết nối bị ngắt nếu không được cấu hình rõ ràng.
Tại sao điều này quan trọng
Đối với các đội ngũ quản lý hạ tầng riêng, độ tin cậy trong tự động hóa là tối quan trọng. Nếu URL webhook được tạo sai do thiếu biến môi trường, các dịch vụ bên ngoài như cổng thanh toán hoặc nền tảng CRM sẽ không thể kích hoạt các quy trình làm việc. Điều này có thể dẫn đến mất dữ liệu âm thầm hoặc chậm trễ trong các quy trình kinh doanh. Hướng dẫn nhấn mạnh rằng WEBHOOK_URL phải được đặt rõ ràng thành tên miền HTTPS công khai, nếu không n8n sẽ mặc định sử dụng địa chỉ localhost nội bộ, vốn không thể truy cập từ thế giới bên ngoài.
Sự ổn định vận hành cũng phụ thuộc vào quản lý tài nguyên và chiến lược sao lưu phù hợp. Bài viết lưu ý rằng mặc dù n8n nhẹ nhàng, mức sử dụng bộ nhớ tăng theo khối lượng dữ liệu và số lượng quy trình làm việc đồng thời. Các quản trị viên phải lên kế hoạch cho việc sao lưu định kỳ cơ sở dữ liệu SQLite và các khóa mã hóa được lưu trữ trong volume Docker. Mất khóa mã hóa có nghĩa là tất cả thông tin đăng nhập đã lưu đều không thể khôi phục, buộc phải đặt lại thủ công mọi dịch vụ tích hợp. Điều này nhấn mạnh sự chuyển đổi trách nhiệm từ nhà cung cấp đám mây sang những người tự host liên quan đến tính toàn vẹn dữ liệu và khôi phục thảm họa.
Bạn có thể làm gì
- Liên kết cổng cục bộ: Đảm bảo tệp Docker Compose của bạn liên kết cổng ứng dụng chỉ với
127.0.0.1, ngăn chặn truy cập trực tiếp từ bên ngoài. - Cấu hình header proxy: Thêm
proxy_set_header Upgrade $http_upgradevàConnection "upgrade"vào cấu hình Nginx của bạn để hỗ trợ WebSocket. - Đặt biến môi trường: Định nghĩa
WEBHOOK_URLvới tên miền HTTPS đầy đủ của bạn và đặtN8N_PROXY_HOPS=1để tin tưởng các header được chuyển tiếp. - Điều chỉnh thời gian chờ: Tăng
proxy_read_timeouttrong Nginx lên ít nhất 3600 giây để ngăn các quy trình làm việc chạy lâu bị cắt đứt. - Tự động hóa sao lưu: Tạo một script để dừng container, lưu trữ volume Docker và khởi động lại dịch vụ, lên lịch qua cron trong các giai đoạn lưu lượng thấp.
- Kiểm tra quyền hạn: Chạy
chown 1000:1000trên bất kỳ thư mục host nào được ánh xạ tới container để tránh lỗi quyền ghi.



