Kad god vidim inženjere kako pišu o svom stacku, znatiželjan sam naučiti nove alate. Posebno kad nešto vodiš sam, uvijek tražiš načine kako učiti iz iskustva drugih.
Godine 2015. bio sam frustriran tadašnjim upraviteljima lozinkama, posebno zbog toga što nije bilo ničeg kvalitetnog za ljude koji vode privatne servere. Počeo sam raditi na Psono, upravitelju lozinki otvorenog koda s pristojnom razinom enkripcije i sigurnim opcijama dijeljenja podataka. Psono nikad nije bio zamišljen kao SaaS, inače bih vjerojatno odmah na početku ugradio podršku za više korisnika (tenant-a).
Da dobijete osjećaj o razmjerima Psona, trenutno je lokalno instaliran u oko 70 zemalja, s više od 4000 instalacija. Samo Psono SaaS trenutno koristi više od 15.000 ljudi, većina njih koristi našu besplatnu community verziju Psona koja radi na istoj tehnološkoj infrastrukturi kao i naš komercijalni Enterprise proizvod.
Tehnološki stack tipične Psono instalacije uključuje bazu podataka, server, dva web klijenta (jedan za regularne korisnike i jedan za administratore), aplikacije za iOS i Android, ekstenzije za preglednike Chrome i Firefox. Kupac može instalirati LDAP gateway ili file server uz to.
Osim toga, postoji još dosta infrastrukture u pozadini. Počevši od web stranice za tvrtku i proizvod, imam serversku komponentu za upravljanje licencama za Enterprise proizvod, centralni ERP sustav za ponude i račune, shop gdje ljudi mogu kupiti Psono SaaS i upravljati svojom instalacijom te autentifikacijski servis s OIDC-om.
Kroz članak ćete vidjeti da preferiram staru i dobro provjerenu tehnologiju.
Programska jezici
- Python: Sav backend kod pisan je u Pythonu. Najveća prednost Pythona je njegovo bogato okruženje (ekosustav). Nedostatak tipova (što mnogi smatraju manom) omogućeva nevjerojatno brzo pisanje web servisa, što je u startup fazi jedna od ključnih stvari koje bih tražio u programskom jeziku.
- Javascript: O ne... tko bi to očekivao... Već je 2015. bilo nemoguće napraviti web stranicu bez Javascripta. ;)
Python mi je omiljeni jezik za web servise. (Ovdje preskačem zašto nešto drugo nije bolje od Pythona, to bi ispunilo novi blog.) Jedina mana koju morate riješiti jest kako pouzdano isporučiti kod sa svim ovisnostima, što je posebno važno ako korisnici lokalno instaliraju vaš softver i traže podršku kada naiđu na probleme. (Što se brzine tiče, što bi možda drugi spomenuli, nije presudno. Python je dovoljno brz.)
Okviri (frameworks)
- Django: "To je kao supermoć za samostalne developere" (da citiram Athony N. Simonsa). Skupa s ekosustavom rješava gotovo sve probleme na koje možete naići. Autentifikacija, predlošci, email, migracije baze, totp, ... samo da nabrojim neke.
- Django Rest Framework: Pogoni sve API-jeve i radi izvrstan posao. Različiti slojevi (serializacija, autentifikacija, dozvole, prikazi) održavaju vaš kod čistim.
- React: Nedavno sam migrirao regularni web klijent na React. Stari web klijent (zapamtite, počet je 2015.) bio je pisan u AngularJS-u i bilo je prilično izazovno održati povratnu kompatibilnost sa starim klijentom npr. svi putovi korisnika nisu smjeli mijenjati, jer su mogli imati bookmarkane linkove na tajne podatke ili koristiti tzv. link dijeljenja. Također su neki koristili vlastiti branding s logotipima gdje putovi u sustavu nisu smjeli mijenjati.
- webpack: Spominjem ga jer je to trenutno jedini dio s kojim nisam zadovoljan. Spor je, frustrirajuć, težak za učenje... jedina prednost je što se nikada nećete zaglaviti - svaki problem koji imate već je netko pitao na StackOverflowu i pronaći ćete rješenje.
- Gatsby: Pokreće statične web stranice tvrtke i proizvoda. Prije sam koristio Wordpress, no zbog troškova održavanja i stalnog straha od kompromitacije (i potencijalne negativne reklame) odlučio sam se za Gatsby. Do sada nisam požalio.
- Vuepress: Najpristojniji sustav za upravljanje dokumentacijom koji sam mogao pronaći. Kompajlira u statične stranice, izgleda moderno i trenutno pokreće Psono dokumentaciju
- Material UI: Glavna biblioteka za frontend. Ima puno mogućnosti, odlično se slaže s Reactom i izgleda moderno, za razliku od starijih tema temeljenim na Bootstrapu.
Naravno da postoji mnogo drugih koji bi zaslužili biti spomenuti, ali ovo su oni "najvažniji" prema mom mišljenju.
Baze podataka
Iako Django podržava više baza podataka, rano sam naišao na pitanje treba li podržavati sve Django baze ili samo jednu određenu. Glavni razlog je bio što sam pohranjivao ugniježdene strukture stabla u bazu podataka. Dakle, stabla s više korijena i dijeljenim granama. Učinkovito izvođenje upita bilo je ključno, pa sam nakon svih istraženih opcija ipak odabrao Postgre ltree ekstenziju.
Ako planirate išta razvijati i voditi sami, treba pouzdano raditi u cloudu, upravljano od strane cloud providera. Vjerojatno ne želite biti vezani za jednog dobavljača (vendor lock-in), pa izbjegavate cloud-specifična rješenja, što znatno ograničava izbor.
Moj odabir:
- Postgres: Postoje dvije open source baze koje možete birati. MariaDB ili Postgres. U početku sam planirao uzeti MariaDB (pogotovo zbog njene Galera Cluster opcije, jedna od onih pogrešnih "mladi developer mora planirati za hiper rast" priča ;D), ali zbog nedostatka ltree ekstenzija, bio sam primoran preći na Postgres. Danas, uz svo razvijanje shardinga u Postgresu, nisam zažalio tu odluku.
- Redis: Planiran kao cache za veće instalacije. Možete birati Redis ili Memcache. Oboje su izvrsni, ali najviše zbog toga što je Redis protokol danas de facto standard za caching odabrao sam Redis. Jedini minus je što je Redis single-threaded.
Infrastruktura
Mali pregled infrastrukture na koju se oslanja Psono:
- Gitlab: Gitlab automatizira sav development Psona. Važno je spomenuti da je sve automatizirano, što je ključno za upravljanje izdanjima i održavanje cijelog ekosustava. Godine 2015. gotovo svi open source projekti bili su na Githubu, ali Gitlab je tada (i sada) bio moćniji funkcionalno (osim što Github ima najbolje pretraživanje). Gitlab pokreće buildove, izdanja, skanira ranjivosti na SVAKOM komadu softvera koji se koristi.
- Cloudflare: Vjerojatno najinovativnija kompanija koja me je utjecala u zadnjih 10 godina. Realno, Cloudflare danas pogoni internet. Daje pouzdane nameservere, TLS, dobar CDN, te napredne mogućnosti poput edge workera. DDoS zaštita i WAF su posebna prednost, što je za upravitelja lozinki jako važno. Volio bih koristiti njihovu SSL as a service opciju kako bi SaaS korisnici mogli konfigurirati vlastite domene, ali Enterprise razina cijena Cloudflarea je previsoka. I dalje se nadam da će to jednom ponuditi kao samostalni dodatak.
- namecheap: Moje rješenje za domene i SSL certifikate.
- Google Cloud Run: Svi backend serveri rade na Google Cloud Runu, što je izuzetno isplativ i pouzdan način za pokretanje servisa u oblaku. Kad stack radi, radi stvarno dobro. Njihova API / CLI integracija je vrhunska. Negativna strana je izostanak Google podrške i rizik da Google odluči da im #3 pozicija među cloud provajderima nije isplativa i ukinu proizvod.
- Artifactory: Štiti pipeline od npm problema i pohranjuje build artefakte (što 2015. nije bilo uključeno u Gitlab).
- Docker Hub: Pohranjuje sve docker kontenjere, radi sigurnosne provjere i omogućuje distribuciju.
- Brevo: Zadužen za sve emailove. Za razliku od većine email servisa, Brevo ima odličan logging i analitiku. Podrška je vrhunska. Jedina mana je što mailovi znaju završiti u spam inboxu (čak i uz SPF, DMARC i sve ostalo), ali osim toga sve dobro radi.
- Poeditor: Zbrinjava sve prijevode. Dobra stvar je što suradnici mogu zatražiti pristup, što je nužno ako želite vanjske prevoditelje. Podrška im je izvrsna i odgovaraju vrlo brzo.
- Docker: Jedna od najboljih odluka za cijeli projekt. Budući da koristim Python, isporučiti ispravan Python kod sa svim ovisnostima je teško. Ako nešto treba raditi kod korisnika na on-premise sustavu i potreban je jednostavan update i održavanje, Docker omogućuje sve to i daje mi punu kontrolu nad instaliranim paketima. Time rješavam barem 70% svih support zahtjeva (dok uvodim 20% novih jer ljudi nisu navikli na Docker ;D)
Praćenje i monitoring
Stvari znaju poći po zlu i bitno je brzo znati kad se to dogodi i dobiti uvid u problem. Tu pomažu ovi alati:
- Google Cloud logging: Prirodni odabir ako ste na Google cloudu.
- Sentry: Moj broj jedan alat za izvještavanje o greškama. Jednom kad ga probate, više ga nećete moći bez njega – daje puni uvid u sve pogreške.
- Uptimerobot: Provjerava healthcheck svih mojih servisa i alarmira me ako nešto padne. Javnu status stranicu za Psono možete pogledati ovdje https://stats.psono.com/, što je samo mali dio servisa koje ovaj alat prati za mene, ali pokazuje pouzdanost sustava.
Razvojna infrastruktura
Mali pregled mog lokalnog development stacka:
- Windows s WSL-om: Vjerojatno ću zbog toga primiti puno kritika, ali da, radim na Windowsima. Prije sam uvijek imao Linux VM za development, ali sada WSL radi svoj posao. Dobijem najbolje od oba svijeta.
- Pycharm / Webstorm: Koristim Jetbrains IDE. Remote development funkcionalnost je ključna za moj tok rada, a filozofija "baterije uključene" mi odgovara. Ponekad imam otvoreno 20 projekata, što zahtijeva solidan hardver i dovoljno RAM-a. VSCode je danas dobra alternativa, no ja sam naviknut na Jetbrains i nije mi se dalo trošiti mentalnu energiju na učenje nečeg novog. Mislim da svatko treba koristiti ono na što je navikao.
Podrška (support)
Za podršku korisnicima proizvoda također su potrebni određeni alati:
- Freshdesk: Klasičan software za email tikete. Pomaže mi pratiti korisničke zahtjeve. Ranije je imao dobar besplatan tier, što je u fazi osnivanja vrlo važno.
- Discord: Neki korisnici preferiraju chat ili žele izravniji kontakt / pomoć. Tu Discord dolazi kao rješenje.
Ostalo
Još nekoliko korisnih alata koje želim izdvojiti, posebno banke – za one koji žele poslovati u Njemačkoj:
- Odoo: Najbolji ERP sustav. Open source verzija je besplatna i lako se proširuje ako znate Python i malo XML-a. Prilagodbe i integracije s vlastitim API-jevima su vrhunske.
- Holvi: Naš glavni bankovni račun. U Njemačkoj trebate banku koja omogućuje "Gründerkonto" (račun za osnivača) – račun za tvrtku koja još nije u potpunosti registrirana. Mali problem "kokoš ili jaje". Velike banke koje to nude su poprilično skupe. Registracija je prošla glatko. Jedini minus je što nema podrške za inozemna plaćanja – a tu pomaže sljedeća usluga.
- Wise: Drugi bankovni račun. Naknade su im jako niske (npr. bez mjesečnih naknada), otvaranje radi bez problema, dobro su povezani, omogućuju međunarodne transakcije i sve transferi budu brzo provedeni, pa ne čekate tjednima.
Sigurnost
Ovo bi mogao biti zaseban blog post o tome kako strukturiramo korisničke račune, infrastrukturu, prava pristupa. Budući da je ovo jedna od najvažnijih sigurnosnih stavki za Psono, neću ulaziti u detalje i držat ću stvari dovoljno neodređenima. Koristimo i Google Cloud i Azure servise, svaka s potpuno odvojenim korisnicima i grupama. Postoje korisnici za administrativne zadatke i korisnički računi za svakodnevni rad. Možemo koristiti različite fizičke i virtualne sustave za pristup / podršku / upravljanje / administraciju Psona. Administracija se provodi isključivo na posebno očvrsnutom fizičkom uređaju korištenom samo u tu svrhu. Svaki račun je zaštićen hardverskim tokenima. Svi sustavi su centralno upravljani i primjenjuju se sigurnosna pravila kako bi svi uređaji zadovoljili standarde sigurnosti kakve imaju banke.
Zahvale
Ovaj članak je bio snažno inspiriran člankom Anthonyja N. Simona o Panelbearu.