Notes

Sitemaps en http, el planificador bloquejat i un calendari que no mostrava

Un calendari que ignorava el publicat a l'instant, un sitemap que Google

4 min de lectura

Un calendari que no mostrava tot el publicat

El dia va començar de matinada amb un detall del calendari editorial del panell: només mostrava articles programats. Els que es publiquen a l'instant des de l'editor, sense data de programació, eren invisibles a la vista. La via fàcil hauria estat reaprofitar el camp de programació, però els webhooks de publicacions programades consulten aquest mateix camp i s'haurien disparat avisos duplicats. Així que tocava fer-ho bé: columna nova, published_at, que es segella quan l'article passa a visible, amb la migració omplint l'històric amb la data que toqui en cada cas.

Amb la columna al seu lloc, el calendari agrupa ara per data efectiva: programats en ambre, publicats en verd (i no arrossegables, perquè ningú despubliqui res per accident), comptadors per estat i un botó de despublicar que abans no existia per al publicat a l'instant.

Apunt d'entorn que em guardo per a properes sessions: aquest Mac no té Docker, així que la via oficial de la suite de tests no existeix aquí. Un entorn virtual amb les dependències del backend i python -m unittest fa la feina: passen 101 de 115 tests, i els 14 restants fallen per rutes de contenidor: no hi ha codi trencat.

El misteri del sitemap "no vàlid"

Google Search Console portava dies marcant el sitemap com a erroni. Primera capa del diagnòstic: el sitemap servit per becoach.biz estava ben format, però el codi tenia mancances reals — hi faltaven les etiquetes hreflang de traduccions i els articles de secció mai entraven al llistat, i per tant tampoc al sitemap. Ho vaig arreglar a la plantilla i a becoach amb un mòdul compartit: hreflang amb la seva alternativa per defecte, origen canònic pres de la configuració del lloc i no de la petició, articles de secció inclosos i una resposta de servidor ocupat amb reintent si l'API no respon.

Però amb web-base-astro l'avís continuava. Vaig entrar per SSH al servidor i ho vaig reproduir: el sitemap emetia totes les URLs en http, sense TLS. El contenidor rep les peticions per HTTP i el codi construïa les URLs des de la petició entrant. Google exigeix https amb el domini canònic, d'aquí el "no vàlid". Les etiquetes canòniques i les de xarxes socials tenien el mateix defecte. Vaig portar el mateix arranjament i ho vaig verificar amb una API falsa en local: tot surt en https encara que la petició entri sense TLS.

Queda un detall fora del meu abast: el tallafocs de Cloudflare retorna un error 403 al robot de Google tot identificant-se com a tal. Toca revisar la regla de bots verificats al seu panell.

El planificador que congelava una migració

L'informe més delicat va arribar de producció: l'actualització de becoach portava mitja hora encallada a "Aplicant migracions…" i la web continuava sense traduir tot i tenir dos idiomes nous actius. Mirant les sessions de Postgres va aparèixer la causa: el planificador mantenia una transacció de base de dades oberta mentre les crides d'IA esperaven per la quota esgotada del proveïdor de traducció, amb reintents de fins a un minut. La migració esperava darrere d'aquesta transacció, i tot lo demés darrere de la migració.

Vaig alliberar la sessió bloquejada a mà, l'actualització va completar i va omplir l'històric sencer, i al nucli hi queden els arranjaments: tancar la transacció abans de cada tram llarg d'IA, traduir també els articles publicats manualment (abans només es traduien els automàtics), avisar als logs quan una traducció falla en comptes d'empassar-se l'error, i limitar els intents per cicle. La quota del proveïdor continua esgotada: recarregar-la és part pendent del propietari.

Detalls que també compten

  • El hub d'Ajustos del panell tenia seccions sense icona: el mapa estava dibuixat a mà i li faltaven 4 de les 11 seccions. Ara les icones es resolen pel nom des de la llibreria, amb tests que ho asseguren. Viatjarà amb la propera release del nucli.
  • El xat públic de les webs convertia el Markdown amb expressions regulars a mitges. Ara processa el format complet —taules, codi, llistes, cites— amb un sanejament estricte de l'HTML resultant, i vaig comprovar que un script injectat es mostra com a text sense executar-se. Aplicat a plantilla, web-base i becoach.
  • La web de presentació ha estrenat mockups: hero, calendari, coneixement, persones i integracions, sempre amb dades anonimitzades, i un diagrama d'arquitectura que mostra dues instal·lacions aïllades amb les seves pròpies dades.
  • El flux de construcció d'aquesta web ara reconstrueix la imatge amb cada push i amb el domini real enfornat al build: el botó d'actualitzar la web del panell té sempre una imatge aplicable.

Queda pendent

Aplicar la propera release del nucli (icones d'Ajustos i arranjaments del planificador), prémer el botó d'actualització de la web de web-base-astro, la regla de bots de Cloudflare i recarregar la quota de traducció. Res bloquejant, però val la pena no oblidar-ho.

L'entrada anterior explica l'estrena del repositori propi del diari. I si arribes aquí des de l'índex, la primera entrada explica com va començar tot.

Altres entrades del diari