diff --git a/scripts/servidor/publicar-webs.sh b/scripts/servidor/publicar-webs.sh new file mode 100755 index 00000000..efde0607 --- /dev/null +++ b/scripts/servidor/publicar-webs.sh @@ -0,0 +1,84 @@ +#!/bin/sh +# Publica los sitios de la caja: PULL de los repos y regeneración de lo generado. +# +# ── POR QUÉ (2026-09-18) ──────────────────────────────────────────────────────────────────────── +# La mudanza dejó los sitios como COPIAS a mano en `/work/www` —4,2 G del monorepo para +# `tawasuyu.net`, más `takana`/`hifas`/`gioser-web`— sin ninguna forma de refrescarlas. Contenido +# correcto y modelo frágil: el día que cambia el repo, la web no se entera y nadie lo nota, porque +# un sitio viejo responde 200 igual que uno nuevo. +# +# Ahora Caddy sirve DIRECTO de los clones de git, así que **publicar = `git pull`**: +# +# tawasuyu.net, www → /work/sergio/tawasuyu (monorepo, con rewrites a web/tawasuyu-web) +# gioser.net → /work/sergio/gioser-web/ +# takana.gioser.net → /work/sergio/gioser-web/takana } las genera scripts/hermanas.py +# hifas.gioser.net → /work/sergio/gioser-web/hifas } +# gioser.net/{humanoid,muestras,vivo,ende,reencuentro} → /work/www/gioser-web/… (MEDIOS, no están en git) +# +# El `.git` de los clones no se filtra: el vhost tiene `@oculto path /.* */.*` → 404, y se comprueba +# abajo. La separación páginas-de-git / medios-de-disco es deliberada: los APK de humanoid y los +# 265 M de `muestras` no viven en ningún repo, así que se quedan donde están. +# +# Idempotente. Se corre EN LA CAJA. +set -eu + +MONO=${MONO:-/work/sergio/tawasuyu} +WEB=${WEB:-/work/sergio/gioser-web} + +tirar() { # $1 = clon + [ -d "$1/.git" ] || { echo "no hay clon en $1" >&2; return 1; } + antes=$(git -C "$1" rev-parse --short HEAD) + # ⚠ Sólo avance rápido: si alguien dejó cambios locales en el clon que sirve la web, esto NO los + # pisa — se queja y sigue. Un `git pull` que rebasa sobre un árbol servido es cómo se rompe un + # sitio en producción sin enterarse. + if git -C "$1" pull -q --ff-only 2>/dev/null; then + ahora=$(git -C "$1" rev-parse --short HEAD) + [ "$antes" = "$ahora" ] && echo " = $1 ya estaba al día ($ahora)" || echo " ↑ $1 $antes → $ahora" + else + echo " ⚠ $1 NO avanzó (¿cambios locales, o divergió?) — sigue en $antes" >&2 + fi +} + +echo "==> repos" +tirar "$MONO" +tirar "$WEB" + +echo "==> páginas generadas (takana y hifas)" +# `hermanas.py` trae el destino CABLEADO a `/home/sergio/gioser-web`, que es una ruta de gioser y en +# esta caja no existe. Se le pasa el del clon sin tocar el fichero del repo: el parche pertenece a +# ese repo, no a este guion. +sed "s|^DESTINO = Path(\"/home/sergio/gioser-web\")|DESTINO = Path(\"$WEB\")|" \ + "$WEB/scripts/hermanas.py" > /tmp/hermanas-caja.py +python3 /tmp/hermanas-caja.py >/dev/null +rm -f /tmp/hermanas-caja.py +for p in takana hifas; do + [ -s "$WEB/$p/index.html" ] || { echo " ✗ $p quedó sin index.html" >&2; exit 1; } +done +echo " ✓ takana $(wc -c < "$WEB/takana/index.html") B · hifas $(wc -c < "$WEB/hifas/index.html") B" + +echo "==> control: lo que se SIRVE tiene que ser lo que está en disco" +falla=0 +comprobar() { # $1 = url $2 = fichero en disco + viv=$(curl -s --max-time 15 "$1" | sha256sum | cut -c1-12) + dis=$(sha256sum "$2" 2>/dev/null | cut -c1-12) + if [ "$viv" = "$dis" ]; then printf " ✓ %-30s %s\n" "$1" "$viv" + else printf " ✗ %-30s vivo=%s disco=%s\n" "$1" "$viv" "$dis"; falla=$((falla+1)); fi +} +comprobar https://tawasuyu.net/ "$MONO/web/tawasuyu-web/index.html" +comprobar https://takana.gioser.net/ "$WEB/takana/index.html" +comprobar https://hifas.gioser.net/ "$WEB/hifas/index.html" +comprobar https://gioser.net/ "$WEB/index.html" + +# Los medios no salen de git, pero tienen que seguir en pie. +for u in https://gioser.net/humanoid/ https://gioser.net/muestras/; do + c=$(curl -s -o /dev/null -w "%{http_code}" --max-time 15 "$u") + [ "$c" = "200" ] && printf " ✓ %-30s %s\n" "$u" "$c" || { printf " ✗ %-30s %s\n" "$u" "$c"; falla=$((falla+1)); } +done + +# Y que servir DESDE UN CLON no exponga el repo. +g=$(curl -s -o /dev/null -w "%{http_code}" --max-time 15 https://tawasuyu.net/.git/config) +[ "$g" = "404" ] && echo " ✓ /.git/config → 404 (la regla @oculto cubre el clon)" \ + || { echo " ✗ /.git/config → $g — EL REPO ESTÁ EXPUESTO"; falla=$((falla+1)); } + +[ "$falla" -eq 0 ] || { echo "==> $falla control(es) en rojo" >&2; exit 1; } +echo "==> sitios publicados y verificados"