Installation Docker (Nginx externe)

Dans ce mode, le conteneur d'application NocoBase et le conteneur Nginx s'exécutent séparément. Vous pouvez commencer par Installation Docker (Nginx intégré), puis basculer l'entrée vers un conteneur Nginx externe.

Quand utiliser ce mode

  • Vous voulez déployer NocoBase et le serveur web séparément
  • Vous voulez gérer vous-même la configuration Nginx et les ports exposés
  • Vous voulez exposer au réseau public uniquement le conteneur proxy

Exemple de docker-compose.yml

Si vous avez besoin de l'image full, remplacez latest-no-nginx par latest-full-no-nginx.

Le mappage 13000:80 sert uniquement aux tests locaux, pour éviter d'occuper directement les ports standard de l'hôte. En production, on ne garde généralement pas 13000:80; le conteneur Nginx externe mappe plutôt directement les ports 80 et 443 de l'hôte.

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:
      # Ceci est uniquement un exemple pour les tests locaux.
      - "13000:80"
      # En production, remplacez généralement par :
      # - "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

Points clés

  • NOCOBASE_EXTRACT_CLIENT_ASSETS=true extrait les ressources client et génère la configuration du proxy
  • NOCOBASE_PROXY_PROVIDER=nginx indique que la configuration Nginx doit être générée
  • NOCOBASE_PROXY_UPSTREAM_HOST=app permet au conteneur Nginx d'accéder au service app via le réseau Compose
  • ./storage doit être monté dans app et nginx afin de partager la configuration du proxy, les ressources statiques et les fichiers téléversés
  • Le conteneur nginx doit attendre que nocobase.conf soit généré, puis créer un lien vers /etc/nginx/conf.d/default.conf avec ln -sf
  • La configuration générée transmet à NocoBase la route /files/ sous APP_PUBLIC_PATH ainsi que la route /files/ à la racine, afin d'assurer l'aperçu et le téléchargement authentifiés des fichiers
  • Si vous utilisez un conteneur Nginx externe, laissez le conteneur nginx gérer le mappage du port hôte. Pour les tests, vous pouvez commencer avec 13000:80; en production, exposez généralement directement les ports 80 et 443 de l'hôte, tandis que le service app n'a pas besoin d'exposer son port à l'hôte

Si vous utilisez un Nginx local sur l'hôte

Si votre Nginx est installé directement sur l'hôte au lieu de s'exécuter dans un conteneur Docker, il est préférable d'utiliser un docker-compose.yml séparé. Dans ce mode, le service app doit exposer un port vers l'hôte, et les variables du proxy doivent être définies du point de vue de l'hôte.

Vous pouvez utiliser un docker-compose.yml comme celui-ci :

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

Dans cette variante :

  • NOCOBASE_PROXY_STORAGE_PATH doit être le chemin absolu du répertoire storage sur l'hôte
  • NOCOBASE_PROXY_UPSTREAM_HOST doit être 127.0.0.1
  • Le service app doit conserver ports, afin que le Nginx local puisse atteindre l'application via 127.0.0.1:13000

Une fois le conteneur app démarré, attendez que le fichier de configuration soit généré, puis créez le lien vers le répertoire de configuration local de Nginx :

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

Si votre Nginx local n'utilise pas le répertoire conf.d, remplacez la cible du lien par votre propre chemin de configuration. En général, il est plus sûr de garder nocobase.conf comme un fichier inclus depuis le contexte http {} plutôt que d'en recopier le contenu manuellement.

Si vous gérez Nginx vous-même au lieu d'utiliser la configuration générée, vérifiez que /files/ et la route correspondante sous APP_PUBLIC_PATH sont transmises à NocoBase avant les règles de fallback de la SPA. Consultez Proxy inverse Nginx pour un exemple complet.

Liens associés