Hướng dẫn · n8n

Cài n8n trên VPS Ubuntu 24.04 bằng Docker, có HTTPS tự động

Từng bước dựng n8n tự lưu trữ trên VPS: Docker Compose, tên miền riêng, chứng chỉ HTTPS tự gia hạn, cách cập nhật và sao lưu workflow an toàn.

Cập nhật 01/11/2026Đọc khoảng 4 phút

Chuẩn bị

  • VPS chạy Ubuntu 24.04, tối thiểu 2 vCPU và 2 GB RAM. Nhiều workflow chạy song song nên dùng từ 4 vCPU, 6 GB RAM.
  • Một tên miền con dành cho n8n, ví dụ n8n.tenmien.vn.
  • Tài khoản có quyền sudo trên VPS và một phần mềm SSH như Terminal, PowerShell hoặc Termius.
Đã thuê VPS n8n cài sẵn?

Nếu chọn ứng dụng n8n khi đặt máy tại thuevpsmanh, n8n đã chạy sẵn. Bạn chỉ cần làm bước gắn tên miền và có thể bỏ qua phần cài đặt.

Bước 1: Trỏ tên miền về VPS

Vào trang quản lý DNS của tên miền (nhà đăng ký hoặc Cloudflare), tạo bản ghi:

LoạiTênGiá trị
An8nĐịa chỉ IPv4 của VPS

Sau vài phút, kiểm tra từ máy tính hoặc ngay trên VPS. Lệnh phải trả về đúng IP của VPS:

bash
dig +short n8n.tenmien.vn
Dùng Cloudflare

Để trạng thái DNS only (đám mây xám) cho tới khi cài xong. Nếu bật proxy sau đó, chọn chế độ SSL Full (strict) để tránh lỗi chuyển hướng lặp.

Bước 2: Cài Docker

Đăng nhập VPS qua SSH, cập nhật hệ thống rồi cài Docker bằng script chính thức:

bash
sudo apt update && sudo apt -y upgrade
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER

Đăng xuất rồi đăng nhập lại để quyền nhóm docker có hiệu lực, sau đó kiểm tra:

bash
docker compose version

Bước 3: Tạo file cấu hình

Tạo thư mục riêng cho n8n và file compose.yaml:

bash
mkdir -p ~/n8n && cd ~/n8n
nano compose.yaml

Dán nội dung sau, thay n8n.tenmien.vn bằng tên miền của bạn:

compose.yaml
services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: unless-stopped
    environment:
      - N8N_HOST=n8n.tenmien.vn
      - N8N_PROTOCOL=https
      - N8N_PROXY_HOPS=1
      - WEBHOOK_URL=https://n8n.tenmien.vn/
      - GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
      - TZ=Asia/Ho_Chi_Minh
    volumes:
      - n8n_data:/home/node/.n8n

  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data

volumes:
  n8n_data:
  caddy_data:

Tạo file Caddyfile cùng thư mục. Caddy tự xin chứng chỉ Let's Encrypt và tự gia hạn:

Caddyfile
n8n.tenmien.vn {
    reverse_proxy n8n:5678
}

Cổng 5678 của n8n không mở ra internet; mọi truy cập đi qua Caddy bằng HTTPS.

Bước 4: Khởi động và tạo tài khoản

bash
docker compose up -d
docker compose logs -f caddy

Khi log báo certificate obtained successfully, nhấn Ctrl+C để thoát log, rồi mở https://n8n.tenmien.vn và tạo tài khoản chủ sở hữu. Tài khoản đầu tiên có toàn quyền, nên tạo ngay sau khi khởi động.

Nếu VPS bật tường lửa ufw, mở hai cổng web:

bash
sudo ufw allow 80,443/tcp

Cập nhật n8n

n8n ra bản mới thường xuyên. Trong thư mục ~/n8n:

bash
docker compose pull
docker compose up -d
docker image prune -f

Dữ liệu nằm trong volume n8n_data nên không mất khi cập nhật. Trước khi lên bản lớn, nên sao lưu theo mục dưới và đọc ghi chú phát hành của n8n.

Sao lưu workflow

Xuất toàn bộ workflow và thông tin xác thực ra tệp, rồi chép về thư mục hiện tại:

bash
docker compose exec n8n n8n export:workflow --all --output=/home/node/.n8n/workflows.json
docker compose exec n8n n8n export:credentials --all --output=/home/node/.n8n/credentials.json
docker compose cp n8n:/home/node/.n8n/workflows.json .
docker compose cp n8n:/home/node/.n8n/credentials.json .
Giữ khoá mã hoá

Thông tin xác thực được mã hoá bằng khoá lưu trong tệp /home/node/.n8n/config. Mất khoá này thì không khôi phục được credentials, nên sao lưu cả tệp config và cất ở nơi an toàn, tách khỏi VPS.

Có thể đặt lệnh trên vào cron chạy hằng ngày, hoặc dựng một workflow n8n tự đẩy bản sao lên Google Drive.

Lỗi thường gặp

Webhook hiện địa chỉ localhost:5678

Thiếu biến WEBHOOK_URL hoặc ghi sai. Sửa trong compose.yaml rồi chạy lại docker compose up -d.

Caddy không xin được chứng chỉ

Kiểm tra bản ghi A đã trỏ đúng IP bằng dig, và cổng 80, 443 đã mở. Let's Encrypt cần truy cập cổng 80 để xác thực tên miền.

Workflow chạy theo lịch bị lệch giờ

Đặt GENERIC_TIMEZONE=Asia/Ho_Chi_Minh như cấu hình trên. Mỗi workflow cũng có thể chọn múi giờ riêng trong phần Settings.

Hướng dẫn khác