Cài n8n sử dụng SQLite
File sh mẫu, bạn dùng thì nhớ thay thông tin cho khớp với của bạn nhé, ví dụ như domain name v..v…
#######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/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
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
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;
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/*
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
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 N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_BASIC_AUTH_USER=Admin \
-e N8N_BASIC_AUTH_PASSWORD=zenpr.net \
n8nio/n8n
Cài n8n sử dụng PostgreSQL
File sh mẫu:
#######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).
Bước 3: Đường dẫn vật lý đến CSDL:
/var/lib/postgresql//main/base//
Ví dụ:/var/lib/postgresql/16/main/base/16384/
- Backup cơ sở dữ liệu
Sử dụng pg_dump để backup toàn bộ CSDL n8n_db:
pg_dump -U n8n_user -d n8n_db -Fc -f /path/to/backup/n8n_db_backup.dump
Giải thích:
-U n8n_user: User PostgreSQL.
-d n8n_db: Tên CSDL.
-Fc: Định dạng backup nén.
-f /path/to/backup/n8n_db_backup.dump: Đường dẫn lưu file backup.
- Restore cơ sở dữ liệu
Sử dụng pg_restore để khôi phục từ file backup:
pg_restore -U n8n_user -d n8n_db -v /path/to/backup/n8n_db_backup.dump
Lưu ý:
Đảm bảo CSDL n8n_db đã tồn tại trước khi restore.
- Backup toàn bộ cụm PostgreSQL (File system level)
Bước 1: Dừng dịch vụ PostgreSQL:
sudo systemctl stop postgresql
Bước 2: Sao lưu thư mục dữ liệu:
sudo rsync -av /var/lib/postgresql/ /path/to/backup/postgresql/
Bước 3: Khởi động lại PostgreSQL:
sudo systemctl start postgresql
- Quản lý quyền truy cập
Đảm bảo user postgres có quyền đọc/ghi thư mục backup:
sudo chown -R postgres:postgres /path/to/backup/
- Lưu ý quan trọng
Không sửa trực tiếp tệp CSDL vật lý: Việc này có thể gây hỏng dữ liệu.
Tự động hóa backup: Sử dụng cron để lên lịch backup định kỳ.
Test backup: Định kỳ kiểm tra tính toàn vẹn của file backup.
Ví dụ lệnh cron để backup hàng ngày:
Mở file crontab:
crontab -e
Thêm dòng sau (thay /path/to/backup/ bằng đường dẫn thực tế):
0 2 * * * pg_dump -U n8n_user -d n8n_db -Fc -f /path/to/backup/n8n_db_$(date +\%Y\%m\%d).dump
Giải thích: Backup lúc 2:00 AM hàng ngày.
Cài n8n Trên VPS Sử Dụng CloudPanel
Trong video trên có 3 phần Mình sẽ list ra phần note của từng phần phía dưới
- 1 Docker + SQLite
visudo
n8nzenprnet ALL=(ALL:ALL) ALL
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker n8nzenprnet
exit
docker run hello-world
mkdir -p /home/n8nzenprnet/htdocs/n8n.zenpr.net/{data,config}
sudo chown -R 1000:1000 /home/n8nzenprnet/htdocs/n8n.zenpr.net/*
docker run -d \
--name n8n \
-p 127.0.0.1:5678:5678 \
-v /home/n8nzenprnet/htdocs/n8n.zenpr.net/data:/home/node/.n8n \
-v /home/n8nzenprnet/htdocs/n8n.zenpr.net/config:/config \
-e N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_BASIC_AUTH_USER=Admin \
-e N8N_BASIC_AUTH_PASSWORD=zenpr.net \
n8nio/n8n
- 2 Docker + Postgresql
////////////////////postgresql///////////////////////////////
visudo
n8nzenprnet ALL=(ALL:ALL) ALL
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker n8nzenprnet
exit
docker run hello-world
mkdir -p /home/n8nzenprnet/htdocs/n8n.zenpr.net/{data,config}
sudo chown -R 1000:1000 /home/n8nzenprnet/htdocs/n8n.zenpr.net/*
###### CÀI POSTGRESQL ######
sudo apt install -y postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo -u postgres psql
CREATE USER n8n_zen WITH PASSWORD 'n8n_zendeptrai';
CREATE DATABASE n8n_database OWNER n8n_zen;
GRANT ALL PRIVILEGES ON DATABASE n8n_database TO n8n_zen;
\q
Kiểm tra IP subnet của docker: docker network inspect bridge
sudo nano /etc/postgresql/<version>/main/pg_hba.conf
trong trường hợp này là
sudo nano /etc/postgresql/16/main/pg_hba.conf
add thêm
host all all 172.17.0.0/16 md5
sudo nano /etc/postgresql/16/main/postgresql.conf
listen_addresses = '*'
sudo systemctl restart postgresql
sudo ufw allow 5432
sudo ufw allow 5678
# Chạy container với thông tin đã nhập
docker run -d \
--name n8n \
-p 127.0.0.1:5678:5678 \
-v /home/n8nzenprnet/htdocs/n8n.zenpr.net/data:/home/node/.n8n \
-v /home/n8nzenprnet/htdocs/n8n.zenpr.net/config:/config \
-e DB_TYPE=postgresdb \
-e DB_POSTGRESDB_HOST=128.140.86.132 \
-e DB_POSTGRESDB_PORT=5432 \
-e DB_POSTGRESDB_USER=n8n_zen \
-e DB_POSTGRESDB_PASSWORD=n8n_zendeptrai \
-e DB_POSTGRESDB_DATABASE=n8n_database \
-e DB_POSTGRESDB_CONNECTION_TIMEOUT=60000 \
-e N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_BASIC_AUTH_USER=Admin \
-e N8N_BASIC_AUTH_PASSWORD=zenpr.net \
n8nio/n8n
////////////////////postgresql///////////////////////////////
///////////////////setup bang file sh ///////////////////
visudo
n8nzenprnet ALL=(ALL:ALL) ALL
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker n8nzenprnet
exit
docker run hello-world
###### 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};
GRANT ALL PRIVILEGES ON DATABASE ${db_name} TO ${db_user};
ALTER USER ${db_user} WITH SUPERUSER;
EOF
# Cho phép remote access
echo "host all all 172.17.0.0/16 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/n8nzenprnet/htdocs/n8n.zenpr.net/{data,config}
sudo chown -R 1000:1000 /home/n8nzenprnet/htdocs/n8n.zenpr.net/*
sudo ufw allow 5432
sudo ufw allow 5678
# 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/n8nzenprnet/htdocs/n8n.zenpr.net/data:/home/node/.n8n \
-v /home/n8nzenprnet/htdocs/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}"
- 3 Nodejs + SQLite
cd /home/n8nzenprnet/htdocs/n8n.zenpr.net
nano .env
nội dung như sau:
N8N_HOST=n8n.zenpr.net
N8N_PORT=5678
NODE_ENV=production
WEBHOOK_URL=https://n8n.zenpr.net
GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
PORT=5678
DB_TYPE=sqlite
DB_DATABASE=/home/n8nzenprnet/htdocs/n8n.zenpr.net/database.sqlite
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=ZenkyNemesis
N8N_BASIC_AUTH_PASSWORD=834435
N8N_DIAGNOSTICS_ENABLED=false
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false
N8N_RELEASE_TYPE=stable
N8N_DEFAULT_BINARY_DATA_MODE=default
npm install -g pm2
npm install -g npm@latest
npm install n8n -g
n8n
pm2 start npx --name n8n -- n8n
Docker compose
Đây là phương pháp khác nữa, tức là mình sẽ clone code trực tiếp từ git về VPS của mình, các bước làm như sau:
Cách 1 Docker và SQLite
git clone https://github.com/n8n-io/n8n.git n8n.zenpr.net
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
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
sudo apt install docker-ce -y
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo usermod -aG docker n8nzenprnet
sudo chown -R 1000:1000 /home/n8nzenprnet/htdocs/n8n.zenpr.net/*
Tạo file docker-compose.yml
nano docker-compose.yml
version: "3.7"
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=Admin
- N8N_BASIC_AUTH_PASSWORD=zendeptrai
- N8N_HOST=n8n.zenpr.net
- WEBHOOK_URL=https://n8n.zenpr.net/
volumes:
- ./n8n_data:/home/node/.n8n
docker compose pull
docker compose down
docker compose up -d
Cách 2 Docker + POSTGRESDB trong Docker
Giống cách trên Tạo file docker-compose.yml
nano docker-compose.yml
services:
postgres:
image: postgres:latest
container_name: postgres
restart: unless-stopped
environment:
POSTGRES_USER: n8n_zen
POSTGRES_PASSWORD: n8n_pass
POSTGRES_DB: n8n_db
volumes:
- ./postgres_data:/var/lib/postgresql/data
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=Admin
- N8N_BASIC_AUTH_PASSWORD=zendeptrai
- N8N_HOST=n8n.zenpr.net
- WEBHOOK_URL=https://n8n.zenpr.net/
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n_db
- DB_POSTGRESDB_USER=n8n_zen
- DB_POSTGRESDB_PASSWORD=n8n_pass
depends_on:
- postgres
volumes:
- ./n8n_data:/home/node/.n8n
Sau đó chạy các lệnh sau:
docker compose pull
docker compose down
docker compose up -d
Giải thích các thay đổi
- Thêm dịch vụ PostgreSQL:
- Sử dụng image chính thức
postgres:latest
. - Đặt tên người dùng, mật khẩu, và cơ sở dữ liệu thông qua các biến môi trường:
POSTGRES_USER
: Tên người dùng để n8n kết nối (ở đây làn8n
).POSTGRES_PASSWORD
: Mật khẩu cho người dùng (ví dụ:strongpassword
).POSTGRES_DB
: Tên cơ sở dữ liệu n8n sẽ sử dụng (ở đây làn8n
).
- Sử dụng image chính thức
- Cấu hình n8n để kết nối PostgreSQL:
DB_TYPE
: Chỉ định loại cơ sở dữ liệu làpostgresdb
.DB_POSTGRESDB_HOST
: Tên host của PostgreSQL (dịch vụpostgres
trong cùng Docker network).DB_POSTGRESDB_PORT
: Cổng kết nối PostgreSQL (mặc định là5432
).DB_POSTGRESDB_DATABASE
: Tên cơ sở dữ liệu mà n8n sẽ sử dụng (trùng vớiPOSTGRES_DB
).DB_POSTGRESDB_USER
: Người dùng để kết nối (trùng vớiPOSTGRES_USER
).DB_POSTGRESDB_PASSWORD
: Mật khẩu của người dùng (trùng vớiPOSTGRES_PASSWORD
).
- Volumes:
./postgres_data
để lưu trữ dữ liệu PostgreSQL bền vững trên máy chủ../n8n_data
để lưu dữ liệu khác của n8n (ngoài cơ sở dữ liệu).
depends_on
:- Đảm bảo dịch vụ
postgres
được khởi động trước khin8n
bắt đầu.
- Đảm bảo dịch vụ
Nếu cần, bạn có thể vào container PostgreSQL để kiểm tra cơ sở dữ liệu:
docker exec -it postgres psql -U n8n -d n8n
Lưu ý
- Sao lưu PostgreSQL:
- Vì bạn đang sử dụng PostgreSQL, hãy đảm bảo sao lưu thư mục
./postgres_data
hoặc sử dụng công cụ nhưpg_dump
để sao lưu cơ sở dữ liệu định kỳ.
- Vì bạn đang sử dụng PostgreSQL, hãy đảm bảo sao lưu thư mục
- Hiệu suất:
- PostgreSQL có hiệu suất tốt hơn SQLite, đặc biệt khi xử lý lượng lớn workflows hoặc chạy trên môi trường sản xuất.
- Mật khẩu và bảo mật:
- Sử dụng mật khẩu mạnh trong các biến môi trường, đặc biệt là
POSTGRES_PASSWORD
.
- Sử dụng mật khẩu mạnh trong các biến môi trường, đặc biệt là
Cách 3 Docker + POSTGRESDB trên VPS
Cài đặt PostgreSQL trực tiếp trên máy chủ
Nếu bạn muốn sử dụng PostgreSQL đã cài sẵn trên máy chủ thay vì Docker, hãy làm theo các bước dưới đây:
1. Cài đặt PostgreSQL
Trên Ubuntu, chạy các lệnh sau:
sudo apt update
sudo apt install postgresql postgresql-contrib -y
2. Cấu hình PostgreSQL
- Tạo user và database cho n8n:
- Đăng nhập vào PostgreSQL:bashCopyEdit
sudo -u postgres psql
- Tạo một database tên
n8n
:sqlCopyEditCREATE DATABASE n8n;
- Tạo một user
n8n
với mật khẩu:sqlCopyEditCREATE USER n8n WITH PASSWORD 'your_password';
- Cấp quyền cho user
n8n
trên databasen8n
:sqlCopyEditGRANT ALL PRIVILEGES ON DATABASE n8n TO n8n;
- Thoát PostgreSQL:sqlCopyEdit
\q
- Đăng nhập vào PostgreSQL:bashCopyEdit
- 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ònglisten_addresses
và chỉnh sửa:listen_addresses = '*'
- Khởi động lại PostgreSQL:
sudo systemctl restart postgresql
- Sửa file cấu hình 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:
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=<IP-hoặc-hostname-của-PostgreSQL>
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=your_password
Lựa chọn phương pháp nào?
- 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ủ.
- Sử dụng volume trong
- 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.
- Chỉ mở cổng PostgreSQL trong Docker network (
- 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
- Backup thư mục
- 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
- Chạy lệnh bên trong container để xuất dữ liệu:
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ặciptables
để bảo vệ cổng PostgreSQL.
- Cấp quyền chính xác trong
- Bạn có thể cấu hình bảo mật mạnh mẽ hơn như:
- 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
).
- Tinh chỉnh cấu hình (như
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.
Backup khi cài PostgreSQL trực tiếp
Backup tương tự như Docker:
- Sao lưu database:
pg_dump -U n8n -d n8n > backup.sql
- Sao lưu thư mục dữ liệu:
sudo systemctl stop postgresql
tar -czvf postgres_data_backup.tar.gz /var/lib/postgresql/16/main
sudo systemctl start postgresql
So sánh tổng quan
Tiêu chí | PostgreSQL trong Docker | PostgreSQL cài trực tiếp |
---|---|---|
Hiệu suất | Kém hơn một chút (do lớp ảo hóa Docker). | Tối ưu hơn, đặc biệt với hệ thống lớn. |
Bảo mật | Yêu cầu cấu hình bổ sung (mật khẩu, firewall). | Bảo mật mạnh hơn nếu cấu hình đúng cách. |
Dễ triển khai | Dễ dàng (1 file Docker Compose). | Phức tạp hơn, cần cài và cấu hình thủ công. |
Dễ di chuyển | Rất dễ di chuyển (chỉ cần sao chép volume/config). | Phải sao chép dữ liệu thủ công. |
Quản lý lâu dài | Phù hợp với môi trường nhỏ/gọn. | Tốt hơn với hệ thống lớn, đòi hỏi tùy chỉnh cao. |
Kết luận
- Nếu bạn muốn triển khai nhanh, dễ bảo trì: PostgreSQL trong Docker là lựa chọn tốt. Nhưng hãy đảm bảo gắn volume và có kế hoạch backup định kỳ.
- Nếu bạn cần hiệu suất cao và bảo mật lâu dài: Cài đặt PostgreSQL trực tiếp trên máy chủ sẽ tốt hơn.