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