Docker-Installation (externes Nginx)

In diesem Setup laufen der NocoBase-App-Container und der Nginx-Container getrennt. Du kannst mit Docker-Installation (integriertes Nginx) starten und den Einstieg danach auf einen externen Nginx-Container umstellen.

Wann dieses Setup sinnvoll ist

  • Du möchtest NocoBase und den Webserver getrennt betreiben
  • Du möchtest die Nginx-Konfiguration und die freigegebenen Ports selbst verwalten
  • Du möchtest nur den Proxy-Container öffentlich erreichbar machen

Beispiel für docker-compose.yml

Wenn du das full-Image brauchst, ersetze latest-no-nginx durch latest-full-no-nginx.

Das Mapping 13000:80 ist nur für lokale Tests gedacht, damit die Standardports des Hosts nicht direkt belegt werden. In Produktion wird 13000:80 normalerweise nicht beibehalten; stattdessen mappt der externe Nginx-Container direkt auf die Host-Ports 80 und 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:
      # Dies ist nur ein Beispiel für lokale Tests.
      - "13000:80"
      # In Produktion normalerweise so ändern:
      # - "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

Wichtige Punkte

  • NOCOBASE_EXTRACT_CLIENT_ASSETS=true extrahiert die Client-Assets und erzeugt die Proxy-Konfiguration
  • NOCOBASE_PROXY_PROVIDER=nginx legt fest, dass eine Nginx-Konfiguration erzeugt wird
  • NOCOBASE_PROXY_UPSTREAM_HOST=app ermöglicht dem Nginx-Container den Zugriff auf den Dienst app über das Compose-Netzwerk
  • ./storage muss sowohl in app als auch in nginx gemountet werden, damit Proxy-Konfiguration, statische Dateien und Uploads gemeinsam genutzt werden können
  • Der nginx-Container sollte warten, bis nocobase.conf erzeugt wurde, und die Datei dann mit ln -sf nach /etc/nginx/conf.d/default.conf verlinken
  • Die erzeugte Konfiguration leitet sowohl die /files/-Route unter APP_PUBLIC_PATH als auch die Root-Route /files/ an NocoBase weiter, damit Dateivorschau und Downloads authentifiziert werden können
  • Bevor Nginx eine historische /storage/uploads/-Datei per alias ausliefert, prüft NocoBase über auth_request den Anmeldestatus; anonyme Zugriffe erhalten standardmäßig 401
  • Wenn du einen externen Nginx-Container verwendest, sollte der nginx-Container das Host-Port-Mapping übernehmen. Für Tests kannst du mit 13000:80 beginnen; in Produktion werden normalerweise die Host-Ports 80 und 443 direkt veröffentlicht, während der Dienst app keinen Port zum Host veröffentlichen muss

Wenn ein bestehendes Programm anonymen Zugriff auf /storage/uploads/ benötigt, füge LEGACY_LOCAL_STORAGE_PUBLIC_ACCESS=true zu app.environment hinzu und starte den Anwendungscontainer neu. Entferne auth_request nicht; der Authentifizierungsendpunkt wertet diese Variable aus. Die Berechtigungen für /files/ bleiben unverändert.

Wenn du ein lokales Nginx auf dem Host verwendest

Wenn dein Nginx direkt auf dem Host installiert ist und nicht in einem Docker-Container läuft, solltest du besser ein separates docker-compose.yml verwenden. Dabei muss der Dienst app einen Port zum Host veröffentlichen, und die Proxy-Variablen müssen aus Host-Sicht gesetzt werden.

Du kannst ein docker-compose.yml wie dieses verwenden:

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

In dieser Variante:

  • NOCOBASE_PROXY_STORAGE_PATH sollte der absolute Host-Pfad des storage-Verzeichnisses sein
  • NOCOBASE_PROXY_UPSTREAM_HOST sollte 127.0.0.1 sein
  • Der Dienst app muss ports behalten, damit das lokale Nginx die Anwendung über 127.0.0.1:13000 erreichen kann

Nachdem der app-Container gestartet wurde, warte auf die Generierung der Konfigurationsdatei und verlinke sie dann in das lokale Nginx-Konfigurationsverzeichnis:

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

Wenn dein Host-Nginx kein conf.d-Verzeichnis verwendet, ersetze das Link-Ziel durch deinen eigenen Konfigurationspfad. In der Regel ist es sicherer, nocobase.conf als Datei zu behalten, die aus dem http {}-Kontext eingebunden wird, statt ihren Inhalt manuell zu kopieren.

Wenn du Nginx selbst verwaltest und nicht die erzeugte Konfiguration verwendest, stelle sicher, dass /files/ und die entsprechende Route unter APP_PUBLIC_PATH vor den SPA-Fallback-Regeln an NocoBase weitergeleitet werden. Beim Ausliefern von /storage/uploads/ per alias muss außerdem auth_request konfiguriert sein, damit die Anmeldeprüfung nicht umgangen wird. Ein vollständiges Beispiel findest du unter Nginx-Reverse-Proxy.