README: documentar el despliegue y las dos trampas que costaron

Anade la URL publica, el diagrama Gitea -> espejo en GitHub -> Coolify, como
publicar un cambio, como verificar contra el despliegue con BASE, y como
devolver la demo a su estado inicial con SEMBRAR_SIEMPRE.

Deja escritas las dos cosas que hicieron fallar los dos primeros despliegues:
que las variables de entorno de Coolify van cifradas (hay que crearlas con
artisan tinker, no con INSERT), y que en el compose deben ir en lista y por
nombre pelado, sin interpolar.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
Uriel Jareth
2026-07-30 00:06:46 -06:00
co-authored by Claude Opus 5
parent 20eb73d4aa
commit a3a00996e1
+51
View File
@@ -11,6 +11,8 @@ portal** en lugar de avisar por WhatsApp.
Está pensado para leerse cómodo: texto de 17 px, contrastes altos, botones grandes, tema claro y
una sola columna en el teléfono.
**En línea:** <https://instademo.urieljareth.org>
> **Es una demostración.** Los tres usuarios de acceso rápido son ficticios y los links de Google
> Meet son de ejemplo. La oferta educativa, los costos, las becas, los requisitos y los datos de
> contacto sí son los reales del instituto.
@@ -279,6 +281,55 @@ npm run capturas # abre tests/capturas/index.html
---
## El despliegue
Vive en `https://instademo.urieljareth.org`, sobre el Coolify self-hosted. El repositorio principal
está en Gitea y GitHub es solo un espejo, porque Coolify construye desde GitHub.
```
Gitea (urieljareth/insta-portal) ← repositorio principal
└─ espejo → GitHub (urieljarethbusiness-cpu/insta-portal)
└─ Coolify (app 52, build_pack dockercompose)
├─ mysql (mysql:8.0, volumen con nombre)
└─ web (Dockerfile, puerto 4180) ← Traefik ← Cloudflare Tunnel
```
Para publicar un cambio:
```bash
git push gitea main && git push github main
# y luego, desde el repo del manager:
# Invoke-RestMethod "$env:COOLIFY_API_URL/deploy?uuid=instademo0portal0insta0demo1&force=true" -Headers @{ Authorization = "Bearer $env:COOLIFY_TOKEN" }
```
Verificar el despliegue con la misma suite de siempre:
```powershell
$env:BASE="https://instademo.urieljareth.org"
node tests/api.mjs # 103 comprobaciones
npx playwright test # 51 pruebas × 2 = 102
```
### Dos cosas que costaron y conviene recordar
1. **Las variables de entorno de Coolify se guardan cifradas.** Escribirlas con un `INSERT` directo
deja un valor que Coolify no puede descifrar, y al normalizar el compose escribe `null`. Hay que
crearlas con el propio modelo:
`docker exec coolify php artisan tinker --execute="\App\Models\EnvironmentVariable::create([...])"`.
2. **En el compose, las variables van en lista y por nombre pelado.** Con
`MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}` el valor llegaba vacío, MySQL se negaba a inicializar
y `web` abortaba con `dependency failed to start`. Por eso el portal acepta los nombres nativos
`MYSQL_DATABASE` / `MYSQL_USER` / `MYSQL_PASSWORD`: un solo juego de variables alimenta a los dos
contenedores, sin interpolar nada.
### Devolver la demo a su estado inicial
El volumen de MySQL sobrevive a los redespliegues, así que lo que el equipo edite se queda. Para
volver al contenido original: poner la variable `SEMBRAR_SIEMPRE` en `true` en Coolify, redesplegar,
y volverla a `false`.
---
## Lo que falta para producción
1. **Enviar el enlace por correo** en lugar de mostrarlo en pantalla: `MOSTRAR_ENLACE=false` ya deja