Commit Graph
485 Commits
Author SHA1 Message Date
Gitea CI 63a5bfb7c4 ci: update shortsmith image to 358eec9e [skip ci] 2026-08-19 21:04:15 +00:00
Gitea CI 0d8d2edaf7 ci: update shortsmith image to fd6a08ad [skip ci] 2026-08-18 22:18:14 +00:00
Gitea CI 7fd99d82a4 ci: update shortsmith image to e32c59f8 [skip ci] 2026-08-18 21:55:22 +00:00
Gitea CI f349f1a916 ci: update shortsmith image to c8777c02 [skip ci] 2026-08-18 17:20:49 +00:00
Gitea CI 4b58f00879 ci: update shortsmith image to 530db4fb [skip ci] 2026-08-18 16:58:39 +00:00
Gitea CI 65d94ad561 ci: update shortsmith image to 7ea1ae56 [skip ci] 2026-08-18 16:45:08 +00:00
Gitea CI 2ee0b2661d ci: update researchowl image to a17edf43 [skip ci] 2026-08-13 21:53:33 +00:00
Gitea CI d121238b75 ci: update researchowl image to 6e4b3e13 [skip ci] 2026-08-13 21:47:28 +00:00
Gitea CI 4e66c7413e ci: update researchowl image to 818533c8 [skip ci] 2026-08-13 21:39:38 +00:00
Gitea CI 3200426629 ci: update researchowl image to 6f960c30 [skip ci] 2026-08-13 21:32:25 +00:00
Gitea CI 5f5be3a0a3 ci: update researchowl image to 4099e3ee [skip ci] 2026-08-13 20:59:28 +00:00
Gitea CI 8d162ca15e ci: update researchowl image to 77029fa8 [skip ci] 2026-08-12 22:09:50 +00:00
Gitea CI 40b8566e88 ci: update researchowl image to 91ceb3b1 [skip ci] 2026-08-12 21:38:03 +00:00
chemavxandClaude Opus 5 e6ba49a1af gitea-runner: el janitor deja el uso del volumen en su log
Tras el desalojo del 2026-08-12 no quedaba nada que mirar: el emptyDir
muere con el pod, así que la causa hubo que deducirla por descarte.

Ahora el janitor mide /dind (montado en solo lectura) antes y después de
cada barrido y lo escribe en su log, cada 6h. La próxima vez habrá curva
de crecimiento medida en vez de conjeturas.

No se usa Prometheus porque no puede verlo: kubelet_volume_stats_* solo
emite series para PVCs y container_fs_usage_bytes viene vacío en k3s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 20:17:09 +00:00
chemavxandClaude Opus 5 472bb6e5b9 gitea-runner: sidecar que barre imágenes huérfanas en dind
El pod fue desalojado el 2026-08-12 tras 21 días: el emptyDir de dind
superó su límite de 10Gi.

La caché de buildx no era la causa (los workflows hacen `buildx rm` al
inicio de cada run y se recicla sola, ~330M). Lo que se acumula son
imágenes sin tag: al republicar upstream catthehacker/ubuntu:act-22.04,
la anterior (1,5G) queda colgada para siempre.

Ni el GC de dockerd ni el de buildkit lo recogen porque ambos calculan
su umbral contra el disco del nodo (913G), no contra el cap del pod.
Nunca saltan antes del desalojo.

El sidecar hace `docker image prune -f` cada 6h por localhost:2375.
Sin -a: solo dangling, nunca una imagen con tag, así que la caché de
act y la de buildkit siguen intactas y los builds no se frenan.

Se descartó un CronJob externo: exigiría pods/exec o publicar el 2375
como Service, y ese puerto va sin TLS ni auth sobre un docker
privilegiado.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 20:09:57 +00:00
Gitea CI 70909e93be ci: update shortsmith image to 2cd52cdd [skip ci] 2026-08-12 15:40:00 +00:00
Gitea CI ae2699f796 ci: update shortsmith image to f234b406 [skip ci] 2026-08-12 15:33:36 +00:00
Gitea CI 88f62c8a39 ci: update shortsmith image to 1db2ed21 [skip ci] 2026-08-12 15:12:05 +00:00
Gitea CI ce3ba96b85 ci: update shortsmith image to 43a26f60 [skip ci] 2026-08-12 15:04:49 +00:00
Gitea CI 637fe0f1d1 ci: update shortsmith image to 31b14998 [skip ci] 2026-08-11 22:30:02 +00:00
Gitea CI 6701d3375d ci: update shortsmith image to a2726e57 [skip ci] 2026-08-10 17:13:05 +00:00
Gitea CI eed9abfa4e ci: update researchowl image to 366ded1f [skip ci] 2026-08-06 21:42:54 +00:00
Gitea CI 71c6495d27 ci: update researchowl image to cfe4a6d7 [skip ci] 2026-08-06 21:36:06 +00:00
Gitea CI 2479d81a2d ci: update shortsmith image to 78162e99 [skip ci] 2026-08-06 21:35:58 +00:00
Gitea CI 0cd3896512 ci: update researchowl image to 129f436f [skip ci] 2026-08-06 16:22:50 +00:00
Gitea CI ef80e1f808 ci: update shortsmith image to f6ff2a71 [skip ci] 2026-08-06 16:22:41 +00:00
Gitea CI 50d16c4268 ci: update researchowl image to a13c3062 [skip ci] 2026-08-06 15:38:46 +00:00
Gitea CI 90e8b39205 ci: update shortsmith image to f685f340 [skip ci] 2026-08-06 15:32:28 +00:00
Gitea CI ddcfbc7b8e ci: update researchowl image to 93a506b6 [skip ci] 2026-08-06 14:41:38 +00:00
Gitea CI 4ada782f4f ci: update shortsmith image to a5e4ebdd [skip ci] 2026-08-06 14:36:56 +00:00
Gitea CI 320a8b9ffd ci: update researchowl image to 1fd0c1b3 [skip ci] 2026-08-06 14:15:41 +00:00
Gitea CI 9d26f8ffa4 ci: update researchowl image to 96099032 [skip ci] 2026-08-06 14:02:28 +00:00
chemavxandClaude Opus 5 87a4ece6f4 backup-system: barrido semanal de imágenes containerd por nodo
El worker llegó al 80,9% de disco: 223 imágenes para ~20 pods, 62 GB en
containerd. Cada build de CI publica un tag y nadie recoge los viejos —
97 tags de researchowl y 105 de polymarket-bot, decomisada en julio.

El GC de kubelet no basta: solo entra al 85% de imagefs, o sea cuando ya
no queda sitio. Un prune manual dejó el worker en 23% (54 GB) y el master
en 15% (58 GB).

Un CronJob por nodo porque un CronJob programa un solo pod; el nodo se
fija con nodeSelector. Domingos 06:30 y 07:15, el hueco entre backups.

El script hace varias pasadas a propósito: borrar snapshots satura a
containerd y las llamadas siguientes dan DeadlineExceeded. No es fallo,
es cola. Se reintenta mirando la salida, no el código de retorno, porque
crictl devuelve 0 aunque haya borrados fallidos.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 16:14:40 +00:00
chemavxandClaude Fable 5 27f57edb6b researchowl: env de YouTube para /upload_short, claves opcionales a propósito
Las tres secretKeyRef van optional: true: mientras no existan en Infisical
el pod arranca igual y el comando contesta 'no configurado'. Sin optional,
una clave que aún no está deja el Deployment en CreateContainerConfigError
y tira el bot entero por una función sin estrenar.

YOUTUBE_PRIVACY=private documenta el candado: los vídeos por API de un
proyecto sin auditar quedan privados los pidas como los pidas.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 15:53:47 +00:00
Gitea CI a73b66bb5f ci: update researchowl image to cc1f0cab [skip ci] 2026-08-05 15:53:08 +00:00
chemavxandClaude Opus 5 fc3be78c9d renovate: fuera polymarket-bot, decomisado el 17-jul
Renovate seguia escaneandolo 6 veces al dia y empujando ramas a un repo
muerto: renovate/uvicorn-0.x se actualizo el 2-ago, 16 dias despues del
decomiso. Misma familia que el bloque de Polymarket del Resumen Diario:
decomisar un servicio no lo saca de las cosas que lo miran.

