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)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
Phiên bản Latest
Phiên bản Beta
Phiên bản Alpha
PostgreSQL
MySQL
MariaDB
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

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

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/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: