Mục lục

Nâng cao: Migrate N8N sang PostgreSQL

SQLite không đủ cho Production? Hướng dẫn chuyển đổi database N8N sang PostgreSQL để tăng tốc độ và sự ổn định.

Mặc định hướng dẫn trước cài N8N dùng SQLite. Đây là lựa chọn tốt cho cá nhân hoặc demo. Tuy nhiên, khi bạn có nhiều workflow chạy song song hoặc cần lưu trữ lịch sử execution lâu dài, SQLite sẽ trở nên chậm chạp và dễ lỗi file lock.

PostgreSQL là chuẩn mực cho Production của N8N. Bài viết này hướng dẫn bạn cách chuyển đổi an toàn mà không mất dữ liệu.

Quy trình tổng quan

  1. Backup: Xuất (Export) Workflow và Credential hiện tại ra file JSON.
  2. Cấu hình: Sửa file compose.yaml để thêm PostgreSQL.
  3. Deploy: Chạy lại container mới.
  4. Restore: Nhập (Import) lại dữ liệu vào database mới.

Bước 1: Sao lưu dữ liệu cũ (SQLite)

Trước khi đụng vào database, hãy xuất mọi thứ ra file để an toàn. Chúng ta sẽ dùng CLI của N8N ngay trong container đang chạy.

bash:
# Vào thư mục chứa file compose.yaml (ví dụ n8n-docker)
cd ~/n8n-docker

# 1. Tạo thư mục chứa backup
mkdir -p backup-data

# 2. Xuất Workflow ra file JSON
docker compose exec n8n n8n export:workflow --all --output=/home/node/.n8n/workflows.json

# 3. Xuất Credentials (phải có flag --decrypted để sang DB mới đọc được)
docker compose exec n8n n8n export:credentials --all --decrypted --output=/home/node/.n8n/credentials.json

# 4. Copy file từ trong container ra máy thật
docker compose cp n8n:/home/node/.n8n/workflows.json ./backup-data/
docker compose cp n8n:/home/node/.n8n/credentials.json ./backup-data/

Lúc này trong thư mục backup-data của bạn đã có 2 file json quan trọng nhất.


Bước 2: Cập nhật Docker Compose

Chúng ta sẽ sửa file compose.yaml để thêm dịch vụ PostgreSQL và cấu hình N8N kết nối vào đó.

Mở file:

bash:
nano compose.yaml

Nội dung mới (Hãy thay thế nội dung cũ):

yaml:
services:
  postgres:
    image: postgres:16-alpine
    container_name: postgres
    restart: always
    environment:
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=MatKhauSieuManh123  # <--- Đổi mật khẩu này!
      - POSTGRES_DB=n8n
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -h localhost -U n8n -d n8n"]
      interval: 5s
      timeout: 5s
      retries: 5

  n8n:
    image: docker.n8n.io/n8nio/n8n
    container_name: n8n
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      # Cấu hình Domain cũ
      - N8N_HOST=n8n.english4it.site
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - WEBHOOK_URL=https://n8n.english4it.site/
      - GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
      
      # CẤU HÌNH MỚI: KẾT NỐI POSTGRES
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=MatKhauSieuManh123 # <--- Phải trùng với bên trên
    volumes:
      - ./n8n_data:/home/node/.n8n
      # Mount folder backup vào để lát import
      - ./backup-data:/backup 
    depends_on:
      postgres:
        condition: service_healthy

Bước 3: Khởi chạy hệ thống mới

bash:
# 1. Tắt hệ thống cũ
docker compose down

# 2. Xóa container cũ để sạch sẽ
docker rm n8n

# 3. Chạy hệ thống mới (Sẽ tự tạo DB Postgres mới)
docker compose up -d

Lúc này, N8N đã chạy lại nhưng là một trang trắng tinh (brand new). Đừng lo, chúng ta sẽ nạp lại dữ liệu.


Bước 4: Khôi phục dữ liệu (Import)

Chúng ta sẽ import 2 file json đã backup ở Bước 1 vào N8N mới.

bash:
# 1. Import Credentials trước (Để workflow import vào có account dùng luôn)
docker compose exec n8n n8n import:credentials --input=/backup/credentials.json

# 2. Import Workflows
docker compose exec n8n n8n import:workflow --input=/backup/workflows.json

Hoàn tất! Giờ bạn hãy truy cập lại https://n8n.english4it.site.

  • Đăng nhập lại (Bạn sẽ cần tạo lại user admin mới vì bảng User nằm trong DB và chúng ta không backup user, chỉ backup workflow).
  • Kiểm tra mục Workflows: Tất cả đã quay lại.
  • Kiểm tra mục Credentials: Tất cả kết nối đã sẵn sàng.

Tại sao bước này quan trọng?

Sử dụng PostgreSQL giúp:

  • Không bị crash khi chạy nhiều việc cùng lúc.
  • Vacuum tốt hơn: Dữ liệu execution log không làm phình file SQLite vô hạn định gây đầy ổ cứng.
  • Scalable: Sau này tách Database ra server riêng dễ dàng.

5. Troubleshooting (Sửa lỗi thường gặp)

Lỗi: additional properties 'yservices' not allowed

Nguyên nhân: Bạn bị thừa ký tự hoặc gõ sai trong file compose.yaml. Ví dụ: Dòng đầu tiên services: bị sửa thành yservices: hoặc bạn paste nhầm ký tự lạ vào.

Cách sửa:

  1. Mở lại file: nano compose.yaml
  2. Kiểm tra dòng đầu tiên (hoặc các dòng cấp 1). Đảm bảo chuẩn xác là:
    yaml:
    services:
      postgres:
        ...
  3. Xóa các ký tự thừa (như chữ y ở đầu).
  4. Lưu lại (Ctrl+O -> Enter) và chạy lại lệnh.
Quảng cáo
mdhorizontal