From a3a00996e1fb671ca997573dbee878b4ab17457b Mon Sep 17 00:00:00 2001 From: Uriel Jareth Date: Thu, 30 Jul 2026 00:06:46 -0600 Subject: [PATCH] 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) --- README.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/README.md b/README.md index 9bb8d13..b1fb819 100644 --- a/README.md +++ b/README.md @@ -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:** + > **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