Category: n8n

  • Hướng Dẫn Cài n8n kèm FFmpeg Trên VPS Chạy Bằng Domain Của Bạn

    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

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

    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: sudo -u postgres psql
      • Tạo một database tên n8n: CREATE DATABASE n8n;
      • 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
    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.

    Cài trên VPS sử dụng Docker Compose

    Dưới đây là video hướng dẫn cài đặt N8N chi tiết trên VPS sử dụng Docker Compose

    Tạo file sh có nội dung sau:

    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'
    -----BEGIN CERTIFICATE-----
    MIIEnjCCA4agAwIBAgIUHBoxza+SR67KGRhpSdBIVBjmgJkwDQYJKoZIhvcNAQEL
    BQAwgYsxCzAJBgNVBAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMTQw
    MgYDVQQLEytDbG91ZEZsYXJlIE9yaWdpbiBTU0wgQ2VydGlmaWNhdGUgQXV0aG9y
    aXR5MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlh
    MB4XDTIzMDEwOTAyMjUwMFoXDTM4MDEwNTAyMjUwMFowYjEZMBcGA1UEChMQQ2xv
    dWRGbGFyZSwgSW5jLjEdMBsGA1UECxMUQ2xvdWRGbGFyZSBPcmlnaW4gQ0ExJjAk
    BgNVBAMTHUNsb3VkRmxhcmUgT3JpZ2luIENlcnRpZmljYXRlMIIBIjANBgkqhkiG
    9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz8HyN6ypslrjlhN/9yYa30152FXmFnCuvwO8
    n8U3T8r4IzSRe4u4VZ4+tbT6OTly3Kj3m2qkcIh4sTSJIsPrL38ACPog7XGNVfBK
    TKZ8JRPC4W/8ZSUr5GjP8SlGXZdwoIyzanyaip77u6le/XxyC8xMPZOertIwjaSR
    kVNwexIcsBdvapSic9QOZuDlrYluNNsby39f9dV7wVJAyW+xOvt9joZi/Aqja6MD
    cLMaMx415f+xW6j2IsAbhcnHySO+L016+bGZ3cF9uM7K9TgigbfkFX2q816J5K9+
    P6XaN0HJdnM41NA/qxrJEz28vh2RYfE0rAeaOyPCQi8xgqlAcwIDAQABo4IBIDCC
    ARwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD
    ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSg+GDLFIFFP5084cg8BFET36P5+TAf
    BgNVHSMEGDAWgBQk6FNXXXw0QIep65TbuuEWePwppDBABggrBgEFBQcBAQQ0MDIw
    MAYIKwYBBQUHMAGGJGh0dHA6Ly9vY3NwLmNsb3VkZmxhcmUuY29tL29yaWdpbl9j
    YTAhBgNVHREEGjAYggsqLnplbnByLm5ldIIJemVucHIubmV0MDgGA1UdHwQxMC8w
    LaAroCmGJ2h0dHA6Ly9jcmwuY2xvdWRmbGFyZS5jb20vb3JpZ2luX2NhLmNybDAN
    BgkqhkiG9w0BAQsFAAOCAQEAE87k3c/YHqv3uqDb2l0uetBi1LGt4d1XZv4t0C9m
    vEoD7flZxcR96FEhwmodDCSzuXbKFVCe7ODebSX9KzKnHWapJiWHUWKMIgBKf0Ne
    RCxaPLOT8cmODsEPfODPa8VeqcLQt+Hr8y/L/7gQgHmDLLfzYXigpnz6f/WyTBOC
    +3tAhwGtDALPsqwilVEqnUF4KIsh388VWoYuT+oSpq1sre6BeJxuGmNzAP4JH2fz
    IvHMl5CILVHBEP7I/NINaKphTrTicK3bUWycN1JcppTOb0Tmyr0vpZszPuYKytEM
    pFly+IMGyjsG2W4bdJQL0fh28qiCv8zhM76cnuzH/Fs4ZA==
    -----END CERTIFICATE-----
    EOL
    sudo tee /etc/nginx/ssl/n8n.zenpr.net/private.key > /dev/null << 'EOL'
    -----BEGIN PRIVATE KEY-----
    MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDPwfI3rKmyWuOW
    E3/3JhrfTXnYVeYWcK6/A7yfxTdPyvgjNJF7i7hVnj61tPo5OXLcqPebaqRwiHix
    NIkiw+svfwAI+iDtcY1V8EpMpnwlE8Lhb/xlJSvkaM/xKUZdl3CgjLNqfJqKnvu7
    qV79fHILzEw9k56u0jCNpJGRU3B7EhywF29qlKJz1A5m4OWtiW402xvLf1/11XvB
    UkDJb7E6+32OhmL8CqNrowNwsxozHjXl/7FbqPYiwBuFycfJI74vTXr5sZndwX24
    zsr1OCKBt+QVfarzXonkr34/pdo3Qcl2czjU0D+rGskTPby+HZFh8TSsB5o7I8JC
    LzGCqUBzAgMBAAECggEAJxi7aUi/4oWCIKLoyOzNz8n3rQN1OjHYYK/mVja50vVC
    PvXMjvBbLxmJeY5mLFCoUegmOIQYD+lOtSJK0FUINDb1HbtcaPKeg1al1Mjbwep3
    GQ+G8s3M9b3Xq+11hXVTR5NSzC5Ist96RfV4n8FEgP3gNxJJoWKCqpUWo7+NAkuu
    deBpQfHEsgkQnmijpemx9c1BKMRDbOJajcb4StH6UTNuZyQAYl9lq9YuSPtOxg5o
    t8lN+xSyFwEhaPLW599wyDHEl3AkHIsyDYLJRwXDejIAqm/Upow6xK0H2s6iGnaY
    y+4SLj2ZygGV1z6KrPikNBIj6YszQVo6oUPh211AcQKBgQDpmUhehYLsm/J4KiiK
    uiM7ilsTx3PYAR65ggqfmxGia3+693/m0zGd6u4IywNMpWsMYbqNPuDMgJNh9YxG
    hdjcQhOxuFupLBUcGYvtfZtq3postdOOfHIdl7owOXSeJFh6ShhKcs98cIIhUnsg
    zPt6+cE5fCx6LflWk44Ou7lzOQKBgQDjrkcU/1OfTg69v9FofmyylULMS+s6jH75
    ir4XFkiHl/Z8UIZsFevuNUx2pecbAyQWMAQCalEy6xHghfXP6xZk+aXfuyp71j3L
    cvKZ2Adw6vfLqkwpaMT/k2RYbU328zNNwDZawBRl/sQVMGfmvZtecNtanWkmpApk
    eBbeawq1CwKBgAub843HAtexdF5mcfdbAs89tAMKoYY1oApGHTMLaNfykbl//VpC
    Wq/ncgb71+EiQ2ytGrFUU6W2KhzvMBZ9Jmbj3ciySdPhffcUifC2klfAUlcwfiAR
    rTYtSTKGWHZXhhIlxolEpW0gxkbTq4zYwxK8gM7Tjf5QdJjJ4oB28eN5AoGAMcJd
    8J3YtcFGgXvRlWfD88ehQKr67uHTwk/rOXp6QYAZs5OZvTeRR49IdcnOV135XgwC
    ZFC+DEXJs2szjMxRKaJR+TKbl1L8UGF/2dWX0rrXiyBd4tLt8vlQfe7tkiIWvVBb
    0LuX+a6TRho9KvWXZi1+EzDB0VsalliUjumP/n8CgYEAmGeDo7HyUqNw9BvGlb3z
    SZD0guNrQby+kyzi6an8KHIzyWMvN8QLiYlYLG3Weh6KUtwvwFrS8l5nUZy8QTfg
    ngwZb+Ckp/cz878oKgfBVTGu6cVW47sOQPMGRSGIcR+OxbVFenTRtHtTAFUwGEcB
    EkF3YhLnhopRzMdSya53ZTY=
    -----END PRIVATE KEY-----
    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
    
    
    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 apt update
    sudo apt install -y docker-compose-plugin
    
    #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 systemctl start docker
    sudo systemctl enable docker
    sleep 5
    
    sudo tee /home/n8n.zenpr.net/docker-compose.yml > /dev/null << 'EOL'
    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
        ports:
          - "5432:5432"
    
      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
    EOL

    Sau khi chạy file trên xong thì chạy các lệnh sau:

    cd /home/n8n.zenpr.net
    sudo docker compose pull
    sudo docker compose down
    sudo chown -R 1000:1000 /home/n8n.zenpr.net/*
    sudo docker compose up -d
    sudo docker logs n8n

    Cài Trên VPS Quản Lý Bằng Cloud Panel Sử Dụng Docker Compose

    Hướng dẫn chi tiết trong video sau:

    Thêm quyền cho user

    visudo
    Thêm vào
    n8nzenprnet ALL=(ALL:ALL) ALL

    Sau đó chạy các lệnh sau:

    cd /home/n8nzenprnet/htdocs/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 apt install -y docker-compose-plugin

    Nếu bạn không muốn cài plugin Docker Compose theo lệnh sudo apt install -y docker-compose-plugin, thì chạy các lệnh sau:

    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
    exit
    sudo su n8nzenprnet
    cd /home/n8nzenprnet/htdocs/n8n.zenpr.net
    
    sudo ufw allow 5432
    sudo ufw allow 5678

    Tạo file cấu hình bằng lệnh nano docker-compose.yml sau đó chèn nội dung bên dưới vào.

    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
        ports:
          - "5432:5432"
    
      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 đó lần lượt chạy các lệnh sau:

    docker compose down
    sudo chown -R 1000:1000 /home/n8nzenprnet/htdocs/n8n.zenpr.net/*
    sudo chown n8nzenprnet:n8nzenprnet /home/n8nzenprnet/htdocs/n8n.zenpr.net/docker-compose.yml
    docker compose pull
    docker compose up -d
    docker compose down
    sudo chown -R 1000:1000 ./n8n_data
    sudo chown -R 999:999 ./postgres_data
    docker compose up -d

    Trong trường hợp bạn muốn sử dụng SQLite thì chèn nội dung này:

    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

    Sau đó chạy các lệnh này là được:

    docker compose pull
    docker compose down
    docker compose up -d