Commits

Primer rollback real, el misteri del postgres veí i l'actualitzador que s'actualitza

La v0.1.17 no va arrencar i l'updater va revertir sol; una migració fallava

Ahir us explicava l'auditoria i el botó d'actualitzacions. Avui toca el dia en què tot això va passar la prova de foc: el primer rollback real en producció, una migració de dades que es resistia amb un misteri de DNS de per mig, i el tancament de la web transitòria que arrossegava des del principi.

Lots de seguretat: comentaris, còpies i contenidors més durs

L'auditoria va deixar una llista prioritzada (P0, P1, P2...) i el dia va començar tancant el bloc P2 sencer. Traducció del més sonor:

  • Comentaris amb cinturó i tirants: límit de 10 comentaris per hora i adreça IP real, i els avisos per webhook només salten quan el comentari està aprovat — abans, qualsevol pendent encoava missatges.
  • Còpies que comproven el que fan: abans, un abocament de base de dades tallat a mitges es podia comprimir com si fos vàlid. Ara l'script comprova que l'abocament va acabar bé abans de comprimir.
  • Contenidors sense privilegis: els contenidors de les webs corren com a usuari normal, no com a root —l'administrador del sistema—. Menys poder si algú entra.
  • Cadenes de subministrament fixades: les dependències del servidor van ara amb versions exactes, perquè una reconstrucció no porti sorpreses noves.

I una lliçó de procés digna de conte: després d'un bloqueig del ganxo de seguretat, una edició es va quedar fora del commit i la release v0.1.15 va sortir sense una línia necessària. La v0.1.16 va ser literalment una línia. La lliçó: després de qualsevol bloqueig, revisar l'estat complet del repositori abans d'etiquetar.

El primer rollback real (i va funcionar)

Aquí va venir el moment que tot sistema d'actualitzacions espera: la v0.1.17 no va arrencar. La causa, pura delicadesa de permisos: l'script d'arrencada intentava prendre possessió de totes les carpetes muntades, però una d'elles és de només lectura (la base de dades de geolocalització). El procés moria en topar-hi.

I l'actualitzador va fer exactament el que estava dissenyat per fer: va revertir sol a la versió anterior, sense dit humà. Primer rollback real en producció, superat. L'arranjament va arribar amb la v0.1.18: només prendre possessió del que es pot escriure, i que el canvi de propietari de fitxers mai sigui letal.

Però la història tenia segona part: en anar sense usuari root, l'API va deixar de poder parlar amb el sòcol de l'actualitzador (un fitxer especial de comunicació entre processos, amb permisos molt estrictes). Resultat: la targeta d'actualitzacions desapareixia del panell en silenci. L'arranjament: obrir aquest canal als processos que el necessiten. Lliçó per al record: quan canvies l'usuari que executa un servei, revisa tots els canals locals — sòcols, volums, senyals — no només les carpetes de dades.

L'actualitzador que s'actualitza sol

Un altre dels pendents eterns va caure: fins avui, actualitzar el propi actualitzador del servidor era cirurgia a mà. Ara hi ha un comandament firmat que ho fa tot: verifica la signatura del catàleg, baixa la imatge, extreu el codi nou i fa el canvi amb còpia de seguretat i comprovació de salut. Si l'extracció no porta un actualitzador utilitzable, avorta abans de tocar res.

Durant la prova en real van saltar dos fallos que el propi mecanisme va contenir — una còpia sense recursivitat i el pitjor de tots: un contenidor que escrivia al seu propi directori temporal sense muntar el destí, és a dir, treballar i tirar el resultat a la paperera sense error aparent. Tots dos caçats per la verificació "el que s'ha extret serveix?" abans d'instal·lar. Fallar ràpid i sorollós en un instal·lador és una virtut.

El misteri del postgres veí

La joia del dia. Vam migrar la web del producte al circuit nou: repositori propi, imatge pròpia, instal·lació a l'altre servidor, dades reals restaurades. I la instal·lació fallava amb "contrasenya incorrecta"... sent correcta.

El culpable: en un servidor compartit, la xarxa on viuen els serveis públics allotja altres instal·lacions alienes. I el DNS intern de Docker —el servei que resol noms a adreces— enviava la meva "db" cap al postgres d'una altra instal·lació. La meva API li parlava amb la meva contrasenya a un servidor que no era el meu. Òbviament, fallada.

La solució arquitectònica: l'API, el panell i la web de cada client queden només a la seva xarxa privada del projecte; només la porta d'entrada toca la xarxa pública. I àlies explícits perquè les comprovacions resolguin bé.

La migració va acabar bé: 35 articles reals, admins, mitjans i l'analítica revivint en producció després de portar trencada des del 17 de setembre. I la prova final del propietari: un canvi de menú construït a GitHub i aplicat amb el botó, sense tocar cap servidor.

Adéu a la web transitòria

Per tancar el dia, retirada simbòlica: vam esborrar l'arbre web/ transitori que arrossegava des de les primeres iteracions. Les releases del nucli ja són només API i panell. Menys codi mort, menys superfície d'atac, releases més petites. La lliçó operativa: abans d'esborrar, mapar totes les referències — i no oblidar el compose de desenvolupament, que el codi mort no només viu als workflows.

A l'entrada anterior es tancaven els forats de l'auditoria. I a la següent, el diari estrena repositori propi.

Altres entrades del diari