> ## Documentation Index
> Fetch the complete documentation index at: https://docs.camellapp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Despliegue

> Cómo se construye y arranca la imagen de CamellApp.

## Build en modo `standalone`

`next.config.ts` activa `output: "standalone"`. El build empaqueta solo lo
que Next.js necesita para arrancar (`.next/standalone` + `.next/static` +
`public`), sin el resto de `node_modules`.

<Warning>
  El CLI de Prisma **no** viaja dentro del bundle standalone. Por eso la
  imagen final incluye, aparte, un toolkit de migraciones separado (más
  abajo).
</Warning>

`next.config.ts` también fuerza el file-tracing de `sharp` y `@img` con
`outputFileTracingIncludes`, porque el tracing automático de Next.js no
siempre los detecta al construir el bundle standalone; sin ese ajuste, el
procesamiento de imágenes falla en producción.

## Arranque: `docker-entrypoint.sh`

Al arrancar el contenedor, un script de entrypoint corre antes que
`node server.js`:

1. Crea los directorios de upload (`public/uploads/avatars`,
   `public/uploads/camellos`) por si la imagen arranca sin volumen o con un
   volumen montado vacío.
2. Aplica `prisma migrate deploy` usando un toolkit de Prisma (CLI, schema y
   cliente generado) instalado aparte, en `/migrate`, precisamente porque el
   CLI no está incluido en el bundle standalone.

<Warning>
  El seed **no** corre en cada deploy — se asume que el entorno ya tiene
  datos. Se ejecuta a mano, con `npm run db:seed`, solo cuando hace falta.
</Warning>

## Integración continua

El workflow de CI corre en cada `push` y `pull request` contra `master`, en
una matriz con Node.js 22 y 25:

```bash theme={null}
npm ci
npx prisma generate
npm run build
npm test
```

## Construir y ejecutar la imagen

```bash theme={null}
docker build -t camellapp .
docker run --rm -p 3000:3000 \
  -e DATABASE_URL="mysql://usuario:contrasena@host:3306/basededatos" \
  -e AUTH_SECRET="secreto-aleatorio-largo" \
  -e NEXTAUTH_URL="http://localhost:3000" \
  camellapp
```

Seed o creación de un admin dentro del contenedor (si tienes shell):

```bash theme={null}
npm run db:seed
npm run admin:create
```
