n8n logoWorkflow Automation

n8n

Nền tảng tự động hoá workflow tự host, kết nối hàng trăm dịch vụ thay cho Zapier và Make.

Ghi chú review

Sử dụng PostgreSQL cho production thay vì SQLite. Nên đặt queue mode với Redis nếu có nhiều workflow chạy đồng thời.

Hướng dẫn deploy

Chạy bằng Docker Compose với PostgreSQL. Có thể thêm Redis cho queue mode.

  1. Tạo thư mục dữ liệu và file docker-compose.
  2. Cấu hình PostgreSQL làm database chính.
  3. Chạy container n8n với volume cho workflows và credentials.
  4. Tạo tài khoản admin và bắt đầu tạo workflows.
  5. Đặt webhook URL đúng nếu sử dụng webhook triggers.
Backup:Backup database PostgreSQL và thư mục .n8n chứa credentials đã mã hoá.

Copy để chạy trên server

Dùng từng block riêng: lưu compose trước, hoặc copy script bash để tạo file và chạy container.

docker-compose.ymlyaml
services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: CHANGEME_db_password # CHANGE THIS
      N8N_HOST: "n8n.example.com"
      WEBHOOK_URL: "https://n8n.example.com/"
    volumes:
      - ./data:/home/node/.n8n
    ports:
      - "5678:5678"
    depends_on:
      - postgres
    restart: unless-stopped

  postgres:
    image: postgres:16-alpine
    container_name: n8n_postgres
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: CHANGEME_db_password # CHANGE THIS
      POSTGRES_DB: n8n
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped
setup.shbash
#!/usr/bin/env bash
set -euo pipefail

sudo mkdir -p /opt/n8n
sudo chown "$USER":"$USER" /opt/n8n
cd /opt/n8n

cat > docker-compose.yml <<'COMPOSE'
services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: CHANGEME_db_password # CHANGE THIS
      N8N_HOST: "n8n.example.com"
      WEBHOOK_URL: "https://n8n.example.com/"
    volumes:
      - ./data:/home/node/.n8n
    ports:
      - "5678:5678"
    depends_on:
      - postgres
    restart: unless-stopped

  postgres:
    image: postgres:16-alpine
    container_name: n8n_postgres
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: CHANGEME_db_password # CHANGE THIS
      POSTGRES_DB: n8n
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped
COMPOSE

docker compose up -d
echo "n8n is running on http://SERVER_IP:5678"

Stack

TypeScriptNode.jsPostgreSQL