# Variables de entorno y secretos

> Cómo dar configuración a tu app, guardar claves y contraseñas como secretos cifrados que nunca se vuelven a mostrar, y conectar bases de datos y almacenes sin copiar credenciales.

Las variables de entorno son la configuración de tu app: el nombre de la tienda, la clave de una API de pagos, el modo de depuración. En Dilohost se guardan por app, los secretos van cifrados y la app se reinicia sola para leerlas.

## Poner variables

<p class="prompt">En la app web de la tienda, pon APP_NAME="Tienda Ana" y APP_ENV=production.</p>

El agente usa `config.set` con un objeto `{"NOMBRE": "valor"}`. La app se reinicia con los valores nuevos en unos segundos; no hace falta volver a publicar.

## Secretos

Las contraseñas, claves y tokens se guardan como **secretos**:

<p class="prompt">Guarda como secreto la clave de Stripe de la tienda: STRIPE_SECRET=…</p>

El agente usa `config.set` con `secret=true`. Un secreto:

- se guarda **cifrado**;
- **nunca se vuelve a mostrar** por el agente: al listar las variables sale como `•••••• (secreto)`;
- si lo pierdes, no se puede recuperar: se cambia por uno nuevo.

> [!IMPORTANT]
> Lo que escribas en la conversación lo ve tu agente, así que lo más seguro es que un secreto no pase por ella. Para bases de datos y almacenes de ficheros no hace falta: Dilohost escribe las credenciales directamente en la app con `inject_into` (ver abajo). Las claves de servicios externos (pagos, correo, APIs) sí tienen que llegar por la conversación una vez; desde ese momento quedan cifradas y no se vuelven a mostrar.

## Ver y quitar variables

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

`config.list` enseña los nombres y los valores, salvo los secretos, que salen ocultos.

<p class="prompt">Quita la variable DEBUG de la tienda.</p>

`config.unset` borra las variables que le digas. Pide confirmación, porque si la app las necesita dejará de funcionar. La app se reinicia sin ellas.

## Conectar bases de datos y almacenes sin copiar credenciales

En lugar de copiar usuarios y contraseñas, pide que Dilohost los inyecte en la app:

<p class="prompt">Conecta la base de datos «datos» a la app web de la tienda.</p>

- `database.connection` con `inject_into="<app>"` guarda como secretos `DATABASE_URL`, `DB_*` y la configuración de TLS. Ver [Bases de datos](/docs/datos/bases-de-datos).
- `storage.connection` con `inject_into="<app>"` guarda como secretos las variables `AWS_*` del almacén. Ver [Almacenamiento de ficheros](/docs/datos/almacenamiento).

La contraseña no aparece en ningún momento en la conversación.

## Reglas

| Regla | Valor |
|---|---|
| Nombre | Letras, números y guion bajo, empezando por letra o guion bajo (por ejemplo `APP_URL`). |
| Valor | Texto, hasta 32 KB. |
| Cuántas | Hasta 50 por petición y 150 por app. |
| Reservadas | `PORT`, `HOME`, `PATH` y `HOSTNAME` las pone Dilohost y no se pueden cambiar. `PORT` vale 8080. |

Los [workers y tareas programadas](/docs/publicar/tareas) usan las variables de la app de la que salen.

> [!NOTE]
> Los ficheros `.env` con secretos que lleguen en un zip se descartan al subirlo, para que no acaben en el repositorio. Pon la configuración en variables.

## Relacionado

- [Apps con servidor](/docs/publicar/apps)
- [Bases de datos](/docs/datos/bases-de-datos)
- [Seguridad](/docs/seguridad)
