December 2024 - Nyhetsbrev
System-design är intressant som analogi till livet i övrigt. Vissa beslut ger bättre resultat än andra. Fatta rätt beslut.
Vad som gjordes i november
Prioriteringen är såklart de mest grundläggande funktionerna först, men jag tar hänsyn till att designa systemet från början för att kunna utökas med andra funktioner.
Här är vad jag gjort för november. Min upplevelse är att jag inte kommit någon vart, men tack vare detta nyhetsbrev ser jag nu att många saker har gjorts. Dock tycker jag att jag överlag kunde haft bättre fokus. Jag avser utforska hur jag kan uppnå bättre fokus nu i december.
Gitea
Jag installerade en egen instans av Gitea. Jag kommer behöva lära mig hur git-interaktion fungerar. Syftet är att bli bättre på att organisera min kod och uppmuntra modularisering av systemet.
Ja det stämmer, matkalkyl.dev har nu en egen Git, den finns här: git.matkalkyl.dev, men den är bara avsedd för mig att ladda upp och organisera kod på. Koden kommer dock vara öppet tillgänglig.
Jag tänkte gitea var enklare än Github men de har samma grundsystem. Men nu kan jag lika gärna köra det själv.
Test-domän
Har satt upp test.matkalkyl.dev. Där kommer jag utveckla test-versionen av den nya sajten. Den sidan reflekterar projektet så som det skulle sett ut om det lanserades idag (och just nu är det inte mycket att hänga i granen).
Databas
Jag har arbetat fram struktur för databasen. Jag funderade på om jag la för mycket tid på det, men det är värt då databasen är en central del. Lömskt är att databasen lätt underskattas. Det kan tyckas lätt att sätta ihop en struktur för databas, men det är svårare att göra den snäll för framtiden och dess behov, samt att verkligen utveckla en struktur som specifik och effektivt svarar mot projektets behov.
Jag vill inte bara ha en lösning, jag vill ha en bra lösning.
Jag har gjort prestandatest för att utvärdera vilka datatyper jag ska använda. Jag känner mig därför mer trygg med de val jag gör, och att de är säkra val för framtiden.
Databasen har intelligent designats också med hänsyn till en plugin-struktur för det övriga systemet.
Kryptering
Kryptering: ambitionen var att se hur långt man kan kryptera allt och skapa maximal anonymitet. Jag har hittat ett mellanläge. Realistiskt måste kompromisser ske för att förhindra sårbarheter i systemet som en angripare kan utnyttja.
Kryptering kommer inte vara prioriterat just nu, utan kommer byggas in som en modul senare för de som vill ha. Viktigt är dock att bygga infrastruktur som lätt stödjer att utöka med sådan funktionalitet.
Möjlighet att skapa grupper, säg ett idrottslag som vill registrera sin data. De ska då kunna kommunicera krypterat utan att servern kan se innehållet. Det möjliggörs med public-key kryptering.
Varför framtidsplaner på kryptering
Därför att hela systemet är så modulärt att andra funktioner kommer kunna utvecklas ovanpå det, inte bara de som strikt har att göra med mat-beräkning. Andra saker är exempelvis att-göra-listor, och att systemet kan användas som kommunikationsmedel i ett team.
Synk/Realtidsuppdatering
Om användare A är inloggad på enhet X och enhet Y, alltså två olika enheter, då uppdateras de i realtid. Det betyder att om A ändrar i innehållet på enhet X, då uppdateras genast enhet Y och reflekterar den nya uppdateringen.
Detta är en funktion jag ska inkludera och har hög prioritet. Folk är vanligtvis inloggade på flera enheter oavsett vilken app/sajt de använder, och det skapar förvirring och dålig upplevelse om de inte synkar.
mk-datalink
Har skapat en websocket-server (node js) som agerar kommunikationslager mellan klient och databas.
Konfigurerat servern för det (nginx reverse proxy för websocket)
Har definierat grundläggande protokoll för kommunikation.
Funktioner
Tidig design avgör hur enkelt eller svårt det är att utöka med vissa funktioner, därför vill jag i tidig skede göra det lätt att utöka för en mångfald funktioner, däribland:
Kolaborativ miljö: Jag tänker att det ska vara möjligt för person A att dela sitt innehåll med person B.
Grupper: Jag har i åtanke att en person kan ha översikt över flera personers innehåll. Säg att Elliot är en personlig tränare och har 3 klienter, då kan Elliot skapa en grupp där Elliot kan ha översikt och vägleda dem individuellt eller som grupp.
Plugin miljö
Kärnan i systemet är ganska liten, därefter utvecklas allt som plugins. Jag har detta i åtanke nu i tidigt stadium.
In-memory database
Vid sidan om vanlig databas som lagras på hårddisken (datorns långtidsminne) används “in-memory database” som en databas i RAM (datorns närminne). Det är mycket effektivt och datahantering kan delegeras till det.
För det ändamålet valde jag KeyDB, och inte Redis som jag först planerat. KeyDB kan falla tillbaka på hårddisk om ram tar slut, och den funktionen fanns bara i Redis Enterprise vilket är betalversion. Jag vill gärna ha den funktionen. KeyDB är helt fritt och inkluderar den funktionen.
KeyDB är en avgrening av Redis, då folk hade olika åsikter om vilka funktioner som skulle ingå. De hade först en modell där det mesta var öppet och fritt men vissa funktioner krävde betal-version.
Vad som förvånade mig är att KeyDB köptes av företaget “Snap”. Snap gjorde det till fullständig open-source och helt fritt (dvs. ingen betalningsmodell alls och vem som helst kan bidra), vilket såklart är väldigt roligt då hela världen får tillgång till teknik i världsklass.
Snap motivering är att genom open-source blir deras produkt bättre då allt fler individer världen över granskar och bidrar till systemet. Jag är fascinerad av open-source-kultur och tycker det är en bedrift av mänskligheten, samtidigt som jag förstår att företag såklart måste hantera och förhålla sig till kapital och inte nödvändigtvis kan göra allt helt fritt.
Fokus för december
Certifikat: Behöver automatisera förnyelse av certifikat.
Behöver lära mig mer om Git.
Behöver göra system-exercis; att nollställa systemet och köra ominstallation för att se att återställningssystemet fungerar. Gäller både för server och min lokala dator. Min filosofi är att aldrig lita på att nuvarande installation kommer fungera imorgon. Vilken sekund som helst måste jag vara redo att återställa hela systemet. Därför har jag utvecklat ett eget factory-reset system som återställer till min senaste version. Jag kan blåsa hela datorn ren och på 10 minuter ha det uppe igen som om inget hände. Så fort jag uppdaterar en konfiguration i ett system och vill behålla den, kör jag ett kommando som också uppdaterar motsvarande factory-reset. Factory-reset:en för ett system innehåller också definitionen av vad det systemet innehåller, ex. att Nginx ska installera och användare X ska skapas etc. Återställning är automatisk där en rad bash-script kör chroot etc. för att installera på hårddisken i fråga.
Hur hantera uppdateringar: Fastställ “release managment process”. Tanken är att de som vill använda den senaste experimentella versionen kan göra det, och alla andra använder en stabil version. Uppdateringar av den stabila versionen ska ske säkert.
Såklart massa mer.