Hướng dẫn migrate n8n sang VPS mới (Docker) – Đầy đủ & An toàn
BỞI: DPS.MEDIA

Hướng dẫn migrate n8n sang VPS mới (Docker) – Đầy đủ & An toàn

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.

Hướng dẫn migrate n8n sang VPS mới (Docker) – Đầy đủ & An toàn
Hướng dẫn migrate n8n sang VPS mới (Docker) – Đầy đủ & An toàn

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 (~/.n8n hay 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

  1. Mở workflow có webhook
  2. Click Test URL
  3. 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ỗiNguyên nhânCách xử lý
Credentials lỗiMất encryption keyDùng lại key cũ
Webhook trả về 404Sai WEBHOOK_URLSet đúng domain
Không thấy workflowChưa restore DBImport lại SQL
n8n restart liên tụcSai DB envKiểm tra lại .env
OAuth lỗiĐổi domainRe-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 .env và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:

  1. Database – Chứa toàn bộ workflows và executions
  2. Dữ liệu n8n – Credentials và cấu hình
  3. Encryption key – Để giải mã credentials
  4. 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!

DPS.MEDIA