tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Definiciones

publicar los sitios pasa a ser `git pull`: Caddy sirve de los clones, no de copias

La mudanza dejó los sitios como copias a mano en /work/www —4,2 G del monorepo sólo para
tawasuyu.net— sin ninguna forma de refrescarlas. El contenido estaba bien y el modelo era frágil: el
día que cambia el repo la web no se entera, y eso no se nota, porque un sitio viejo responde 200
igual que uno nuevo.

Ahora Caddy sirve directo de los clones: tawasuyu.net del monorepo y gioser.net/takana/hifas del
clon de gioser-web. Los medios que NO están en git —los APK de humanoid, los 265 M de muestras,
vivo, ende— siguen en /work/www con su propio `root`, que es la separación correcta. Liberados 4,2 G.

El guion hace `pull --ff-only` (no pisa cambios locales de un árbol que está sirviendo), regenera las
dos páginas hermanas —hermanas.py trae el destino cableado a una ruta de gioser, así que se le pasa
el del clon sin tocar el fichero de ese repo— y después COMPRUEBA: que lo servido sea byte a byte lo
que hay en disco, que los medios sigan en 200, y que /.git/config dé 404, porque servir desde un clon
no puede exponer el repo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

69a93a9d0d5975dc77be66b1ae3c035ecf7548ed · por Sergio · (hace 1 mes) · padre 4be104c8f · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

1 archivos · +84 −0

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"