Installation Docker (Caddy externe)

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

Quand utiliser ce mode

  • Vous voulez déployer NocoBase et le serveur web séparément
  • Vous voulez simplifier la configuration du proxy inverse et de HTTPS avec Caddy
  • 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 Caddy 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=caddy
      - NOCOBASE_PROXY_STORAGE_PATH=/app/nocobase/storage
      - NOCOBASE_PROXY_UPSTREAM_HOST=app
    volumes:
      - ./storage:/app/nocobase/storage

  caddy:
    image: caddy:2
    restart: always
    depends_on:
      - app
    networks:
      - nocobase
    volumes:
      - ./storage:/app/nocobase/storage
    command: >
      /bin/sh -c '
        while [ ! -f /app/nocobase/storage/.nocobase/proxy/caddy/nocobase.caddy ]; do
          echo "waiting for nocobase.caddy..."
          sleep 1
        done
        ln -sf /app/nocobase/storage/.nocobase/proxy/caddy/nocobase.caddy /etc/caddy/Caddyfile
        caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
      '
    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=caddy indique que la configuration Caddy doit être générée
  • NOCOBASE_PROXY_UPSTREAM_HOST=app permet au conteneur Caddy d'accéder au service app via le réseau Compose
  • ./storage doit être monté dans app et caddy afin de partager la configuration du proxy, les ressources statiques et les fichiers téléversés
  • Le conteneur caddy doit attendre que nocobase.caddy soit généré, puis créer un lien vers /etc/caddy/Caddyfile 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
  • Exposez uniquement le port du conteneur Caddy à l'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 Caddy local sur l'hôte

Si votre Caddy 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=caddy
      - 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 Caddy 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 chemin de configuration local de Caddy :

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

sudo ln -sf "$(pwd)/storage/.nocobase/proxy/caddy/nocobase.caddy" /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
sudo systemctl reload caddy

Si votre Caddy local n'utilise pas /etc/caddy/Caddyfile, remplacez la cible du lien par votre propre chemin de configuration. En général, il est plus sûr de garder nocobase.caddy comme fichier d'entrée principal plutôt que d'en recopier le contenu manuellement.

Si vous gérez Caddy 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 Caddy pour un exemple complet.

Liens associés