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 trên Ubuntu 24.04.2
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:
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:
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
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
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:
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:
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
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
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:
nano docker-compose.yml
Dán nội dung sau vào file:
# 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_passwordbằ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_HOSTvàWEBHOOK_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ổng5678để truy cập nội bộ.GENERIC_TIMEZONEđược đặt thànhAsia/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_datavàpg_datatrong 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:
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:
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:
docker compose ps
Bạn sẽ thấy n8n và postgres đang ở trạng thái Up và running (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:
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ỉ:
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ụ: admin và your_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:
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
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:
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
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)
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
cd ~/.n8n
docker compose down
5.3.2. Chỉnh sửa docker-compose.yml
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ên127.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ànhhttpsvì 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
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ý.
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:
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!
const tabs = document.querySelectorAll(‘.tab-button’);
const tabContents = document.querySelectorAll(‘.tab-content’);
tabs.forEach(tab => {
tab.addEventListener(‘click’, () => {
tabs.forEach(item => item.classList.remove(‘active’));
tab.classList.add(‘active’);
const targetTab = tab.getAttribute(‘data-tab’);
tabContents.forEach(content => {
content.classList.remove(‘active’);
if (content.id === targetTab) {
content.classList.add(‘active’);
}
});
});
});
function copyCode(button) {
const codeBlock = button.parentElement;
const pre = codeBlock.querySelector(‘pre’);
const code = pre.innerText;
const tooltip = codeBlock.querySelector(‘.tooltip’);
navigator.clipboard.writeText(code).then(() => {
tooltip.style.visibility = ‘visible’;
tooltip.style.opacity = ‘1’;
setTimeout(() => {
tooltip.style.visibility = ‘hidden’;
tooltip.style.opacity = ‘0’;
}, 2000);
}).catch(err => {
console.error(‘Không thể sao chép mã: ‘, err);
tooltip.innerText = ‘Lỗi sao chép!’;
tooltip.style.backgroundColor = ‘#ef4444’; // bg-red-500
tooltip.style.visibility = ‘visible’;
tooltip.style.opacity = ‘1’;
setTimeout(() => {
tooltip.style.visibility = ‘hidden’;
tooltip.style.opacity = ‘0’;
tooltip.innerText = ‘Đã sao chép!’; // Reset tooltip text
tooltip.style.backgroundColor = ‘#1e293b’;
}, 2000);
});
}