Hướng dẫn Step-by-step: Cài đặt N8n Self-host trên Ubuntu 24.04.2 với Docker Compose

Hướng dẫn Step-by-step: Cài đặt N8n Self-host trên Ubuntu 24.04.2 với Docker Compose

Hướng dẫn cài đặt N8n Self-host tương tác

Hướng dẫn cài đặt N8n Self-host trên Ubuntu 24.04.2

Nội dung trang

Từng bước chi tiết để triển khai N8n với Docker Compose.

1. Chuẩn bị hệ thống

Đảm bảo máy chủ VPS Ubuntu 24.04.2 của bạn đã được cài đặt và bạn có quyền truy cập sudo.

1.1. Cài đặt Hệ điều hành Ubuntu 24.04.2 (Nếu là VPS mới)

Nếu bạn đang bắt đầu với một VPS hoàn toàn mới, hãy làm theo các bước cơ bản sau để cài đặt Ubuntu 24.04.2 LTS:

  • **Chọn hệ điều hành:** Khi tạo VPS tại nhà cung cấp dịch vụ (ví dụ: DigitalOcean, Linode, Vultr, AWS, Google Cloud, Azure), hãy chọn **Ubuntu 24.04.2 LTS** làm hệ điều hành.
  • **Cấu hình tài nguyên:** Chọn gói VPS phù hợp với nhu cầu của bạn (CPU, RAM, dung lượng lưu trữ). Đối với N8n cơ bản, 1-2GB RAM và 1-2 vCPU thường là đủ để bắt đầu.
  • **Cấu hình mạng:** Ghi lại địa chỉ IP Public của VPS của bạn.
  • **Thiết lập xác thực:**
    • **Nếu sử dụng mật khẩu:** Đặt một mật khẩu mạnh cho tài khoản người dùng root hoặc tài khoản người dùng mặc định (ví dụ: `ubuntu`).
    • **Nếu sử dụng khóa SSH (khuyến nghị):** Tải lên khóa SSH công khai của bạn (.pub file) vào VPS. Điều này an toàn hơn nhiều so với mật khẩu.
  • **Khởi tạo VPS:** Hoàn tất quá trình tạo VPS theo hướng dẫn của nhà cung cấp.
  • **Truy cập SSH lần đầu:** Sử dụng một công cụ SSH client (như PuTTY trên Windows, hoặc Terminal trên macOS/Linux) để kết nối đến VPS của bạn bằng địa chỉ IP Public và thông tin xác thực đã thiết lập.

    Đã sao chép!
    ssh username@your_vps_ip_address

    (Thay `username` bằng tên người dùng mặc định của VPS bạn, ví dụ `root` hoặc `ubuntu`, và `your_vps_ip_address` bằng địa chỉ IP Public của VPS).

Lưu ý: Quá trình cài đặt chi tiết có thể khác nhau tùy thuộc vào nhà cung cấp VPS của bạn. Hãy tham khảo tài liệu của họ nếu bạn gặp khó khăn ở bước này.

1.2. Cập nhật hệ thống

Sau khi truy cập SSH vào máy chủ VPS, chạy các lệnh sau để cập nhật các gói phần mềm:

Đã sao chép!
sudo apt update

sudo apt upgrade -y

1.3. Cài đặt các gói cần thiết

Cài đặt các gói phụ thuộc để Docker có thể hoạt động:

Đã sao chép!
sudo apt install -y ca-certificates curl gnupg lsb-release

Sau khi hoàn thành các bước này, hệ thống của bạn đã sẵn sàng để cài đặt Docker.

2. Cài đặt Docker Engine

Docker là nền tảng chính để chạy N8n.

2.1. Thêm Docker GPG key

Đã sao chép!
sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

2.2. Thêm Docker repository

Đã sao chép!
echo \

  “deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \

  $(. /etc/os-release && echo “$VERSION_CODENAME”) stable” | \

  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

2.3. Cài đặt Docker Engine

Cập nhật lại danh sách gói và cài đặt Docker Engine:

Đã sao chép!
sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2.4. Thêm người dùng vào nhóm Docker (Được khuyến nghị)

Để chạy các lệnh Docker mà không cần sudo, hãy thêm người dùng hiện tại vào nhóm docker:

Đã sao chép!
sudo usermod -aG docker $USER

newgrp docker

Lưu ý: Sau khi chạy các lệnh trên, bạn cần **đăng xuất và đăng nhập lại SSH** hoặc **khởi động lại Terminal** để thay đổi quyền có hiệu lực. Nếu bạn vẫn gặp lỗi permission denied với các lệnh Docker sau này, hãy thử khởi động lại toàn bộ máy chủ.

2.5. Kiểm tra cài đặt Docker

Đã sao chép!
docker run hello-world

Nếu bạn thấy thông báo “Hello from Docker!”, Docker đã được cài đặt thành công.

Tiếp theo, chúng ta sẽ cấu hình Docker Compose.

3. Cấu hình và chạy N8n với Docker Compose (Truy cập Local)

Docker Compose đã được cài đặt cùng với Docker Engine ở bước trước (là docker-compose-plugin). Bạn có thể kiểm tra phiên bản với docker compose version.

Chúng ta sẽ tạo một file docker-compose.yml để định nghĩa dịch vụ N8n.

3.1. Tạo thư mục cho N8n

Đã sao chép!
mkdir ~/.n8n

cd ~/.n8n

3.2. Tạo file docker-compose.yml

Sử dụng trình soạn thảo văn bản yêu thích của bạn (ví dụ: nano) để tạo file docker-compose.yml:

Đã sao chép!
nano docker-compose.yml

Dán nội dung sau vào file:

Đã sao chép!
# Lưu ý: ‘version’ không còn cần thiết với Docker Compose V2 trở lên.

# version: ‘3.8’

services:

  n8n:

    image: n8nio/n8n # Sử dụng image chính xác từ Docker Hub

    restart: always

    ports:

      – “192.168.12.225:5678:5678” # Truy cập N8n qua IP nội bộ và cổng 5678

    environment:

      – N8N_HOST=192.168.12.225 # Đặt host cho N8n

      – N8N_PORT=5678

      – N8N_PROTOCOL=http

      – WEBHOOK_URL=http://192.168.12.225:5678/ # URL webhook cho truy cập nội bộ

      – GENERIC_TIMEZONE=Asia/Ho_Chi_Minh # Múi giờ Việt Nam

      – N8N_BASIC_AUTH_ACTIVE=true # Bật xác thực cơ bản

      – N8N_BASIC_AUTH_USER=admin # Tên người dùng mặc định (thay đổi sau)

      – N8N_BASIC_AUTH_PASSWORD=your_strong_password # Mật khẩu (THAY ĐỔI BẰNG MẬT KHẨU MẠNH)

      – N8N_SECURE_COOKIE=false # Tắt secure cookie cho truy cập HTTP nội bộ

      # Cấu hình cơ sở dữ liệu PostgreSQL (Khuyến nghị cho production)

      – DB_TYPE=postgresdb

      – DB_POSTGRESDB_HOST=postgres

      – DB_POSTGRESDB_PORT=5432

      – DB_POSTGRESDB_DATABASE=n8n

      – DB_POSTGRESDB_USER=n8nuser

      – DB_POSTGRESDB_PASSWORD=n8npassword # Mật khẩu DB (THAY ĐỔI BẰNG MẬT KHẨU MẠNH)

    volumes:

      – ./n8n_data:/home/node/.n8n # Lưu trữ dữ liệu N8n

    depends_on:

      postgres:

        condition: service_healthy

    networks:

      – n8n_network

  postgres:

    image: postgres:13

    restart: always

    environment:

      – POSTGRES_DB=n8n

      – POSTGRES_USER=n8nuser

      – POSTGRES_PASSWORD=n8npassword # Mật khẩu DB (PHẢI GIỐNG Ở TRÊN)

    volumes:

      – ./pg_data:/var/lib/postgresql/data # Lưu trữ dữ liệu PostgreSQL

    healthcheck:

      test: [“CMD-SHELL”, “pg_isready -U n8nuser -d n8n”]

      interval: 5s

      timeout: 5s

      retries: 5

      start_period: 10s

    networks:

      – n8n_network

