1) `publicar-webs.sh` corría como root y hacía el `git pull` igual: git dejó 24 entradas de root dentro del .git de /work/sergio/tawasuyu —refs, logs, config, directorios de objetos— y el dueño se quedó sin poder ni hacer `fetch` («unable to append to .git/logs/refs/remotes/origin/main»). El clon quedó congelado 21 commits atrás sin que nada fallara del lado de root. Ahora el pull va COMO EL DUEÑO, y los cuatro clones quedaron con sus permisos. 2) `cc-por-zig.sh` elegía el rust con `ls -d …/*-rust | tail -1`, que es el último ALFABÉTICO: certificaba `fe277b32…` mientras la jaula usaba el vigente `6441302d…`. Dos artefactos distintos, uno certificado y otro en uso. Ahora pregunta por el hash vigente de la receta y sólo cae al más reciente —con el nombre exacto— si no puede. Lo detectó el agente comparando los dos guiones. 3) `rustdoc` entra en `tools`: el artefacto salía con cargo y rustc y SIN rustdoc, o sea que en una caja takana `cargo doc` no existe. `docs = false` se queda —la documentación de la std es otra decisión, cientos de MB—. Radio medido: 0 dependientes de build. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
92 lines
5.1 KiB
Bash
Executable File
92 lines
5.1 KiB
Bash
Executable File
#!/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.
|
|
# ⚠ COMO EL DUEÑO, NO COMO ROOT (2026-09-18). Este guion corre como root y hacía el `pull` igual:
|
|
# git dejó 24 entradas de root dentro del `.git` de /work/sergio/tawasuyu —refs, logs, config,
|
|
# directorios de objetos— y el dueño se quedó sin poder ni hacer `fetch`: «unable to append to
|
|
# .git/logs/refs/remotes/origin/main». El clon quedó congelado 21 commits atrás sin que nada
|
|
# fallara del lado de root. Lo reportó el agente que trabaja ahí.
|
|
duenio=$(stat -c %U "$1" 2>/dev/null || echo root)
|
|
if [ "$duenio" != "root" ] && [ "$(id -u)" = "0" ]; then tira="su $duenio -s /bin/sh -c"; else tira="sh -c"; fi
|
|
if $tira "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"
|