Instalasi Docker (Nginx eksternal)

Dalam mode ini, kontainer aplikasi NocoBase dan kontainer Nginx berjalan terpisah. Anda bisa mulai dari Instalasi Docker (Nginx bawaan), lalu mengganti pintu masuk ke kontainer Nginx eksternal.

Kapan menggunakan mode ini

  • Anda ingin memisahkan deployment NocoBase dan web server
  • Anda ingin mengelola sendiri konfigurasi Nginx dan port yang dibuka
  • Anda ingin hanya mengekspos kontainer proxy ke jaringan publik

Contoh docker-compose.yml

Jika Anda membutuhkan image full, ganti latest-no-nginx dengan latest-full-no-nginx.

Mapping 13000:80 hanya untuk memudahkan pengujian lokal, agar tidak langsung memakai port standar host. Di produksi, biasanya jangan terus memakai 13000:80; biarkan kontainer Nginx eksternal langsung memetakan port host 80 dan 443.

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:
      # Ini hanya contoh untuk pengujian lokal.
      - "13000:80"
      # Di produksi, biasanya ubah menjadi:
      # - "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

Poin penting

  • NOCOBASE_EXTRACT_CLIENT_ASSETS=true mengekstrak aset klien dan membuat konfigurasi proxy
  • NOCOBASE_PROXY_PROVIDER=nginx menandakan bahwa konfigurasi Nginx harus dibuat
  • NOCOBASE_PROXY_UPSTREAM_HOST=app memungkinkan kontainer Nginx mengakses layanan app melalui jaringan Compose
  • ./storage harus dimount ke app dan nginx agar konfigurasi proxy, aset statis, dan file unggahan bisa dipakai bersama
  • Kontainer nginx perlu menunggu sampai nocobase.conf dibuat, lalu menautkannya ke /etc/nginx/conf.d/default.conf dengan ln -sf
  • Konfigurasi yang dibuat otomatis meneruskan rute /files/ di bawah APP_PUBLIC_PATH dan rute /files/ di root ke NocoBase untuk pratinjau dan unduhan file yang memerlukan autentikasi
  • Jika menggunakan kontainer Nginx eksternal, biarkan kontainer nginx menangani mapping port host. Untuk pengujian, Anda bisa mulai dengan 13000:80; di produksi, biasanya langsung ekspos port host 80 dan 443, sementara layanan app tidak perlu membuka port ke host

Jika menggunakan Nginx lokal di host

Jika Nginx Anda terpasang langsung di host dan tidak berjalan di dalam kontainer Docker, sebaiknya gunakan docker-compose.yml terpisah. Dalam mode ini, layanan app perlu membuka port ke host, dan variabel proxy harus memakai nilai dari sudut pandang host.

Anda bisa memakai docker-compose.yml seperti ini:

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

Dalam varian ini:

  • NOCOBASE_PROXY_STORAGE_PATH harus berupa path absolut direktori storage di host
  • NOCOBASE_PROXY_UPSTREAM_HOST harus 127.0.0.1
  • Layanan app perlu mempertahankan ports, supaya Nginx lokal bisa mengakses aplikasi melalui 127.0.0.1:13000

Setelah kontainer app berjalan, tunggu file konfigurasi dibuat lalu tautkan ke direktori konfigurasi Nginx lokal:

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

Jika Nginx lokal Anda tidak menggunakan direktori conf.d, ganti target link dengan path konfigurasi Anda sendiri. Biasanya lebih aman membiarkan nocobase.conf tetap sebagai file yang di-include dari konteks http {} daripada menyalin isinya secara manual.

Jika Anda mengelola Nginx sendiri dan tidak menggunakan konfigurasi yang dibuat otomatis, pastikan /files/ serta rute terkait di bawah APP_PUBLIC_PATH diteruskan ke NocoBase sebelum rule fallback SPA. Lihat Reverse proxy Nginx untuk contoh lengkap.

Tautan terkait