Tự cài n8n trên máy chủ riêng gồm ba việc: chạy bằng Docker Compose, thêm Postgres khi dùng thật; sao lưu thư mục .n8n (chứa khoá mã hoá) và cơ sở dữ liệu ra nơi khác; đọc ghi chú phát hành trước khi cập nhật. Mất khoá mã hoá thì không mở được thông tin đăng nhập.
Bài n8n cho doanh nghiệp Việt: chi phí tự dựng đã tính các khoản tiền và giới hạn giấy phép; bài n8n là gì, bản cập nhật 2026 nói tính năng mới. Bài này chỉ nói vận hành: dựng bằng Docker, đặt biến môi trường nào từ đầu, HTTPS qua reverse proxy, sao lưu thế nào cho khôi phục được, và cập nhật sao cho không vỡ workflow. Lệnh và tên biến lấy từ tài liệu tự dựng của n8n (docs.n8n.io) và trang phát hành trên GitHub, kiểm ngày 09/11/2026.
Vòng vận hành n8n tự dựng
Cài n8n mất một buổi; phần tốn công là giữ nó chạy ổn qua nhiều tháng. Tôi coi vận hành là một vòng ba bước lặp lại.

- Chạy. n8n và cơ sở dữ liệu chạy bằng Docker Compose, có tên miền HTTPS phía trước.
- Sao lưu. Mỗi ngày chép thư mục .n8n và bản dump cơ sở dữ liệu ra máy khác hoặc kho lưu trữ khác.
- Cập nhật. Đọc ghi chú phát hành, sao lưu đầy đủ, kéo image mới, chạy thử, rồi mới coi là xong.
Trang hướng dẫn Docker Compose của n8n cũng nói thẳng: tự dựng n8n cần kiến thức về máy chủ, container, bảo mật; làm sai có thể mất dữ liệu, lộ thông tin và ngừng chạy. Người chưa quen quản trị máy chủ thì n8n khuyên dùng n8n Cloud.
Dựng n8n bằng Docker Compose
Tài liệu hiện có ba đường cài bằng Docker (kiểm 09/11/2026):
- One-line setup: một lệnh dựng sẵn mọi thứ, gồm cả hộp cát chạy mã cho n8n Assistant.
- Install using Docker Compose: tự viết tệp
.envvàcompose.yml, gồm n8n, bộ hộp cát và SearXNG. Trang ghi cần tối thiểu 4 GB RAM và 2 vCPU vì hộp cát chạy Docker-in-Docker. - Use a cloud provider / Use Docker Compose: hai container n8n và Traefik trên máy chủ Linux, Traefik lo chứng chỉ HTTPS. Đây là bản gọn nhất nếu anh chị chưa cần n8n Assistant.
Với bản Traefik, các bước là: cài Docker và Docker Compose, trỏ bản ghi A của tên miền phụ (ví dụ n8n) về IP máy chủ, tạo thư mục n8n-compose, viết tệp .env với DOMAIN_NAME, SUBDOMAIN, GENERIC_TIMEZONE, SSL_EMAIL, tạo thư mục local-files, dán tệp compose.yaml trong tài liệu, rồi chạy sudo docker compose up -d. Tệp mẫu chỉ mở cổng 5678 cho 127.0.0.1; bên ngoài vào qua cổng 80 và 443 của Traefik.
Thêm Postgres khi dùng thật
Mặc định n8n lưu workflow, thông tin đăng nhập và lịch sử chạy vào SQLite. Tài liệu ghi SQLite đủ để thử, còn môi trường thật có nhiều người dùng hoặc workflow chạy suốt ngày đêm thì nên dùng Postgres. Phần cần thêm:
- Một dịch vụ
postgres(tài liệu dùng imagepostgres:18) với volume riêng và biếnPOSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_DB. Với Postgres 18, giữ dòngPGDATA: /var/lib/postgresql/data; tài liệu cảnh báo bỏ dòng này thì cơ sở dữ liệu khởi động rỗng. - Trong dịch vụ n8n:
DB_TYPE: postgresdb,DB_POSTGRESDB_HOST,DB_POSTGRESDB_PORT,DB_POSTGRESDB_DATABASE,DB_POSTGRESDB_USER,DB_POSTGRESDB_PASSWORD, và cho n8n chờ Postgres sẵn sàng.
Lưu ý từ tài liệu: dữ liệu SQLite cũ không tự chuyển sang Postgres. Cách thêm Postgres ở trên dành cho máy mới. Đang chạy SQLite muốn chuyển thì dùng lệnh n8n export:entities và n8n import:entities của n8n. Dù dùng Postgres, vẫn phải giữ volume gắn vào /home/node/.n8n, vì thư mục này chứa khoá mã hoá.
Biến môi trường nên đặt ngay từ đầu
Bảng dưới gom các biến tôi đặt cho mọi máy n8n, kèm mặc định theo trang biến môi trường của n8n (kiểm 09/11/2026):
| Biến | Mặc định | Đặt thế nào |
|---|---|---|
N8N_HOST, N8N_PROTOCOL, N8N_PORT | localhost, http, 5678 | Tên miền thật, https, giữ 5678 |
N8N_WEBHOOK_URL | Trống | Địa chỉ HTTPS công khai, ví dụ https://n8n.example.com/ |
N8N_PROXY_HOPS | 0 | 1 khi chạy sau một reverse proxy |
GENERIC_TIMEZONE và TZ | America/New_York | Múi giờ Việt Nam theo tên chuẩn IANA, Asia/Ho_Chi_Minh |
N8N_ENCRYPTION_KEY | n8n tự tạo khoá ngẫu nhiên lần chạy đầu | Tự đặt một chuỗi ngẫu nhiên và cất ở nơi an toàn |
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS | false | true để tệp cấu hình chỉ chủ sở hữu đọc, ghi được, như lệnh mẫu của tài liệu |
EXECUTIONS_DATA_PRUNE, EXECUTIONS_DATA_MAX_AGE, EXECUTIONS_DATA_PRUNE_MAX_COUNT | true, 336 giờ, 10.000 | Giữ bật dọn lịch sử chạy; giảm số giờ nếu đĩa nhỏ |
Ba điểm hay sai:
- Tên biến webhook đã đổi.
WEBHOOK_URLbị đánh dấu ngừng dùng từ n8n 2.35.0, thay bằngN8N_WEBHOOK_URL(có từ 2.30.0). Hướng dẫn cũ trên mạng vẫn ghi tên cũ; nó còn chạy nhưng n8n ghi cảnh báo khi khởi động. - Múi giờ.
GENERIC_TIMEZONEquyết định giờ chạy của nút Schedule Trigger;TZlà giờ hệ thống của container. Quên đặt thì báo cáo «8 giờ sáng» chạy theo giờ New York. - Khoá mã hoá. Tài liệu ghi n8n dùng khoá này để mã hoá thông tin đăng nhập trước khi lưu vào cơ sở dữ liệu. Tự đặt bằng biến môi trường giúp anh chị chủ động cất khoá ở nơi khác, tách khỏi máy chủ.
HTTPS qua reverse proxy
n8n cần địa chỉ HTTPS để nhận webhook từ dịch vụ ngoài. Ví dụ Zalo OA yêu cầu webhook dùng tên miền và HTTPS, như tôi viết trong bài Zalo OA API: lấy token, gửi tin và webhook.
Bản Docker Compose của n8n dùng Traefik, tự xin chứng chỉ qua SSL_EMAIL. Nếu máy chủ đã có Nginx hay Caddy cho dịch vụ khác, trang cấu hình webhook sau reverse proxy (kiểm 09/11/2026) yêu cầu ba việc:
- Đặt
N8N_WEBHOOK_URLbằng địa chỉ công khai. Không đặt, n8n ghép địa chỉ từN8N_PROTOCOL,N8N_HOST,N8N_PORTvà đăng ký sai webhook với dịch vụ ngoài, vì bên trong chạy cổng 5678 còn bên ngoài là 443. - Đặt
N8N_PROXY_HOPS=1. - Ở proxy cuối cùng, chuyển tiếp các header
X-Forwarded-For,X-Forwarded-Host,X-Forwarded-Proto.
Chỉ để lộ cổng của proxy ra Internet. Cổng 5678 nên chỉ mở cho máy nội bộ như tệp mẫu của n8n.
Sao lưu n8n: thứ gì, bao lâu, để ở đâu
Trang Back up and restore của n8n (kiểm 09/11/2026) chia một bản sao lưu đầy đủ thành hai phần:
- Thư mục .n8n (trong Docker là volume gắn vào
/home/node/.n8n): chứa tệp cấu hình có khoá mã hoá; với SQLite thì chứa luôn tệp cơ sở dữ liệu. - Cơ sở dữ liệu Postgres, sao lưu bằng công cụ của chính Postgres. Thư mục .n8n vẫn phải có trong bản sao lưu, vì thông tin đăng nhập trong cơ sở dữ liệu được mã hoá bằng khoá nằm ở đó.
Với SQLite, tài liệu dặn dừng n8n trước khi chép thư mục, tránh chép đúng lúc n8n đang ghi.
Xuất workflow bằng lệnh n8n
Ngoài bản sao lưu đầy đủ, tôi xuất thêm workflow và thông tin đăng nhập ra tệp JSON để dễ xem lại và chuyển máy. Trong Docker, lệnh n8n chạy qua docker exec -u node -it <n8n-container-name> <n8n-cli-command>. Hai lệnh tài liệu đưa ra:
n8n export:workflow --backup --output=backups/workflows/n8n export:credentials --backup --output=backups/credentials/
Cờ --backup tương đương --all --pretty --separate: mỗi workflow một tệp JSON dễ đọc. Ba lưu ý trong tài liệu:
- Thư mục
backups/bên trong container không được giữ lại khi tạo lại container. Gắn một thư mục của máy chủ vào, hoặc chép tệp ra ngoài trước. - Bản xuất này không có người dùng và vai trò, lịch sử chạy, biến (Variables), cài đặt máy và khoá mã hoá. Đủ để chuyển workflow, không đủ để dựng lại cả máy.
- Cờ
--decryptedxuất thông tin đăng nhập ở dạng chữ thường. Chỉ dùng khi chuyển máy, xong thì xoá tệp.
Lịch sao lưu tôi dùng
Phần này là cách tôi làm, không phải quy định của n8n: sao lưu hằng ngày ra một nơi khác máy chủ (máy chủ khác hoặc kho lưu trữ đối tượng), giữ vài bản gần nhất, và mỗi tháng thử khôi phục lên một máy trống. Bản sao lưu chưa từng khôi phục thử thì chưa nên tin. Khoá mã hoá cất riêng, tách khỏi bản sao lưu dữ liệu.
Cập nhật n8n an toàn
Trang Update n8n khuyên cập nhật thường xuyên, ít nhất mỗi tháng một lần để khỏi phải nhảy nhiều phiên bản, đọc ghi chú phát hành để tìm thay đổi phá vỡ tương thích, và thử trên một bản thử trước. Trang Back up and restore thì khuyên sao lưu đầy đủ trước khi cập nhật.
Về phiên bản, ngày 09/11/2026: tài liệu Docker ghi bản ổn định hiện tại là 2.46.6, bản beta 2.47.2; trang phát hành GitHub của n8n cũng đánh dấu 2.46.6 là bản mới nhất. Ghi chú phát hành đã có mục n8n 3.0 (ngày 27/10/2026) kèm cảnh báo đây là bản lớn có thay đổi phá vỡ tương thích, cần đọc trang breaking changes và chạy công cụ di chuyển trước khi nâng. Trên GitHub, các bản 3.x vẫn đang đánh dấu prerelease.
Quy trình tôi làm mỗi lần cập nhật:
- Đọc ghi chú phát hành từ bản đang chạy tới bản định lên.
- Sao lưu đầy đủ: thư mục .n8n và cơ sở dữ liệu.
- Ghi số phiên bản cụ thể trong tệp compose (ví dụ
n8nio/n8n:2.46.6) thay vì để trống thẻ, để biết đang chạy bản nào và quay lại được. - Chạy ba lệnh trong tài liệu:
docker compose pull,docker compose down,docker compose up -d. - Mở giao diện, chạy thử vài workflow quan trọng, kiểm webhook từ dịch vụ ngoài còn về.
Một bài học từ máy chủ của tôi: ngày 06/11/2026, một máy chạy nhiều dịch vụ Docker lên 98% dung lượng đĩa vì dựng image ngay trên máy. Từ đó tôi đặt cảnh báo khi đĩa vượt 85% và dọn image cũ sau mỗi lần cập nhật. n8n kéo image mới định kỳ nên cũng cần thói quen này. Ai chạy thêm công cụ tự dựng khác trên cùng máy có thể xem bài Metabase tự dựng cho doanh nghiệp nhỏ và Claude Code với Docker Compose.
Điểm bất lợi khi tự dựng n8n
- Anh chị là người trực. Workflow lỗi lúc nửa đêm, chứng chỉ HTTPS hết hạn, đĩa đầy: không ai báo nếu anh chị không tự đặt giám sát.
- Phiên bản ra liên tục. Tài liệu ghi n8n ra bản minor mới hầu như mỗi tuần. Bỏ cập nhật vài tháng thì lần cập nhật sau phải nhảy nhiều bản, rủi ro hơn.
- Bản lớn có thay đổi phá vỡ. Từ 1.x lên 2.0 và sắp tới 3.0 đều có trang breaking changes riêng; workflow cũ có thể phải sửa.
- Mất khoá mã hoá là mất thông tin đăng nhập. Cơ sở dữ liệu còn nguyên nhưng mọi tài khoản đã nối phải nhập lại.
- Bản đầy đủ có n8n Assistant tốn tài nguyên. Tài liệu yêu cầu tối thiểu 4 GB RAM và 2 vCPU, và container chạy mã cần quyền đặc biệt (privileged), không được mở ra Internet.
Câu hỏi thường gặp về n8n self-hosted
n8n tự dựng nên dùng SQLite hay Postgres?
Thử nghiệm thì SQLite mặc định là đủ. Tài liệu n8n khuyên dùng Postgres cho môi trường thật có nhiều người dùng hoặc workflow chạy liên tục. Dù dùng Postgres, vẫn giữ volume .n8n vì khoá mã hoá nằm ở đó.
WEBHOOK_URL và N8N_WEBHOOK_URL khác gì nhau?
Cùng một việc. N8N_WEBHOOK_URL là tên mới; WEBHOOK_URL bị đánh dấu ngừng dùng từ n8n 2.35.0, vẫn chạy nhưng có cảnh báo khi khởi động (kiểm 09/11/2026).
Lệnh export:workflow có đủ để sao lưu không?
Không. Lệnh chỉ xuất workflow và thông tin đăng nhập, không có người dùng, lịch sử chạy, biến và khoá mã hoá. Sao lưu đầy đủ cần thư mục .n8n và cơ sở dữ liệu.
Có nên lên n8n 3.0 ngay không?
Ngày 09/11/2026, bản ổn định theo tài liệu và GitHub vẫn là 2.46.6, các bản 3.x còn là prerelease. Máy đang chạy việc thật thì chờ 3.x lên bản ổn định, đọc trang breaking changes, chạy công cụ di chuyển và thử trên bản sao trước.
Cập nhật n8n bằng Docker Compose gồm những lệnh nào?
Trong thư mục chứa tệp compose: docker compose pull, docker compose down, rồi docker compose up -d. Trước đó sao lưu đầy đủ và đọc ghi chú phát hành.
Nguồn: docs.n8n.io (Install with Docker; Install using Docker Compose; Use Docker Compose; Use environment variables: Deployment, Endpoints, Executions, Timezone and localization; Configure webhook URLs with reverse proxy; Set a custom encryption key; Use the command line; Back up and restore; Update n8n; Release notes); github.com/n8n-io/n8n/releases, kiểm ngày 09/11/2026.


