Tropic Host

n8n: là gì và cách cài đặt trên VPS bằng Docker Compose

13 phút đọc
Tropic
n8n: là gì và cách cài đặt trên VPS bằng Docker Compose

n8n trên VPS: nền tảng tự động hóa của riêng bạn, không còn công việc thủ công

Một yêu cầu đến từ website. n8n xác thực dữ liệu, kiểm tra trùng lặp, tạo giao dịch, chuẩn bị bản trả lời nháp bằng AI và thông báo cho quản lý qua Telegram. Con người chỉ tham gia khi cần quyết định—không phải để chuyển dữ liệu giữa các tab trình duyệt.

Dưới đây, chúng ta sẽ xem n8n hoạt động như thế nào và cách cài đặt trên VPS bằng Docker Compose, PostgreSQL, HTTPS và thực thi mã được cô lập.

n8n trong bảy bước

Kế hoạch khởi chạy tối thiểu:

  1. Tạo VPS và trỏ tên miền phụ tới đó, chẳng hạn n8n.example.com.
  2. Cài Docker và Docker Compose.
  3. Chạy n8n cùng PostgreSQL, task runner bên ngoài và Caddy.
  4. Mở giao diện qua HTTPS và tạo tài khoản chủ sở hữu.
  5. Kết nối Telegram, CRM, email hoặc API bên ngoài.
  6. Cấu hình xử lý lỗi và thời gian lưu dữ liệu thực thi.
  7. Tự động sao lưu cơ sở dữ liệu, dữ liệu và khóa mã hóa.

Với bản cài đặt production nhỏ, bắt đầu từ 2 vCPU và 4 GB RAM là hợp lý. 2 GB thường đủ để kiểm thử, nhưng PostgreSQL, Docker và các quy trình đồng thời nhanh chóng dùng hết phần bộ nhớ còn lại.

n8n là gì và hoạt động ra sao?

n8n là nền tảng tự động hóa workflow. Một workflow được lắp ghép từ các node: một node bắt đầu quy trình, các node tiếp theo lấy và biến đổi dữ liệu, còn node cuối thực hiện hành động.

Một workflow đơn giản trông như sau:

Webhook → xác thực dữ liệu → CRM → Telegram → phản hồi website

Chuỗi có thể được kích hoạt bởi webhook, lịch, email, tin nhắn hoặc sự kiện trong dịch vụ bên ngoài. Giữa các node có điều kiện, vòng lặp, bộ lọc, thời gian chờ và xử lý lỗi.

Một trong những điểm mạnh của n8n là tự động hóa không bị giới hạn bởi các tích hợp dựng sẵn. Bạn có thể gọi bất kỳ dịch vụ nào có API qua HTTP Request, trong khi logic tùy chỉnh có thể viết trong Code node bằng JavaScript hoặc Python. Điều này đặt n8n ở khoảng giữa trình xây dựng no-code đơn giản và mã phía máy chủ tùy chỉnh.

Vì sao n8n không chỉ là chuyển tiếp dữ liệu?

n8n hữu ích khi một quy trình trải qua nhiều hệ thống và cần một quyết định:

biểu mẫu → xác thực → tìm trùng lặp → đánh giá AI → phê duyệt của quản lý → CRM

Con người chỉ cần xuất hiện tại điểm kiểm soát. Ví dụ, AI chuẩn bị câu trả lời, nhưng tin nhắn chỉ được gửi cho khách hàng sau khi nhân viên phê duyệt.

Các trường hợp sử dụng điển hình:

  • bán hàng và hỗ trợ: thu thập yêu cầu, phân công lead và tạo giao dịch;
  • nội dung và AI: soạn nháp, phân loại yêu cầu và xuất bản sau khi phê duyệt;
  • DevOps: thông báo gián đoạn, Git webhook và kiểm tra API;
  • vận hành nội bộ: đồng bộ bảng tính, email, lịch và hệ thống doanh nghiệp.

Bản cài đặt self-hosted cho bạn quyền kiểm soát quy trình và cơ sở dữ liệu, nhưng không biến các dịch vụ bên ngoài thành dịch vụ cục bộ. Dữ liệu gửi tới Telegram, CRM hoặc mô hình AI đám mây sẽ rời khỏi VPS.

n8n Cloud hay máy chủ riêng?

Tham sốn8n Cloudn8n trên VPS
Khởi chạyKhông cần thiết lập máy chủCần tên miền, Docker và HTTPS
Cập nhậtn8n xử lýChủ sở hữu xử lý
Cơ sở dữ liệu và tệpTrong hạ tầng dịch vụTrên máy chủ đã chọn
Mở rộngTheo gói cloudTự cấu hình
Trách nhiệmÍt việc quản trị hơnChủ sở hữu chịu trách nhiệm sao lưu, bảo mật và giám sát
Phù hợp nhấtBắt đầu nhanh không cần DevOpsKiểm soát, tùy chỉnh và quy trình luôn chạy

Community Edition có thể được self-host miễn phí cho các quy trình cá nhân và nội bộ doanh nghiệp. Tuy nhiên, n8n không được phân phối theo giấy phép mã nguồn mở truyền thống mà theo Sustainable Use License dạng fair-code. Giấy phép cho phép sử dụng và sửa đổi nội bộ, nhưng không cho phép bạn chỉ cần triển khai n8n, thêm logo riêng rồi bán quyền truy cập như một SaaS độc lập. Với sản phẩm như vậy, cần xem xét riêng các điều khoản giấy phép.

Yêu cầu máy chủ n8n

Tải phụ thuộc vào khối lượng dữ liệu, mức đồng thời và loại thao tác. Tệp, danh sách dài, Code node và workflow AI cần nhiều bộ nhớ hơn việc truyền các payload JSON nhỏ giữa các API.

Kịch bảnCấu hình khởi đầu
Kiểm thử và workflow văn bản cá nhân1 vCPU, 2 GB RAM, 20 GB NVMe
Bản cài đặt production nhỏ2 vCPU, 4 GB RAM, 25–40 GB NVMe
Quy trình đồng thời, AI hoặc tệp4 vCPU, 8 GB RAM trở lên
Nhiều worker ở queue modeKích thước theo khối lượng thực thi

SQLite phù hợp để học và cho thiết lập nhỏ một instance. PostgreSQL thuận tiện hơn cho production: sao lưu dễ hơn và sau này chuyển sang queue mode đơn giản hơn.

Cách cài n8n trên VPS

Ví dụ này sử dụng Ubuntu 24.04, PostgreSQL, Caddy và task runner bên ngoài. Thay n8n.example.com và múi giờ bằng giá trị của bạn.

1. Cấu hình DNS và chuẩn bị máy chủ

Tạo bản ghi DNS A trỏ tới địa chỉ IPv4 của VPS, sau đó kết nối qua SSH:

ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw openssl

Cài Docker Engine và plugin Compose từ kho chính thức:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update
apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
docker compose version

Chỉ cho phép SSH, HTTP và HTTPS:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Không đóng phiên SSH hiện tại cho đến khi xác nhận kết nối mới hoạt động.

2. Tạo biến môi trường

Chuẩn bị thư mục:

mkdir -p /opt/n8n
cd /opt/n8n

Tạo .env. Các lệnh dưới đây lập tức tạo các secret ngẫu nhiên riêng cho PostgreSQL, mã hóa n8n và task runner:

cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF

chmod 600 .env

Tag stable thuận tiện cho lần khởi chạy đầu tiên. Sau khi xác minh cài đặt, nên ghim một phiên bản n8n cụ thể để lần cập nhật image tiếp theo không xảy ra ngoài dự kiến.

Không được làm mất N8N_ENCRYPTION_KEY. n8n dùng khóa này để mã hóa mật khẩu, token và các thông tin xác thực khác đã lưu. Nếu chỉ khôi phục PostgreSQL mà không có khóa, các bản ghi vẫn còn trong cơ sở dữ liệu nhưng n8n sẽ không thể đọc chúng.

3. Tạo tệp Docker Compose

Tạo compose.yaml:

services:
  postgres:
    image: postgres:18-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: "5432"
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}

      N8N_HOST: ${N8N_HOST}
      N8N_PORT: "5678"
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_HOST}
      N8N_WEBHOOK_URL: https://${N8N_HOST}/
      N8N_PROXY_HOPS: "1"
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}

      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"

      N8N_RUNNERS_MODE: external
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0

      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: "168"
      EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
    volumes:
      - n8n_data:/home/node/.n8n
    expose:
      - "5678"
    depends_on:
      postgres:
        condition: service_healthy

  n8n-runner:
    image: n8nio/runners:${N8N_VERSION}
    restart: unless-stopped
    environment:
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
    depends_on:
      - n8n

  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    environment:
      N8N_HOST: ${N8N_HOST}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - n8n

