puerta 5 cerrada: repo.gioser.net sirve el repo FIRMADO, y el guion aprende cómo se recarga esta caja
`takana install zsh --repo https://repo.gioser.net --trust ./trust --require-signed` ⇒ `release: trusted (by release)`, 1331 ficheros en 0,286 s, zsh 5.9 corriendo. 173 paquetes anclados, 0 sin ancla, certificado CN=repo.gioser.net de Let's Encrypt. Tres cosas que sólo se supieron al poder entrar como root, y que el guion ahora sabe: · `caddy reload` NO funciona acá: el Caddyfile lleva `admin off` y el reload habla por ese admin (de ahí que el :2019 estuviera siempre cerrado). La recarga real es `arjectl restart caddy` — caddy es un Ente de arje con Restart{1000,30000}, no un proceso suelto. · Un restart levanta los 19 dominios o ninguno, así que el guion saca un TESTIGO de la config previa (acá gitea.gioser.net), espera a que responda, y si no vuelve restaura y revierte. Comprobado después: los 8 dominios vivos siguen en pie. · El certificado tarda más que la comprobación: el guion dio «todavía no responde» y la misma URL daba 200 segundos después. El mensaje ahora manda reintentar antes de ir a leer logs. Y dos fallos míos, medidos: backticks dentro de comillas y de un heredoc sin entrecomillar se EJECUTAN (salió un `journalctl: not found` en mitad de un mensaje de ayuda), y `[ -n "$X" ] && echo` como última orden mata el guion entero bajo `set -e`. El espejo provisional sin firmar de takana.gioser.net/repo se borró: con el firmado en pie, un origen sin firma no es un origen.
This commit is contained in:
@@ -75,7 +75,10 @@ export KEY
|
||||
# en el clon de tawasuyu, dejó 24 entradas suyas dentro del `.git` y congeló el clon para el dueño
|
||||
# sin que nada fallara del lado de root (ver `publicar-webs.sh`). Así que el scratch va aparte.
|
||||
if [ "$(id -u)" = "0" ] && [ -z "${TAKANA_WORK:-}" ]; then
|
||||
TAKANA_WORK="${TAKANA_WORK_ROOT:-/var/tmp/takana-publicar-work}"
|
||||
# `/var/tmp` no existe en la caja (sistema mínimo), así que se elige el que haya en vez de
|
||||
# crear un directorio que ese sistema decidió no tener.
|
||||
[ -d /var/tmp ] && _tmp=/var/tmp || _tmp=/tmp
|
||||
TAKANA_WORK="${TAKANA_WORK_ROOT:-$_tmp/takana-publicar-work}"
|
||||
export TAKANA_WORK
|
||||
install -d -m 755 "$TAKANA_WORK"
|
||||
echo "==> como root: scratch de build en $TAKANA_WORK (no en el árbol del usuario)"
|
||||
@@ -86,6 +89,40 @@ install -d -m 755 "$DESTINO"
|
||||
PERFIL="$PERFIL" STORE="$STORE" REPO="$DESTINO" TRUST="$TRUST" TAKANA="$TAKANA" \
|
||||
"$ROOT/scripts/repo-perfil.sh" "$PERFIL"
|
||||
|
||||
# ── CÓMO SE APLICA UNA CONFIG NUEVA, QUE NO ES `caddy reload` ───────────────────────────────────
|
||||
# El Caddyfile de la caja lleva `admin off` (por eso el `:2019` está cerrado), y **`caddy reload`
|
||||
# habla por el admin**: sin él no recarga nada y falla. Lo que hay es un supervisor: caddy es un
|
||||
# Ente de arje (`/etc/arje/cards.d/caddy.json`, `Restart{initial:1000,max:30000}`), así que la
|
||||
# recarga de verdad es `arjectl restart caddy` y esperar a que vuelva a escuchar.
|
||||
#
|
||||
# ⚠ Y no alcanza con que el proceso vuelva: hay que comprobar que **sigue sirviendo lo de antes**.
|
||||
# Un restart con la config nueva levanta los 19 dominios o ninguno, así que el testigo es un
|
||||
# dominio que YA funcionaba —sacado de la config previa— y si no responde, se revierte.
|
||||
TESTIGO="${TESTIGO:-}"
|
||||
aplicar_config() {
|
||||
if caddy reload --config "$CADDYFILE" 2>/dev/null; then
|
||||
echo " · recargado por el admin de Caddy"
|
||||
return 0
|
||||
fi
|
||||
command -v arjectl >/dev/null 2>&1 || {
|
||||
echo ' !! caddy reload falló (¿admin off?) y no hay arjectl para reiniciar' >&2
|
||||
return 1
|
||||
}
|
||||
echo " · el admin de Caddy está apagado ⇒ reinicio por el supervisor (arjectl)"
|
||||
arjectl restart caddy >/dev/null 2>&1 || return 1
|
||||
[ -n "$TESTIGO" ] || return 0
|
||||
i=0
|
||||
while [ "$i" -lt 25 ]; do
|
||||
if curl -sk -o /dev/null -m 3 "https://$TESTIGO/"; then
|
||||
echo " · testigo $TESTIGO responde: Caddy volvió con todo lo que ya servía"
|
||||
return 0
|
||||
fi
|
||||
i=$((i + 1)); sleep 1
|
||||
done
|
||||
echo " !! $TESTIGO no volvió a responder tras el reinicio" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
if [ "$INSTALL_VHOST" = "1" ]; then
|
||||
echo
|
||||
echo "==> vhost de Caddy en $CADDYFILE"
|
||||
@@ -99,6 +136,12 @@ if [ "$INSTALL_VHOST" = "1" ]; then
|
||||
cp -p "$CADDYFILE" "$COPIA"
|
||||
echo " copia de seguridad: $COPIA"
|
||||
|
||||
# El testigo sale de la config que YA funcionaba: el primer dominio con nombre propio.
|
||||
[ -n "$TESTIGO" ] || TESTIGO=$(grep -oE "^[a-z0-9][a-z0-9.-]+\.[a-z]+" "$COPIA" | head -1)
|
||||
# Sin `|| true` esto mataría el guion con `set -e` cuando no hay testigo: el `&&` con la
|
||||
# condición falsa devuelve 1 y `set -e` no distingue «no aplica» de «falló».
|
||||
[ -n "$TESTIGO" ] && echo " testigo para comprobar que no rompí nada: $TESTIGO" || true
|
||||
|
||||
# Un site block va al FINAL: las opciones globales de Caddy tienen que ser lo primero del
|
||||
# fichero, así que añadir al final nunca las invalida.
|
||||
cat >> "$CADDYFILE" <<EOF
|
||||
@@ -121,16 +164,16 @@ EOF
|
||||
fi
|
||||
echo " ✓ la config valida"
|
||||
|
||||
if ! caddy reload --config "$CADDYFILE"; then
|
||||
# El reload falló: Caddy sigue con lo que tenía cargado, pero el fichero en disco ya no
|
||||
# es eso. Se restaura para que el próximo arranque no levante una config que no probó
|
||||
# nadie, y se reintenta el reload con la buena.
|
||||
if ! aplicar_config; then
|
||||
# No se pudo aplicar: Caddy sigue con lo que tenía cargado, pero el fichero en disco ya
|
||||
# no es eso. Se restaura para que el próximo arranque no levante una config que no probó
|
||||
# nadie, y se vuelve a aplicar la buena.
|
||||
cp -p "$COPIA" "$CADDYFILE"
|
||||
caddy reload --config "$CADDYFILE" >/dev/null 2>&1 || true
|
||||
echo "!! el reload falló — restaurada $COPIA y recargada" >&2
|
||||
aplicar_config >/dev/null 2>&1 || true
|
||||
echo "!! no pude aplicar la config — restaurada $COPIA y revertida" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo " ✓ recargado"
|
||||
echo " ✓ aplicada"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -150,8 +193,9 @@ else
|
||||
cat <<EOF
|
||||
✗ el vhost está puesto y Caddy recargado, pero https://$NOMBRE todavía no responde.
|
||||
Lo normal a mirar, en este orden:
|
||||
· el CERTIFICADO: Caddy lo pide en la primera petición y tarda unos segundos; si falla,
|
||||
`journalctl -u caddy` (o el log de arje) lo dice — casi siempre es el :80 tapado o el DNS.
|
||||
· el CERTIFICADO: Caddy lo pide en la PRIMERA petición y puede tardar unos segundos más de
|
||||
los que espera esta comprobación — reintentá el curl antes de buscar nada. Si de verdad
|
||||
falla, el log de caddy (arjectl status caddy) lo dice: casi siempre el :80 tapado o el DNS.
|
||||
· el DNS: $NOMBRE tiene que resolver a ESTA caja (hoy: A → 2.29.29.217).
|
||||
· el repo: $DESTINO tiene que tener el index.json que acaba de firmarse.
|
||||
EOF
|
||||
|
||||
Reference in New Issue
Block a user