Når jeg ser ingeniører skrive om deres stack, er jeg nysgerrig på at lære nye værktøjer. Især når du kører tingene solo, er du altid på udkig efter at lære af andres erfaringer.
I 2015 var jeg frustreret over det nuværende niveau af password managers, især at der ikke var noget anstændigt for folk, der kører private servere. Jeg begyndte at arbejde på Psono, en open source password manager med et anstændigt niveau af kryptering og sikre delingsmuligheder. Psono var aldrig tænkt som en SaaS, ellers ville jeg sandsynligvis have indbygget understøttelse af flere lejere lige fra starten.
Bare så du får et overblik over omfanget af Psono. Psono er i øjeblikket installeret lokalt i omkring 70 lande med mere end 4000 installationer. Psono SaaS alene bruges i øjeblikket af over 15.000 mennesker, de fleste af dem bruger vores gratis community-udgave af Psono som kører på den samme tekniske stack som vores betalte Enterprise-produkt.
Stacken i en typisk Psono-installation består af en database, server, to webklienter (en til almindelige brugere og en til administratorer), apps til iOS og Android, browserudvidelser til Chrome og Firefox. En kunde kan installere en LDAP-gateway eller en filserver ovenpå.
Ved siden af det har jeg meget mere infrastruktur på plads. Fra hjemmesiden til at drive virksomhedens hjemmeside og produktside har jeg en licensserver til vores virksomhedsløsning, et centralt ERP-system til at håndtere tilbud og fakturaer, en butik hvor folk kan købe Psono SaaS og administrere deres installation og en autentificeringstjeneste med OIDC.
Gennem hele artiklen vil du se, at jeg foretrækker gammel og kedelig teknologi.
Sprog
- Python: Al backend-kode er skrevet i Python. De største fordele ved Python er dets rige økosystem. Manglen på typer (mange betragter dette som en ulempe) gør det ekstremt hurtigt at skrive din webtjeneste, hvilket som en startup er en af de nøgleaspekter, du bør se efter i et programmeringssprog.
- Javascript: Åh nej... hvem ville have troet det... Det er bare umuligt at skabe en hjemmeside uden Javascript, allerede tilbage i 2015. ;)
Python er mit yndlingssprog til webtjenester. (Jeg undlader mine tanker om hvorfor XY ikke er bedre end Python. Det ville fylde en anden blogartikel.) Der er bare én ulempe, som du skal modvirke, og det er muligheden for at levere kode med alle afhængigheder pålideligt, hvilket er særligt afgørende, hvis folk installerer din software lokalt og beder om support, hvis de støder på problemer. (Hastighedsmæssigt, hvilket andre måske tilføjer her, betyder det ikke noget. Python er hurtigt nok).
Frameworks
- Django: "Det er som en superkraft for solouafhængige udviklere" (hvis jeg må citere Athony N. Simons her). Sammen med økosystemet løser det næsten alle problemer, du måtte støde på. Autentificering, skabeloner, e-mail, database-migrationer, totp... bare for at nævne nogle få.
- Django Rest Framework: Det driver i øjeblikket alle API'er og gør et fantastisk job. De forskellige lag (serialization, autentifikation, tilladelser, views) holder din kode ekstremt ren.
- React: Jeg har lige for nylig migreret den regelmæssige webklient til React. Den gamle webklient (husk, at den blev startet i 2015) var skrevet i AngularJS, og det var ret en udfordring at forblive bagudkompatibel med den gamle klient, f.eks. alle stier til brugeren skulle ikke ændres, da de måske har bogmærkede links til hemmeligheder i deres dokumentation eller har såkaldte link-deling i brug. Også folk brugte brugerdefineret branding med egne logoer osv., hvor stierne i systemet ikke skulle ændres.
- webpack: Jeg ville nævne det her, da det i øjeblikket er den eneste del, som jeg er utilfreds med. Det er langsomt, frustrerende, svært at lære... den eneste fordel, du har, er, at du aldrig sidder fast. Ethvert problem, du måtte opleve, blev allerede spurgt på Stackoverflow, og du finder en løsning.
- Gatsby: Driver vores statiske hjemmesider til virksomheden og produktet. Tidligere brugte jeg Wordpress, men administrationsomkostningerne med opdateringer og den konstante frygt for, at hjemmesiden blev kompromitteret (og den potentielt negative omtale) fik os til at skifte til Gatsby. Indtil videre har jeg aldrig set mig tilbage.
- Vuepress: Det mest anstændige dokumentationsstyringssystem, som jeg kunne finde. Det kompilerer til statiske hjemmesider, ser moderne ud og driver i øjeblikket Psonos dokumentation
- Material UI: Hovedbiblioteket, der driver frontend. Det er funktionsrigt, fungerer godt sammen med React og ser ganske moderne ud, i modsætning til ældre Bootstrap-baserede temaer.
Der er helt sikkert utallige andre, der fortjener at blive nævnt her, men disse er de "mest vigtige" ifølge min mening.
Databaser
Selvom Django understøtter flere databaser, stødte jeg ret tidligt på spørgsmålet, om jeg ville understøtte alle Djangos databaser eller kun en bestemt. Roden til dette spørgsmål var, at jeg gemte indlejrede træstrukturer i databasen. Så træer med flere rødder og delte grene. Det var afgørende at kunne forespørge disse effektivt, så efter at have udforsket alle tilgængelige muligheder besluttede jeg at gå med Postgres' ltree-udvidelse.
Hvis du planlægger at udvikle noget og køre det solo, skal det køre pålideligt i skyen, styret af skyudbyderen. Du vil sandsynligvis heller ikke blive låst fast af en bestemt udbyder, så intet specifikt for skyen, hvilket begrænser dine valg ret hårdt.
Min beslutning:
- Postgres: Der er to open source databaser, du kan vælge mellem: MariaDB eller Postgres. Jeg havde altid planlagt at gå med Maria (mest på grund af Maria DB's Galera Cluster, en af disse misforståede "unge udvikler skal planlægge for hyper vækst" historier ;D), men på grund af de manglende ltree-udvidelser blev mine hænder tvunget. Nu med al den udvikling, der går ind i Postgres sharding-muligheder, har jeg aldrig fortrudt den beslutning hidtil.
- Redis: Planlagt til at blive brugt som cache til større installationer. Også her kan du vælge enten Redis eller Memchache. Begge er fremragende, men mest på grund af Redis-protokollen, der nu om dage er de facto standarden for caching, gik jeg med Redis. Den eneste ulempe, jeg nogensinde har oplevet med Redis, er, at det er single threaded.
Infrastruktur
Bare en lille oversigt over infrastrukturen, som Psono er afhængig af:
- Gitlab: Gitlab driver al automatisering af Psono. Bemærkelsesværdigt er alt i Psono automatiseret, hvilket er en af nøgleaspekterne, hvordan jeg kan håndtere udgivelser og vedligeholde hele Psono-økosystemet. Tilbage i 2015 kørte hvert open source-projekt på Github, men Gitlab var (og er stadig) bare så mægtig og funktionsmæssigt overlegen (med undtagelse af Githubs søgefunktionalitet). Gitlab driver builds, udgivelser, sårbarhedsscanninger af HVER software, vi bruger.
- Cloudflare: Sandsynligvis den mest innovative virksomhed, jeg kender til, der har påvirket mig gennem de sidste 10 år. Det er fair at sige, at Cloudflare driver internettet nu om dage. Det giver mig pålidelige navneservere, TLS, en anstændig CDN og avancerede funktioner som deres edge worker. DDoS-beskyttelsen og WAF-funktionaliteten giver en vis ekstra sikkerhed, hvilket som password manager er ret vigtigt. Jeg ville elske at bruge deres SSL som en serviceløsning til at tillade SaaS-kunder at konfigurere deres egne domæner, men Cloudflares Enterprise-niveau betalingsvæg er bare for hård. Jeg håber stadig, at de frigiver det et sted som en uafhængig plugin, som man kan købe.
- namecheap: Min foretrukne løsning til domæner og SSL-certifikater.
- Google Cloud Run: Alle backend-servere kører på Google Cloud Run, hvilket er ekstremt omkostningseffektivt og pålideligt, når du vil oprette en flåde af tjenester. Når du først har fået din stack til at køre, gør den et ret godt stykke arbejde. Deres førsteklasses API/cli-integration er et absolut plus her. Der er et par ulemper, som den manglende support fra Google eller truslen om, at Google på et tidspunkt beslutter, at det at være nr. 3 som cloud-serviceudbyder ikke er det værd, og de annullerer produktet.
- Artifactory: Beskytter min byggelinje mod npm-udfald og gemmer mine build-artifakter (hvilket ikke var bundtet i Gitlab i 2015).
- Docker Hub: Opbevarer alle docker-containere og udfører nogle yderligere sikkerhedsscanninger og distribution af mine containere.
- Mailgun: Håndterer alle e-mails. I modsætning til de fleste e-mail-løsningstjenester har Mailgun anstændig logning og analysefunktionalitet. Deres support er topklasse. Det eneste problem er, at deres e-mails nogle gange bliver sendt til spam-indbakken (selv med SPF, DMARC osv. alt på plads), men bortset fra det gør de et fantastisk stykke arbejde.
- Poeditor: Håndterer alle oversættelser. Det gode er, at bidragydere kan anmode om adgang, hvilket er afgørende, hvis du vil have eksterne til at hjælpe med at oversætte dit projekt. Deres support er fantastisk, og du får ekstremt hurtige svar.
- Docker: En af de bedste beslutninger for hele projektet. Især da jeg bruger Python, og at levere fungerende Python-kode med alle Python / OS-bibliotek afhængigheder er hårdt. Hvis tingene skal køre med en kunde på stedet og kravet om, at de kan opdatere og vedligeholde systemet. Docker tillader os at gøre alt det og giver mig fuld kontrol over de installerede pakker, hvilket løser mindst 70 % af alle supportproblemer (mens det introducerer 20 % nye problemer, da folk ikke er vant til Docker ;D)
Overvågning
Så ting kan gå galt, og du skal vide, hvornår det sker, og få nogle indsigter i problemet. Det er her, disse værktøjer er praktiske:
- Google Cloud logging: Hvis du er på Google, er dette din naturlige løsning.
- Sentry: Min nummer et fejlapporteringsløsning. Når du har prøvet det, vil du aldrig undvære det. Det giver mig den nødvendige indsigt i alle fejl.
- Uptimerobot: Ringer til sundhedstjekket af mine forskellige tjenester og vil advare mig, hvis noget går ned. Den offentlige status side for Psono kan forresten findes her https://stats.psono.com/, som kun er en lille del af de tjenester, som dette overvåger for mig, men forhåbentlig viser lidt af systemets pålidelighed.
Udviklingsinfrastruktur
En lille oversigt over, hvordan min lokale udviklingsstack ser ud:
- Windows med WSL: Jeg får sandsynligvis en masse kritik for dette, men ja, jeg kører på Windows. I de sidste par år havde jeg altid en Linux VM et sted, som jeg ville forbinde til for udvikling, men nu om dage drives det af WSL. Jeg får det bedste fra begge verdener.
- Pycharm / Webstorm: Jeg bruger Jetbrain-IDEs. Fjernudviklingsfunktionen er afgørende for min udviklingsarbejdsgang, og denne "batterier inkluderet" filosofi passer mig godt. Nogle gange har jeg omkring 20 projekter åbne, hvilket kræver ordentlig hardware med nok RAM. VSCode synes at være et godt alternativ nu om dage, men gennem de sidste par år har jeg vænnet mig til Jetbrains, og at lære noget nyt kræver altid lidt mental styrke, som jeg i øjeblikket ikke er villig til at investere i dette. Jeg vil sige, at alle bør bruge noget, som de er vant til.
Support
Der er visse værktøjer, der naturligvis er nødvendige for at håndtere supporten for folk, der bruger produktet:
- Freshdesk: En typisk e-mail ticket-software. Den hjælper mig med at holde styr på de forskellige kundeforespørgsler. Tidligere tilbød den en anstændig gratis udgave, hvilket især på grundlæggelsesstadiet er afgørende.
- Discord: Nogle folk foretrækker måske chat eller kræver en mere direkte samtale / hjælp. Det er her, Discord kommer i spil.
Andre
Der er visse andre værktøjer, som jeg ville nævne, der kan være nyttige for andre. Især bankerne for folk, der ønsker at drive deres virksomhed i Tyskland:
- Odoo: Det bedste ERP-system. Dens open source-udgave er gratis og kan nemt udvides med Python og noget XML-viden. Dens tilpasnings- og integrationsmuligheder med brugerdefinerede API'er er i topklasse.
- Holvi: Vores hovedbankkonto. I Tyskland har du brug for en bank, der tillader dig at oprette en Founder Account, på tysk "Gründerkonto", så en bankkonto, der er knyttet til en virksomhed, der endnu ikke er helt registreret, og hvor du kan overføre den oprindelige kapital, som er nødvendig for at registrere virksomheden. En lille kylling og æg problematik. Og de store banker, der tillader dette, koster dig normalt en formue. Registreringsprocessen fungerede også ret fejlfrit. Den eneste ulempe er den manglende support til internationale betalinger, men det er her, den næste service kommer til nytte.
- Wise: Vores anden bankkonto. Deres gebyrer er ekstremt lave (f.eks. ingen månedlige gebyrer), oprettelsesprocessen fungerer fejlfrit, de er vel forbundne og tillader internationale bankoverførsler, og overførsler udføres hurtigt, så du ikke skal vente uger eller lignende.
Sikkerhed
Jeg formoder, at dette kunne være et separat blogindlæg om, hvordan vi strukturerede brugerkonti, infrastruktur, adgangsrettigheder. Da dette er et af de mest afgørende aspekter for sikkerheden af Psono, går jeg ikke i detaljer her og prøver at være vag nok. Vi bruger både Google Cloud og Azure-tjenester. Begge med helt adskilte brugere og grupper.
Der er brugere dedikeret til administration og brugerkonti til "daglig gøren". Der er forskellige fysiske og virtuelle systemer, som jeg bruger til at få adgang til / supporte / administrere / administrere Psono.
Administration opgaver udføres kun på et separat, specielt hærdet fysisk enhed, der udelukkende bruges til disse opgaver. Hver konto er beskyttet med hardware tokens.
Alle systemer administreres centralt, og der er sikkerhedspolitikker på plads for at sikre, at alle enheder følger de sikkerhedsstandarder, som du normalt finder i banker.
Credits
Denne artikel var stærkt inspireret af Anthony N. Simons' artikel om Panelbear.