Cài đặt Docker
Điều kiện tiên quyết
- Đã cài Docker và Docker Compose
- Đảm bảo dịch vụ Docker đang chạy
1. Tạo mới docker-compose.yml
# Tạo một thư mục tên my-project (có thể đặt tên khác) để chứa các tệp hệ thống do NocoBase tạo ra
mkdir my-project && cd my-project
# Tạo một tệp docker-compose.yml trống
vi docker-compose.yml
2. Cấu hình docker-compose.yml
Chọn phiên bản NocoBase (So sánh phiên bản) và loại database, sao chép cấu hình tương ứng vào docker-compose.yml.
Hướng dẫn cấu hình
- Chọn image:
latest latest-full beta beta-full alpha alpha-full 1.7.14 1.7.14-full
- Môi trường sản xuất khuyến nghị cố định phiên bản số cụ thể, tránh việc tự động nâng cấp ngoài ý muốn. Xem tất cả phiên bản
- Image Aliyun:
registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
- Image Docker Hub:
nocobase/nocobase:latest-full
- Image full bao gồm PostgreSQL 16/17 client, MySQL 8.0 client, Oracle 19.25 client cần cho Plugin quản lý backup và migration, cùng LibreOffice cần cho in template (PDF)
- Nếu cần tự build image, có thể tham khảo Dockerfile (bản tinh gọn) và Dockerfile-full (bản đầy đủ) chính thức
- Sửa
APP_KEY: Vui lòng thay your-secret-key bằng chuỗi ngẫu nhiên, dùng để mã hóa Token người dùng và các thông tin nhạy cảm khác
- Sử dụng database có sẵn: Nếu đã có dịch vụ database, vui lòng sửa
DB_HOST thành địa chỉ server database và xóa hoặc comment các cấu hình dịch vụ database (như postgres, mysql, mariadb)
- Mapping port: Mặc định ánh xạ port 80 của container đến port 13000 của host, có thể sửa theo nhu cầu
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
restart: always
networks:
- nocobase
depends_on:
- postgres
environment:
# Khóa bí mật của ứng dụng, dùng để tạo Token người dùng, v.v.
# Nếu APP_KEY được sửa, các Token cũ cũng sẽ vô hiệu
# Có thể là chuỗi ngẫu nhiên bất kỳ, đảm bảo không tiết lộ ra ngoài
- APP_KEY=your-secret-key
# Loại database, hỗ trợ postgres, mysql, mariadb
- DB_DIALECT=postgres
# Host database, có thể thay bằng IP server database có sẵn
- DB_HOST=postgres
# Database port
- DB_PORT=5432
# Tên database
- DB_DATABASE=nocobase
# User database
- DB_USER=nocobase
# Mật khẩu database
- DB_PASSWORD=nocobase
# Múi giờ
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Nếu dùng dịch vụ database có sẵn, có thể không khởi động postgres
postgres:
image: registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16
restart: always
command: postgres -c wal_level=logical
environment:
POSTGRES_USER: nocobase
POSTGRES_DB: nocobase
POSTGRES_PASSWORD: nocobase
volumes:
- ./storage/db/postgres:/var/lib/postgresql/data
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
restart: always
networks:
- nocobase
depends_on:
- mysql
environment:
# Khóa bí mật của ứng dụng, dùng để tạo Token người dùng, v.v.
# Nếu APP_KEY được sửa, các Token cũ cũng sẽ vô hiệu
# Có thể là chuỗi ngẫu nhiên bất kỳ, đảm bảo không tiết lộ ra ngoài
- APP_KEY=your-secret-key
# Loại database, hỗ trợ postgres, mysql, mariadb
- DB_DIALECT=mysql
# Host database, có thể thay bằng IP server database có sẵn
- DB_HOST=mysql
# Database port
- DB_PORT=3306
# Tên database
- DB_DATABASE=nocobase
# User database
- DB_USER=root
# Mật khẩu database
- DB_PASSWORD=nocobase
# Có chuyển đổi tên bảng và tên trường database sang snake case không
- DB_UNDERSCORED=true
# Múi giờ
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Nếu dùng dịch vụ database có sẵn, có thể không khởi động mysql
mysql:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mysql:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
restart: always
networks:
- nocobase
depends_on:
- mariadb
environment:
# Khóa bí mật của ứng dụng, dùng để tạo Token người dùng, v.v.
# Nếu APP_KEY được sửa, các Token cũ cũng sẽ vô hiệu
# Có thể là chuỗi ngẫu nhiên bất kỳ, đảm bảo không tiết lộ ra ngoài
- APP_KEY=your-secret-key
# Loại database, hỗ trợ postgres, mysql, mariadb
- DB_DIALECT=mariadb
# Host database, có thể thay bằng IP server database có sẵn
- DB_HOST=mariadb
# Database port
- DB_PORT=3306
# Tên database
- DB_DATABASE=nocobase
# User database
- DB_USER=root
# Mật khẩu database
- DB_PASSWORD=nocobase
# Có chuyển đổi tên bảng và tên trường database sang snake case không
- DB_UNDERSCORED=true
# Múi giờ
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Nếu dùng dịch vụ database có sẵn, có thể không khởi động mariadb
mariadb:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mariadb:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:beta-full
restart: always
networks:
- nocobase
depends_on:
- postgres
environment:
# Khóa bí mật của ứng dụng, dùng để tạo Token người dùng, v.v.
# Nếu APP_KEY được sửa, các Token cũ cũng sẽ vô hiệu
# Có thể là chuỗi ngẫu nhiên bất kỳ, đảm bảo không tiết lộ ra ngoài
- APP_KEY=your-secret-key
# Loại database, hỗ trợ postgres, mysql, mariadb
- DB_DIALECT=postgres
# Host database, có thể thay bằng IP server database có sẵn
- DB_HOST=postgres
# Database port
- DB_PORT=5432
# Tên database
- DB_DATABASE=nocobase
# User database
- DB_USER=nocobase
# Mật khẩu database
- DB_PASSWORD=nocobase
# Múi giờ
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Nếu dùng dịch vụ database có sẵn, có thể không khởi động postgres
postgres:
image: registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16
restart: always
command: postgres -c wal_level=logical
environment:
POSTGRES_USER: nocobase
POSTGRES_DB: nocobase
POSTGRES_PASSWORD: nocobase
volumes:
- ./storage/db/postgres:/var/lib/postgresql/data
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:beta-full
restart: always
networks:
- nocobase
depends_on:
- mysql
environment:
# Khóa bí mật của ứng dụng, dùng để tạo Token người dùng, v.v.
# Nếu APP_KEY được sửa, các Token cũ cũng sẽ vô hiệu
# Có thể là chuỗi ngẫu nhiên bất kỳ, đảm bảo không tiết lộ ra ngoài
- APP_KEY=your-secret-key
# Loại database, hỗ trợ postgres, mysql, mariadb
- DB_DIALECT=mysql
# Host database, có thể thay bằng IP server database có sẵn
- DB_HOST=mysql
# Database port
- DB_PORT=3306
# Tên database
- DB_DATABASE=nocobase
# User database
- DB_USER=root
# Mật khẩu database
- DB_PASSWORD=nocobase
# Có chuyển đổi tên bảng và tên trường database sang snake case không
- DB_UNDERSCORED=true
# Múi giờ
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Nếu dùng dịch vụ database có sẵn, có thể không khởi động mysql
mysql:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mysql:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:beta-full
restart: always
networks:
- nocobase
depends_on:
- mariadb
environment:
# Khóa bí mật của ứng dụng, dùng để tạo Token người dùng, v.v.
# Nếu APP_KEY được sửa, các Token cũ cũng sẽ vô hiệu
# Có thể là chuỗi ngẫu nhiên bất kỳ, đảm bảo không tiết lộ ra ngoài
- APP_KEY=your-secret-key
# Loại database, hỗ trợ postgres, mysql, mariadb
- DB_DIALECT=mariadb
# Host database, có thể thay bằng IP server database có sẵn
- DB_HOST=mariadb
# Database port
- DB_PORT=3306
# Tên database
- DB_DATABASE=nocobase
# User database
- DB_USER=root
# Mật khẩu database
- DB_PASSWORD=nocobase
# Có chuyển đổi tên bảng và tên trường database sang snake case không
- DB_UNDERSCORED=true
# Múi giờ
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Nếu dùng dịch vụ database có sẵn, có thể không khởi động mariadb
mariadb:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mariadb:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:alpha-full
restart: always
networks:
- nocobase
depends_on:
- postgres
environment:
# Khóa bí mật của ứng dụng, dùng để tạo Token người dùng, v.v.
# Nếu APP_KEY được sửa, các Token cũ cũng sẽ vô hiệu
# Có thể là chuỗi ngẫu nhiên bất kỳ, đảm bảo không tiết lộ ra ngoài
- APP_KEY=your-secret-key
# Loại database, hỗ trợ postgres, mysql, mariadb
- DB_DIALECT=postgres
# Host database, có thể thay bằng IP server database có sẵn
- DB_HOST=postgres
# Database port
- DB_PORT=5432
# Tên database
- DB_DATABASE=nocobase
# User database
- DB_USER=nocobase
# Mật khẩu database
- DB_PASSWORD=nocobase
# Múi giờ
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Nếu dùng dịch vụ database có sẵn, có thể không khởi động postgres
postgres:
image: registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16
restart: always
command: postgres -c wal_level=logical
environment:
POSTGRES_USER: nocobase
POSTGRES_DB: nocobase
POSTGRES_PASSWORD: nocobase
volumes:
- ./storage/db/postgres:/var/lib/postgresql/data
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:alpha-full
restart: always
networks:
- nocobase
depends_on:
- mysql
environment:
# Khóa bí mật của ứng dụng, dùng để tạo Token người dùng, v.v.
# Nếu APP_KEY được sửa, các Token cũ cũng sẽ vô hiệu
# Có th ể là chuỗi ngẫu nhiên bất kỳ, đảm bảo không tiết lộ ra ngoài
- APP_KEY=your-secret-key
# Loại database, hỗ trợ postgres, mysql, mariadb
- DB_DIALECT=mysql
# Host database, có thể thay bằng IP server database có sẵn
- DB_HOST=mysql
# Database port
- DB_PORT=3306
# Tên database
- DB_DATABASE=nocobase
# User database
- DB_USER=root
# Mật khẩu database
- DB_PASSWORD=nocobase
# Có chuyển đổi tên bảng và tên trường database sang snake case không
- DB_UNDERSCORED=true
# Múi giờ
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Nếu dùng dịch vụ database có sẵn, có thể không khởi động mysql
mysql:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mysql:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:alpha-full
restart: always
networks:
- nocobase
depends_on:
- mariadb
environment:
# Khóa bí mật của ứng dụng, dùng để tạo Token người dùng, v.v.
# Nếu APP_KEY được sửa, các Token cũ cũng sẽ vô hiệu
# Có thể là chuỗi ngẫu nhiên bất kỳ, đảm bảo không tiết lộ ra ngoài
- APP_KEY=your-secret-key
# Loại database, hỗ trợ postgres, mysql, mariadb
- DB_DIALECT=mariadb
# Host database, có thể thay bằng IP server database có sẵn
- DB_HOST=mariadb
# Database port
- DB_PORT=3306
# Tên database
- DB_DATABASE=nocobase
# User database
- DB_USER=root
# Mật khẩu database
- DB_PASSWORD=nocobase
# Có chuyển đổi tên bảng và tên tr ường database sang snake case không
- DB_UNDERSCORED=true
# Múi giờ
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Nếu dùng dịch vụ database có sẵn, có thể không khởi động mariadb
mariadb:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mariadb:/var/lib/mysql
networks:
- nocobase
3. Cài đặt và khởi động NocoBase
# Pull image mới nhất
docker compose pull
# Chạy ở chế độ nền (lần chạy đầu tiên sẽ tự động cài đặt)
docker compose up -d
# Xem log cài đặt và vận hành
docker compose logs -f app
app-postgres-app-1 | nginx started
app-postgres-app-1 | yarn run v1.22.15
app-postgres-app-1 | $ cross-env DOTENV_CONFIG_PATH=.env node -r dotenv/config packages/app/server/lib/index.js install -s
app-postgres-app-1 | Done in 2.72s.
app-postgres-app-1 | yarn run v1.22.15
app-postgres-app-1 | $ pm2-runtime start --node-args="-r dotenv/config" packages/app/server/lib/index.js -- start
app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: Launching in no daemon mode
app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: App [index:0] starting in -fork mode-
app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: App [index:0] online
app-postgres-app-1 | NocoBase server running at: http://localhost:13000/
4. Đăng nhập NocoBase
Mở trình duyệt và truy cập http://localhost:13000, tài khoản và mật khẩu khởi tạo là admin@nocobase.com và admin123.
Lưu ý bảo mật tài khoản
Sau khi đăng nhập lần đầu, vui lòng đổi mật khẩu mặc định ngay để đảm bảo an toàn hệ thống.
5. Triển khai production
Nếu bạn dùng image có Nginx tích hợp, thông thường không nên mở trực ti ếp 13000 ra internet công khai. Cách phổ biến hơn là chỉ giữ cổng container trên host, rồi để Nginx trên host xử lý domain, HTTPS và reverse proxy.
Proxy root path bằng Nginx
Cấu hình dưới đây proxy các request của domain tới http://127.0.0.1:13000/:
server {
listen 80;
server_name your_domain.com; # Thay your_domain.com bằng domain của bạn
location / {
proxy_pass http://127.0.0.1:13000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header Host $final_host;
proxy_set_header Referer $http_referer;
proxy_set_header User-Agent $http_user_agent;
add_header Cache-Control "no-cache, no-store" always;
proxy_cache_bypass $http_upgrade;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
proxy_buffering off;
}
}
Nếu bạn cũng muốn bật HTTPS, hãy cấu hình 443 và chứng chỉ trên Nginx của host. Container NocoBase không cần xử lý chứng chỉ riêng.
Block location / trong cấu hình root path này cũng proxy /api/, /ws và /files/. Nếu bạn tách tài nguyên tĩnh khỏi route ứng dụng, vẫn phải bảo đảm /files/ được chuyển tiếp đến NocoBase và không bị xử lý như thư mục tĩnh.
Triển khai theo subpath
Nếu bạn muốn triển khai ứng dụng dưới một subpath, ví dụ https://your_domain.com/nocobase/, trước tiên hãy cấu hình biến môi trường APP_PUBLIC_PATH:
services:
app:
image: nocobase/nocobase:latest
environment:
+ - APP_PUBLIC_PATH=/nocobase/
Giữ nguyên dấu / ở đầu và cuối path. Sau khi cấu hình, URL của ứng dụng sẽ là http://127.0.0.1:13000/nocobase/.
Sau đó cấu hình Nginx trên host với cùng subpath proxy:
server {
listen 80;
server_name your_domain.com; # Thay your_domain.com bằng domain của bạn
location /nocobase/ {
proxy_pass http://127.0.0.1:13000/nocobase/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header Host $final_host;
proxy_set_header Referer $http_referer;
proxy_set_header User-Agent $http_user_agent;
add_header Cache-Control "no-cache, no-store" always;
proxy_cache_bypass $http_upgrade;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
proxy_buffering off;
}
# Giữ tương thích với URL truy cập file ở root.
location ^~ /files/ {
proxy_pass http://127.0.0.1:13000;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header Host $final_host;
proxy_set_header Referer $http_referer;
proxy_set_header User-Agent $http_user_agent;
add_header Cache-Control "no-cache, no-store" always;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
}
Hãy lưu ý:
APP_PUBLIC_PATH và path trong proxy_pass phải nhất quán. Nếu một trong hai bên thiếu /nocobase/, tài nguyên tĩnh và routing thường sẽ không hoạt động đúng
/nocobase/files/ được chuyển tiếp bởi location /nocobase/; route tương thích /files/ ở root cần được chuyển tiếp riêng đến NocoBase
Tùy chọn khác
Nếu bạn không muốn dùng Nginx tích hợp, bạn cũng có thể xem hai cách cấu hình proxy riêng này: