Varje gång jag ser ingenjörer skriva om deras stack är jag nyfiken på att lära mig nya verktyg. Speciellt när man kör saker solo är man alltid på utkik efter att lära sig av andras erfarenheter.
2015 var jag frustrerad över nivån på de befintliga lösenordshanterarna, särskilt eftersom det inte fanns något anständigt för folk som körde privata servrar. Jag började arbeta på Psono, en öppen källkods lösenordshanterare med en anständig nivå av kryptering och säkra delningsalternativ. Psono var aldrig tänkt att köras som SaaS, annars hade jag nog redan från början byggt in stöd för flera hyresgäster.
För att ge dig en översikt över skalan av Psono. Psono är för närvarande installerat lokalt i cirka 70 länder, med mer än 4000 installationer. Psono SaaS ensam används för närvarande av över 15.000 personer, de flesta av dem använder vår kostnadsfria community edition av Psono som körs på samma tekniska stack som vår betalda Enterprise-produkt.
Stacken för en typisk Psono-installation består av en databas, server, två webbklienter (en för vanliga användare och en för administratörer), appar för iOS och Android, webbläsartillägg för Chrome och Firefox. En kund kan installera en LDAP-gateway eller en filserver ovanpå det.
Utöver det har jag mycket mer infrastruktur på plats. Från webbplatsen för att driva företagets hemsida och produktsida har jag en licensserver för vår företagsprodukt, ett centralt ERP-system för att hantera offerter och fakturor, en butik där folk kan köpa Psono SaaS och hantera deras installation och en autentiseringstjänst med OIDC.
I artikeln kommer du att se att jag föredrar gammal och tråkig teknik.
Språk
- Python: All backend-kod är skriven i Python. Den största fördelen med Python är dess rika ekosystem. Bristen på typer (många ser detta som en nackdel) gör det extremt snabbt att skriva din webbtjänst vilket som startup är en av nyckelaspekterna du bör se upp för i ett programmeringsspråk.
- Javascript: Åh nej... Vem kunde ha trott det... Det är helt enkelt omöjligt att skapa någon webbplats utan Javascript, redan tillbaka 2015. ;)
Python är mitt favoritprogrammeringsspråk för webbservice. (Jag lämnar mina tankar här varför inte XYZ är bättre än Python. Det skulle fylla en annan bloggartikel.) Det finns bara en nackdel som du måste åtgärda och det är möjligheten att leverera kod med alla beroenden pålitligt vilket är särskilt avgörande om folk installerar din programvara lokalt och begär support om de stöter på problem. (Fartmässigt, vilket andra kanske lägger till här spelar ingen roll. Python är tillräckligt snabbt).
Ramverk
- Django: "Det är som en superkraft för ensamma utvecklare" (om jag får citera Athony N. Simons här). Tillsammans med ekosystemet löser det nästan alla problem som du kan stöta på. Autentisering, mallar, e-post, databas-migreringar, totp, ... bara för att nämna några.
- Django Rest Framework: Det driver för närvarande alla API:er och gör ett utmärkt jobb. De olika lagren (serialisering, autentisering, behörigheter, vyer) håller din kod extremt ren.
- React: Jag migrerade nyligen den vanliga webbklienten till React. Den gamla webbklienten (kom ihåg att den startades 2015) var skriven i AngularJS och det var ganska svårt att vara bakåtkompatibel med den gamla klienten, t.ex. alla vägar till användaren bör inte ändras, eftersom de kan ha bokmärkt länkar till hemligheter i deras dokumentation eller har så kallade länkdelningar i bruk. Dessutom använde folk anpassad branding med egna logotyper och så vidare där systemets vägar inte bör ändras.
- webpack: Jag ville nämna det här, eftersom det för närvarande är den enda del som jag är missnöjd med. Det är långsamt, hårslitande, svårt att lära sig ... den enda fördelen som du har är att du aldrig fastnar. Vilket problem du än upplever har redan frågats på Stackoverflow och du hittar en lösning.
- Gatsby: Drivs våra statiska webbplatser för företaget och produkten. Tidigare använde jag Wordpress, men förvaltningsöversynen med uppdateringar och den ständiga rädslan för att webbplatsen skulle komprometteras (och den potentiellt negativa publiciteten) fick oss att byta till Gatsby. Har aldrig ångrat mig hittills.
- Vuepress: Det anständigaste dokumentationshanteringssystemet som jag kunde hitta. Det kompilerar till statiska webbsidor, ser modernt ut och driver för närvarande Psonos dokumentation
- Material UI: Huvudbiblioteket som driver frontend. Det är funktionsrikt, fungerar bra med React och ser ganska modernt ut, i motsats till äldre Bootstrap-baserade teman.
Det finns säkert otaliga andra som skulle förtjäna att nämnas här, men dessa är de "viktigaste" enligt min åsikt.
Databaser
Även om Django stöder flera databaser stötte jag ganska tidigt på frågan om jag ville stödja alla Djangos databaser eller bara en specifik. Roten till denna fråga var att jag lagrade inbäddade trädstrukturer i databasen. Så träd med flera rötter och delade grenar. Att fråga dessa effektivt var avgörande så efter att ha undersökt alla tillgängliga alternativ bestämde jag mig för att gå med Postgres ltree-extension.
Om du planerar att utveckla något och köra det solo, måste det köras på ett tillförlitligt sätt i molnet, hanterat av molntjänstleverantören. Du vill troligen inte heller vara låst till en leverantör, så inget molnspecifikt, vilket begränsar dina val ganska hårt.
Mitt beslut:
- Postgres: Det finns två open source-databaser som du kan välja mellan. MariaDB eller Postgres. Jag planerade alltid att gå med Maria (mestadels på grund av Maria DB:s Galera-kluster, en av dessa missledda "ung utvecklare måste planera för hyper-tillväxt"-berättelser ;D) men på grund av de saknade ltree-extensionerna tvingades jag byta. Numera med all utveckling som går in i Postgres shard-möjligheter har jag aldrig ångrat det beslutet så här långt.
- Redis: Planerad att användas som cache för större installationer. Även här kan du välja antingen Redis eller Memcache. Båda är utmärkta, men mest eftersom Redis-protokollet numera är de facto-standarden för caching valde jag Redis. Den enda nackdelen jag någonsin upplevt med Redis är att den är enkeltrådig.
Infrastruktur
Bara en liten översikt över infrastrukturen som Psono förlitar sig på:
- Gitlab: Gitlab driver all automatisering av Psono. Noterbart är att allt i Psono är automatiserat vilket är en av nyckelaspekterna hur jag kan hantera releaser och underhålla hela Psono-ekosystemet. Tillbaka i 2015 körde alla open source-projekt på Github, men Gitlab var (och är fortfarande) så mäktigt och funktionsmässigt överlägset (med undantag för Githubs sökfunktionalitet). Gitlab driver byggen, releaser, sårbarhetsskanningar av ALLA programvarubitar som vi använder.
- Cloudflare: Förmodligen det mest innovativa företaget som jag känner till som har påverkat mig under de senaste 10 åren. Det är rättvist att säga att Cloudflare driver internet nuförtiden. Det ger mig pålitliga namnservrar, TLS, en anständig CDN och avancerade funktioner som deras edge-worker. DDoS-skyddet och WAF-funktionaliteten ger ett visst extra, vilket som lösenordshanterare är ganska viktigt. Jag skulle gärna använda deras SSL som en tjänst-funktion för att tillåta SaaS-kunder att konfigurera sina egna domäner, men Cloudflares Enterprise-nivås betalvägg är helt enkelt för hög. Jag hoppas fortfarande att de släpper det någonstans som en oberoende plugin som man kan köpa.
- Namecheap: Min första lösning för domäner och SSL-certifikat.
- Google Cloud Run: Alla backend-servrar körs på Google Cloud Run, vilket är extremt kostnadseffektivt och pålitligt när du vill starta en flotta av tjänster. När du väl har din stack igång gör det ett ganska bra jobb. Deras toppmoderna API / CLI-integration är ett absolut plus här. Det finns några nackdelar, som den saknade supporten från Google eller hotet om att Google kanske beslutar vid någon tidpunkt att vara nummer 3 som molntjänstleverantör kanske inte är värt det och de avbryter produkten.
- Artifactory: Skyddar min byggpipeline mot npm-avbrott och lagrar mina byggartefakter (vilket inte ingick i Gitlab 2015)
- Docker Hub: Lagrar alla docker-containrar och gör ytterligare säkerhetsskanningar och distribution av mina containrar.
- Mailgun: Hanterar alla e-postmeddelanden. Till skillnad från de flesta e-postlösningsleverantörer, har Mailgun anständig loggnings- och analysfunktionalitet. Deras support är toppklass. Det enda problemet är att deras e-post ibland skickas till skräppostlådan (även med SPF, DMARC och så vidare på plats), men förutom det gör de ett bra jobb.
- Poeditor: Hanterar alla översättningar. Det fina är att bidragsgivare kan begära åtkomst, vilket är avgörande om du vill att externa ska hjälpa till att översätta ditt projekt. Deras support är fantastisk och du får extremt snabba svar.
- Docker: Ett av de bästa besluten för hela projektet. Speciellt eftersom jag använder Python och att skicka fungerande Python-kod med alla Python / OS-biblioteksberoenden är svårt. Om saker ska fungera med en kund på plats och kravet att han kan uppdatera och underhålla systemet. Docker tillåter oss att göra allt detta och ger mig full kontroll över de installerade paketen vilket löser åtminstone 70% av alla supportproblem (medan 20% nya problem introduceras eftersom folk inte är vana vid Docker ;D)
Övervakning
Saker kan gå fel och du behöver veta när det händer och få några insikter i problemet. Det är här dessa verktyg kommer till nytta:
- Google Cloud logging: Om du är på Google är din naturliga lösning
- Sentry: Min nummer ett felrapporteringslösning. När du väl provat det kommer du aldrig vilja vara utan det. Det ger mig den nödvändiga insikten i alla fel.
- Uptimerobot: Ringer hälso-kontrollen av mina olika tjänster och meddelar mig om något går ner. Den offentliga status-sidan för Psono kan förresten hittas här https://stats.psono.com/, vilket bara är en liten del av de tjänster som denna sak övervakar för mig, men förhoppningsvis demonstrerar det lite systemets tillförlitlighet.
Utvecklingsinfrastruktur
En liten översikt över hur min lokala utvecklingsstack ser ut:
- Windows med WSL: Jag får förmodligen mycket kritik för detta, men ja jag kör på Windows. Under de senaste åren har jag alltid haft någonstans en Linux VM som jag skulle ansluta mig till för utveckling, men nuförtiden drivs det av WSL. Jag får det bästa av båda världarna.
- Pycharm / Webstorm: Jag använder Jetbrain IDEs. Den fjärrutvecklingsfunktionaliteten är avgörande för mitt utvecklingsarbetsflöde och denna "batterier inkluderade" filosofi passar mig bra. Ibland har jag cirka 20 projekt öppna vilket kräver en anständig hårdvara med tillräckligt med RAM. VSCode verkar vara ett bra alternativ nuförtiden, men genom åren har jag vant mig vid Jetbrains och att lära sig något nytt kräver alltid lite mental styrka som jag för närvarande inte är villig att investera i detta. Jag skulle säga att alla ska använda något som de är vana vid.
Support
Det finns naturligtvis vissa verktyg som krävs för att hantera supporten för personer som använder produkten:
- Freshdesk: En typisk e-postticketmjukvara. Det hjälper mig att hålla koll på de olika kundförfrågningarna. I de tidigare tiderna tillhandahöll det en anständig gratistjänst, vilket särskilt under grundandefasen är avgörande.
- Discord: Vissa människor kanske föredrar chatt eller kräver en mer direkt konversation / hjälp. Det är där Discord kommer till nytta.
Övrigt
Det finns vissa andra verktyg som jag ville nämna som kan vara till hjälp för andra. Särskilt bankerna för människor som vill driva sitt företag i Tyskland:
- Odoo: Det bästa ERP-systemet. Dess opensource-utgåva är gratis och kan enkelt utökas med Python och lite XML-kunskaper. Dess anpassning och integrationsalternativ med anpassade API:er är toppen.
- Holvi: Vårt huvudbankkonto. I Tyskland behöver du en bank som tillåter dig att sätta upp ett grundarkonto, på tyska "Gründerkonto", så ett bankkonto som är knutet till ett företag som ännu inte är helt registrerat och där du kan överföra det initiala kapitalet som krävs för att registrera företaget. Lite av ett kyckling-äggproblem. Och de stora bankerna som tillåter det kostar vanligtvis en förmögenhet. Registreringsprocessen fungerade också ganska smidigt. Den enda nackdelen är den saknade supporten för internationella betalningar, men det är där nästa tjänst kommer till nytta.
- Wise: Vårt andra bankkonto. Deras avgifter är extremt låga (t.ex. inga månadsavgifter), inställningsprocessen fungerar smidigt, de är välkopplade och tillåter internationella banköverföringar och överföringar genomförs snabbt, så du behöver inte vänta veckor eller liknande.
Säkerhet
Jag antar att detta skulle kunna vara en separat bloggpost om hur vi strukturerade användarkonton, infrastruktur, åtkomsträttigheter. Eftersom detta är en av de mest avgörande aspekterna för säkerheten i Psono går jag inte in på detaljer här och försöker vara tillräckligt vag. Vi använder både Google Cloud och Azure-tjänster. Båda med helt separerade användare och grupper.
Det finns användare som är dedikerade för administration uppgifter och användarkonton för det "dagliga arbetet". Det finns olika fysiska och virtuella system som jag använder för att komma åt / stödja / hantera / administrera Psono. Administrationsuppgifter utförs endast på en separat, speciellt härdad fysisk enhet som används exklusivt för dessa uppgifter. Varje konto är skyddat med hårdvarutokens.
Alla system är centralt hanterade och säkerhetspolicys på plats för att garantera att alla enheter följer de säkerhetsstandarder som du vanligtvis hittar på banker.
Credits
Denna artikel var starkt inspirerad av Anthony N. Simon's artikel om Panelbear.