# Instalación en su propio servidor

Puede ejecutar draften en su propio servidor. El correo, los borradores y las
claves se quedan entonces con usted; solo sale lo que envía al proveedor del
modelo de lenguaje (o nada, con un modelo local).

Esta página es un resumen de cómo se compone una instalación. El procedimiento
en sí está en [La instalación, paso a paso](/es/admin/installing).

## El paquete y la licencia

Cada versión de draften es un **paquete**, un archivo `draften-<version>.tar`.
Contiene las imágenes de todos los servicios, los archivos que los inician, una
lista firmada de todo su contenido y el comando `./draften`, que administra la
instalación. El servidor no necesita nada más que Docker.

Para ejecutarlo necesita una **licencia**: un archivo que le damos nosotros y
que se sube en la interfaz. Limita el número de buzones y de asistentes, y su
clave sirve también para descargar las versiones nuevas. Más información en
[La licencia](/es/admin/licence).

## De qué se compone una instalación

Todo se ejecuta en Docker mediante `docker compose`:

| Servicio | Qué hace |
|---|---|
| `db` | la base de datos MariaDB: lo guarda todo (configuración, instrucciones, mensajes, borradores, secretos cifrados). Nada de otra máquina accede a ella |
| `worker` | lee los buzones, llama a los modelos, escribe los borradores, aprende, ejecuta los pasos de la configuración guiada. Puede haber varios |
| `web-blue`, `web-green` | la interfaz web y la API en dos colores: uno atiende y el otro espera a la siguiente versión; por eso las actualizaciones no interrumpen el servicio |
| `proxy` | la entrada desde fuera: cambia entre los colores de la web y, opcionalmente, termina el HTTPS |
| `updater` | opcional: ejecuta lo que el operador solicita en Instalación (actualizar, volver a una versión anterior, el número de procesos, sustituir la clave, una copia de seguridad) y hace cada día una copia de seguridad de la base de datos |
| `cloudflared` | opcional: publicar la interfaz a través de un Cloudflare Tunnel |

La interfaz y el worker no se comunican directamente: ambos trabajan con la
misma base de datos; lo que necesita el correo o un modelo, la interfaz lo pone
en cola como trabajo para el worker.

## Qué necesitará

- un servidor x86-64 con Linux y Docker 24 o posterior (con el plugin compose),
  4 GB de memoria y 20 GB de disco,
- la dirección en la que estará disponible la interfaz, con HTTPS: un
  certificado directamente en draften, o su proxy inverso o túnel,
- acceso a los buzones: un registro de aplicación en Microsoft Entra, una
  cuenta de servicio de Google Workspace o los datos de IMAP,
- una clave de API de un modelo (Anthropic, OpenAI) o su propio servidor
  compatible con OpenAI,
- una licencia nuestra.

## HTTPS

- **En draften**: indique al instalador el certificado y su clave (PEM).
  draften escucha entonces en el puerto 443 y redirige desde el puerto 80. Un
  certificado renovado se despliega con `./draften certificate new.pem new.key`
  sin perder ni una sola solicitud. El certificado lo obtiene usted (de una
  autoridad de certificación o con un cliente ACME).
- **Delante de draften**: sin certificado, draften escucha en
  `127.0.0.1:8085` y su proxy o túnel termina el HTTPS.

## El updater

El updater es un servicio opcional que ejecuta lo que el operador solicita en
**Instalación › Instalación**: actualizar a una versión nueva, volver a la
anterior, cambiar el número de procesos worker, sustituir la clave de cifrado
y hacer una copia de seguridad de la base de datos. Además, hace cada día por
sí mismo una copia de seguridad de la base de datos. Para ello ejecuta el mismo
`./draften` que ejecutaría usted.

El updater tiene acceso a Docker, lo que equivale a derechos de root en el
servidor. La propia interfaz nunca toca Docker: solo escribe una solicitud en
la base de datos para el updater. Se activa durante la instalación
(`COMPOSE_PROFILES=updater` en `.env`); sin él, todo funciona desde la línea
de comandos.

## Configuración en `.env`

El archivo `.env` del directorio de la instalación lo escribe el instalador y
solo lo puede leer su propietario. Contiene la infraestructura y los secretos;
todo lo relativo a los asistentes está en la base de datos y se configura en la
interfaz.

| Variable | Para qué |
|---|---|
| `DRAFTEN_VERSION`, `DRAFTEN_EDITION` | la versión en ejecución y la edición (`onprem`) |
| `DB_ROOT_PASSWORD`, `DB_PASSWORD` | contraseñas de la base de datos |
| `MASTER_KEY` | la clave que cifra los secretos en la base de datos (claves de API, acceso a los buzones, clientes de inicio de sesión). **Guarde una copia fuera del servidor** |
| `MASTER_KEY_PREVIOUS` | la clave anterior después de sustituirla, mientras `backups/` contenga volcados de antes del cambio |
| `WEB_APP_SECRET` | una cadena aleatoria que firma las sesiones |
| `WEB_PUBLIC_URL` | la dirección en la que se abre la interfaz; a partir de ella se crean las direcciones de redirección del inicio de sesión |
| `WEB_BIND`, `DRAFTEN_TLS`, `WEB_TLS_BIND` | dónde escuchan HTTP y HTTPS |
| `COMPOSE_PROFILES` | servicios opcionales: `updater`, `tunnel` |
| `DRAFTEN_BACKUPS` | cuántos volcados de la base de datos de antes de una actualización se conservan en `backups/` (3 de forma predeterminada) |
| `DRAFTEN_DAILY_BACKUPS` | cuántas copias diarias y a petición se conservan (7 de forma predeterminada; `0` desactiva la copia diaria) |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | la hora de la copia diaria y su zona horaria (de forma predeterminada `01:00`, `Europe/Prague`); la hora configurada en la interfaz tiene prioridad |
| `CLOUDFLARE_TUNNEL_TOKEN` | solo con un Cloudflare Tunnel |
| `INTERVAL_SECONDS`, `WORKER_CONCURRENCY` | el intervalo predeterminado de revisión del correo y las revisiones simultáneas (mejor configurarlos en la interfaz) |
| `WORKER_REPLICAS` | cuántos procesos `worker` se ejecutan en esta máquina (1 de forma predeterminada), vea [Funcionamiento y capacidad](/es/admin/operations) |

Un valor con el signo `$` debe escribirse como `$$` en `.env`; si no, la parte
que sigue al dólar se pierde sin aviso. Las claves generadas con
`openssl rand -hex 32` nunca contienen un dólar.

## Dónde está cada cosa

| | |
|---|---|
| `.env` | la configuración y los secretos de la instalación |
| `compose.yaml`, `proxy/` | cómo se ejecutan los contenedores; cada actualización los sustituye |
| `backups/` | volcados de la base de datos: diarios, a petición y de antes de las actualizaciones; cópielos fuera del servidor |
| `data/` | los registros y los informes del worker |
| `updates/` | paquetes pendientes de instalar; el updater también descarga aquí |
| `NOTES.md` | qué cambió la versión instalada |

## Siguiente

- [La instalación, paso a paso](/es/admin/installing),
- [Administración de la instalación](/es/admin/installation-admin): versión,
  licencia, claves y remitente predeterminados, organizaciones,
- [«Actualizar con el updater»](/es/admin/updating-with-the-updater)
  y [desde la línea de comandos](/es/admin/updating),
- [Funcionamiento y capacidad](/es/admin/operations),
- [Copia de seguridad y restauración](/es/admin/backup-and-restore),
- [Solución de problemas](/es/admin/troubleshooting).
