docs/quick-start.md

# Inicio rápido: instalación mínima de Welley

El camino más corto para tener una instancia de Welley en marcha en un solo host Linux, en cualquier nube o en tu propio hardware. Usa solo las opciones que la CLI realmente exige; todo lo demás se queda con su valor por defecto.

Lo que obtienes: la plataforma, el pipeline RAG, Nginx, Redis y un contenedor de PostgreSQL **incluido**, con un certificado de Let's Encrypt emitido durante la instalación. No incluye base de datos administrada, CDN, telemetría ni integración con Slack. Para eso, consulta las guías de AWS EC2 y DigitalOcean.

## 1\. Requisitos previos

**Un host Linux**

-   Ubuntu 24.04 LTS (o una distribución actual comparable).
-   2 vCPU, 4 GB de RAM y 60 GB de disco como punto de partida.
-   Una dirección IPv4 pública que no cambie.
-   Los puertos TCP de entrada **80** y **443** abiertos a internet, y el **22** abierto para ti. El puerto 80 hace falta durante la instalación para el desafío del certificado y después para la renovación semanal.
-   Un usuario que no sea root, con `sudo`. La guía ejecuta todo con ese usuario, al que más abajo llamamos `<user>`.

**DNS**

Dos registros, ambos apuntando a la IP pública del host:

| Registro | Finalidad |
| --- | --- |
| `<domain>` | el sitio en sí |
| `storage.<domain>` | archivos subidos y archivos estáticos, porque esta configuración no tiene CDN |

Créalos antes de empezar: la CLI comprueba que ambos nombres apunten a este host y se detiene si no es así.

**Registros DNS de correo**

El dominio de tu dirección `--smtp-from` necesita registros de autenticación de correo. Sin ellos, Gmail, Outlook y otros proveedores grandes suelen descartar el correo dirigido a destinatarios que nunca han recibido nada de ti. Eso afecta a todas las invitaciones y confirmaciones de registro, y el correo ni siquiera llega a spam, aunque tu proveedor de SMTP lo marque como enviado.

| Registro | Tipo | Valor |
| --- | --- | --- |
| `<mail-domain>` | TXT | SPF, por ejemplo `v=spf1 include:<provider> ~all`. Toma el valor exacto de tu proveedor de SMTP |
| `_dmarc.<mail-domain>` | TXT | DMARC, por ejemplo `v=DMARC1; p=none; rua=mailto:dmarc@<mail-domain>` |
| `<selector>._domainkey.<mail-domain>` | TXT o CNAME | DKIM, que genera tu proveedor de SMTP cuando verificas el dominio |

Un dominio solo puede tener un registro SPF. Si ya tiene uno, añade tu proveedor a ese en lugar de crear un segundo. `create` avisa si falta SPF o DMARC, pero no se detiene. No puede comprobar DKIM, porque el nombre del selector es propio de cada proveedor.

No te saltes DKIM. Muchos proveedores, entre ellos Amazon SES, envían por defecto con su propio dominio como remitente del sobre. Entonces SPF comprueba el dominio del proveedor y no el tuyo, así que no cuenta para DMARC, y solo DKIM puede hacer que DMARC se cumpla. Revisa el estado de DKIM en la consola de tu proveedor. En Amazon SES está en _Verified identities_, dentro de `<mail-domain>`, en la sección _DKIM_, y debe decir _Successful_. SES Easy DKIM publica tres registros CNAME con el nombre `<token>._domainkey.<mail-domain>`.

**Credenciales SMTP**

Host, usuario, contraseña y una dirección de remitente, de cualquier proveedor. La plataforma las necesita para la confirmación por correo y la recuperación de contraseña, y la CLI se niega a instalar sin ellas. Los valores por defecto suponen envío por STARTTLS en el puerto 587.

**Una dirección de correo de administrador** para el primer inicio de sesión y la recuperación de contraseña.

## 2\. Instalar Docker