networks:

  n8n_network:

    driver: bridge

Lưu ý quan trọng:

  • Thay đổi your_strong_password bằng một mật khẩu mạnh và duy nhất cho tài khoản N8n.
  • Thay đổi n8npassword (ở cả hai chỗ) bằng một mật khẩu mạnh và duy nhất cho cơ sở dữ liệu PostgreSQL.
  • N8N_HOSTWEBHOOK_URL được đặt thành địa chỉ IP nội bộ của máy chủ VPS của bạn (ví dụ: 192.168.12.225) và cổng 5678 để truy cập nội bộ.
  • GENERIC_TIMEZONE được đặt thành Asia/Ho_Chi_Minh.
  • **Biến môi trường N8N_SECURE_COOKIE=false đã được thêm vào.** Điều này cho phép bạn truy cập N8n qua HTTP trong mạng nội bộ.
  • Cấu hình PostgreSQL được khuyến nghị cho môi trường production. N8n sẽ tạo các thư mục n8n_datapg_data trong thư mục ~/.n8n để lưu trữ dữ liệu.

Lưu file (Ctrl+O, Enter, Ctrl+X nếu dùng nano).

3.3. Cấp quyền cho thư mục dữ liệu (Quan trọng)

Để tránh lỗi permission denied, hãy đảm bảo người dùng Docker có quyền ghi vào các thư mục dữ liệu:

Đã sao chép!
sudo chown -R $USER:$USER n8n_data pg_data

sudo chmod -R 755 n8n_data pg_data

Giải thích: Lệnh này gán quyền sở hữu thư mục cho người dùng hiện tại của bạn và cấp quyền đọc/ghi/thực thi cho chủ sở hữu, và quyền đọc/thực thi cho nhóm và người khác. Điều này giúp Docker có thể ghi dữ liệu vào các volume được ánh xạ.

3.4. Chạy N8n

Trong thư mục ~/.n8n, chạy lệnh sau để khởi động N8n và PostgreSQL ở chế độ nền:

Đã sao chép!
docker compose up -d

Nếu bạn gặp lỗi permission denied khi chạy lệnh này, hãy thử **khởi động lại toàn bộ máy chủ VPS** (`sudo reboot`), sau đó đăng nhập lại và chạy lại lệnh docker compose up -d.

3.5. Kiểm tra trạng thái các container

Chờ khoảng 30-60 giây để các container khởi động hoàn chỉnh, sau đó kiểm tra trạng thái của chúng:

Đã sao chép!
docker compose ps

Bạn sẽ thấy n8npostgres đang ở trạng thái Uprunning (healthy).

3.6. Kiểm tra biến môi trường N8N_SECURE_COOKIE

Để xác nhận biến môi trường đã được áp dụng, chạy lệnh sau:

Đã sao chép!
docker inspect n8n-n8n-1 | grep N8N_SECURE_COOKIE

Bạn sẽ thấy output là ”N8N_SECURE_COOKIE=false”.

N8n của bạn đã sẵn sàng để truy cập cục bộ.

4. Truy cập N8n và Cấu hình Firewall (Truy cập Local)

4.1. Truy cập N8n

Mở trình duyệt web trên máy tính trong cùng mạng nội bộ (hoặc nếu là VPS, bạn có thể cần truy cập qua một tunnel SSH hoặc cấu hình tường lửa để truy cập tạm thời) và truy cập địa chỉ:

http://192.168.12.225:5678/

Bạn sẽ được yêu cầu nhập tên người dùng và mật khẩu đã cấu hình trong file docker-compose.yml (ví dụ: adminyour_strong_password).

4.2. Cấu hình Firewall (UFW)

Nếu bạn có tường lửa UFW trên máy chủ Ubuntu, bạn cần cho phép truy cập vào cổng 5678. Nếu bạn đã bật UFW và chỉ cho phép SSH, bạn cần thêm quy tắc này:

Đã sao chép!
sudo ufw allow 5678/tcp

sudo ufw enable # Nếu chưa bật UFW

sudo ufw reload # Áp dụng các thay đổi

Lưu ý: Khi bạn bật UFW lần đầu, nó có thể làm mất kết nối SSH hiện tại nếu bạn chưa cho phép cổng 22. Hãy đảm bảo cổng 22 đã được cho phép trước khi bật UFW.

Bây giờ bạn đã có thể truy cập N8n trong mạng nội bộ. Bước tiếp theo sẽ hướng dẫn chuẩn bị để public ra Internet.

5. Chuẩn bị cho việc Public ra Internet với tên miền n8n.icttech.vn

Để public N8n ra Internet với tên miền, bạn sẽ cần một Reverse Proxy (ví dụ: Nginx) và một chứng chỉ SSL/TLS (Let’s Encrypt được khuyến nghị).

5.1. Cấu hình DNS

Đảm bảo tên miền n8n.icttech.vn của bạn trỏ đến địa chỉ IP Public của máy chủ VPS này. Bước này thực hiện tại nhà cung cấp tên miền của bạn (ví dụ: Cloudflare, GoDaddy, v.v.).

5.2. Cấu hình Reverse Proxy (Ví dụ với Nginx)

5.2.1. Cài đặt Nginx

Đã sao chép!
sudo apt install -y nginx

5.2.2. Tạo file cấu hình Nginx cho N8n

Tạo file cấu hình:

Đã sao chép!
server {

    listen 80;

    server_name n8n.icttech.vn;

    # Chuyển hướng HTTP sang HTTPS

    return 301 https://$host$request_uri;

}

server {

    listen 443 ssl http2;

    server_name n8n.icttech.vn;

    # Đường dẫn chứng chỉ SSL – Sẽ được Certbot tạo

    # ssl_certificate /etc/letsencrypt/live/n8n.icttech.vn/fullchain.pem;

    # ssl_certificate_key /etc/letsencrypt/live/n8n.icttech.vn/privkey.pem;

    # Cấu hình SSL/TLS cơ bản (Certbot sẽ quản lý tốt hơn)

    # ssl_session_cache shared:SSL:10m;

    # ssl_session_timeout 10m;

    # ssl_protocols TLSv1.2 TLSv1.3;

    # ssl_ciphers “ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:ECDHE+AES256:DHE+AES256:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-MD5:!DHE-RSA-AES128-SHA:!DHE-RSA-AES256-SHA:!DHE-DSS-AES128-SHA:!DHE-DSS-AES256-SHA:!CAMELLIA:!SEED”;

    # ssl_prefer_server_ciphers on;

    location / {

        proxy_pass http://127.0.0.1:5678/; # Trỏ về cổng N8n trên localhost

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection “upgrade”;

        proxy_read_timeout 900s; # Tăng thời gian timeout cho các workflow dài

    }

}

Lưu ý: Các dòng ssl_certificate, ssl_certificate_key và các cấu hình SSL chi tiết khác sẽ được Certbot tự động thêm và quản lý ở bước sau. Bạn có thể để chúng ở dạng comment như trên hoặc bỏ đi ban đầu.

5.2.3. Kích hoạt cấu hình Nginx

Đã sao chép!
sudo ln -s /etc/nginx/sites-available/n8n.icttech.vn /etc/nginx/sites-enabled/

sudo nginx -t # Kiểm tra cú pháp Nginx

sudo systemctl restart nginx

5.2.4. Cài đặt Certbot và lấy chứng chỉ SSL (Let’s Encrypt)

Đã sao chép!
sudo snap install core

sudo snap refresh core

sudo snap install –classic certbot

sudo ln -s /snap/bin/certbot /usr/bin/certbot

sudo certbot –nginx -d n8n.icttech.vn

Làm theo hướng dẫn trên màn hình để hoàn tất quá trình lấy chứng chỉ. Certbot sẽ tự động cập nhật file cấu hình Nginx của bạn để sử dụng SSL.

5.3. Cập nhật cấu hình N8n Docker Compose cho Public Access

Sau khi Reverse Proxy và SSL đã hoạt động, bạn cần cập nhật file docker-compose.yml của N8n.

5.3.1. Dừng N8n

Đã sao chép!
cd ~/.n8n

docker compose down

5.3.2. Chỉnh sửa docker-compose.yml

