Migrate n8n từ VPS cũ sang VPS mới nghe có vẻ đơn giản, nhưng thực tế nếu thiếu một vài bước quan trọng, bạn có thể đối mặt với những lỗi nghiêm trọng như mất credentials, webhook không hoạt động, hoặc thậm chí toàn bộ workflow biến mất.
Bài viết này được viết dựa trên kinh nghiệm thực tế khi migrate n8n trong môi trường production, đảm bảo quy trình an toàn và đầy đủ nhất.

Mục tiêu của quá trình migrate
Sau khi hoàn tất migration, VPS mới phải đảm bảo:
- Đăng nhập n8n bình thường
- Tất cả workflow còn nguyên vẹn
- Credentials không bị lỗi (không hiển thị màu đỏ)
- Webhook và Cron hoạt động ổn định
- Lịch sử executions vẫn được giữ nguyên
Những thành phần cần migrate (RẤT QUAN TRỌNG)
Một stack n8n đầy đủ bao gồm 4 phần bắt buộc:
1. Database
- PostgreSQL / MySQL / SQLite
2. Thư mục dữ liệu n8n
- Workflows
- Credentials
- Executions
3. Environment variables
- Đặc biệt là
N8N_ENCRYPTION_KEY
4. Cấu hình domain & webhook
Lưu ý: Thiếu chỉ một trong bốn phần này cũng có thể khiến toàn bộ hệ thống gặp lỗi nghiêm trọng.
Bước 1: Chuẩn bị trên VPS cũ (Source VPS)
1.1. Kiểm tra n8n đang chạy
Đầu tiên, kiểm tra xem n8n đang chạy như thế nào:
bash
docker ps
docker compose ps
Xác định các thông tin sau:
- Loại database đang sử dụng
- Volume đang mount ở đâu (
~/.n8nhay Docker volume)
1.2. Backup database
Với PostgreSQL:
bash
docker exec -t postgres \
pg_dump -U n8n n8n > n8n.sql
Với MySQL:
bash
docker exec -t mysql \
mysqldump -u n8n -p n8n > n8n.sql
Với SQLite:
bash
cp ~/.n8n/database.sqlite n8n.sqlite
1.3. Backup dữ liệu n8n
Nếu dùng bind mount:
bash
tar -czvf n8n-data.tar.gz ~/.n8n
Nếu dùng Docker volume:
bash
docker run --rm \
-v n8n_data:/data \
-v $(pwd):/backup \
alpine tar czvf /backup/n8n-data.tar.gz /data
Lưu ý quan trọng: Thư mục này chứa toàn bộ credentials đã được mã hóa.
1.4. Lưu lại biến môi trường (.env)
File .env bắt buộc phải có các biến sau:
env
N8N_ENCRYPTION_KEY=
DB_TYPE=
DB_POSTGRESDB_DATABASE=
DB_POSTGRESDB_USER=
DB_POSTGRESDB_PASSWORD=
N8N_HOST=
WEBHOOK_URL=
⚠️ CẢNH BÁO: Mất N8N_ENCRYPTION_KEY đồng nghĩa với việc mất toàn bộ credentials!
Bước 2: Chuẩn bị VPS mới (Destination VPS)
2.1. Cài đặt Docker & Docker Compose
bash
apt update && apt upgrade -y
apt install docker.io docker-compose-plugin -y
systemctl enable docker --now
2.2. Tạo thư mục project
bash
mkdir -p /opt/n8n
cd /opt/n8n
Copy các file sau vào thư mục này:
docker-compose.yml.env- File backup (
n8n.sql,n8n-data.tar.gz)
Bước 3: Restore dữ liệu trên VPS mới
3.1. Restore dữ liệu n8n
Với bind mount:
bash
tar -xzvf n8n-data.tar.gz -C /
Với Docker volume:
bash
docker volume create n8n_data
docker run --rm \
-v n8n_data:/data \
-v $(pwd):/backup \
alpine tar xzvf /backup/n8n-data.tar.gz -C /
3.2. Restore database
PostgreSQL:
bash
docker compose up -d postgres
docker exec -i postgres \
psql -U n8n n8n < n8n.sql
MySQL:
bash
docker compose up -d mysql
docker exec -i mysql \
mysql -u n8n -p n8n < n8n.sql
Bước 4: Khởi động n8n
Khởi động n8n:
bash
docker compose up -d
Theo dõi log để kiểm tra:
bash
docker compose logs -f n8n
Khi thấy dòng log sau, n8n đã chạy thành công:
Editor is now accessible via:
Bước 5: Fix domain & webhook (BƯỚC DỄ BỊ QUÊN NHẤT)
5.1. Cập nhật file .env
env
N8N_HOST=n8n.domainmoi.com
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.domainmoi.com/
Sau đó restart n8n:
bash
docker compose restart n8n
5.2. Test webhook
- Mở workflow có webhook
- Click Test URL
- Gọi thử bằng browser hoặc curl
Nếu webhook lỗi, gần như chắc chắn nguyên nhân là do WEBHOOK_URL chưa được cấu hình đúng.
Bước 6: Checklist kiểm tra sau migrate
- ✅ Đăng nhập được vào n8n
- ✅ Workflow còn đủ
- ✅ Credentials không báo đỏ
- ✅ Webhook hoạt động bình thường
- ✅ Cron workflow chạy đúng lịch
- ✅ Execution history còn nguyên vẹn
Những lỗi thường gặp khi migrate n8n
| Lỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
| Credentials lỗi | Mất encryption key | Dùng lại key cũ |
| Webhook trả về 404 | Sai WEBHOOK_URL | Set đúng domain |
| Không thấy workflow | Chưa restore DB | Import lại SQL |
| n8n restart liên tục | Sai DB env | Kiểm tra lại .env |
| OAuth lỗi | Đổi domain | Re-authorize |
Kinh nghiệm thực tế
Luôn stop n8n trước khi backup:
bash
docker compose stop n8n
Một số lưu ý khác:
- Môi trường production nên sử dụng PostgreSQL thay vì SQLite
- Lưu file
.envvào password manager để tránh mất - Snapshot VPS trước khi migrate để có thể rollback nếu cần
- Nếu dùng queue mode, nhớ migrate cả Redis
Kết luận
Migration n8n sang VPS mới sẽ hoàn toàn an toàn nếu bạn đảm bảo đầy đủ 4 trụ cột:
- Database – Chứa toàn bộ workflows và executions
- Dữ liệu n8n – Credentials và cấu hình
- Encryption key – Để giải mã credentials
- Webhook – Đảm bảo domain và URL chính xác
Nếu bạn đang gặp khó khăn trong quá trình migrate hoặc cần hỗ trợ thêm, đừng ngần ngại để lại comment bên dưới. Hãy cho mình biết:
- Bạn đang dùng PostgreSQL hay MySQL?
- Single n8n hay queue mode?
- Có sử dụng reverse proxy (Nginx / Traefik / Cloudflare) không?
Mình sẽ hỗ trợ và cung cấp các lệnh cụ thể phù hợp với stack của bạn!
