Tự động hoá · 7 phút đọc · 2026-09-17
Self host n8n: sao lưu workflow, credential và nâng Node 24
Chép mỗi database.sqlite thì khôi phục ra 0 workflow; nhập credential sang máy mới thiếu khoá vẫn báo thành công; n8n từ 2.36.0 đòi Node 24. Mình đo cả ba trên bản sao dữ liệu.

Self host n8n xong, chạy được workflow đầu tiên mới là nửa việc. Nửa còn lại là ba thứ quyết định bạn có mất dữ liệu hay không: sao lưu, khoá mã hoá và cập nhật phiên bản. Mình thử cả ba trên bản n8n cài bằng npm trên Windows ở bài Cài n8n trên Windows. Mọi phép thử chạy trên bản sao của thư mục dữ liệu, và credential dùng để thử là credential giả, không nối tới dịch vụ nào.
Tóm tắt những gì đo được ngày 17/09/2026:
- Chép mỗi tệp
database.sqliteđể sao lưu thì khôi phục ra 0 workflow. Phải chép kèm tệp-wal. - Khôi phục credential sang máy mới mà không mang theo khoá mã hoá thì lệnh nhập vẫn báo thành công, nhưng credential không giải mã được.
- Từ bản 2.36.0, n8n đòi Node.js 24. Máy đang chạy Node 22 phải nâng Node trước, và lệnh
n8n --versionsẽ không báo cho bạn biết điều đó.
Các lệnh dưới đây viết cho Git Bash hoặc terminal Linux. Biến N8N_USER_FOLDER phải trỏ đúng thư mục dữ liệu bạn dùng khi chạy n8n.
Dữ liệu self host n8n nằm ở đâu
Trước khi làm n8n backup workflow hay n8n backup credentials, cần biết dữ liệu thật sự nằm ở đâu. Trong thư mục N8N_USER_FOLDER, n8n tạo thư mục con .n8n. Trên máy thử (n8n 2.35.7, 2 workflow) nó gồm:
config: 56 byte, chứa khoá mã hoáencryptionKeydài 32 ký tự.database.sqlite: 1.519.616 byte.database.sqlite-wal: 4.136.512 byte, lớn gần gấp ba tệp chính và có ngày sửa mới hơn.database.sqlite-shm,n8nEventLog.log, thư mụcnodesvàstorage.
Tệp -wal là nhật ký ghi của SQLite. Những thay đổi chưa được gộp vào tệp chính nằm ở đó, và đây là gốc của bẫy khi làm n8n backup SQLite bằng cách chép tệp.
Cách 1: n8n export workflow và credential bằng dòng lệnh
export N8N_USER_FOLDER="$HOME/n8n-data"
n8n export:workflow --backup --output=sao-luu/workflows/
n8n export:credentials --backup --output=sao-luu/credentials/Kết quả trên máy thử: "Successfully exported 2 workflows." và "Successfully exported 1 credentials.", mỗi workflow hay credential là một tệp JSON đặt tên theo id.
Mở tệp credential ra xem, trường data là một chuỗi mã hoá dài 88 ký tự bắt đầu bằng U2FsdGVkX1. Giá trị thật của credential giả ("gia-tri-thu-123") không xuất hiện trong tệp. Lệnh export còn có cờ --decrypted xuất ra giá trị thật. Chỉ dùng cờ này khi thật sự cần, và xoá tệp ngay sau đó.
Cách này gọn và dễ đọc, nhưng bản sao lưu credential vô dụng nếu thiếu khoá mã hoá. Phần khoá ở ngay bên dưới.
Cách 2: chép cả thư mục .n8n, đừng quên tệp -wal
Mình thử hai kiểu chép trên dữ liệu thật của máy thử, lúc n8n đang tắt:
- Chép đủ
config,database.sqlite,database.sqlite-wal,database.sqlite-shm: n8n liệt kê đủ 2 workflow. - Chỉ chép
configvàdatabase.sqlite: n8n chạy lại một loạt migration như gặp cơ sở dữ liệu cũ, rồi liệt kê 0 workflow. Đọc thẳng tệp SQLite, bảngworkflow_entitycó 0 dòng.
Lệnh chép đúng, chạy khi n8n đã tắt:
NGAY=$(date +%Y%m%d)
cp -r "$N8N_USER_FOLDER/.n8n" "sao-luu/n8n-$NGAY"
ls -la "sao-luu/n8n-$NGAY"Kiểm kết quả ls: nếu thư mục gốc có database.sqlite-wal thì bản sao cũng phải có. Mình chỉ thử chép lúc n8n đang tắt, chưa thử lúc đang chạy.
Khoá mã hoá quyết định credential còn dùng được hay không
Mọi credential trong n8n được mã hoá bằng khoá trong tệp config, thứ tài liệu tiếng Anh gọi là n8n encryption key. Để biết mất khoá thì mất gì, mình khôi phục bản sao lưu ở Cách 1 sang thư mục mới theo ba kiểu.
Kiểu 1: máy mới, để n8n tự sinh khoá. Lệnh nhập báo "Successfully imported 2 workflows." và "Successfully imported 1 credential.", không có cảnh báo nào. Chỉ khi đọc credential mới lộ lỗi:
Credentials could not be decrypted. The likely reason is that a different "encryptionKey" was used to encrypt the data.Tệp config mới chứa một khoá 32 ký tự khác hẳn khoá gốc. Workflow vẫn còn, nhưng mọi credential phải nhập lại từ đầu.
Kiểu 2: máy mới, đặt khoá cũ trước lần chạy đầu tiên. Khoá lấy từ tệp config cũ (dạng JSON, trường encryptionKey):
export N8N_ENCRYPTION_KEY="khoa-lay-tu-tep-config-cu"
export N8N_USER_FOLDER="$HOME/n8n-data-moi"
n8n import:workflow --separate --input=sao-luu/workflows/
n8n import:credentials --separate --input=sao-luu/credentials/Credential giải mã ra đúng giá trị ban đầu, và tệp config mới ghi đúng khoá cũ. Đặt biến này trước lệnh n8n đầu tiên trên thư mục mới. Nếu n8n đã kịp tự sinh khoá, bạn rơi vào kiểu thứ ba.
Kiểu 3: biến môi trường và tệp config lệch khoá. n8n từ chối chạy mọi lệnh:
Mismatching encryption keys. The encryption key in the settings file ...\.n8n\config does not match the N8N_ENCRYPTION_KEY env var.Lỗi này ít nguy hiểm hơn Kiểu 1 vì nó dừng hẳn và nói rõ nguyên nhân. Từ ba kết quả trên có hai việc nên làm. Thứ nhất, cất khoá ở chỗ khác với bản sao lưu, vì ai có cả hai thì đọc được mọi credential. Thứ hai, sau mỗi lần khôi phục thử, mở một credential ra kiểm chứ đừng tin dòng "Successfully imported".
Cập nhật self host n8n: kiểm Node trước khi nâng
Tra npm ngày 17/09/2026: bản latest là 2.39.7, phát hành sáng cùng ngày; bản next là 2.40.2. Yêu cầu Node đổi ở giữa:
- n8n 2.35.7 ghi
engines.nodelà>=22.22. - Từ n8n 2.36.0 (phát hành 18/08/2026), cả 2.37.0, 2.38.0, 2.39.0 đều ghi
>=24.0.0.
Tự kiểm trên máy bạn:
node -v
npm view n8n@latest version engines.nodeMáy thử in v22.22.0, rồi version = '2.39.7' và engines.node = '>=24.0.0', tức là chưa được nâng.
Chạy bản mới bằng Node cũ: --version vẫn "ổn"
Mình cài n8n 2.39.7 vào một thư mục riêng, rồi gọi bằng Node 22.22.0. Lệnh n8n --version vẫn in 2.39.7 bình thường, vì tệp khởi động trả phiên bản trước khi kiểm Node. Lệnh thật như n8n list:workflow thì thoát sau 187 ms:
Your Node.js version 22.22.0 is currently not supported by n8n.
Please use a Node.js version that satisfies the following version range: >=24.0.0Lệnh dừng trước khi chạm vào cơ sở dữ liệu. Nhưng nếu bạn chỉ dùng --version để kiểm tra sau khi cập nhật, bạn sẽ tưởng mọi thứ đã xong.
Nâng bằng Node 24 trên bản sao dữ liệu
Thứ tự mình làm:
- Sao lưu theo cả Cách 1 và Cách 2, ghi khoá mã hoá ra chỗ riêng.
- Tải Node 24 LTS (v24.21.0, bản zip cho Windows 37.618.919 byte).
- Cài bản n8n mới bằng npm của Node 24 vào thư mục riêng.
npm install n8n@2.39.7chạy 149 giây, "added 2287 packages". - Chạy bản mới trên bản sao thư mục dữ liệu trước, chưa đụng bản đang dùng.
Lần chạy đầu, n8n 2.39.7 áp 20 migration mới trong 38.256 ms. Sau đó nó liệt kê đủ 2 workflow, và credential giả vẫn giải mã ra đúng giá trị vì khoá trong config giữ nguyên.


