Hướng Dẫn Cài n8n Trên VPS Chạy Bằng Domain Của Bạn
Hướng Dẫn Cài n8n Trên VPS Chạy Bằng Domain Của Bạn Credit: Zen

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}"
  1. 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;”

  1. 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/

  1. 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.

  1. 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.

  1. 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

  1. 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/

  1. 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

  1. 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).
  2. 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ới POSTGRES_DB).
    • DB_POSTGRESDB_USER: Người dùng để kết nối (trùng với POSTGRES_USER).
    • DB_POSTGRESDB_PASSWORD: Mật khẩu của người dùng (trùng với POSTGRES_PASSWORD).
  3. 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).
  4. depends_on:
    • Đảm bảo dịch vụ postgres được khởi động trước khi n8n bắt đầu.

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 ý

  1. 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ỳ.
  2. 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.
  3. 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.

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

  1. Tạo user và database cho n8n:
    • Đăng nhập vào PostgreSQL:bashCopyEditsudo -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 database n8n:sqlCopyEditGRANT ALL PRIVILEGES ON DATABASE n8n TO n8n;
    • Thoát PostgreSQL:sqlCopyEdit\q
  2. 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:

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?

  1. 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.
  2. 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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:

  1. 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ủ.
  2. 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.
  3. 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ể.
  4. 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:

  1. Volume snapshot:
    • Backup thư mục ./postgres_data trên máy chủ:
      tar -czvf postgres_data_backup.tar.gz ./postgres_data
  2. 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:

  1. 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.
  2. 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.
  3. 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:

  1. 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.
  2. 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.
  3. 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:

  1. Sao lưu database:
    pg_dump -U n8n -d n8n > backup.sql
  2. 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 DockerPostgreSQL cài trực tiếp
Hiệu suấtKé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ậtYê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 khaiDễ 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ểnRấ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àiPhù 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.
5/5 - (2 votes)
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments