Nếu bạn đang có một vps cấu hình khá mạnh, nhưng chỉ để cài đặt n8n thì có vẻ hơi phí. Bạn có thể tận dụng vps đó cài thêm một số tool phục vụ các công việc tự động hóa của mình.
Dưới đây là hệ thống mình đang triển khai để phục vụ công việc cá nhân, chạy khá ổn.
Nhược điểm là hơi mệt công setup ban đầu :)))
Hiện tại mình đang triển khai 1 vps ubuntu gồm những tool như sau:
- portainer: quản lý tổng thể các tool chạy bằng docker
- nginxproxymanager: trỏ tên miền đến các tool thay vì sử dụng ip, đăng ký ssl miễn phí
- n8n (thật ra mình chạy n8n trên nodejs, không phải docker)
- postgres: cơ sở dữ liệu cho n8n, nocodb
- nocodb: thay thế airtable, google sheet
- couchdb: mình dùng livesync cho obsidian
- pgadmin4: kết nối với postgres để quản lý cơ sở dữ liệu bằng UI
Hướng cài đặt và triển khai
- VPS đã cài sẵn docker
- Cài portainer
- Sử dụng portainer để tạo network và triển khai các ứng dụng phù hợp
- postgres
- n8n
- nocodb
- Cài nginxproxymanager để trỏ tên miền đến các container (nocodb, n8n)

Hướng dẫn chi tiết
Mình sẽ cài trên ubuntu 24, hệ điều hành khác cũng tương tự nhé, chỉ khác vài câu lệnh.
0. Cài đặt docker và các dependencies
Hướng dẫn: Xem hướng dẫn tại trang chủ Docker
Có thể bỏ qua nếu bạn đã cài docker
1. Cài portainer
SSH đến vps và thực hiện các thao tác:
- Tạo volume cho portainer
- docker volume create portainer_data
- Tải và cài đặt portainer
- docker run -d -p 8000:8000 -p 9443:9443 –name portainer –restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts
- Sau khi cài đặt xong, truy cập <địa chỉ ip vps>:9443 để tiến hành thiết lập
- đổi username
- đặt password

2. Thiết lập network
Để các container có thể giao tiếp với nhau, nên thiết lập 1 network chung để dễ dàng cấu hình
- Chọn Network
- Chọn Add network
- Đặt tên network – ví dụ “my-tool-network”
- driver: mặc định chọn bridge
- Chọn Create the network

3. Cài postgress, pgadmin và tạo các database cần thiết
3.1. Tạo containter postgres
Portainer đã có sẵn template để cài postgres nên thao tác khá dễ
Ở mục template -> Chọn Application
Gõ tìm: postgres
Tiến hành thiết lập:
- Đặt tên cho container: lưu ý ghi nhớ tên này để các ứng dụng khác kết nối đến, ví dụ “my_postgres”
- Network: chọn network vừa tạo ở bước trước (my-tool-network)
- Superuser: tên user admin cho postgres
- Superuser password: mật khẩu
- Chọn “Deploy the containter” để triển khai postgres

3.2. Cài pgadmin4 để quản lý postgres bằng giao diện
Bước 1. Cài đặt
Tạo container mới: Add container
- tên container
- image: nhập đúng “dpage/pgadmin4”
- port mapping: 5050:80
Mục Advanced container settings: - Network: chọn network tạo ở bước trước (my-tool-network)
- Env: thiết lập môi trường
- PGADMIN_DEFAULT_EMAIL=<EMAIL CỦA BẠN>
- PGADMIN_DEFAULT_PASSWORD=<MẬT KHẨU ĐĂNG NHẬP PGADMIN>
- Chọn Deploy the container

Bước 2. Truy cập
Truy cập pgadmin theo địa chỉ ip của vps, port 5050
http://<ip_vps>:5050
User và pass ở mục (5) ở bước trước

Bước 3. Kết nối với postgres đã tạo
Sau khi login thành công, chọn Add New Server
Một cửa sổ hiện ra, nhập những thông tin sau:
- Ở tab General
- Name: đặt tên để dễ nhớ
- Chọn tab Connection
- Host name/address: tên của container postgres tạo lúc đầu, ở đây của mình là “my_postgres”
- port: mặc định là 5432
- Maintenance database: mặc định là postgres
- Username: nhập superuser lúc tạo postgres
- Password: nhập superuser password lúc tạo postgres
- Tick chọn save password (tùy chọn)
- Save
Nếu kết nối thành công sẽ hiện ra danh sách database mặc định. Còn nếu báo lỗi thì có thể do:
- Sai tên hostname (4)
- Sai user, password
- pgdmin và posgres không thiết lập chung network

3.3. Tạo user mới cho các database
Tiếp theo, nên tạo 1 user mới cho các database của nocodb, n8n,…
- Chuột phải vào Login/Group Roles -> Create -> Login/Group Role…
- Tab General -> Name: Nhập tên user
- Tab Definition -> Password: nhập mật khẩu cho user
- Tab Privileges -> Tick chọn ở Can login và Inherit rights from the parent roles
- Chọn Save

3.4. Tạo database cho các tool sẽ dùng (nocodb và n8n)
Database cho nocodb
Click chuột phải vào Databases -> Create -> Database
Nhập thông tin database vào cửa sổ hiện ra
- Tại tab General:
– Nhập tên database: ví dụ nocodb
– Nhập owner: Chọn user vừa tạo ở bước trên
Chọn Save để khởi tạo database

