diff --git a/scripts/servidor/publicar-humanoid.sh b/scripts/servidor/publicar-humanoid.sh new file mode 100755 index 00000000..5623c23c --- /dev/null +++ b/scripts/servidor/publicar-humanoid.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# Publica la subpágina `gioser.net/humanoid` en la caja. SE CORRE DESDE EL LAPTOP, no en la caja. +# +# ── POR QUÉ ES DISTINTA DE LAS DEMÁS (2026-09-18) ─────────────────────────────────────────────── +# El resto de los sitios se publican con `git pull` porque Caddy sirve de los clones +# (`publicar-webs.sh`). Con humanoid no se puede: su repo es el proyecto **Android** —gradle, con +# consola/cubo/keyboard/launcher/matiz/nimbo/nonet/notas— y lo que se sirve son **APK ya +# construidos** más su índice. Eso es salida de release: no vive en ningún repo, y para regenerarla +# hay que COMPILAR con Android SDK + Java, que la caja no tiene. +# +# Así que hasta que la caja pueda construir Android, esto es un `rsync` del árbol que produce el +# laptop. Es un puente declarado, no el modelo: el día que haya build reproducible, esta receta se +# jubila y humanoid se publica como los demás. +# +# ⚠ `--checksum` a propósito: los APK se reconstruyen a menudo con el MISMO tamaño y otra fecha, y +# un rsync por fecha subiría 91 M cada vez. Con checksum se midió lo que de verdad cambia: en la +# corrida del 2026-09-18, tres ficheros (`index.html`, `en/index.html` y `rizoma-launcher.apk`) —los +# otros nueve APK sólo tenían la marca de tiempo distinta. +# +# ⚠ Y NO lleva `--delete`: el árbol de la caja podría tener algo que el laptop no, y borrar a ciegas +# en lo que se está sirviendo no es una publicación, es una pérdida. Si hace falta podar, a mano. +set -eu + +ORIGEN=${ORIGEN:-/home/sergio/gioser-web/humanoid/} +CAJA=${CAJA:-root@2.29.29.217} +DESTINO=${DESTINO:-/work/www/gioser-web/humanoid/} +LLAVE=${LLAVE:-$HOME/.ssh/github5} +PUERTO=${PUERTO:-22022} +URL=${URL:-https://gioser.net/humanoid/} + +[ -f "${ORIGEN}index.html" ] || { echo "no encuentro la página en $ORIGEN" >&2; exit 1; } +SSH="ssh -i $LLAVE -p $PUERTO -o StrictHostKeyChecking=accept-new" + +echo "==> qué cambia (en seco, por contenido)" +rsync -an --checksum --itemize-changes -e "$SSH" "$ORIGEN" "$CAJA:$DESTINO" | grep -E '^[<>ch]' || echo " (nada)" + +echo "==> subiendo" +rsync -a --checksum --itemize-changes -e "$SSH" "$ORIGEN" "$CAJA:$DESTINO" | grep -E '^[<>ch]' || true + +# ── CONTROL: lo que se SIRVE, no lo que se copió ──────────────────────────────────────────────── +# Un rsync que "salió bien" y una página vieja conviven sin ruido: hay que preguntarle al sitio. +echo "==> control" +loc=$(sha256sum "${ORIGEN}index.html" | cut -c1-12) +viv=$(curl -s --max-time 30 "$URL" | sha256sum | cut -c1-12) +[ "$loc" = "$viv" ] || { echo " ✗ la página servida ($viv) NO es la local ($loc)" >&2; exit 1; } +echo " ✓ índice: $viv" + +# Y un APK, porque el índice puede estar bien y la descarga rota: es lo que la gente se lleva. +apk=$(ls "$ORIGEN"*.apk 2>/dev/null | head -1) +if [ -n "$apk" ]; then + n=$(basename "$apk") + l=$(sha256sum "$apk" | cut -c1-12) + v=$(curl -s --max-time 120 "$URL$n" | sha256sum | cut -c1-12) + [ "$l" = "$v" ] || { echo " ✗ $n servido ($v) ≠ local ($l)" >&2; exit 1; } + echo " ✓ $n: $v" +fi +echo "==> humanoid publicado"