Sigue las instrucciones oficiales para tu distribución: [Install Docker Engine](https://docs.docker.com/engine/install/). Después, permite que tu usuario se comunique con el daemon:

```
sudo usermod -aG docker <user>
```

Cierra sesión y vuelve a entrar, y luego comprueba que las dos partes estén listas:

```
docker ps
docker compose version
```

## 3\. Descargar la CLI

Elige el valor de `platform` que corresponda a tu host:

**linux/amd64**

```

curl -fL "https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?channel=stable&platform=linux/amd64" -o wlycli
chmod +x wlycli
./wlycli -v
  
```
  **linux/arm64**

```

curl -fL "https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?channel=stable&platform=linux/arm64" -o wlycli
chmod +x wlycli
./wlycli -v
  
```
  **darwin/arm64**

```

curl -fL "https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?channel=stable&platform=darwin/arm64" -o wlycli
chmod +x wlycli
./wlycli -v
  
```
  **darwin/amd64**

```

curl -fL "https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?channel=stable&platform=darwin/amd64" -o wlycli
chmod +x wlycli
./wlycli -v
  
```
  

## 4\. Desplegar

```
./wlycli deploy create \
-d example.com \
-e admin@example.com \
--smtp-host smtp.example.com \
--smtp-user "$MAIL_USER" \
--smtp-password "$MAIL_PASSWORD" \
--smtp-from noreply@example.com
```

Estas seis opciones son todas las obligatorias. El comando comprueba el DNS, escribe los archivos del despliegue, emite el certificado con Certbot e inicia los contenedores; puede tardar varios minutos.

Valores por defecto que aceptas aquí:

| Ajuste | Valor por defecto |
| --- | --- |
| Directorio de instalación | `~/.welley/<project>`, donde `<project>` es el dominio con cada carácter no alfanumérico reemplazado por `_` (así, `example.com` pasa a ser `example_com`) |
| Base de datos | contenedor de PostgreSQL incluido, con los datos dentro del directorio de instalación |
| Certificados | Let's Encrypt mediante Certbot, renovados automáticamente una vez por semana |
| Archivos subidos y archivos estáticos | servidos desde `https://storage.<domain>` |
| Actualizaciones | canal `stable`, con comprobación diaria, aplicadas sin tiempo de inactividad cuando es posible |

## 5\. Primer inicio de sesión

La contraseña de administrador generada se imprime en el registro de la plataforma:

```
docker logs example_com-platform-blue-1 | grep "Auto-init complete"
```

Abre `https://<domain>`, inicia sesión con el correo de administrador que pasaste con `-e` y cambia la contraseña enseguida. Trata el registro como un secreto hasta que lo hayas hecho.

## 6\. Comprobar el resultado

```
docker ps
```

Deberías ver un contenedor para cada uno de estos: `nginx`, `platform-blue`, `rag-pipeline-blue`, `postgres`, `redis`, `autoheal` y `snoopy`, todos con el nombre `<project>-<service>-1`.

## Si algo salió mal

`create` no se ejecutará por segunda vez mientras existan el directorio del proyecto o sus contenedores. Si los archivos están bien y solo algunos contenedores no se iniciaron, vuelve a crearlos sin perder nada:

```
./wlycli deploy restart -d example.com
```

Si hay que rehacer el despliegue en sí, elimínalo y empieza de nuevo. Esto borra la base de datos incluida junto con todo lo demás:

```
./wlycli deploy delete -d example.com --yes-please-delete-all-the-data
```

## Otros documentos

-   [**Welley CLI** docs/index.md](https://welley.com/es/administrators/docs/cli/)
-   [**Desplegar el servidor** skills/deploy-server/SKILL.md](https://welley.com/es/administrators/docs/deploy-server-skill/)
-   [**openai.yaml** skills/deploy-server/agents/openai.yaml](https://welley.com/es/administrators/docs/deploy-server-openai-yaml/)
-   [**Referencia de DigitalOcean** skills/deploy-server/references/digitalocean.md](https://welley.com/es/administrators/docs/deploy-server-digitalocean/)
