n8n chạy bằng Docker: những cấu hình cần đặt cho đúng
Danh sách biến môi trường phải đặt trước khi chạy n8n bằng Docker thật, phần bản cài nhanh hay bỏ qua rồi mới phát hiện lúc workflow đã chạy vài tuần.
Container chạy lên. Giao diện n8n mở được. Workflow đầu tiên chạy qua trót lọt. Mọi thứ trông ổn cho tới khi webhook báo lỗi lúc nửa đêm, hoặc dữ liệu workflow biến mất sau một lần restart. Phần lớn sự cố đó không phải bug của n8n. Đó là biến môi trường chưa đặt đúng ngay từ lúc dựng container.

Vì sao n8n chạy bằng Docker vẫn lỗi dù container khởi động thành công
n8n chạy bằng Docker khởi động được không có nghĩa là đã sẵn sàng chạy thật. Image mặc định chỉ bật cấu hình tối thiểu để demo. Phần bảo mật và bền dữ liệu phải người dựng tự khai báo qua biến môi trường. Container xanh trên lệnh `docker ps` chỉ xác nhận tiến trình còn sống, không xác nhận dữ liệu có được giữ lại hay webhook có nhận đúng địa chỉ.
Ba nhóm hay bị bỏ sót nhất: nơi lưu dữ liệu, địa chỉ webhook thật, và khoá mã hoá credential. Cả ba không gây lỗi ngay khi cài. Chúng chỉ lộ ra khi đã có vài chục workflow đang chạy, lúc đó sửa tốn công hơn nhiều so với đặt đúng từ đầu. Đội chưa quen Docker nên nhờ đội quản trị máy chủ BizMaC soát cấu hình trước khi đưa workflow vào chạy thật.
Volume phải trỏ đúng chỗ để không mất dữ liệu khi container khởi động lại
Container Docker mặc định là ephemeral. Xoá container thì mọi thứ ghi bên trong cũng mất theo, kể cả khi không ai cố ý gõ lệnh xoá. Image cập nhật, Docker tạo lại container mới, và toàn bộ workflow, lịch sử chạy, credential lưu trong container cũ biến mất sạch.
Cách tránh là mount volume ra ngoài container ngay từ file `docker-compose.yml` đầu tiên, không đợi sự cố mới thêm vào:
| Volume | Mount vào | Chứa gì |
|---|---|---|
| n8n_data | /home/node/.n8n | Workflow, credential đã mã hoá, cấu hình |
| postgres_data | /var/lib/postgresql/data | Toàn bộ dữ liệu PostgreSQL nếu không dùng SQLite mặc định |
| n8n_files | /files (tuỳ chọn) | File tạm khi workflow xử lý upload hoặc export |
Theo tài liệu docs.n8n.io, thiếu bước mount này là nguyên nhân phổ biến nhất khiến người mới tự host báo mất sạch workflow sau một lần `docker compose down`. Lệnh đó không xoá volume. Nhưng nếu volume chưa từng được khai báo, dữ liệu vốn dĩ chưa bao giờ ra khỏi container để lệnh đó có thể giữ lại.
Ba biến hay đặt sai nhất: timezone, webhook URL và HTTPS
Ba biến này không làm container chết, nên bản cài nhanh bỏ qua được. Hậu quả chỉ lộ khi chạy thật: lịch sai giờ, hệ thống ngoài không gọi tới được, đăng nhập bị đá ra.
Timezone lệch làm lịch chạy cronjob sai giờ thực tế
Container Docker mặc định chạy theo giờ UTC, lệch 7 tiếng so với giờ Việt Nam. Một workflow đặt lịch chạy 8 giờ sáng thực chất chạy lúc 15 giờ nếu biến `TZ` không được khai báo trong file compose. Báo cáo tự động vì thế gửi vào 3 giờ sáng thay vì 8 giờ như đã đặt.
Khai báo `TZ=Asia/Ho_Chi_Minh` và `GENERIC_TIMEZONE=Asia/Ho_Chi_Minh` cùng lúc. Biến đầu chỉnh giờ hệ thống của container. Biến sau n8n dùng riêng cho node Schedule Trigger và log hiển thị trên giao diện. Thiếu một trong hai, phần còn lại vẫn chạy theo UTC dù cái kia đã đúng giờ Việt Nam. Cách kiểm nhanh: chạy docker exec TEN_CONTAINER date rồi so với đồng hồ tường, lệch đúng 7 tiếng là dấu hiệu chắc chắn thiếu biến `TZ`.
Webhook URL đặt sai khiến hệ thống bên ngoài không gọi được vào n8n
n8n chạy bằng Docker thường nằm sau một domain và reverse proxy, không mở trực tiếp ra Internet bằng IP. Nếu biến `WEBHOOK_URL` không được đặt, n8n tự suy ra địa chỉ webhook từ URL nội bộ của container, ví dụ `http://localhost:5678`. Đó là địa chỉ mà Zalo OA, Google Sheets hay phần mềm kế toán bên ngoài không bao giờ gọi tới được.
Workflow trong giao diện trông hoàn toàn bình thường. Nút Active bật xanh. Nhưng không request nào từ bên ngoài chạm được vào node Webhook. Đặt đúng: `WEBHOOK_URL=https://n8n.tenmiendoanhnghiep.vn/`, khớp với domain thật đã trỏ DNS, có dấu gạch chéo ở cuối theo đúng cú pháp tài liệu yêu cầu.
HTTPS và secure cookie: hai biến phải đi cùng nhau
n8n chạy bằng Docker phía sau reverse proxy có TLS cần khai báo rõ giao thức. Không khai báo đúng, phần đăng nhập có thể chặn luôn chính người quản trị. Biến `N8N_SECURE_COOKIE` mặc định là `true`, buộc cookie phiên đăng nhập chỉ gửi qua kết nối HTTPS.
Vấn đề nảy sinh khi domain chưa gắn SSL nhưng biến này vẫn giữ giá trị mặc định. n8n cấp cookie yêu cầu HTTPS, trình duyệt chỉ nhận được HTTP, phiên đăng nhập bị từ chối ngay sau khi nhập đúng mật khẩu. Hai cách xử lý, chọn một: bật SSL cho domain trước rồi giữ nguyên mặc định. Hoặc tạm đặt `N8N_SECURE_COOKIE=false` trong lúc thử nghiệm nội bộ chưa có chứng chỉ. Reverse proxy như Nginx hay Caddy cũng cần forward đúng header `X-Forwarded-Proto`, để n8n biết request gốc là HTTPS chứ không phải suy đoán từ kết nối nội bộ.
Cấu hình Docker cho n8n đã có người dựng sẵn
VPS n8n của BizMaC cài sẵn n8n, PostgreSQL và Redis với biến môi trường chuẩn cho chạy thật, gói Start từ 490.000đ/tháng.
Encryption key mất là mất luôn quyền đọc mọi credential đã lưu
Mỗi lần n8n khởi động lần đầu, nó tự sinh một encryption key ngẫu nhiên để mã hoá toàn bộ credential lưu trong database: API key, mật khẩu, token OAuth. Key này không tự migrate sang container mới nếu không được khai báo tường minh bằng biến `N8N_ENCRYPTION_KEY`.
Container cũ chết. Container mới dựng lên với key sinh ngẫu nhiên khác. Database volume vẫn còn nguyên, nhưng mọi credential bên trong trở thành chuỗi mã hoá không đọc được bằng key mới. Không có lệnh khôi phục. Phải nhập lại từng credential bằng tay, việc mất vài giờ nếu workflow đã kết nối hàng chục tài khoản. Cách tránh triệt để: đặt cố định `N8N_ENCRYPTION_KEY` bằng một chuỗi ngẫu nhiên tự tạo, ghi lại nơi lưu trữ mật khẩu riêng, dùng đúng key đó cho mọi lần dựng lại hoặc di chuyển container sang máy khác.
Doanh nghiệp không có người rành Docker để tự soát các biến này trước khi đưa vào chạy thật có thể giao phần vận hành máy chủ cho dịch vụ quản trị máy chủ BizMaC, đội kỹ thuật kiểm cấu hình, theo dõi tài nguyên và xử lý khi container gặp sự cố.
Danh sách biến môi trường cần đặt trước khi chạy thật
Trước khi đưa n8n chạy bằng Docker vào môi trường thật, đối chiếu qua bảng dưới một lượt. Đừng chờ sự cố mới quay lại sửa từng biến một.
| Biến | Ý nghĩa | Hậu quả nếu bỏ trống |
|---|---|---|
| N8N_ENCRYPTION_KEY | Khoá mã hoá credential | Mất quyền đọc credential khi đổi container |
| WEBHOOK_URL | Địa chỉ webhook công khai | Hệ thống ngoài không gọi được vào n8n |
| N8N_SECURE_COOKIE | Bắt cookie chỉ gửi qua HTTPS | Không đăng nhập được nếu domain chưa có SSL |
| TZ / GENERIC_TIMEZONE | Múi giờ container và lịch chạy | Cronjob và Schedule Trigger lệch giờ thực tế |
| DB_TYPE, DB_POSTGRESDB_* | Kết nối PostgreSQL thay vì SQLite mặc định | Giới hạn hiệu năng khi số workflow tăng |
Chạy nhiều instance n8n trên cùng một VPS, ví dụ một bản test và một bản chạy thật, thì mỗi container cần cổng riêng và tên volume riêng. Trộn chung là tranh cổng 5678 mặc định hoặc ghi đè dữ liệu lên nhau.
Không muốn dò từng biến môi trường thì gói VPS n8n cài sẵn đã khai sẵn phần này từ lúc bàn giao.
Câu hỏi thường gặp khi chạy n8n bằng Docker
Chạy n8n bằng Docker có cần PostgreSQL ngay từ đầu không
Không bắt buộc lúc thử nghiệm, n8n mặc định dùng SQLite. Chuyển sang PostgreSQL khi đưa vào chạy thật hoặc số workflow đã vượt vài chục, vì SQLite giới hạn khi nhiều tiến trình ghi đồng thời.
Quên khai báo N8N_ENCRYPTION_KEY thì sửa được không
Nếu container cũ vẫn còn chạy, vào lấy key đang dùng rồi khai báo cố định cho lần dựng sau. Container đã bị xoá thì credential mã hoá cũ không đọc lại được, phải nhập lại từng credential.
WEBHOOK_URL đặt sai có tự sửa lại được không
Không tự sửa, phải đổi giá trị biến rồi khởi động lại container. Các webhook đã đăng ký ở hệ thống ngoài như Zalo OA hay phần mềm kế toán cũng cần cập nhật lại địa chỉ mới nếu domain thay đổi.
Có nên tự dựng Docker Compose hay dùng VPS cài sẵn
Tự dựng phù hợp khi đã quen Docker và muốn kiểm soát từng biến. Muốn tiết kiệm thời gian dò lỗi cấu hình thì VPS cài sẵn n8n, PostgreSQL và Redis giúp bỏ qua bước dựng từ đầu.
Tóm tắt
n8n chạy bằng Docker không khó dựng. Nhưng 5 biến trong bảng trên quyết định workflow có sống sót qua lần restart đầu tiên hay không: volume để giữ dữ liệu, timezone để lịch chạy đúng giờ, webhook URL để hệ thống ngoài gọi vào được, secure cookie để đăng nhập không bị chặn, và encryption key để không mất credential khi đổi container. Đặt đúng cả 5 biến trước khi đưa vào chạy thật. Đừng đợi lỗi xuất hiện mới quay lại sửa từng cái một.
Lưu ý: Bài viết chia kinh nghiệm chung, còn mỗi doanh nghiệp một quy mô và một cách vận hành. Muốn biết cách nào hợp với trường hợp của bạn — chọn gói nào, làm theo thứ tự nào, chi phí ra sao — chuyên viên BizMaC tư vấn và làm giúp bạn phần kỹ thuật.
Để BizMaC dựng website cho doanh nghiệp bạn
Giao diện chuẩn UX, cấu trúc chuẩn SEO, chạy mượt trên di động và dễ tự quản trị sau khi bàn giao. BizMaC làm website cho doanh nghiệp Việt từ năm 2007, đi kèm hướng dẫn vận hành chứ không bàn giao xong là hết.



