Cài đặt Docker (Nginx bên ngoài)

Trong cách triển khai này, container ứng dụng NocoBase và container Nginx chạy tách rời nhau. Bạn có thể bắt đầu từ Cài đặt Docker (Nginx tích hợp), rồi chuyển điểm vào sang container Nginx bên ngoài.

Khi nào nên dùng cách này

  • Bạn muốn tách riêng NocoBase và web server
  • Bạn muốn tự quản lý cấu hình Nginx và các cổng được mở
  • Bạn chỉ muốn đưa container proxy ra mạng công khai

Ví dụ docker-compose.yml

Nếu bạn cần image full, hãy thay latest-no-nginx bằng latest-full-no-nginx.

Mapping 13000:80 chỉ dùng để tiện kiểm thử local, tránh chiếm trực tiếp các cổng chuẩn của host. Trong production, thường không tiếp tục dùng 13000:80; thay vào đó, container Nginx bên ngoài sẽ map trực tiếp tới các cổng 80443 của host.

networks:
  nocobase:
    driver: bridge

services:
  app:
    image: nocobase/nocobase:latest-no-nginx
    restart: always
    depends_on:
      - postgres
    networks:
      - nocobase
    environment:
      - APP_KEY=your-secret-key
      - DB_DIALECT=postgres
      - DB_HOST=postgres
      - DB_PORT=5432
      - DB_DATABASE=nocobase
      - DB_USER=nocobase
      - DB_PASSWORD=nocobase
      - TZ=Etc/UTC
      - NOCOBASE_EXTRACT_CLIENT_ASSETS=true
      - NOCOBASE_PROXY_PROVIDER=nginx
      - NOCOBASE_PROXY_STORAGE_PATH=/app/nocobase/storage
      - NOCOBASE_PROXY_UPSTREAM_HOST=app
    volumes:
      - ./storage:/app/nocobase/storage

  nginx:
    image: nginx:latest
    restart: always
    depends_on:
      - app
    networks:
      - nocobase
    volumes:
      - ./storage:/app/nocobase/storage
    command: >
      /bin/sh -c '
        while [ ! -f /app/nocobase/storage/.nocobase/proxy/nginx/nocobase.conf ]; do
          echo "waiting for nocobase.conf..."
          sleep 1
        done
        rm -f /etc/nginx/conf.d/default.conf
        ln -sf /app/nocobase/storage/.nocobase/proxy/nginx/nocobase.conf /etc/nginx/conf.d/default.conf
        nginx -g "daemon off;"
      '
    ports:
      # Đây chỉ là ví dụ kiểm thử local.
      - "13000:80"
      # Trong production, thường đổi thành:
      # - "80:80"
      # - "443:443"

  postgres:
    image: 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

Điểm chính

  • NOCOBASE_EXTRACT_CLIENT_ASSETS=true dùng để tách tài nguyên client và tạo cấu hình proxy
  • NOCOBASE_PROXY_PROVIDER=nginx cho biết cần tạo cấu hình Nginx
  • NOCOBASE_PROXY_UPSTREAM_HOST=app cho phép container Nginx truy cập dịch vụ app qua mạng Compose
  • ./storage cần được mount vào cả appnginx để cùng dùng cấu hình proxy, tài nguyên tĩnh và tệp tải lên
  • Container nginx cần chờ nocobase.conf được tạo xong, sau đó dùng ln -sf liên kết nó tới /etc/nginx/conf.d/default.conf
  • Cấu hình được tạo tự động chuyển tiếp cả route /files/ dưới APP_PUBLIC_PATH và route /files/ ở root đến NocoBase để xử lý xem trước và tải file có xác thực
  • Nếu dùng container Nginx bên ngoài, chỉ cần để container nginx xử lý mapping cổng host. Khi kiểm thử, bạn có thể bắt đầu với 13000:80; trong production, thường mở trực tiếp các cổng 80443 của host, còn dịch vụ app không cần mở cổng ra host

Nếu dùng Nginx cài trực tiếp trên máy host

Nếu Nginx của bạn được cài trực tiếp trên máy host thay vì chạy trong container Docker, bạn nên dùng một docker-compose.yml riêng. Trong cách này, dịch vụ app cần publish cổng ra host, và các biến proxy phải dùng giá trị theo góc nhìn của host.

Bạn có thể dùng docker-compose.yml như sau:

networks:
  nocobase:
    driver: bridge

services:
  app:
    image: nocobase/nocobase:latest-no-nginx
    restart: always
    depends_on:
      - postgres
    networks:
      - nocobase
    environment:
      - APP_KEY=your-secret-key
      - DB_DIALECT=postgres
      - DB_HOST=postgres
      - DB_PORT=5432
      - DB_DATABASE=nocobase
      - DB_USER=nocobase
      - DB_PASSWORD=nocobase
      - TZ=Etc/UTC
      - NOCOBASE_EXTRACT_CLIENT_ASSETS=true
      - NOCOBASE_PROXY_PROVIDER=nginx
      - NOCOBASE_PROXY_STORAGE_PATH=/path/to/your-project/storage
      - NOCOBASE_PROXY_UPSTREAM_HOST=127.0.0.1
      - NOCOBASE_PROXY_UPSTREAM_PORT=13000
    volumes:
      - ./storage:/app/nocobase/storage
    ports:
      - "13000:13000"

  postgres:
    image: 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

Trong biến thể này:

  • NOCOBASE_PROXY_STORAGE_PATH cần là đường dẫn tuyệt đối của thư mục storage trên host
  • NOCOBASE_PROXY_UPSTREAM_HOST cần là 127.0.0.1
  • Dịch vụ app cần giữ ports, để Nginx trên host có thể truy cập ứng dụng qua 127.0.0.1:13000

Sau khi container app khởi động, hãy chờ file cấu hình được tạo rồi liên kết nó vào thư mục cấu hình Nginx trên host:

while [ ! -f ./storage/.nocobase/proxy/nginx/nocobase.conf ]; do
  echo "waiting for nocobase.conf..."
  sleep 1
done

sudo ln -sf "$(pwd)/storage/.nocobase/proxy/nginx/nocobase.conf" /etc/nginx/conf.d/nocobase.conf
sudo nginx -t
sudo systemctl reload nginx

Nếu Nginx trên host của bạn không dùng thư mục conf.d, hãy thay đường dẫn đích bằng đường dẫn cấu hình thực tế của bạn. Thông thường, giữ nocobase.conf như một file được include từ ngữ cảnh http {} sẽ an toàn hơn là chép thủ công nội dung của nó.

Nếu bạn tự quản lý Nginx thay vì dùng cấu hình được tạo tự động, hãy bảo đảm /files/ và route tương ứng dưới APP_PUBLIC_PATH được chuyển tiếp đến NocoBase trước các rule fallback SPA. Xem Proxy ngược Nginx để tham khảo ví dụ đầy đủ.

Liên kết liên quan