Cài đặt n8n trên VPS Ubuntu 24.04 bằng Docker Compose

SSH vào VPS Ubuntu 24.04 mới tinh, việc đầu tiên cần làm là cài ngay một instance n8n để bắt đầu tự động hóa công việc. Với Docker Compose, bạn có thể hoàn tất việc này trong vòng 15 phút, bao gồm cả cơ sở dữ liệu PostgreSQL riêng và reverse proxy Nginx với HTTPS. Bài viết này đi từng bước cụ thể, từ cài Docker, kéo image, cấu hình file compose cho đến thiết lập backup và các lỗi hay gặp khi chạy n8n trên VPS.
Yêu cầu trước khi bắt đầu
- Một VPS chạy Ubuntu 24.04 LTS với quyền
sudo. Bạn có thể thuê VPS Linux tại các nhà cung cấp uy tín trong nước để có độ trễ thấp. - Ít nhất 1 GB RAM (khuyến nghị 2 GB cho workflow production). Xem gói VPS 2GB RAM nếu bạn chưa có.
- Tên miền đã trỏ DNS về IP VPS (nếu muốn dùng HTTPS).
- Cổng 80 và 443 mở trên firewall.
Vì sao dùng Docker Compose cho n8n?
Chạy n8n qua Docker Compose mang lại ba lợi ích chính. Thứ nhất, bạn có PostgreSQL làm database riêng thay vì SQLite mặc định, quan trọng khi cần backup và phục hồi. Thứ hai, toàn bộ cấu hình n8n, Docker và các dịch vụ đi kèm (Redis nếu dùng queue mode) nằm gọn trong một file docker-compose.yml, dễ nhân bản sang VPS khác. Thứ ba, việc cập nhật n8n chỉ là gõ docker compose pull && docker compose up -d.
Bước 1 - Cài đặt Docker và Docker Compose trên Ubuntu 24.04
Đảm bảo hệ thống đã được cập nhật, sau đó cài Docker từ repo chính thức.
sudo apt update && sudo apt upgrade -y
sudo apt install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Thêm user hiện tại vào group docker để không cần sudo mỗi lần gõ lệnh, rồi kiểm tra.
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version
Output mong đợi: Docker version 29.6.2 và Docker Compose version v2.33.0 (hoặc cao hơn).
Bước 2 - Tạo cấu trúc thư mục và file .env
Tạo thư mục chứa toàn bộ dữ liệu n8n và file biến môi trường riêng cho nhạy cảm.
mkdir -p ~/n8n/data ~/n8n/backup
cd ~/n8n
nano .env
Nội dung file .env:
N8N_ENCRYPTION_KEY=your-strong-random-32-char-key-here
POSTGRES_USER=n8n_user
POSTGRES_PASSWORD=strong_db_password_here
POSTGRES_DB=n8n_db
N8N_HOST=n8n.your-domain.com
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.your-domain.com/
GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
Quan trọng: Thay your-strong-random-32-char-key-here bằng một chuỗi ngẫu nhiên dài 32 ký tự (dùng openssl rand -hex 16 để sinh). Mất key này sẽ mất tất cả credential đã lưu trong n8n. Đặt quyền chỉ user đọc file.
chmod 600 ~/n8n/.env
Bước 3 - Tạo file docker-compose.yml
nano ~/n8n/docker-compose.yml
Dán nội dung sau:
version: "3.9"
services:
postgres:
image: postgres:16-alpine
container_name: n8n-postgres
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- ./data/postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
n8n:
image: n8nio/n8n:latest
container_name: n8n-app
restart: always
depends_on:
postgres:
condition: service_healthy
ports:
- "127.0.0.1:5678:5678"
environment:
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- N8N_HOST=${N8N_HOST}
- N8N_PORT=${N8N_PORT}
- N8N_PROTOCOL=${N8N_PROTOCOL}
- WEBHOOK_URL=${WEBHOOK_URL}
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
volumes:
- ./data/n8n:/home/node/.n8n
links:
- postgres
Giải thích:
- n8n chỉ listen trên localhost (127.0.0.1:5678) để không expose ra ngoài trực tiếp, reverse proxy Nginx bên ngoài mới xử lý cổng 443.
- PostgreSQL dùng image
16-alpinenhẹ, có healthcheck để n8n chỉ chạy khi database sẵn sàng. - Volume mount thư mục
./data/tương ứng cho từng service để dễ backup.
Bước 4 - Khởi chạy n8n lần đầu
cd ~/n8n
docker compose up -d
Lần đầu sẽ kéo image PostgreSQL và n8n từ Docker Hub. Kiểm tra trạng thái:
Bước 5 - Cấu hình Nginx làm reverse proxy với HTTPS
Cài Nginx và Certbot:
sudo apt install nginx certbot python3-certbot-nginx -y
Tạo file cấu hình Nginx cho n8n:
sudo nano /etc/nginx/sites-available/n8n
server {
listen 80;
server_name n8n.your-domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name n8n.your-domain.com;
ssl_certificate /etc/letsencrypt/live/n8n.your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/n8n.your-domain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_set_header X-Forwarded-Host $host;
proxy_buffering off;
}
}
Kích hoạt site và xin chứng chỉ SSL tự động:
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d n8n.your-domain.com
Verify: Truy cập https://n8n.your-domain.com, n8n sẽ xuất hiện với ổ khóa xanh. Nếu không, xem log Nginx với sudo journalctl -u nginx -f.
Bước 6 - Cấu hình firewall và bảo mật
Nếu dùng UFW (mặc định trên Ubuntu 24.04), mở các cổng cần thiết và đóng cổng n8n trực tiếp.
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 5678
sudo ufw enable
sudo ufw status verbose
Vì n8n chỉ listen trên localhost (127.0.0.1:5678), cổng này không thể truy cập từ ngoài, deny 5678 là dự phòng. Không expose n8n ra ngoài nếu không có reverse proxy.
Bước 7 - Backup dữ liệu n8n đúng cách
Backup n8n cần đủ 2 thành phần: encryption key (đã đặt trong .env) và database PostgreSQL + thư mục data/n8n (chứa credential và workflow files). Đây là lệnh backup thủ công dùng Docker:
cd ~/n8n
docker compose exec -T postgres pg_dump -U $POSTGRES_USER $POSTGRES_DB > backup/n8n_db_$(date +%Y%m%d).sql
tar -czf backup/n8n_data_$(date +%Y%m%d).tar.gz data/
echo "Backup hoàn tất: backup/n8n_db_$(date +%Y%m%d).sql và backup/n8n_data_$(date +%Y%m%d).tar.gz"
Thêm dòng trên vào crontab để chạy tự động mỗi ngày: crontab -e rồi thêm
0 3 * * * cd /home/youruser/n8n && docker compose exec -T postgres pg_dump -U $POSTGRES_USER $POSTGRES_DB > backup/n8n_db_$(date +\%Y\%m\%d).sql && tar -czf backup/n8n_data_$(date +\%Y\%m\%d).tar.gz data/
Hướng dẫn này cũng áp dụng nếu bạn thuê VPS n8n đã cài sẵn, bạn vẫn nên chủ động backup ra ngoài.
Bước 8 - Xử lý lỗi thường gặp khi chạy n8n trên VPS
Lỗi "Encryption key missing": Chưa set biến N8N_ENCRYPTION_KEY trong file .env. Kiểm tra lại và chạy docker compose up -d sau khi sửa.
Lỗi "Cannot connect to database": PostgreSQL chưa kịp khởi tạo. Chạy docker compose logs postgres xem có lỗi gì không. Xóa volume cũ nếu cần: docker compose down -v rồi chạy lại.
Lỗi "502 Bad Gateway" từ Nginx: n8n chưa chạy hoặc sai cổng proxy. Kiểm tra docker compose ps và log Nginx với sudo tail -f /var/log/nginx/error.log.
Log chẩn đoán tổng quát: journalctl -u docker -f xem Docker container có restart liên tục không. Thường do thiếu RAM, n8n cần ít nhất 512 MB RAM trống cho process chính.
Câu hỏi thường gặp
Có cần cài thêm Redis cho n8n không?
Không bắt buộc. Redis chỉ cần khi bạn chạy n8n ở queue mode (tách worker riêng để xử lý workflow song song). Với 1-5 workflow chạy đồng thời, chế độ mặc định (main process) là đủ. Nếu bạn có kế hoạch mở rộng, thêm service Redis vào docker-compose.yml và set biến EXECUTIONS_MODE=queue.
Tôi nên dùng SQLite hay PostgreSQL cho n8n?
PostgreSQL, đặc biệt trên production. SQLite không hỗ trợ backup nóng (pg_dump), dễ bị lock khi nhiều workflow chạy cùng lúc. Nếu VPS có RAM thấp (dưới 1 GB), SQLite có thể tạm dùng được, nhưng nâng cấp lên PostgreSQL sớm sẽ an toàn hơn.
Làm sao để cập nhật n8n lên phiên bản mới?
Chỉ cần chạy hai lệnh: docker compose pull để kéo image mới, rồi docker compose up -d để khởi động lại container. Kiểm tra log với docker compose logs -f n8n xem có lỗi migration database không. Nên backup trước khi update.
Nên dùng bản n8n latest hay bản stable?
Dùng n8nio/n8n:latest cho bản mới nhất (có feature mới, nhưng tiềm ẩn lỗi). Hoặc n8nio/n8n:stable cho bản đã được test kỹ. Nếu bạn không thích rủi ro, chọn stable. Xem tag trên Docker Hub trước khi chọn.
VPS bao nhiêu RAM là đủ cho n8n?
Với 1-2 workflow đơn giản, 1 GB RAM là tối thiểu (dùng SQLite). Với PostgreSQL và 5-10 workflow, cần 2-4 GB RAM. Nếu bạn dùng queue mode + nhiều worker, 4-8 GB RAM sẽ thoải mái. Xem gói VPS NVMe 4GB RAM nếu bạn cần dung lượng trung bình.
Bài viết liên quan
- n8n là gì? Những ai nên sử dụng n8n?
- Chạy n8n liên tục trên VPS mà không cần biết Docker
- Backup n8n đúng cách: Encryption key, database và credential
- Chọn RAM cho n8n theo số workflow chạy song song