volumes:
  postgres_data:
    name: n8n_postgres_data
  n8n_data:
    name: n8n_data
  caddy_data:
    name: n8n_caddy_data
  caddy_config:
    name: n8n_caddy_config

Task runner bên ngoài thực thi mã tách khỏi tiến trình n8n chính. Cách này an toàn hơn chế độ nội bộ và giảm khả năng lỗi trong Code node ảnh hưởng đến editor và xử lý webhook.

4. Bật HTTPS

Tạo Caddyfile:

{$N8N_HOST} {
    reverse_proxy n8n:5678
}

Caddy sẽ tự động lấy chứng chỉ TLS nếu DNS đã trỏ tới VPS và port 80, 443 có thể truy cập. Port nội bộ 5678 không được mở ra internet: bên ngoài chỉ có port 80 và 443, còn Caddy truy cập n8n qua mạng Docker.

Cần có các biến N8N_WEBHOOK_URLN8N_PROXY_HOPS để editor tạo đúng địa chỉ webhook công khai và tin cậy header từ một reverse proxy.

5. Khởi động n8n

Xác thực cấu hình cuối cùng rồi khởi động container:

docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddy

Mở:

https://n8n.example.com

Tạo tài khoản chủ sở hữu. Không chia sẻ mật khẩu với đồng nghiệp; khi làm việc nhóm, hãy dùng tài khoản riêng và chỉ cấp quyền mỗi người cần.

Workflow hữu ích đầu tiên

Một bài kiểm thử tốt là xử lý yêu cầu từ website:

  1. Thêm node Webhook với phương thức POST.
  2. Dùng Edit Fields để chỉ giữ tên, địa chỉ email và nguồn.
  3. Dùng node If để từ chối yêu cầu thiếu dữ liệu bắt buộc.
  4. Tạo giao dịch trong CRM hoặc gửi yêu cầu qua HTTP Request.
  5. Thêm thông báo Telegram.
  6. Kết thúc chuỗi bằng node Respond to Webhook.
  7. Sau khi kiểm thử, kích hoạt workflow và thay webhook kiểm thử bằng URL production.

Ví dụ này kiểm tra ngay tên miền, HTTPS, yêu cầu đến, thông tin xác thực và tích hợp bên ngoài. Tiếp theo, hãy thêm Error Workflow riêng để thông báo khi chuỗi chính thất bại.

Bảo mật n8n sau khi cài đặt

Một instance n8n đã cài chưa chắc đã đáng tin cậy. Sau khi khởi chạy, hãy bảo đảm rằng:

  • editor chỉ truy cập được qua HTTPS;
  • .env có quyền 600 và không được commit vào Git;
  • khóa API bên ngoài có quyền tối thiểu cần thiết;
  • mỗi webhook xác minh chữ ký hoặc secret của nguồn;
  • lịch sử thực thi được tự động xóa;
  • lỗi trong workflow quan trọng được gửi cho quản trị viên.

Community node được cài dưới dạng package và có thể truy cập dữ liệu workflow cùng máy chủ. Không thêm node không rõ nguồn gốc nếu chưa xem xét. Nếu không cần, hãy tắt bằng N8N_COMMUNITY_PACKAGES_ENABLED=false.

Chạy audit tích hợp sẵn:

docker compose exec n8n n8n audit

Lệnh giúp nhận diện webhook không được bảo vệ, node rủi ro và vấn đề thông tin xác thực, nhưng không thay thế việc kiểm tra thủ công.

Lịch sử thực thi và dữ liệu cá nhân

n8n lưu dữ liệu đầu vào và đầu ra để gỡ lỗi. Cùng với đó, tin nhắn email, số điện thoại, tài liệu và phản hồi API có thể còn trong cơ sở dữ liệu.

Trong cấu hình trên, các lần thực thi bị xóa sau bảy ngày và số lượng bị giới hạn ở 10.000. Với quy trình nhạy cảm, hãy chọn thời gian lưu theo chính sách lưu giữ dữ liệu và loại bỏ trường không cần thiết trước khi workflow kết thúc.

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

Việc khôi phục cần dump PostgreSQL, volume n8n_data, các tệp cấu hình và .env chứa N8N_ENCRYPTION_KEY. Trước khi sao chép, dừng các bộ xử lý nhưng để PostgreSQL tiếp tục chạy. Điều này tạo ra gián đoạn ngắn trong việc thực thi workflow:

cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner

docker compose exec -T postgres sh -c \
  'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
  | gzip > "backup/n8n-db-$(date +%F).sql.gz"

docker run --rm \
  -v n8n_data:/source:ro \
  -v "$PWD/backup":/backup \
  alpine sh -c \
  'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'

tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
  .env compose.yaml Caddyfile

docker compose start n8n n8n-runner

Kho lưu trữ chứa .env có các secret: hãy mã hóa nó và lưu bên ngoài VPS. Định kỳ xác minh bản sao lưu bằng cách thực hiện khôi phục thử.

Trước khi cập nhật, hãy sao lưu và xem ghi chú phát hành:

cd /opt/n8n
docker compose pull
docker compose up -d
docker compose ps

Task runner và container chính phải sử dụng cùng một tag phiên bản.

Khi nào cần mở rộng?

Đừng bắt đầu với Redis và nhiều worker trước khi có tải thực tế. Một instance duy nhất cùng PostgreSQL dễ bảo trì hơn và thường đáp ứng các quy trình nội bộ nhỏ.

Queue mode trở nên cần thiết khi tác vụ chạy lâu làm chậm webhook, nhiều workflow bắt đầu cùng lúc hoặc xử lý tệp thường xuyên dùng hết bộ nhớ. Trong thiết lập đó, instance chính nhận sự kiện, Redis phân phối job và worker thực thi song song. Tất cả thành phần phải kết nối cùng cơ sở dữ liệu PostgreSQL và sử dụng cùng N8N_ENCRYPTION_KEY.

Nên chọn VPS nào cho n8n?

Đối với n8n, PostgreSQL, Caddy và task runner cùng chạy, bắt đầu từ 2 vCPU, 4 GB RAM và ổ NVMe là hợp lý. Trên tropic.host, gói Light phù hợp với cấu hình này: 2 vCPU, 4 GB RAM và 25 GB NVMe. Mức này đủ cho các workflow production đầu tiên nếu không xử lý tệp nặng.

Với tài liệu, bộ dữ liệu lớn và nhiều workflow AI đồng thời, 8 GB RAM sẽ phù hợp hơn. Mạng ổn định cũng quan trọng: webhook, callback OAuth và job theo lịch phải luôn sẵn sàng.

Kết luận

n8n biến các thao tác lặp lại thành những flow trực quan rõ ràng: node dựng sẵn giúp khởi chạy nhanh, HTTP Request kết nối gần như mọi API và Code node cho phép thêm logic riêng.

Phiên bản self-hosted cho bạn quyền kiểm soát máy chủ và cơ sở dữ liệu, nhưng cần HTTPS, khóa bị giới hạn, dọn lịch sử và bản sao lưu đã xác minh. Lưu N8N_ENCRYPTION_KEY cùng PostgreSQL: không có khóa này, thông tin xác thực được khôi phục sẽ không thể giải mã.

Câu hỏi thường gặp

n8n có thể dùng miễn phí không?

Có. Community Edition có thể được lưu trữ miễn phí trên máy chủ riêng cho các quy trình cá nhân và nội bộ. Việc bán lại n8n được host như một SaaS độc lập bị hạn chế bởi giấy phép fair-code.

Có thể cài n8n mà không cần tên miền không?

Để kiểm thử cục bộ thì có. Với webhook công khai và OAuth, tốt hơn nên dùng tên miền cùng HTTPS.

n8n cần bao nhiêu RAM?

Các workflow cá nhân đơn giản thường chạy với 2 GB RAM. Với n8n cùng PostgreSQL, Caddy và task runner, 4 GB hợp lý hơn; tệp và các lần thực thi đồng thời có thể cần 8 GB trở lên.

Tất cả dữ liệu có nằm trong VPS không?

Chỉ dữ liệu mà workflow không gửi đi nơi khác. Cơ sở dữ liệu và lịch sử thực thi được lưu trên VPS, nhưng node Telegram, CRM hoặc mô hình AI bên ngoài sẽ gửi dữ liệu đã chọn tới dịch vụ tương ứng.

Bản sao lưu n8n cần bao gồm những gì?

Một dump PostgreSQL, volume n8n_data, compose.yaml, Caddyfile.env chứa N8N_ENCRYPTION_KEY. Lưu bản sao lưu ở dạng mã hóa bên ngoài VPS và xác minh bằng cách khôi phục thử.