Còn chiều quay lại thì sao? Mình chạy lại n8n 2.35.7 trên dữ liệu đã nâng cấp: lệnh liệt kê workflow vẫn chạy. Nhưng mình chưa chạy cả server bản cũ trên dữ liệu đó, nên không thể nói quay lại là an toàn. Đường lùi chắc chắn vẫn là bản sao lưu làm trước khi nâng.
Những cảnh báo khởi động nên đọc
Cả bản 2.35.7 và 2.39.7 khi chạy bằng npm đều in một khối cảnh báo. Ba dòng đáng chú ý nhất với người self host n8n:
- "Running n8n outside a container is deprecated. Future versions will require running n8n via the official Docker image." Cách cài bằng npm đang được báo là sẽ bị bỏ ở các bản sau.
N8N_RUNNERS_TASK_TIMEOUT: thời gian chờ mặc định của task sẽ giảm từ 300 giây xuống 60 giây.N8N_UNVERIFIED_PACKAGES_ENABLED: mặc định sẽ chuyển thànhfalse, ảnh hưởng tới việc cài community node chưa xác minh.
Bản 2.39.7 báo thêm biến N8N_RUNNERS_ENABLED không còn cần, và chế độ task runner internal sắp bị bỏ.
Bẫy cổng 5679
Khi dựng bản thử, mình đặt N8N_PORT=5679 và gặp "Cannot GET /" trên mọi trang, trong khi /healthz vẫn trả 200. Log khởi động ghi rõ: "n8n Task Broker ready on 127.0.0.1, port 5679". Task Broker của n8n mặc định dùng cổng 5679 (khai báo trong gói @n8n/config, biến N8N_RUNNERS_BROKER_PORT). Gọi 127.0.0.1:5679 là trúng broker chứ không phải giao diện.
Đổi sang N8N_PORT=5690, các đường /, /signin, /rest/settings đều trả 200. Nếu chạy hai bản n8n trên cùng máy, chọn cổng giao diện tránh 5679.
Những gì mình chưa kiểm
- Self host n8n bằng Docker, Postgres, chế độ queue.
- Chép thư mục
.n8ntrong lúc n8n đang chạy. - Chạy server bản cũ trên dữ liệu đã nâng cấp.
- Đổi cổng broker bằng
N8N_RUNNERS_BROKER_PORT: mình mới đọc thấy trong mã, chưa chạy thử.
- Tác giả
- Quản trị viên
- Đăng ngày
- 2026-09-17
- Cập nhật
- 2026-09-17
- Thời gian đọc
- 7 phút đọc
- Tất cả bài viết