Nhu cầu cài đặt FFmpeg ngay trên n8n nhằm tận dụng tài nguyên của VPS để render video luôn ngày càng cao. Bản thân mình cũng khá cần cái này. Sau mọt thời gian tìm hiểu thì mình chi sẻ hướng dẫn các bạn cách cài n8n kèm FFmpeg để các bạn vận hành một cách dể nhất.
Dưới đây là video hướng dẫn chi tiết
Còn đây là nội dung file bash cài đặt:
#!/bin/bash
set -e
###############################################################################
# Script cài đặt N8N (kèm Postgres, Redis, Docker, SSL thủ công v.v.)
# Dùng được cả cho domain chính lẫn subdomain:
# - Hỏi người dùng domain (VD: zenpr.net)
# - Hỏi subdomain (nếu để trống => cài trên domain chính)
# - Người dùng paste chứng chỉ SSL (certificate.crt & private.key)
# - Script tạo file cấu hình Nginx, Docker Compose, ...
###############################################################################
# Kiểm tra quyền root
if [ "$EUID" -ne 0 ]; then
echo "Vui lòng chạy script với quyền root (sudo)."
exit 1
fi
###############################################################################
# Thu thập thông tin từ người dùng
###############################################################################
echo "======================================"
echo " CÀI ĐẶT N8N BÁN TỰ ĐỘNG BY ZEN"
echo "======================================"
echo ""
read -p "Nhập domain chính (ví dụ: zenpr.net): " DOMAIN_NAME
read -p "Nhập subdomain (để trống nếu muốn cài trên domain chính): " SUBDOMAIN
# Xác định HOSTNAME
if [ -z "$SUBDOMAIN" ]; then
HOSTNAME="$DOMAIN_NAME"
else
HOSTNAME="${SUBDOMAIN}.${DOMAIN_NAME}"
fi
echo ""
echo "Nhập nội dung SSL Certificate (bao gồm cả dòng -----BEGIN CERTIFICATE----- ...)."
echo "Khi paste xong, nhấn Ctrl+D 2 lần để kết thúc."
SSL_CERT_CONTENT="$(</dev/stdin)" # Đọc mọi thứ cho đến khi Ctrl+D
echo ""
echo "Nhập nội dung SSL Private Key (bao gồm cả dòng -----BEGIN PRIVATE KEY----- ...)."
echo "Khi paste xong, nhấn Ctrl+D 2 lần để kết thúc."
SSL_KEY_CONTENT="$(</dev/stdin)"
echo ""
read -p "Nhập POSTGRES_USER (ví dụ: n8n_zen_demo): " POSTGRES_USER
read -p "Nhập POSTGRES_PASSWORD (ví dụ: n8n_pass_demo): " POSTGRES_PASSWORD
read -p "Nhập POSTGRES_DB (ví dụ: n8n_db_demo): " POSTGRES_DB
echo ""
read -p "Nhập dung lượng swap (GB) cần tạo (ví dụ 2GB Ram thì nhập là 2): " swap_size
###############################################################################
# Update hệ thống, cài đặt các gói cần thiết
###############################################################################
export DEBIAN_FRONTEND=noninteractive
echo "===== Cập nhật hệ thống ====="
apt update -y && apt upgrade -y
echo "===== Cài đặt một số gói cơ bản (distro-info-data, cifs-utils, etc.) ====="
apt-get install -y distro-info-data cifs-utils mhddfs unionfs-fuse unzip zip \
software-properties-common wget curl gnupg2 ca-certificates lsb-release
###############################################################################
# Tạo thư mục cài đặt N8N
###############################################################################
INSTALL_DIR="/home/${HOSTNAME}"
mkdir -p "$INSTALL_DIR"
cd "$INSTALL_DIR"
###############################################################################
# Cài đặt Nginx từ repo chính thức (nginx.org)
###############################################################################
echo "===== Cài đặt Nginx chính thức ====="
apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
wget -O- https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| tee /etc/apt/trusted.gpg.d/nginx.gpg > /dev/null
# Tạo thư mục .gnupg để tránh warning
mkdir -p -m 600 /root/.gnupg
gpg --dry-run --quiet --import --import-options import-show /etc/apt/trusted.gpg.d/nginx.gpg
echo "deb http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | tee /etc/apt/sources.list.d/nginx.list
sudo apt update -y
# Xóa Nginx cũ (nếu có)
sudo apt purge -y nginx nginx-common nginx-full nginx-core || true
# Cài Nginx mới
sudo apt install -y nginx
nginx -v
systemctl enable nginx
systemctl start nginx
# Tạo các thư mục cấu hình Nginx nếu chưa có
mkdir -p /etc/nginx/{modules-available,modules-enabled,sites-available,sites-enabled,snippets}
# Backup file cấu hình gốc
if [ -f /etc/nginx/nginx.conf ]; then
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
fi
# Ghi file /etc/nginx/nginx.conf
cat > /etc/nginx/nginx.conf << 'EOL'
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
## Basic Settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
## SSL Settings
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
## Logging Settings
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
## Gzip Settings
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
EOL
nginx -t
mkdir -p /etc/systemd/system/nginx.service.d/
echo -e "[Service]\nRestart=always\nRestartSec=10s" > /etc/systemd/system/nginx.service.d/restart.conf
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx
systemctl restart nginx
###############################################################################
# Cài đặt FFmpeg 7.1
###############################################################################
echo "===== Cài đặt FFmpeg 7.1 ====="
# Gỡ bỏ FFmpeg cũ nếu có
sudo apt remove --purge -y ffmpeg || true
sudo apt autoremove -y
# Cài FFmpeg mới
sudo add-apt-repository -y ppa:ubuntuhandbook1/ffmpeg7
sudo apt update -y
sudo apt install -y ffmpeg
###############################################################################
# Cấu hình domain cho Nginx, sử dụng file /etc/nginx/conf.d/<subdomain>.<domain>.conf
###############################################################################
CONF_FILE="/etc/nginx/conf.d/${HOSTNAME}.conf"
cat > "$CONF_FILE" <<EOL
server {
listen 80;
listen [::]:80;
server_name ${HOSTNAME};
return 301 https://\$host\$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name ${HOSTNAME};
ssl_certificate /etc/nginx/ssl/${HOSTNAME}/certificate.crt;
ssl_certificate_key /etc/nginx/ssl/${HOSTNAME}/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# Enable gzip compression for text-based resources
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
add_header Content-Security-Policy "frame-ancestors *";
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
client_max_body_size 15G;
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 Host \$http_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-Frame-Options SAMEORIGIN;
proxy_buffers 16 64k;
proxy_buffer_size 128k;
client_max_body_size 10M;
proxy_set_header X-Forwarded-Server \$host;
proxy_pass_request_headers on;
proxy_max_temp_file_size 0;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_intercept_errors on;
}
}
EOL
echo "===== Tạo thư mục SSL và ghi chứng chỉ người dùng đã nhập ====="
mkdir -p "/etc/nginx/ssl/${HOSTNAME}/"
# Ghi certificate.crt
echo "$SSL_CERT_CONTENT" | sudo tee "/etc/nginx/ssl/${HOSTNAME}/certificate.crt" > /dev/null
# Ghi private.key
echo "$SSL_KEY_CONTENT" | sudo tee "/etc/nginx/ssl/${HOSTNAME}/private.key" > /dev/null
sudo systemctl daemon-reload
sudo systemctl restart nginx
service nginx restart
###############################################################################
# Tạo swap
###############################################################################
echo "===== Tạo/Thiết lập swap dung lượng ${swap_size}GB ====="
if swapon --show | grep -q '/swapfile'; then
echo "Phân vùng swap đã tồn tại. Tiến hành hủy bỏ phân vùng cũ..."
swapoff /swapfile
rm -f /swapfile
fi
fallocate -l "${swap_size}G" /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# Thêm vào /etc/fstab nếu chưa có
if ! grep -q '/swapfile' /etc/fstab; then
echo '/swapfile none swap sw 0 0' >> /etc/fstab
fi
echo "Swap với dung lượng ${swap_size}GB đã được tạo và kích hoạt."
###############################################################################
# Cài đặt Redis
###############################################################################
echo "===== Cài đặt Redis ====="
wget -O- https://packages.redis.io/gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/redis.gpg
mkdir -p -m 600 /root/.gnupg
gpg --dry-run --quiet --import --import-options import-show /etc/apt/trusted.gpg.d/redis.gpg
echo "deb https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
# Nhiều khi script paste bị lặp, ta chỉ echo 1 dòng:
# deb https://packages.redis.io/deb jammy main (tùy version Ubuntu).
# Ở đây ta tin dùng $(lsb_release -cs) = jammy.
sudo apt update -y
sudo apt install -y redis
systemctl enable redis-server
systemctl start redis-server
###############################################################################
# Cài đặt Docker & Docker Compose
###############################################################################
echo "===== Cài đặt Docker & Docker Compose ====="
sudo apt update -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update -y
sudo apt install -y docker-ce docker-compose-plugin
systemctl start docker
systemctl enable docker
sleep 5
###############################################################################
# Mở các cổng firewall cần thiết
###############################################################################
sudo ufw allow 5432
sudo ufw allow 5678
# sudo ufw allow 5456
# sudo ufw allow 3456
###############################################################################
# Tạo docker-compose.yml và file .env cho N8N
###############################################################################
echo "===== Tạo file docker-compose.yml và .env cho N8N ====="
# .env
sudo tee "${INSTALL_DIR}/.env" > /dev/null <<EOL
#===== Thông tin tên miền =====#
DOMAIN_NAME=${DOMAIN_NAME}
SUBDOMAIN=${SUBDOMAIN}
HOSTNAME=${HOSTNAME}
N8N_PROTOCOL=https
NODE_ENV=production
#===== Thông tin Postgres =====#
POSTGRES_USER=${POSTGRES_USER}
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
POSTGRES_DB=${POSTGRES_DB}
#===== Múi giờ =====#
GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
#===== Lưu trữ file nhị phân (attachments…) trên ổ cứng thay vì DB =====#
N8N_DEFAULT_BINARY_DATA_MODE=filesystem
N8N_DEFAULT_BINARY_DATA_FILESYSTEM_DIRECTORY=/files
N8N_DEFAULT_BINARY_DATA_TEMP_DIRECTORY=/files/temp
#===== Quyền file config =====#
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
#===== Dọn dẹp logs/executions cũ =====#
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168
EXECUTIONS_DATA_PRUNE_MAX_COUNT=50000
#===== Basic Auth cho n8n =====#
N8N_BASIC_AUTH_USER=Admin
N8N_BASIC_AUTH_PASSWORD=xxxxx
EOL
# Dockerfile (thêm FFmpeg vào container)
sudo tee "${INSTALL_DIR}/Dockerfile" > /dev/null << 'EOL'
FROM n8nio/n8n:latest
USER root
# Cài ffmpeg (alpine) hoặc (debian-based). Tùy theo base image.
# n8nio/n8n:latest hiện tại là alpine, nên:
# RUN apk update && apk add ffmpeg
RUN apk update && apk add --no-cache ffmpeg
# nếu image của bạn dựa trên Debian/Ubuntu thì dùng lệnh sau thay thế cho lệnh trên
# RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*
USER node
EOL
# docker-compose.yml
sudo tee "${INSTALL_DIR}/docker-compose.yml" > /dev/null <<EOL
services:
postgres:
image: postgres:latest
container_name: postgres-\${HOSTNAME}
restart: unless-stopped
environment:
- POSTGRES_USER=\${POSTGRES_USER}
- POSTGRES_PASSWORD=\${POSTGRES_PASSWORD}
- POSTGRES_DB=\${POSTGRES_DB}
volumes:
- ./postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
n8n:
build:
context: .
dockerfile: Dockerfile
container_name: n8n-\${HOSTNAME}
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_HOST=\${HOSTNAME}
- WEBHOOK_URL=https://\${HOSTNAME}/
- 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_DEFAULT_BINARY_DATA_MODE=\${N8N_DEFAULT_BINARY_DATA_MODE}
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=\${N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS}
- N8N_FILE_IO_ALLOWED_DIRECTORIES=/home/node/.n8n
- GENERIC_TIMEZONE=\${GENERIC_TIMEZONE}
- EXECUTIONS_DATA_PRUNE=\${EXECUTIONS_DATA_PRUNE}
- EXECUTIONS_DATA_MAX_AGE=\${EXECUTIONS_DATA_MAX_AGE}
- EXECUTIONS_DATA_PRUNE_MAX_COUNT=\${EXECUTIONS_DATA_PRUNE_MAX_COUNT}
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=\${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=\${N8N_BASIC_AUTH_PASSWORD}
volumes:
- ./n8n_data:/home/node/.n8n
- ./n8n_data/files:/files
- ./n8n_data/backup:/backup
- ./n8n_data/shared:/data/shared
- ./n8n_data/custom_fonts:/home/node/custom_fonts
depends_on:
- postgres
user: "1000:1000"
EOL
echo "===== Khởi động lại Docker Compose để áp dụng quyền và cấu hình mới ====="
cd "$INSTALL_DIR"
sudo docker compose pull
# Tắt container (nếu đang chạy)
sudo docker compose down || true
# Chuyển quyền thư mục sang user 1000:1000
sudo chown -R 1000:1000 "$INSTALL_DIR"/*
# Khởi động lại docker compose ở chế độ detached
sudo docker compose up -d
echo "===== Đã tạo xong file docker-compose.yml và .env ====="
echo "============================================================================"
echo "Tất cả cài đặt đã hoàn tất."
echo "N8N đang chạy ở thư mục ${INSTALL_DIR}"
echo "Bạn vào thư mục ${INSTALL_DIR} và chạy các lệnh sau:"
echo " cd ${INSTALL_DIR}"
echo " docker compose down"
echo " chown -R 1000:1000 ${INSTALL_DIR}/*"
echo " docker compose up -d"
echo "============================================================================"
echo "Để nâng cấp N8N mỗi khi có update mới, chạy lần lượt 3 lệnh sau"
echo " cd ${INSTALL_DIR}"
echo " docker compose down"
echo " docker-compose build --pull"
echo " docker-compose up -d"
echo "============================================================================"
exit 0
#######Cài nginx#####
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring -y
wget -O- https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/nginx.gpg > /dev/null
mkdir -m 600 /root/.gnupg
gpg --dry-run --quiet --import --import-options import-show /etc/apt/trusted.gpg.d/nginx.gpg
echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt purge nginx nginx-common nginx-full nginx-core
sudo apt install nginx
nginx -v
systemctl enable nginx
systemctl start nginx
#######Cài nginx#####
mkdir /etc/nginx/{modules-available,modules-enabled,sites-available,sites-enabled,snippets}
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
cat > /etc/nginx/nginx.conf << 'EOL'
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
EOL
mkdir -p /etc/systemd/system/nginx.service.d/
echo -e "[Service]\nRestart=always\nRestartSec=10s" > /etc/systemd/system/nginx.service.d/restart.conf
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx
systemctl restart nginx
cd /home
mkdir n8n.zenpr.net
#####Cấu hình domain nginx ####
sudo tee /etc/nginx/conf.d/n8n.zenpr.net.conf > /dev/null << 'EOL'
server {
listen 80;
listen [::]:80;
server_name n8n.zenpr.net;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name n8n.zenpr.net;
ssl_certificate /etc/nginx/ssl/n8n.zenpr.net/certificate.crt;
ssl_certificate_key /etc/nginx/ssl/n8n.zenpr.net/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
#ssl_stapling on;
#ssl_stapling_verify on;
# Enable gzip compression for text-based resources
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# CORS header settings
#add_header Access-Control-Allow-Origin *;
#add_header Pragma public;
#add_header Cache-Control public;
#add_header X-Frame-Options ALLOWALL;
add_header Content-Security-Policy "frame-ancestors *";
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
# Increase the body size limit to accommodate large uploads
client_max_body_size 15G;
# Proxy settings for the application server
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 Host $http_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-Frame-Options SAMEORIGIN;
proxy_buffers 16 64k;
proxy_buffer_size 128k;
client_max_body_size 10M;
proxy_set_header X-Forwarded-Server $host;
proxy_pass_request_headers on;
proxy_max_temp_file_size 0;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_intercept_errors on;
}
}
EOL
#Tao thu muc SSL
sudo mkdir -p /etc/nginx/ssl/n8n.zenpr.net/
sudo tee /etc/nginx/ssl/n8n.zenpr.net/certificate.crt > /dev/null << 'EOL'
Điền chứng chỉ của bạn vào đây
EOL
sudo tee /etc/nginx/ssl/n8n.zenpr.net/private.key > /dev/null << 'EOL'
Điền chứng chỉ của bạn vào đây
EOL
systemctl daemon-reload
systemctl restart nginx
service nginx restart
# Khởi động lại dịch vụ Nginx để áp dụng cấu hình
systemctl restart nginx
cd /home/n8n.zenpr.net
# Khởi động lại dịch vụ Nginx để áp dụng cấu hình
systemctl restart nginx
# Cập nhật danh sách gói và cài đặt software-properties-common
sudo apt update
sudo apt install software-properties-common
#Cài mout ổ đĩa
sudo apt-get install nginx cifs-utils -y
sudo service nginx restart
cd /home/n8n.zenpr.net
mkdir -p /home/n8n.zenpr.net/{data,config}
sudo chown -R 1000:1000 /home/n8n.zenpr.net/*
###### CÀI POSTGRESQL ######
sudo apt install -y postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
# Yêu cầu nhập thông tin PostgreSQL
read -p "Nhập tên user PostgreSQL (mặc định: n8n_user): " db_user
db_user=${db_user:-n8n_user}
read -sp "Nhập mật khẩu PostgreSQL (mặc định: n8n_pass): " db_password
db_password=${db_password:-n8n_pass}
echo
read -p "Nhập tên database (mặc định: n8n_db): " db_name
db_name=${db_name:-n8n_db}
# Tạo user và database
sudo -u postgres psql <<EOF
CREATE USER ${db_user} WITH PASSWORD '${db_password}';
CREATE DATABASE ${db_name} OWNER ${db_user};
ALTER USER ${db_user} WITH SUPERUSER;
EOF
# Cho phép remote access
echo "host all all 0.0.0.0/0 md5" | sudo tee -a /etc/postgresql/*/main/pg_hba.conf
echo "listen_addresses = '*'" | sudo tee -a /etc/postgresql/*/main/postgresql.conf
sudo systemctl restart postgresql
###### END POSTGRESQL ######
mkdir -p /home/n8n.zenpr.net/{data,config}
sudo chown -R 1000:1000 /home/n8n.zenpr.net/*
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
###### ... (Phần cài đặt Nginx và các bước khác giữ nguyên) ######
# Lấy IP của host machine
read -p "Vui lòng nhập IP của VPS (ví dụ: 128.140.86.132): " host_ip
while [[ -z "$host_ip" ]]; do
echo "Bạn chưa nhập IP! Vui lòng thử lại."
read -p "Nhập IP của VPS: " host_ip
done
# Chạy container với thông tin đã nhập
docker run -d \
--name n8n \
-p 127.0.0.1:5678:5678 \
-v /home/n8n.zenpr.net/data:/home/node/.n8n \
-v /home/n8n.zenpr.net/config:/config \
-e DB_TYPE=postgresdb \
-e DB_POSTGRESDB_HOST="$host_ip" \
-e DB_POSTGRESDB_PORT=5432 \
-e DB_POSTGRESDB_USER="${db_user}" \
-e DB_POSTGRESDB_PASSWORD="${db_password}" \
-e DB_POSTGRESDB_DATABASE="${db_name}" \
-e DB_POSTGRESDB_CONNECTION_TIMEOUT=60000 \
-e N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_BASIC_AUTH_USER=Admin \
-e N8N_BASIC_AUTH_PASSWORD=834435 \
n8nio/n8n
echo "Container n8n đã được khởi chạy với:"
echo "- User PostgreSQL: ${db_user}"
echo "- Database: ${db_name}"
echo "- IP VPS: ${host_ip}"
Vị trí lưu trữ cơ sở dữ liệu PostgreSQL PostgreSQL lưu trữ dữ liệu trong thư mục mặc định: /var/lib/postgresql//main/ Ví dụ: /var/lib/postgresql/16/main/ Để xác định chính xác thư mục dữ liệu, thực hiện:
sudo -u postgres psql -c “SHOW data_directory;”
Kiểm tra thông tin cơ sở dữ liệu n8n_db
Bước 1: Đăng nhập vào PostgreSQL:
sudo -u postgres psql
Bước 2: Xem OID (Object Identifier) của CSDL n8n_db:
SELECT oid, datname FROM pg_database WHERE datname = ‘n8n_db’; Kết quả sẽ hiển thị OID (ví dụ: 16384).
Tạo một user n8n với mật khẩu: CREATE USER n8n WITH PASSWORD 'your_password';
Cấp quyền cho user n8n trên database n8n: GRANT ALL PRIVILEGES ON DATABASE n8n TO n8n;
Thoát PostgreSQL: \q
Cho phép kết nối từ bên ngoài (nếu cần):
Sửa file cấu hình PostgreSQL (pg_hba.conf): sudo nano /etc/postgresql/<version>/main/pg_hba.conf Thêm dòng sau (nếu bạn muốn n8n trong Docker kết nối PostgreSQL bên ngoài): host all all 0.0.0.0/0 md5 host all all 172.17.0.0/16 md5
Sửa file cấu hình PostgreSQL (postgresql.conf) để lắng nghe tất cả IP: sudo nano /etc/postgresql/<version>/main/postgresql.conf Tìm dòng listen_addresses và chỉnh sửa: listen_addresses = '*'
Khởi động lại PostgreSQL: sudo systemctl restart postgresql
3. Cấu hình n8n để kết nối PostgreSQL cài đặt thủ công
Trong file docker-compose.yml, sửa phần cấu hình n8n như sau:
Nếu bạn dùng Docker Compose để triển khai: Không cần cài PostgreSQL trước. Docker Compose sẽ tự động xử lý việc này.
Nếu bạn muốn PostgreSQL độc lập (không trong Docker): Thực hiện cài đặt PostgreSQL trên máy chủ trước khi chạy docker compose.
So sánh việc dùng Docker Compose PostgreSQL và PostgreSQL độc lập (không trong Docker)
1. Chạy PostgreSQL trong Docker
Ưu điểm:
Triển khai nhanh chóng:
Docker tự động tải và chạy PostgreSQL mà không cần cài đặt phức tạp trên hệ thống.
Quản lý dễ dàng:
Dễ dàng dừng, khởi động hoặc di chuyển container PostgreSQL đến máy chủ khác.
Phù hợp với mô hình DevOps, CI/CD hoặc môi trường phát triển.
Cách ly môi trường:
PostgreSQL chạy trong container hoàn toàn độc lập với hệ điều hành máy chủ, giúp giảm xung đột hoặc lỗi giữa các phiên bản.
Khả năng di động:
Bạn có thể sao chép cấu hình Docker và chạy cùng một môi trường PostgreSQL trên các máy chủ khác.
Nhược điểm:
Rủi ro mất dữ liệu:
Nếu bạn không gắn volume đúng cách (sử dụng bind volume), dữ liệu của PostgreSQL trong container có thể bị mất khi container bị xóa.
Cách khắc phục:
Sử dụng volume trong docker-compose.yml: volumes: - ./postgres_data:/var/lib/postgresql/data
Thư mục ./postgres_data sẽ lưu trữ dữ liệu bền vững trên máy chủ.
Bảo mật:
Mặc định, container PostgreSQL có thể không được tối ưu bảo mật (ví dụ: tường lửa, cấu hình truy cập mở).
Cách khắc phục:
Chỉ mở cổng PostgreSQL trong Docker network (DB_POSTGRESDB_HOST=postgres).
Đặt mật khẩu mạnh và giới hạn truy cập từ các IP đáng tin cậy.
Hiệu suất:
PostgreSQL trong Docker có thể có hiệu suất kém hơn một chút nếu bạn chạy trên máy chủ có nhiều ứng dụng hoặc sử dụng ổ đĩa chậm (vì Docker thêm một lớp ảo hóa).
Tuy nhiên, nếu máy chủ mạnh và được tối ưu, sự khác biệt là không đáng kể.
Khó khăn khi quản lý ở quy mô lớn:
Trong môi trường cần hiệu suất cao (hàng triệu bản ghi), bạn có thể cần tinh chỉnh cấu hình PostgreSQL mà Docker không hỗ trợ dễ dàng.
Backup trong Docker
Backup PostgreSQL trong Docker không khó, bạn có thể dùng:
Volume snapshot:
Backup thư mục ./postgres_data trên máy chủ: tar -czvf postgres_data_backup.tar.gz ./postgres_data
Dùng công cụ PostgreSQL như pg_dump:
Chạy lệnh bên trong container để xuất dữ liệu: docker exec -it postgres pg_dump -U n8n n8n > backup.sql
Hoặc từ bên ngoài: pg_dump -h <IP-hoặc-container-host> -U n8n -d n8n > backup.sql
2. Cài đặt PostgreSQL trực tiếp trên máy chủ
Ưu điểm:
Hiệu suất tối ưu:
PostgreSQL chạy trực tiếp trên hệ thống mà không có lớp ảo hóa, mang lại hiệu suất tốt hơn, đặc biệt khi xử lý khối lượng dữ liệu lớn.
Bảo mật:
Bạn có thể cấu hình bảo mật mạnh mẽ hơn như:
Cấp quyền chính xác trong pg_hba.conf.
Sử dụng các công cụ như fail2ban hoặc iptables để bảo vệ cổng PostgreSQL.
Quản lý dễ dàng trong môi trường lớn:
Tinh chỉnh cấu hình (như work_mem, shared_buffers) phù hợp với phần cứng của máy chủ.
Tích hợp các công cụ giám sát (như pgAdmin, Prometheus).
Nhược điểm:
Phức tạp hơn khi triển khai:
Cần cài đặt, cấu hình PostgreSQL thủ công, bao gồm tạo user, database, và mở cổng.
Không di động:
Nếu bạn muốn di chuyển sang máy chủ khác, bạn phải sao chép toàn bộ dữ liệu hoặc cấu hình thủ công.
Bảo trì khó hơn:
Khi nâng cấp PostgreSQL, bạn phải đảm bảo tương thích giữa các phiên bản và xử lý các lỗi liên quan.