Quedan 11 ramas renovate/* en el repo; se limpian aparte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 21:23:36 +00:00
Gitea CI e27a46be4b ci: update researchowl image to 20c8d03a [skip ci] 2026-08-01 21:58:31 +00:00
Gitea CI edf8bb8261 ci: update shortsmith image to 42dcb408 [skip ci] 2026-08-01 17:12:46 +00:00
Gitea CI 7593ec8019 ci: update shortsmith image to dae4b12d [skip ci] 2026-08-01 17:08:59 +00:00
Gitea CI 1c5289d381 ci: update shortsmith image to 5dc59d08 [skip ci] 2026-08-01 17:00:13 +00:00
Gitea CI b4f4112e23 ci: update shortsmith image to 854f9144 [skip ci] 2026-08-01 16:43:01 +00:00
chemavxandClaude Opus 5 aeb31eae59 shortsmith: recursos medidos en el pod, no en el host
El primer render real murio OOMKilled con el limite de 1Gi que salia de medir en
la maquina de desarrollo. El host lleva ffmpeg 4.4.2 y la imagen 7.1.5, y 7.0
reescribio la transcodificacion sobre un planificador con colas de fotogramas
decodificados entre componentes: pasarle el WAV como segunda entrada dejaba al
decodificador de video correr por delante y llenar una cola con fotogramas de
6,2 MB. Arreglado partiendo el encode en dos pasos (repo shortsmith), y aqui van
las cifras nuevas, medidas dentro del pod.

requests 768Mi (pico anon 640 MB), limits 1536Mi. El limite no es 1Gi por el
caso techo de 180 s: ahi el pico era 940 MB de 1024 y sobrevivia solo porque
quedaba cache reclamable que soltar. A 1.5Gi memory.events da max 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 16:40:24 +00:00
Gitea CI 0a6d0e9b58 ci: update shortsmith image to 46b39256 [skip ci] 2026-08-01 16:13:58 +00:00
Gitea CI 4edd7575e6 ci: update shortsmith image to 171dc544 [skip ci] 2026-08-01 15:44:25 +00:00
chemavxandClaude Opus 5 60235a75c9 shortsmith: deployment, service, PVC y Application
Renderizador determinista JSON->MP4 para Shorts. API interna sin Ingress, en
shortsmith-svc:8080; la cola es por proceso y la SQLite va en RWO, de ahí la
replica unica con estrategia Recreate.

Los recursos van medidos, no estimados, y la tabla con las cifras queda en el
propio manifiesto: el pico son 522 MB de anon y lo pone entero el encode, no el
render. Ojo al comentario sobre por que los workers salen del limite de CPU y no
del request.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 15:18:46 +00:00
chemavxandClaude Opus 5 97ff13cc83 docs: leer la sqlite de n8n con cp se salta el WAL
Un barrido hecho con cp dijo que un cambio recien escrito no estaba, media
hora despues de escribirlo. La copia no tiene los ultimos commits y no da
ningun error.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 16:15:30 +00:00
chemavxandClaude Opus 5 d9e8de9e17 CLAUDE.md: tras publicar por SQLite hay que reiniciar el pod de n8n
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 09:00:49 +00:00
chemavxandClaude Opus 5 bd92f5ae9d Distinguir "no se reinicio" de "no pude comprobarlo"
El GET de comprobacion no miraba su propio codigo HTTP. Un 403 devuelve un
objeto Status, que parsea como JSON perfectamente y luego revienta en
dep.spec.replicas ("Cannot read properties of undefined (reading 'replicas')").
El aviso resultante decia "reinicio fallido, intervencion manual necesaria"
cuando el reinicio habia ido BIEN y lo unico roto era la verificacion.

Falso negativo, mucho menos grave que el falso positivo de ayer -- pero te
levanta de la cama para nada, y estando Jose fuera eso importa.

Ahora el nodo marca verificable:false cuando no ha podido comprobar (HTTP no
2xx, cuerpo ilegible o error de red) y el aviso lo dice con esas palabras,
con el codigo de la comprobacion aparte del codigo del PATCH.

Reproducido en produccion: POST legitimo a las 08:43:22 (PATCH ok, restartedAt
cambia), permiso retirado a los 15 s, GET a los 60 s con 403. Ejecucion de
60,394 s, o sea el camino completo.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 08:46:25 +00:00
chemavxandClaude Opus 5 f0e99635bf CLAUDE.md: el auto-reinicio ahora falla en cerrado y con permisos por nombre
Anade tambien como leer por que rama fue una ejecucion cuando
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none ya la ha vaciado: por la duracion.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 08:08:50 +00:00
chemavxandClaude Opus 5 50f090bbea Cerrar el auto-reinicio: fail-closed, permisos por nombre y fallo visible
Tres agujeros que encontro una review adversarial de Codex sobre el trabajo
de ayer. Los tres verificados contra el fichero antes de tocar nada.

1. El webhook publico fallaba en ABIERTO. Con `optional: true` y un
   `if (secreto && ...)`, la ausencia del secreto equivalia a autorizacion:
   cualquier POST con heartbeat.status=0 y un monitor.name del mapa reiniciaba
   n8n, Gitea, ArgoCD, Vaultwarden o los blogs. El argumento para dejarlo asi
   era "que un despiste no te deje sin avisos", y era falso: el aviso de caida
   lo manda Kuma por su notificacion 1, directa, no por este webhook.
   Ahora el secreto es obligatorio (sin `optional`) y la puerta rechaza si
   falta. Secreto ausente da error ruidoso; cabecera que no casa, vacio.

2. El ClusterRole permitia patch sobre CUALQUIER deployment de 10 namespaces,
   y la SA va montada en el pod entero de n8n: cualquier workflow con un nodo
   Code heredaba eso. Ahora son Roles por namespace con resourceNames sobre
   los 12 workloads exactos del SERVICE_MAP.

3. El flujo daba exito aunque el PATCH fallara. `restartOk` se calculaba y se
   tiraba: `K8s API Check Status` construia un objeto nuevo sin el, y el IF
   final solo miraba `statusOk`. Un 403 sobre un servicio ya sano mandaba
   "reiniciado correctamente". Ahora hay rama de fallo tras el PATCH y el
   exito exige observedGeneration >= la generation que devolvio el PATCH.
   Se compara con >= porque selfHeal de ArgoCD revierte la anotacion y vuelve
   a subir la generation; con == daria un fallo falso.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 08:02:07 +00:00