Jeg lovet i v1-retrospektivet at v2 skulle få et ekte veikart før noe kode ble skrevet. Her er det, den faktiske planen, publisert slik at fremtidens meg ikke kan late som den sa noe annet. Dette innlegget handler bare om det som kommer. Det som allerede er levert får sine egne innlegg her på devbloggen, det er det devbloggen er til for.
Kjerneideen er å ordne etter avhengighet i stedet for entusiasme. Nesten alt jeg vil ha henger på noen få bærende deler, så de kommer først selv om de er de minst morsomme å bygge:
+----------------------+
| email service | the keystone
+----------+-----------+
|
+------------+----------+-----------+-------------+
v v v v
password reset contact alerts reply notifications newsletter
+---------------------+ +---------------------+
| central log service | | backups (DB+media) |
+---------------------+ +---------------------+Bølge én er infrastruktur. E-posttjenesten kommer først fordi fire separate funksjoner jeg vil ha alle trenger å sende e-post, så e-post blir sin egen lille tjeneste med en holdbar outbox, og alt annet ber den bare om å sende ting. Den vanskelige delen med e-post er ikke SMTP, det er bare et bibliotekkall. Den vanskelige delen er alt rundt: å ikke miste en e-post når prosessen restarter, å ikke sende samme e-post to ganger når en retry kolliderer med en suksess, og leveringsdyktighet, den mørke kunsten med SPF-, DKIM- og DMARC-oppføringer som avgjør om e-posten min havner i en innboks eller en spam-mappe. Jeg regner med å bruke mer tid på å lese DNS-dokumentasjon enn å skrive Go.
Backup er i bølge én fordi det ikke har noen avhengigheter og ingen unnskyldning. Det vanskelige med backup er ikke å ta dem, det kan cron gjøre. Det er å bevise at de kan gjenopprettes. En utestet backup er en følelse, ikke en backup, så planen inkluderer faktisk å gjenopprette til en scratch-database på en fast tidsplan og sjekke resultatet. Kopier lagret et annet sted også, fordi en backup på samme disk som det den sikkerhetskopierer bare beskytter mot én type feil, og ikke den skumle.
Den sentrale loggtjenesten er den ærlige raringen. En personlig blogg trenger den ikke, feiltabellene per tjeneste gjør allerede jobben. Jeg bygger den likevel fordi mønstrene i den er hele poenget: en outbox-shipper som batcher rader til en sentral mottaker, prøver på nytt når nettverket faller ut, og en konsument som holder seg korrekt når samme batch kommer inn to ganger. Det er mønstre som er verdt å lære på et system der eksplosjonsradiusen er min egen blogg. Jeg skriver det ned her så jeg ikke ved et uhell gullbelegger den til noe bedriftsformet.
Bølge to er alt som trenger e-post. Passordtilbakestilling høres trivielt ut, men er full av skarpe kanter: tokens som utløper og bare kan brukes én gang, og svar som ikke avslører om en e-postadresse har en konto her. E-postverifisering blir med på lasset. Varsler fra kontaktskjemaet er den enkle oppvarmingen. Varsling om svar på kommentarer trenger en måte å reservere seg per tråd, ingen vil ha e-post for alltid bare fordi de kommenterte én gang. Nyhetsbrevet er den dype enden: samtykke fra abonnenter, avmeldingslenker som alltid virker (den delen er lov, ikke høflighet), og å sende sakte nok til at min ene lille server ikke havner på svartelisten selv.
Bølge tre er den morsomme. En masseopplaster og et galleri for bilder, fordi denne bloggen sakte blir en bildesamling av turer med en blogg festet til. Vanskelige deler: å få hundrevis av filer gjennom en nettleseropplasting uten at én feil ødelegger hele batchen, å generere miniatyrbilder på serversiden så galleriet ikke sender bilder i full størrelse til telefonen din, og å fjerne EXIF-data før publisering, fordi et bilde som stille bærer GPS-koordinater er en personvernlekkasje i solnedgangskostyme. Innleggsserier hører hjemme her også, å lenke innlegg sammen til en ordnet samling, som er mer et modelleringsspørsmål enn et kodespørsmål.
Bølge fire handler om rekkevidde. ActivityPub er sjefskampen: å få innlegg til å føderere så folk kan følge denne bloggen fra Mastodon. Det betyr aktører, innbokser, utbokser og HTTP-signaturer, og folkloren sier at hver server snakker en litt annen dialekt av spesifikasjonen, så mesteparten av arbeidet blir å feilsøke føderering mot servere jeg ikke kontrollerer. Webmentions er den lettere oppvarmingsversjonen av samme idé. En oversettelseshjelper for de tre språkene denne bloggen kjører på hører hjemme her også: oversett én gang ved skrivetidspunktet og lagre det (en sidevisning skal aldri koste et API-kall), oppdag når kilden har endret seg slik at en oversettelse kan merkes som utdatert, og la maskinresultatet alltid havne som et utkast jeg redigerer, aldri rett til publisering. Og offline-lesing som en PWA, der den berømte fellen er cache-invalidering som serverer leserne en foreldet side for alltid.
Hver av disse sendes som sin egen lille ferdige endring, ikke én kjempe v2-branch som lever i en måned. Selv om bare bølge én lander bra, var v2 allerede verdt det. Det kjedelige først, med vilje, skriftlig. Hold meg til det.