Đã sao chép!
services:

  n8n:

    # … các cấu hình khác

    ports:

      # – “192.168.12.225:5678:5678” # Comment hoặc xóa dòng này

      – “127.0.0.1:5678:5678”      # Chỉ cho phép truy cập từ localhost (Nginx sẽ proxy)

    environment:

      # … các biến khác

–     – N8N_HOST=192.168.12.225

–     – N8N_PORT=5678

–     – N8N_PROTOCOL=http

–     – WEBHOOK_URL=http://192.168.12.225:5678/

+     – N8N_HOST=n8n.icttech.vn # Thay đổi thành tên miền public

+     – N8N_PORT=5678 # N8n vẫn chạy trên cổng 5678 nội bộ

+     – N8N_PROTOCOL=https # Giao thức sẽ là HTTPS khi truy cập qua Nginx

+     – WEBHOOK_URL=https://n8n.icttech.vn/ # Thay đổi thành URL public

      # … các biến khác

Giải thích thay đổi:

  • Phần ports: Chúng ta thay đổi để N8n chỉ lắng nghe trên 127.0.0.1:5678 (localhost). Nginx sẽ là điểm truy cập từ bên ngoài và proxy request đến N8n trên cổng này. Việc N8n không còn public trực tiếp cổng của nó ra IP mạng LAN (192.168.12.225) là một bước bảo mật tốt khi đã có reverse proxy.
  • N8N_HOST: Đặt thành tên miền public của bạn (n8n.icttech.vn).
  • N8N_PORT: N8n vẫn chạy trên cổng 5678 bên trong Docker. Nginx sẽ xử lý cổng 443 từ bên ngoài.
  • N8N_PROTOCOL: Đặt thành https vì người dùng sẽ truy cập qua Nginx với SSL.
  • WEBHOOK_URL: Cập nhật thành URL public đầy đủ với HTTPS (https://n8n.icttech.vn/). Điều này rất quan trọng để N8n tạo ra các URL webhook chính xác cho các workflow của bạn.

5.3.3. Khởi động lại N8n

Đã sao chép!
docker compose up -d

Quá trình cấu hình public đã gần hoàn tất.

6. Cấu hình Firewall cho Public Access, Lưu ý Bảo mật & Hoàn tất

6.1. Cấu hình Firewall cho Public Access

Nếu bạn đang sử dụng tường lửa (ví dụ: UFW), hãy đảm bảo các cổng 80 (HTTP) và 443 (HTTPS) được mở để truy cập từ Internet. Cổng 5678 không cần mở ra public nữa vì Nginx sẽ xử lý.

Đã sao chép!
sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

# sudo ufw deny 5678/tcp # Cân nhắc đóng cổng 5678 nếu trước đó đã mở ra public

sudo ufw reload

6.2. Hoàn tất

Bây giờ bạn có thể truy cập N8n thông qua tên miền của mình:

https://n8n.icttech.vn/

6.3. Lưu ý quan trọng về bảo mật

  • Luôn sử dụng mật khẩu mạnh và duy nhất cho tài khoản N8n (N8N_BASIC_AUTH_PASSWORD) và cho cơ sở dữ liệu PostgreSQL (DB_POSTGRESDB_PASSWORD).
  • Thường xuyên cập nhật Docker images của N8n (n8nio/n8n) và PostgreSQL (postgres:13) bằng cách chạy:

    Đã sao chép!
    cd ~/.n8n
    
    docker compose pull
    
    docker compose up -d

  • Theo dõi các bản vá bảo mật cho Ubuntu, Nginx, Docker và các thành phần khác.
  • Cân nhắc cấu hình thêm các lớp bảo mật như Fail2Ban để chống lại các cuộc tấn công brute-force vào Nginx hoặc N8n (nếu không dùng Basic Auth của N8n mà dựa vào giải pháp xác thực khác).
  • Đảm bảo Certbot tự động gia hạn chứng chỉ SSL thành công. Bạn có thể kiểm tra với:

    Đã sao chép!
    sudo certbot renew –dry-run

Chúc bạn thành công với việc cài đặt và sử dụng N8n!

Nội dung trang

Chỉ mục