la caja tiene HORA, LATIDO y ROTACIÓN — y el respaldo del gitea dejó de ser a mano
`planear.py --revisar` sobre el censo ordena lo que queda, y lo primero no eran los servicios del usuario sino TRES CAPACIDADES que ninguna metrica reclama: el disparador periodico, la hora y la rotacion de logs. Los tres paquetes ya estaban sellados y declarados en `perfil.servidor` desde que ese perfil nacio — lo que faltaba era el eslabon que los ARRANCA, igual que con squid. · `chronyd`: la caja iba **15 s atrasada** y nadie la corregia. Ahora stratum 3 contra los NTP de Hetzner, 0,000005 s de NTP. Sin hora no hay TLS ni firmas, y el sintoma no se parece a la causa. · `crond`: no existia el latido. Verificado con una entrada `* * * * *` en el crontab REAL. · `logrotate`: `/var/log/squid` sin rotar. Diario, con `squid -k rotate` (squid mantiene los ficheros abiertos: un rename a secas lo deja escribiendo en un inode que nadie puede leer). · `scripts/respaldo-gitea.sh` + `17 3 * * *`: cierra el hueco del §6.15 — los 44 repos vivian en UNA copia y el respaldo se hacia a mano. Sube 23+21 repos (1,5 G) y un `gitea.db` de 332 M tomado con `.backup`, consistente con el servidor vivo. El control no es que el script salga 0: es CONTAR los repos de los dos lados. `chrony` y `cronie` NO declaraban `[[service]]` — el paquete llegaba a la imagen y no lo arrancaba nadie. Ahora lo declaran (fuera de `hash_inputs`: los hashes no se movieron) y el perfil los habilita. TRES MEDICIONES que valen mas que el resultado: 1. **La deriva era de gioser, no de la caja**: despues de sincronizar, el HUB quedo 3 s adelantado. Medir «contra el otro» sin un tercero no dice quien esta mal. 2. **El spool de cronie es `/var/spool/cron/<usuario>`**, no `…/crontabs/<usuario>`: `crontab -l` mostraba las entradas y `crontabs/` estaba vacio. Un crontab restaurado en el sitio equivocado es un fichero perfecto que nadie lee. 3. 🧨 **`sqlite3` seguia INERTE en la caja** (`compressBound: symbol not found`): el ultimo de los 23 del §6.4. Le faltaba `zlib-shared`, sellado y declarado en `perfil.base` desde el 11-09 — pero la caja se instalo antes. Sin el no habia snapshot consistente. Un paquete declarado no es un paquete instalado: en una caja viva vale lo que el `upgrade` proyecto. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1691,6 +1691,48 @@ escrito por el log daemon, y el `basic_ncsa_auth` leyendo el `passwd` de verdad
|
||||
con una clave mala contesta `ERR Wrong password`). Los dos primeros intentos de esta receta habrían
|
||||
llegado a producción sin ese control: el binario estaba sellado y el hash era estable las dos veces.
|
||||
|
||||
### 6.29 ⏱️ La caja tiene HORA, LATIDO y ROTACIÓN — y el respaldo del gitea dejó de ser a mano *(2026-09-15)*
|
||||
|
||||
`planear.py --revisar` sobre el censo del día ordena lo que queda, y lo primero de la lista no eran
|
||||
los servicios del usuario sino **tres capacidades que ninguna métrica reclama**: el disparador
|
||||
periódico, la hora y la rotación de logs. Los tres paquetes ya estaban sellados y declarados en
|
||||
`perfil.servidor` desde que ese perfil nació — **lo que faltaba era el eslabón que los ARRANCA**.
|
||||
|
||||
| | antes | ahora |
|
||||
|---|---|---|
|
||||
| `chronyd` | la caja iba **15 s atrasada** y nadie la corregía | stratum 3 contra `ntp{1,2,3}.hetzner.de`, **0,000005 s** de NTP |
|
||||
| `crond` | no existía el latido | ejecuta el crontab real, verificado con una entrada `* * * * *` |
|
||||
| `logrotate` | `/var/log/squid` sin rotar | diario con `squid -k rotate`, 14 copias |
|
||||
| respaldo del gitea | **a mano, una vez** (§6.15) | `17 3 * * *`, con el snapshot consistente de la sqlite |
|
||||
|
||||
**El respaldo, medido:** `scripts/respaldo-gitea.sh` sube **44 repos (23 `sergio` + 21 `tawasuyu`,
|
||||
1,5 G)** y un `gitea.db` de **332 M** tomado con `.backup` —consistente con el servidor vivo— al
|
||||
Storage Box. El control no es que el script salga 0: es **contar los repos de los dos lados**, que
|
||||
es lo que se hizo.
|
||||
|
||||
⚠ **`chrony` y `cronie` NO declaraban `[[service]]`**, como `squid` antes: el paquete llegaba a la
|
||||
imagen y no lo arrancaba nadie. Ahora lo declaran (fuera de `hash_inputs`: los hashes no se movieron)
|
||||
y `perfil.servidor` los habilita en `servicios`.
|
||||
|
||||
⚠ **La config va aparte y el servicio sale 78 si falta**, igual que gitea: a qué NTP se pregunta y
|
||||
qué logs se guardan son decisiones del SITIO. Una caja que se sincroniza contra un pool que nadie
|
||||
eligió es peor que una sin hora, porque nadie lo mira.
|
||||
|
||||
#### Tres cosas medidas que valen más que el resultado
|
||||
|
||||
1. **La deriva era de gioser, no de la caja.** Antes de chrony la caja iba 15 s atrás; después, la
|
||||
caja quedó en hora de NTP y **el hub pasó a estar 3 s adelantado**. La máquina de referencia era
|
||||
la equivocada — medir «contra el otro» sin un tercero no dice quién está mal.
|
||||
2. **El spool de cronie es `/var/spool/cron/<usuario>`, no `…/crontabs/<usuario>`.** `crontab -l`
|
||||
mostraba las entradas y `crontabs/` estaba vacío. El día que alguien restaure un crontab a mano
|
||||
en el sitio equivocado va a tener un fichero perfecto que nadie lee. Lo decide un control y no la
|
||||
intuición: meter un `* * * * *` en el crontab REAL y ver si dispara.
|
||||
3. 🧨 **`sqlite3` seguía inerte en la caja** (`Error relocating: compressBound: symbol not found`):
|
||||
es el último de los 23 binarios del §6.4, y le faltaba `zlib-shared` — **sellado y declarado en
|
||||
`perfil.base` desde el 2026-09-11**, pero la caja se instaló antes. Sin él no había snapshot
|
||||
consistente, o sea que el respaldo habría copiado la sqlite a lo bruto. *Un paquete declarado no
|
||||
es un paquete instalado: en una caja viva, lo que vale es lo que el `upgrade` proyectó.*
|
||||
|
||||
## 7. Reusar los scripts que ya existen, y no escribir de nuevo
|
||||
|
||||
Pedido explícito del usuario. El inventario de lo que ya hace el trabajo:
|
||||
|
||||
@@ -1409,4 +1409,8 @@ paquetes = [
|
||||
# `gitea` en `/etc/passwd`— y sale con 78 si falta alguna. Es a propósito: las dos vienen con los
|
||||
# datos de la mudanza, y un gitea que arranca sin su config ofrece el asistente de «crear
|
||||
# administrador» a quien pase. Hasta que la mudanza traiga ambas, este servicio NO levanta y lo dice.
|
||||
servicios = ["sshd", "gitea", "caddy", "minga", "squid"]
|
||||
# ⚠ `crond` y `chronyd` (2026-09-15) son las dos CAPACIDADES que un servidor necesita y que ninguna
|
||||
# métrica reclama: el latido y la hora. Sus paquetes ya estaban declarados arriba y sellados —lo que
|
||||
# faltaba era el eslabón que los ARRANCA, que es este. Una caja con `cronie` instalado y sin `crond`
|
||||
# corriendo se ve idéntica a una con latido, y no rota un log ni respalda nada.
|
||||
servicios = ["sshd", "gitea", "caddy", "minga", "squid", "crond", "chronyd"]
|
||||
|
||||
Reference in New Issue
Block a user