Database cho n8n
Thực hiện thao tác tương tự trên

4. Tạo container NocoDB
Tạo một container mới tại giao diện của portainer
- Tên của container
- Image: nocodb/nocodb
- port mapping: host 8080, container 8080
Thiết lập nâng cao - Network: chọn network đã thiết lập ở bước trước
- Env: thiết lập những thông tin:
Để thiết lập env cho nocodb, bạn cần liệt kê ra những thông tin sau:
- Tên hostname của postgres: như bước đầu mình tạo là my_postgres
- port của postgres: 5432 (nếu tạo mặc định theo template của portainer thì mặc định)
- tên database sẽ kết nối: nocodb
- tên user có quyền truy cập databse: n8n_app
Sau khi liệt kê được những thành phần trên, tiến hành thiết lập Env cho nocodb
- NC_DB: pg://<tên hostname>:5432?u=<tên user>&p=<mật khẩu user>&d=<tên database nocodb>
- NC_PUBLIC_URL: nên thiết lập 1 tên miền cho nocodb để dễ dàng truy cập, có thể đặt subdomain (noco.tenmien.com)
- Chọn Deploy the container

Truy cập nocodb và tạo tài khoản

Sau khi tạo tài khoản thành công, bạn có thể kiểm tra nocodb có thật sự được kết nối đến database nocodb trong postgres chưa bằng cách:
- Truy cập pgadmin 4 -> Chọn database nocodb
- Ở mục Schemas, bạn sẽ thấy 1 schema có tên giống với id base Getting Started
Vậy là bạn có thể sử dụng NocoDB rồi.

5. Tạo containter n8n
Thực hiện tương tự với nocodb
- Tên container: n8n
- image: nhập đúng: n8nio/n8n
- Port mapping: 5678: 5678
- Network: chọn đúng network tạo lúc đầu
- Env
Cần nhập đúng những thông tin sau:
Có thể chuyển sang Advance mode, paste giá trị này vào, thay đổi phù hợp với cấu hình của bạn.
DB_TYPE=postgresdb
DB_POSTGRESDB_DATABASE=n8n_db # tên database bạn tạo
DB_POSTGRESDB_HOST=my_postgres # tên của container postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_USER=n8n_app # tên user có quyền kết nối database
DB_POSTGRESDB_PASSWORD=123123 # mật khẩu user
DB_POSTGRESDB_SCHEMA=public
GENERIC_TIMEZONE=Asia/Ho_Chi_Minh
N8N_SECURE_COOKIE=FALSE
WEBHOOK_URL=https://vidu.tenmien.com
WEBHOOK_TUNNEL_URL=https://vidu.tenmien.com
- Chọn Deploy the container

Truy cập n8n
vào địa chỉ ip:5678 để bắt đầu sử dụng n8n

6. Cài nginxproxymanager
Bước tiếp theo là cài nginxproxymanager
6.1. Thiết lập ban đầu
Cài nginxproxymanager để dễ dàng thiết lập tên miền cho các container
Tạo stack mới trong Portainer
Nhập thông tin sau và Deploy
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

Truy cập ip:81 để thiết lập
- Đăng nhập với thông tin sau:
- Email: admin@example.com
- Password: changeme
- Đổi thông tin user
- Đổi password mặc định và Save

6.2. Trỏ tên miền
6.2.1. Trỏ DNS ở trang quản trị tên miền
Trỏ bản ghi A cho tên miền bạn muốn chạy n8n, hoặc nocodb về ip của vps, ví dụ bên dưới đang trỏ bằng trình quản lý dns của Cloudflare.

6.2.2. Thiết lập proxy host trên nginxproxymanager
Tại giao diện nginxproxymanager
- Ở tab Dashboard -> Proxy Hosts
- Add Proxy Host -> một cửa sổ hiện lên
- nhập tên miền cho ứng dụng bạn muốn chạy, ở đây mình chọn n8n
- mặc định http
- hostname: tên container bạn chạy ứng dụng
- port của container đó
- Tick chọn Block common exploits và Websockets Support
- Chuyển sang tab SSL, chọn Request a new SSL Certificate. Tick chọn như hình
- Điền email và tick chọn đồng ý điều khoản của Let Encrypt
- Save và đợi 1 xíu

6.3. Lỗi thường gặp
- Tạo proxy host, tab SSL, mặc dù chọn Request a new SSL Certificate nhưng khi Save thì SSL không lưu
-> Edit proxy host -> Chọn lại ssl -> Tick chọn Force SSL, HTTP/2 Support, HSTS Enabled -> Save - Vào được n8n bằng tên miền nhưng bị connection lost ở giao diện thiết kế workflow
Nguyên nhân: Do chưa bật Websockets Support
Giải pháp: Edit proxy host -> Tick chọn Websockets Support -> Save
Truy cập tên miền xem đã trỏ thành công chưa :))

Thực hiện lại bước 6 để trỏ tên miền cho nocodb nhé.
Kết
Vậy cơ bản đã hoàn thành và bạn có thể sử dụng n8n, nocodb rồi, nhìn chung hơi phức tạp tí, nhưng là nền tảng để bạn có thể triển khai thêm các tool khác trong tương lai.
Chúc bạn thực hiện thành công nhé.