Instalación con Docker (Nginx externo)

En esta modalidad, el contenedor de la aplicación NocoBase y el contenedor de Nginx se ejecutan por separado. Puedes empezar con Instalación con Docker (Nginx integrado) y luego cambiar la entrada a un contenedor externo de Nginx.

Cuándo usar esta modalidad

  • Quieres desplegar NocoBase y el servidor web por separado
  • Quieres gestionar tú mismo la configuración de Nginx y los puertos expuestos
  • Quieres exponer a la red pública solo el contenedor proxy

Ejemplo de docker-compose.yml

Si necesitas la imagen full, sustituye latest-no-nginx por latest-full-no-nginx.

El mapeo 13000:80 es solo para facilitar las pruebas locales y evitar ocupar directamente los puertos estándar del host. En producción, normalmente no se mantiene 13000:80; en su lugar, el contenedor externo de Nginx se mapea directamente a los puertos 80 y 443 del 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:
      # Esto es solo un ejemplo para pruebas locales.
      - "13000:80"
      # En producción, normalmente cámbialo a:
      # - "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

Puntos clave

  • NOCOBASE_EXTRACT_CLIENT_ASSETS=true extrae los recursos del cliente y genera la configuración del proxy
  • NOCOBASE_PROXY_PROVIDER=nginx indica que debe generarse la configuración de Nginx
  • NOCOBASE_PROXY_UPSTREAM_HOST=app permite que el contenedor de Nginx acceda al servicio app mediante la red de Compose
  • ./storage debe montarse tanto en app como en nginx para compartir la configuración del proxy, los recursos estáticos y los archivos subidos
  • El contenedor nginx debe esperar a que se genere nocobase.conf y luego enlazarlo a /etc/nginx/conf.d/default.conf con ln -sf
  • La configuración generada reenvía a NocoBase tanto la ruta /files/ bajo APP_PUBLIC_PATH como la ruta /files/ en la raíz para permitir vistas previas y descargas autenticadas
  • Si usas un contenedor externo de Nginx, deja que el contenedor nginx gestione el mapeo del puerto del host. Para pruebas, puedes empezar con 13000:80; en producción, normalmente se exponen directamente los puertos 80 y 443 del host, mientras que el servicio app no necesita exponer su puerto al host

Si usas Nginx local en el host

Si tu Nginx está instalado directamente en el host y no se ejecuta dentro de un contenedor Docker, es mejor usar un docker-compose.yml independiente. En este caso, el servicio app debe exponer un puerto al host y las variables del proxy deben configurarse desde la perspectiva del host.

Puedes usar un docker-compose.yml como este:

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

En esta variante:

  • NOCOBASE_PROXY_STORAGE_PATH debe ser la ruta absoluta del directorio storage en el host
  • NOCOBASE_PROXY_UPSTREAM_HOST debe ser 127.0.0.1
  • El servicio app debe conservar ports, para que el Nginx local pueda acceder a la aplicación mediante 127.0.0.1:13000

Después de iniciar el contenedor app, espera a que se genere el archivo de configuración y luego enlázalo al directorio de configuración 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 tu Nginx local no usa el directorio conf.d, sustituye la ruta del enlace por tu propia ruta de configuración. En la mayoría de los casos es más seguro mantener nocobase.conf como un archivo incluido desde el contexto http {} en lugar de copiar su contenido manualmente.

Si mantienes Nginx por tu cuenta en lugar de usar la configuración generada, asegúrate de que /files/ y la ruta correspondiente bajo APP_PUBLIC_PATH se reenvíen a NocoBase antes de las reglas de fallback de la SPA. Consulta Proxy inverso con Nginx para ver un ejemplo completo.

Enlaces relacionados