El nombre está dado de alta en la zona de Hetzner con la convención de la zona (A, ttl 60, la misma IP que takana/git/gitea/www). Resuelve — comprobado contra Cloudflare; el resolutor de Google aún servía el NXDOMAIN cacheado, que es negativo de 1 h por el `minimum` del SOA y no un fallo del alta. ⚠ La API vieja de DNS de Hetzner (dns.hetzner.com/api/v1) ya no es la buena y devuelve HTML de la consola web, que es lo peor que puede devolver: no falla, contesta. Las zonas están hoy en la API de cloud y las lee el MISMO token de ~/.config/hcloud/cli.toml (gioser.net = zona 986350). Hoy el nombre resuelve y no sirve nada: falta el vhost, que es root. `publicar-repo.sh` hace la parte publicable —repo firmado en /srv/repo + verificación contra trust/— y para imprimiendo el bloque de Caddy en vez de editarlo: esta caja sirve 19 dominios y su Caddyfile ya lleva 20 `.bak`. Y aborta antes de publicar si el takana de la caja es anterior al arreglo del SDD 28 §5.5 (se detecta porque no conoce `outdated`): con uno viejo el repo sale con las 16 recetas multi-parche irreproducibles y 8 paquetes prometiendo un binario que no existe.
80 lines
4.0 KiB
Bash
Executable File
80 lines
4.0 KiB
Bash
Executable File
#!/bin/sh
|
|
# publicar-repo.sh — deja el repo FIRMADO servido en `repo.gioser.net`. Se corre EN LA CAJA, como
|
|
# root (la clave privada de release vive en `/root/.config/takana/keys/`, SDD 28 §2116).
|
|
#
|
|
# ── QUÉ HACE ────────────────────────────────────────────────────────────────────────────────────
|
|
# 1. publica la clausura del perfil en `/srv/repo` con `repo-perfil.sh` (que ABORTA si no está la
|
|
# clave: un índice firmado con una efímera que nadie conoce no lo verifica nadie),
|
|
# 2. comprueba que el índice verifica contra `trust/`,
|
|
# 3. dice si Caddy ya sirve el nombre, y **si no, imprime el bloque y para**.
|
|
#
|
|
# ── POR QUÉ NO EDITA EL CADDYFILE ───────────────────────────────────────────────────────────────
|
|
# En esta caja Caddy sirve 19 dominios y su Caddyfile ya acumula 20 `.bak` (SDD 28 §1). Un guion que
|
|
# lo reescribe a ciegas es cómo se tiran 19 sitios para levantar uno. El bloque va a mano, una vez:
|
|
#
|
|
# repo.gioser.net {
|
|
# root * /srv/repo
|
|
# file_server browse
|
|
# }
|
|
#
|
|
# y después `caddy reload --config /etc/caddy/Caddyfile`. El DNS ya está: `repo` A → 2.29.29.217,
|
|
# ttl 60, en la zona de Hetzner (dado de alta el 2026-09-21).
|
|
#
|
|
# ⚠ **Un solo origen es exactamente lo que el ADR 0014 existe para no tener.** Esta caja sirviéndose
|
|
# a sí misma está bien como camino normal, pero el `--repo` de los clientes debería llevar también
|
|
# el Storage Box: el primer origen roto, si es el único, es el último.
|
|
#
|
|
# Uso: sudo scripts/servidor/publicar-repo.sh [perfil]
|
|
# Env: PERFIL (def servidor) · STORE (def /store) · DESTINO (def /srv/repo)
|
|
# NOMBRE (def repo.gioser.net) · TRUST (def ./trust)
|
|
set -eu
|
|
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
|
|
|
|
PERFIL="${1:-${PERFIL:-servidor}}"
|
|
STORE="${STORE:-/store}"
|
|
DESTINO="${DESTINO:-/srv/repo}"
|
|
NOMBRE="${NOMBRE:-repo.gioser.net}"
|
|
TRUST="${TRUST:-$ROOT/trust}"
|
|
TAKANA="${TAKANA:-$ROOT/target/release/takana}"
|
|
|
|
[ "$(id -u)" = "0" ] || { echo "!! corré esto como root: la clave de release está en /root/.config/takana/keys/" >&2; exit 2; }
|
|
[ -x "$TAKANA" ] || { echo "!! falta $TAKANA (cargo build --release)" >&2; exit 2; }
|
|
|
|
# ⚠ El binario TIENE que traer el arreglo de los parches múltiples y del target_bin (SDD 28 §5.5):
|
|
# con uno anterior, las 16 recetas con ≥2 parches se publican irreproducibles y 8 paquetes más
|
|
# (bash, sed, tar, parted, dhcpcd, squid, wpa_supplicant, zsh) prometen un binario que no existe.
|
|
"$TAKANA" outdated --help >/dev/null 2>&1 || {
|
|
echo "!! este $TAKANA es anterior al arreglo del SDD 28 §5.5 (no conoce 'outdated')." >&2
|
|
echo " Reconstruilo —cargo build --release— antes de publicar, o el repo sale roto." >&2
|
|
exit 2
|
|
}
|
|
|
|
echo "==> publicando el perfil '$PERFIL' en $DESTINO"
|
|
install -d -m 755 "$DESTINO"
|
|
PERFIL="$PERFIL" STORE="$STORE" REPO="$DESTINO" TRUST="$TRUST" "$ROOT/scripts/repo-perfil.sh" "$PERFIL"
|
|
|
|
echo
|
|
echo "==> ¿lo sirve Caddy?"
|
|
if curl -fsS -m 10 "https://$NOMBRE/index.json" -o /dev/null 2>/dev/null; then
|
|
echo " ✓ https://$NOMBRE/index.json responde"
|
|
echo
|
|
echo " probalo desde cualquier hub (necesita el lab: install reproduce desde fuente):"
|
|
echo " takana install zsh --repo https://$NOMBRE --trust ./trust --require-signed"
|
|
echo " y el aviso periódico:"
|
|
echo " REPO=https://$NOMBRE scripts/servidor/avisar-actualizaciones.sh"
|
|
else
|
|
cat <<EOF
|
|
✗ https://$NOMBRE todavía no responde. El repo YA está publicado y firmado en $DESTINO;
|
|
lo que falta es el vhost. Añadí a /etc/caddy/Caddyfile:
|
|
|
|
$NOMBRE {
|
|
root * $DESTINO
|
|
file_server browse
|
|
}
|
|
|
|
y recargá: caddy reload --config /etc/caddy/Caddyfile
|
|
Después volvé a correr este guion: comprueba el lazo entero en vez de darlo por hecho.
|
|
EOF
|
|
exit 1
|
|
fi
|