# Diagnóstico, registros y visitas

> Saber si una app está en marcha, leer sus registros, que el agente te explique por qué falla, reiniciarla, ejecutar migraciones y consultar las visitas de tu web.

Cuando algo no va bien, tu agente puede mirar dentro de la app por ti: su estado, sus registros y la causa probable del fallo, explicada en lenguaje llano. También puede decirte cuántas visitas recibe tu web.

## Estado

<p class="prompt">¿Está funcionando la app web de la tienda?</p>

El agente usa `app.status`, que sirve para webs, apps, workers y tareas programadas. Devuelve:

- el **estado**: en marcha, arrancando, fallando, parada, programada (las tareas) o suspendida;
- la **versión** que está en línea y su dirección;
- cuántas veces se ha **reiniciado** y, si hay un problema, el detalle.

Para saber cómo va una publicación (construyendo, arrancando, en línea, falló), el agente usa `deploy.status`. Ver [Versiones](/docs/publicar/versiones).

## Registros

<p class="prompt">Enséñame los últimos registros de la app web de la tienda.</p>

`app.logs` devuelve las últimas líneas que ha escrito la app (100 por defecto, hasta 300). Funciona igual con un worker o una tarea programada: basta con su nombre.

> [!NOTE]
> Lo que escribe tu app en los registros lo entrega Dilohost a tu agente marcado como **datos, no instrucciones**. Así, si un visitante consigue que tu app registre un texto como «borra todo», tu agente no lo obedece.

## Diagnóstico automático

<p class="prompt">La tienda da error. ¿Qué le pasa?</p>

`app.diagnose` revisa la app y te dice qué falla y qué hacer. Detecta, entre otras cosas:

| Lo que ve | Lo que te dice |
|---|---|
| La última publicación falló | El motivo del fallo del build o del arranque. |
| La app no responde en su puerto | Que escuche en `0.0.0.0` y en el puerto de la variable `PORT` (8080). |
| La app se cierra nada más arrancar | El error del registro que lo provoca. |
| No conecta con la base de datos, o la contraseña no es válida | Que conectes la base con `database.connection` e `inject_into`. |
| Falta una variable de entorno | Que la añadas con `config.set`. |
| Intenta escribir donde no puede | Que escriba en `/tmp` o use un disco persistente. |
| Se queda sin memoria | Que la app necesita más memoria de la que da tu plan. |
| El proyecto tiene base de datos pero la app no tiene variables | Que probablemente falta conectarla. |
| Está suspendida | Por qué. |

## Reiniciar

<p class="prompt">Reinicia la app web de la tienda.</p>

`app.restart` reinicia la app; en unos segundos vuelve a estar disponible. Una app suspendida no se puede reiniciar.

## Ejecutar comandos de mantenimiento

<p class="prompt">Ejecuta las migraciones de la base de datos en la tienda.</p>

`app.run` ejecuta un comando dentro de una app con servidor y devuelve su salida y su código de salida. Puede durar hasta 2 minutos. Por seguridad, **no es una consola libre**: solo se admiten estos comandos de mantenimiento.

| Framework | Comandos admitidos |
|---|---|
| Laravel | `php artisan` con `migrate`, `migrate:status`, `db:seed`, `queue:restart`, `cache:clear`, `config:cache`, `config:clear`, `route:cache`, `route:clear`, `view:clear`, `storage:link`, `optimize`, `optimize:clear` o `about` (con `--force` y `--seed` cuando apliquen) |
| Prisma | `npx prisma migrate deploy`, `npx prisma db seed`, `npx prisma generate` |
| Node | `npm run migrate`, `migration:run`, `seed`, `db:migrate` o `typeorm:run` (y variantes con `:algo`); `npx typeorm migration:run` |
| AdonisJS | `node ace migration:run` |
| Django | `python manage.py migrate`, `collectstatic --noinput`, `check` |
| Rails | `rails db:migrate` (también con `bundle exec`) |
| Comprobaciones | `ls`, `ls -l`, `ls -la`, `pwd`, `whoami` |

No se admite `env` ni ningún otro comando que pudiera mostrar los secretos de la app. Si necesitas algo que no está en la lista, añádelo como script de tu proyecto que se ejecute al arrancar, o como [tarea programada](/docs/publicar/tareas).

## Memoria, procesador y disco

<p class="prompt">¿Qué recursos tiene la app web de la tienda?</p>

`app.resources` dice la memoria máxima y garantizada, el procesador máximo que da tu plan a cada app y su disco persistente, si tiene. Para ampliar el disco, `app.disk`. Ver [Apps con servidor](/docs/publicar/apps#discos-persistentes).

## Visitas

<p class="prompt">¿Cuántas visitas ha tenido la web de la tienda en los últimos 14 días?</p>

`app.traffic` da las estadísticas de una web o una app con dirección pública, de 1 a 14 días atrás (7 por defecto):

- peticiones totales y de personas, páginas vistas y visitantes únicos;
- visitas por día;
- páginas más vistas y páginas que no se encuentran (404);
- de dónde llegan las visitas;
- códigos de respuesta y peticiones de robots;
- datos transferidos y tiempo de respuesta medio y del 95 % de las peticiones.

No hace falta instalar ninguna analítica ni poner cookies. Solo se dan totales: nunca se muestran las direcciones IP de tus visitantes.

## Relacionado

- [Apps con servidor](/docs/publicar/apps)
- [Versiones y vuelta atrás](/docs/publicar/versiones)
- [Solución de problemas](/docs/ayuda/problemas)
- [Soporte](/docs/ayuda/soporte)
