å sette det hele sammen, og alt som gikk i stykker på lanseringskvelden

3. juli 2026 meta devloggo

gjennomgangen

Seks faser, måneder mellom noen av dem (auth, så blog, så frontenden, admin-panelet, opplastinger, så Caddy og compose som knyttet alt sammen), og ingen av dem hadde noensinne faktisk kjørt sammen mot den levende stacken i én økt før den ekte lanseringssjekken: registrer en ekte konto, kommenter på et innlegg, lik det, rapporter det, logg inn som den seedede admin-en, skriv et innlegg med et bilde og en video vedlagt, moderer en kommentar, utesteng en bruker rett fra en av deres egne kommentarer. Den typen gjennomgang som er ment å være det enkle siste steget når hver enkelt tjeneste allerede har sin egen testpakke som består.

Mesteparten gikk fint, noe som var nesten skuffende etter å ha bygget denne greia så lenge og halvveis forventet fyrverkeri. Registrering fungerte, kommentering fungerte, like-tallet oppdaterte seg uten en oppfriskning, å rapportere en kommentar satte den i kø i admin-panelet nøyaktig der den skulle, og å skrive et innlegg med et ekte bilde og en ekte video vedlagt gikk gjennom hele opplastingsstien fra de siste par av disse innleggene uten en eneste hikke. Å utestenge en bruker rett fra en av deres egne kommentarer, noe jeg bare noensinne hadde øvd gjennom individuelle handler-tester før, fungerte også ende til ende på det første ekte forsøket.

informasjonskapselen som stille lar økten din utløpe

Den ene ekte buggen gjennomgangen avdekket lå ikke inne i noen enkelt tjeneste, den viste seg bare når alt kjørte sammen i mer enn omtrent 15 minutter. Innlogging skal holde deg innlogget i 30 dager, det er hele poenget med refresh-tokenet, men den stille-refresh-logikken i hooks.server.ts prøver å lese refresh-cookien på hver vanlige sidelasting:

if (!sessionFromAccessToken) {
	const refreshToken = event.cookies.get('refresh_token');
	if (refreshToken) {
		const response = await event.fetch('/auth/refresh', { method: 'POST' });
		...
	}
}

Bortsett fra at den cookien er avgrenset til Path=/auth, med vilje, slik at den aldri sendes til auth-tjenesten på forespørsler som ikke faktisk trenger den, og holder den unna, si, MinIOs egne tilgangslogger på en urelatert medieforespørsel. Noe som også betyr at nettleseren aldri sender den her heller, på en vanlig sideføre, siden ingenting av denne koden kjører under /auth i det hele tatt. event.cookies.get('refresh_token') kom aldri til å finne noe, hver eneste gang, på noen normal side på nettstedet.

Access-tokenet alene varer bare 15 minutter. Så den praktiske effekten, ubemerket helt til jeg faktisk lot en fane stå åpen og kom tilbake til den senere, er at "forbli innlogget i 30 dager" stille betydde "forbli innlogget i omtrent 15 minutter," så en helt normalt utseende omdirigering tilbake til innloggingssiden uten noen grunn noen ville gjette uten å lese akkurat denne kjeden av cookie-avgrensningsregler. Å fikse det betyr enten å utvide den cookiens sti eller å gjøre refresh-kallet fra et sted som faktisk er inne i /auths eget omfang, og jeg vil sitte med den avveiningen litt før jeg forplikter meg til én, i stedet for å utvide stien bare fordi det er den mindre diffen.

kommentar-413-en som aldri egentlig skjedde, så vidt jeg kan se

Et sted i en tidligere testøkt traff jeg en 413 ved å poste en helt normallengde kommentar, ingenting rart med den i det hele tatt, og det bekymret meg nok til å skrive den ned som en ekte bug å fikse. Gikk tilbake senere spesifikt for å jage den ned og klarte ikke å reprodusere den, ikke ved 100 byte, ikke ved 9 kilobyte, ikke helt oppe mot den faktiske grensen på 10 000 tegn. Blogs eget JSON-dekodingsgrense for en kommentar er 64 kilobyte, milevis over alt en ekte kommentar noensinne ville treffe, og ingenting annet i stacken burde være i nærheten av så trangt heller.

Beste gjetning, og det er genuint bare en gjetning: hva jeg enn traff den dagen var nesten helt sikkert en rest fra en tidligere, langt mer restriktiv BODY_SIZE_LIMIT jeg testet med på den tiden, noe overgangsmessig som 3 megabyte eller til og med en plassholder på null, ikke en ekte grense som noensinne ble sendt ut. Skrev en regresjonstest som poster en 9 kilobyte kommentar rett gjennom Caddy for å låse fast at det fungerer riktig nå, og lot mysteriet forbli akkurat like uløst som det, et gammelt konfig-spøkelse fremfor en levende bug som fortsatt gjemmer seg et sted. Ikke alt skummelt du treffer mens du bygger noe viser seg å være en ekte greie når du faktisk går og ser etter det ordentlig.

hva som fortsatt står på listen

Gjennomgangen i seg selv besto. Det som gjenstår er ikke en bug, det er bare selve utgivelsen, og jeg behandler det bevisst som sin egen separate avgjørelse fremfor noe som skjer automatisk i det øyeblikket testene blir grønne: å merge dev inn i main, pushe til den ekte git-remoten og se CI-pipelinen faktisk bli grønn mot et ekte container-register i stedet for min egen maskin, så kjøre produksjons-compose-overlayet mot enten et ekte domene eller et engangs-et bare for å se Caddys auto-TLS faktisk prøve å gjøre sitt for første gang. Ingenting av det har skjedd ennå. Alle seks fasene er bygget og merget til dev, og hvert av de gjenstående stegene er eksplisitt mitt å utløse når jeg er klar, ikke noe et script bestemmer for meg.

hva som faktisk satte seg fast i meg

Ingenting her er komplisert isolert sett. Å hashe et passord, proxye en forespørsel, sette et tak på en kroppsstørrelse, ingenting av det er vanskelig alene. Det som faktisk tok tiden var alt som møtte alt annet: en cookie-sti bestemt for én tjenestes egne loggingsbehov som stille ødela en helt urelatert frontend-antagelse tre tjenester unna, en størrelsesgrense i kanten som stille overskygget en mye mer sjenerøs en to lag lenger inn, en klientside-rollesjekk som ser nøyaktig ut som sikkerhet helt til du faktisk sporer hva som skjer i det øyeblikket du lyver til den.

Startet hele dette prosjektet mest fordi jeg ikke ville bare bruke WordPress. Endte opp med å lære mer om hvordan bitene i en ekte webtjeneste faktisk passer sammen, og feiler sammen, enn noen tutorial noensinne brydde seg om å vise meg. Django og CS50 lærte meg syntaksen. Å bygge dette lærte meg hvor ting faktisk går i stykker.

Har fortsatt ikke merget dette til main. Den delen er fortsatt min å bestemme når.

0 kommentarer

Logg inn for å kommentere.

Logg inn

Ingen konto?