AI Automation

Tự host n8n trong 10 phút: nền móng cho mọi workflow AI automation

Tóm tắt

n8n là nền tảng workflow automation “fair-code”, tự host được. Chạy thử: tạo volume n8n_data và docker run image n8n ở cổng 5678. Khi chạy thật: dùng Postgres, đặt sau reverse proxy có HTTPS, đặt N8N_ENCRYPTION_KEY cố định, sao lưu định kỳ.

Hầu hết các bài về AI automation trên binhAI đều dùng n8n — nền tảng workflow kéo thả có hàng trăm tích hợp sẵn, node AI Agent, và quan trọng nhất là tự host được. Bài này đi từ chạy thử trong 2 phút trên laptop đến một bản cài đặt đủ chuẩn để chạy thật: Postgres, HTTPS, khoá mã hoá, sao lưu và cập nhật.

Chạy thử trên máy (2 phút)

Cần Docker Desktop (Mac, Windows, Linux) hoặc Docker Engine trên server Linux.

docker volume create n8n_data

docker run -it --rm --name n8n -p 5678:5678 \
  -e GENERIC_TIMEZONE="Asia/Ho_Chi_Minh" -e TZ="Asia/Ho_Chi_Minh" \
  -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
  -v n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n
# mở http://localhost:5678
  • GENERIC_TIMEZONE quyết định múi giờ cho các node lịch (Schedule Trigger); TZ là múi giờ hệ thống. Quên đặt là workflow “8h sáng” chạy lúc 3h chiều.
  • Volume n8n_data lưu khoá mã hoá, log và dữ liệu — xoá volume là mất credential.
  • Kênh phát hành: stable cho production, beta là bản mới nhất có thể chưa ổn định.

Tài liệu chính thức nhấn mạnh: tự host đòi hỏi kỹ năng kỹ thuật; cấu hình sai có thể gây mất dữ liệu, lỗ hổng bảo mật và downtime. Nếu team chưa có ai vận hành server, n8n Cloud là lựa chọn an toàn hơn.

Cấu hình để chạy thật: Docker Compose + Postgres

n8n mặc định dùng SQLite — đủ để thử, nhưng khi có nhiều workflow chạy đồng thời và cần sao lưu tử tế, hãy chuyển sang Postgres:

# docker-compose.yml (rút gọn)
services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes: [pg_data:/var/lib/postgresql/data]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]

  n8n:
    image: n8nio/n8n:<phiên-bản-cố-định>     # không dùng :latest khi chạy thật
    ports: ["127.0.0.1:5678:5678"]           # chỉ reverse proxy truy cập được
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_HOST: n8n.congty.vn
      N8N_PROTOCOL: https
      WEBHOOK_URL: https://n8n.congty.vn/
      GENERIC_TIMEZONE: Asia/Ho_Chi_Minh
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
    volumes: [n8n_data:/home/node/.n8n]
    depends_on: [postgres]

volumes: { pg_data: {}, n8n_data: {} }

Giữ volume .n8n kể cả khi đã dùng Postgres — nó chứa khoá mã hoá, log và dữ liệu source control.

Ba biến môi trường quan trọng nhất

BiếnVì sao quan trọng
N8N_ENCRYPTION_KEYMã hoá mọi credential lưu trong database. Đổi khoá là toàn bộ credential đã lưu không dùng được nữa. Tạo một lần (openssl rand -hex 32), cất trong secret manager.
WEBHOOK_URLĐịa chỉ HTTPS công khai; n8n dùng nó để tạo URL webhook đưa cho dịch vụ bên ngoài. Sai là webhook từ GitHub, Stripe… không tới được.
N8N_HOST / N8N_PROTOCOLTên miền công khai và giao thức của instance.

HTTPS và reverse proxy

  • Cho n8n lắng nghe 127.0.0.1:5678, đặt Nginx, Caddy hoặc Cloudflare Tunnel phía trước để cấp HTTPS.
  • Với Nginx: bật header nâng cấp WebSocket, tăng client_max_body_size (vd 50M) và proxy_read_timeout (vd 3600 giây) để workflow chạy lâu không bị cắt.
  • Một VPS 5–10 USD/tháng (Ubuntu 22.04/24.04) đủ cho hàng nghìn lượt chạy mỗi ngày với workflow thông thường.

Sao lưu và cập nhật

Thành phầnCách sao lưu
Database Postgrespg_dump hằng đêm, đẩy lên object storage (S3, B2…)
Volume n8n_dataNén hằng tuần — chứa file đính kèm, custom node
WorkflowExport JSON và lưu trong Git
N8N_ENCRYPTION_KEYLưu riêng trong secret manager — mất khoá là mất credential

Cập nhật: đổi tag image cố định trong commit, đọc changelog trước khi lên bản lớn, snapshot Postgres trước khi nâng, rồi docker compose pull → down → up -d. Lỗi thì quay về tag cũ. Lưu ý từ n8n 2.0, biến N8N_RUNNERS_ENABLED không còn cần thiết.

Thử nghiệm sao lưu: một bản sao lưu chưa từng được restore thử thì chưa phải là bản sao lưu.

Self-host hay n8n Cloud?

Self-hostn8n Cloud
Dữ liệuNằm trên hạ tầng của bạnTrên hạ tầng n8n
Chi phíVPS cố định, không giới hạn lượt chạyTheo gói và số lượt chạy
Vận hànhBạn lo vá OS, chứng chỉ, ổ đĩa, sao lưun8n lo
Mở rộngCài community node qua npmTheo chính sách nền tảng

Giấy phép: n8n dùng Sustainable Use License (fair-code) — dùng nội bộ thoải mái, nhưng nếu định bán lại n8n như một dịch vụ cho người khác thì cần đọc kỹ điều khoản.

Bảo mật tối thiểu

  • Không mở cổng 5678 trực tiếp ra internet; chỉ qua reverse proxy có HTTPS.
  • Bật xác thực hai lớp cho tài khoản quản trị; mỗi người một tài khoản.
  • .env chứa mật khẩu và khoá không bao giờ commit vào Git.
  • Credential trong n8n được mã hoá trong database, không nằm trong JSON workflow — export workflow chia sẻ được an toàn hơn.

Áp dụng thế nào?

  • Dev: Chạy bản Docker một lệnh trên laptop để học, rồi chuyển lên VPS với Compose + Postgres khi có workflow cần chạy 24/7.
  • Tech Lead / DevOps: Quản lý docker-compose.yml trong Git, ghim tag image, tự động sao lưu và có runbook khôi phục.
  • PM: Một instance n8n nội bộ là “nền móng” cho hàng loạt tự động hoá: báo cáo, phân loại ticket, bản tin. Chi phí hạ tầng rất thấp — chi phí thật là người vận hành.

Nguồn & tham khảo

  1. Docker installation — n8n Docs
  2. Running n8n locally without regrets — DEV Community