Valahányszor látom, hogy mérnökök a technológiai eszköztárukról írnak, mindig kíváncsi vagyok, hogy tanuljak valami új eszközt. Különösen, ha az ember egyedül viszi a dolgokat, mindig keresi, hogy mások tapasztalatából tanulhasson.
2015-ben frusztrált voltam a jelszókezelők aktuális színvonala miatt, főleg azért, mert nem volt semmi használható azok számára, akik magán szervereken futtatják a rendszereiket. El is kezdtem dolgozni a Psono, egy nyílt forráskódú jelszókezelőn, amely megfelelő titkosítási szinttel és biztonságos megosztási lehetőségekkel rendelkezik. A Psono-t sosem arra szántam, hogy SaaS-ként fusson, különben már kezdettől beépítettem volna a több bérlőt támogató lehetőséget.
Csak hogy legyen elképzelésed a Psono léptékéről: A Psono-t jelenleg helyileg kb. 70 országban telepítették, több mint 4000 példányban. A Psono SaaS önmagában több mint 15.000 ember által használt, legtöbben a
Psono ingyenes közösségi kiadását használják, amely ugyanarra a technológiai eszköztárra épül, mint a fizetős vállalati verzió.
Egy tipikus Psono telepítés eszköztára egy adatbázisból, szerverből, két web kliensből (egy a normál felhasználóknak és egy az adminoknak), iOS és Android applikációkból, böngészőbővítményekből Chrome és Firefox alá áll. Az ügyfelek telepíthetnek LDAP átjárót vagy fájlszervert is ehhez.
Emellett sok más infrastruktúra is működik a háttérben. A céges honlapot és termékoldalt kiszolgáló weboldaltól kezdve van licensz szerver a vállalati termékhez, egy központi ERP rendszer az árajánlatok és számlák kezelésére, egy bolt, ahol lehet SaaS-t vásárolni és a telepítést kezelni, valamint egy OIDC-s hitelesítési szolgáltatás.
Ahogy majd látni fogod a cikk során, régi és "unalmas" technológiát preferálok.
Programnyelvek
- Python: A backend összes kódja Pythonban íródott. A Python legnagyobb előnye a gazdag ökoszisztéma. Típusok hiánya (sokan ezt hátránynak tartják) miatt extrém gyorsan lehet webszolgáltatást fejleszteni, ami induló vállalkozásnál az egyik legfontosabb szempont.
- Javascript: Ó, ne... ki gondolta volna... Lehetetlen bármilyen weboldalt Javascript nélkül létrehozni, már 2015-ben is az volt. ;)
Python a kedvenc programnyelvem webszolgáltatásokhoz. (Hagyom itt, hogy ne írjam le, miért nem XY a jobb a Pythonnál - ez önmagában kitöltene egy külön blogposztot). Van egyetlen hátránya, amit kezelni kell: a kód összes függőségének megbízható szállítása, ami különösen fontos, ha az emberek helyileg telepítik a szoftveredet, és támogatást kérnek, ha problémába ütköznek. (A sebesség, amit sokan felhoznak, nem számít - a Python elég gyors).
Keretrendszerek
- Django: "Ez egy szupererő egy egyszemélyes fejlesztőnek" (idézve Athony N. Simons-t). Az ökoszisztémával együtt szinte minden problémát megold, ami felmerülhet: hitelesítés, sablonok, e-mail, adatbázis migrációk, totp, stb.
- Django Rest Framework: Jelenleg minden API-t ez hajt meg, és nagyszerű munkát végez. A különböző rétegek (szerializáció, hitelesítés, jogosultságok, nézetek) rendkívül tisztán tartják a kódot.
- React: Nemrég migráltam az alap webklienst React-re. A régi web kliens (ne felejtsd, 2015-ben indult) AngularJS-ben íródott, és komoly munka volt kompatibilis maradni a régivel, pl. a felhasználók útvonalai nem változhattak, mivel lehetett, hogy könyvjelzőként mentettek el titkokat vagy úgynevezett linkmegosztásokat használtak. Sok felhasználó saját márkajelzést, logót, stb. használ ott, ahol szintén nem változhattak az útvonalak.
- webpack: Az egyetlen rész, amivel nem vagyok elégedett. Lassú, idegőrlő, nehéz tanulni... Az egyetlen előnye, hogy sosem ragadsz le: bármilyen problémára van már Stack Overflow válasz.
- Gatsby: A statikus céges és termék weboldalakat ez hajtja. Régebben WordPress-t használtam, de a frissítési munkák és a folyamatos félelem attól, hogy feltörik az oldalt (és a potenciális negatív sajtó) átváltásra kényszerített Gatsby-re. Eddig nem bántam meg.
- Vuepress: A legjobb dokumentáció-kezelő rendszer, amit találtam. Statikus weboldalra fordul, modern megjelenésű, jelenleg a Psono dokumentációt is ez szolgálja ki.
- Material UI: A frontend fő könyvtára. Funkcióban gazdag, jól működik együtt a React-tel és modern külsőt ad, szemben a régi Bootstrap-alapú témákkal.
Bizonyára rengeteg mást is lehetne említeni, de ezek a "legfontosabbak" szerintem.
Adatbázisok
Bár a Django több adatbázist támogat, elég hamar szembesültem a kérdéssel: mindet támogatni akarom, vagy csak egyet? Az ok az volt, hogy fa-struktúrákat (több gyökérrel és közös ágakkal) tároltam adatbázisban. Ezek hatékony lekérdezése kulcsfontosságú volt, ezért a Postgre ltree kiterjesztése mellett döntöttem.
Ha egyedül fejleszted és futtatod a projekted, a felhőben kell stabilan működnie, a szolgáltató által menedzselve. Valószínű nem akarsz szolgáltatói függőséget sem, ezért semmi felhőspecifikus - ami erősen lekorlátozza a lehetőségeket.
Az én választásom:
- Postgres: Két nyílt forrású adatbázis közül lehet választani: MariaDB vagy Postgres. Eredetileg a Mariát akartam használni (főleg a MariaDB Galera Cluster miatt, egyike azoknak a "fiatal fejlesztő túlterveződik a hiper növekedésre" történeteknek ;D), de mivel az ltree kiterjesztés hiányzott, kényszerpályán voltam. Most már, a Postgres sharding fejlesztéseit látva, egyáltalán nem bántam meg a döntést.
- Redis: Nagyobb telepítésekben cache-ként terveztem használni. Lehetne Memcached-et is, mindkettő kiváló, de a Redis protokoll mára a de facto szabvány cache-eléshez, ezért a Redis lett a választás. Egyetlen hátránya, hogy egyszálas.
Infrastruktúra
Egy rövid áttekintés, milyen infrastruktúrákra támaszkodik a Psono:
- Gitlab: A teljes Psono automatizációt a Gitlab hajtja. Megjegyzendő, hogy a Psono minden eleme automatizált, ami kulcsfontosságú, hogy egyedül tudjam kezelni a kiadásokat és karbantartani a teljes ökoszisztémát. Még 2015-ben minden nyílt forrású projekt Githubon futott, de a Gitlab (még ma is) funkciókban sokkal jobb (kivéve a Github keresési funkcióját). A Gitlab kezeli az összes buildet, kiadást, sebezhetőségi vizsgálatot minden egyes szoftverünknél.
- Cloudflare: Valószínűleg a leginnovatívabb cég, amely a múlt 10 évben rám hatott. Nyugodtan kijelenthetjük, hogy ma a Cloudflare hajtja az internetet. Megbízható névkiszolgálókat, TLS-t, jó CDN-t és fejlett funkciókat (pl. edge worker) nyújt. A DDoS-védelem és a WAF szintén nagyon fontos jelszókezelőknél. Nagyon szeretném egyszer használni a Cloudflare SSL as a Service szolgáltatását, hogy a SaaS ügyfelek saját domaint konfigurálhassanak, de az Enterprise szint fizetőfala túl magas. Remélem, egyszer külön plugin-ként megjelenik.
- namecheap: Az alapértelmezett megoldásom domainekhez és SSL tanúsítványokhoz.
- Google Cloud Run: Az összes backend szerver a Google Cloud Run-on fut, ami borzasztóan költséghatékony és megbízható, amikor sok szolgáltatást akarsz futtatni. Ha egyszer beállítottad a stack-et, remekül működik. Kiemelkedő az API/CLI integrációja. Van néhány hátrány (pl. a Google hiánya támogatásban, vagy a veszély, hogy harmadik helyen lévő szolgáltatóként egyszer csak megszüntetik a terméket).
- Artifactory: Megvédi a build pipeline-t az npm leállásoktól és tárolja a build artifactokat (ezt 2015-ben még nem tudta a Gitlab).
- Docker Hub: Minden docker konténert tárol és további biztonsági vizsgálatokat, valamint a disztribúciót is kezeli.
- Brevo: Kezeli az összes e-mailt. Más szolgáltatókhoz képest a Brevo-nak kiváló naplózási és elemzési lehetőségei vannak, támogatásuk kitűnő. Egyetlen gond, hogy az e-mailek néha a spam mappában landolnak (SPF, DMARC stb. ellenére is), de ezen kívül nagyszerűen működik.
- Poeditor: Minden fordítást kezel. Jó benne, hogy a közreműködők hozzáférést kérhetnek, ami kulcsfontosságú, ha kívülállók is segítenék a fordítást. Gyors segítséget adnak.
- Docker: Az egyik legjobb döntésem a projekt szempontjából. Főleg, hogy Pythonban fejlesztünk, és a Python / OS függőségek szállítása nehéz. Premise telepítés esetén is fontos, hogy frissíthető és karbantartható legyen. A Docker minden ezt lehetővé teszi, és teljesen kontrollálhatom a telepített csomagokat, így a támogatási kérdések 70%-át megoldja (igaz, 20% új probléma születik, mert az emberek nem értik a Dockert ;D).
Monitoring
Bármikor baj történhet, erről kell tudni, és betekintést nyerni a hibába. Ilyenkor jönnek jól az alábbi eszközök:
- Google Cloud logging: Ha Google-t használsz, természetes megoldás.
- Sentry: Az első számú hibajelentő rendszerem. Ha egyszer kipróbáltad, sosem akarsz nélküle dolgozni. Minden hibába betekintést ad.
- Uptimerobot: A különböző szolgáltatások egészségét figyeli és értesít, ha bármi leáll. A Psono nyilvános státuszoldala egyébként itt található: https://stats.psono.com/, ami csak egy kis részét monitorozza a szolgáltatásoknak, de talán mutat valamit a rendszer megbízhatóságából.
Fejlesztői infrastruktúra
Egy rövid áttekintés arról, hogy néz ki a helyi fejlesztői környezetem:
- Windows WSL-lel: Valószínűleg ezért sokan megköveznek majd, de igen, Windowst használok. Korábban mindig volt egy Linux VM-em fejlesztéshez, mostanra viszont a WSL viszi a fejlesztői környezetet. Mindkét világ legjobbjait élvezem így.
- Pycharm / Webstorm: Jetbrain IDE-ket használok. A távoli fejlesztési funkció kulcsfontosságú a munkafolyamatomhoz, és a "mindent tartalmaz" filozófia nagyon tetszik. Néha 20 projekt is meg van nyitva, ezért kell erős gép sok memóriával. A VSCode is jó alternatíva ma már, de megszoktam a Jetbrains-t, az új megtanulása nagy mentális energia, amire most nem vagyok hajlandó áldozni. Szerintem mindenki azt használja, amihez hozzászokott.
Ügyféltámogatás
Vannak kifejezetten támogató eszközök, hogy segíthessek a felhasználóknak:
- Freshdesk: Tipikus e-mail alapú jegykezelő. Segít nyomon követni a különböző vevői igényeket. Kezdetben jó volt az ingyenes csomagja, ami indulása idején különösen fontos.
- Discord: Vannak, akik chatet preferálnak vagy közvetlenebb segítségre vágynak. Ilyenkor a Discord ideális.
Egyéb
Vannak más eszközök is, amiket érdemes megemlíteni, főleg bankok Németországban üzletet alapítóknak:
- Odoo: A legjobb ERP rendszer. A nyílt forrású kiadása ingyenes, Python- és némi XML-tudással könnyen bővíthető. Testreszabhatósága és integrációs lehetőségei egyediek.
- Holvi: Fő bankszámlánk. Németországban olyan bank kell, amely engedélyezi a "Gründerkonto" (alapító-cégszámla) nyitását, amikor még nincs teljesen bejegyezve a cég és ide helyezhető a kezdő tőke. Ez egyfajta tyúk-tojás problémát jelent, a nagy bankoknál pedig nagyon drága. A Holvi regisztráció zökkenőmentes volt. Egyetlen hátránya, hogy nincs nemzetközi utalás - erre való a következő szolgáltatás.
- Wise: Második bankszámlánk. Nagyon alacsonyak a díjaik (pl. nincs havidíj), a regisztráció zökkenőmentes, jól kapcsolódnak más bankokhoz, van nemzetközi átutalás, és gyorsan teljesülnek az utalások, nem kell heteket várni.
Biztonság
Erről akár önálló blogbejegyzést is lehetne írni, hogyan építettük fel a felhasználói fiókokat, infrastruktúrát, hozzáférési jogokat. Ez az egyik legkritikusabb része a Psono biztonságának, ezért nem is megyek bele részletekbe, elég homályos leszek. Google Cloudot és Azure szolgáltatásokat is használunk, teljesen elkülönített felhasználókkal és csoportokkal. Vannak adminisztrátori és "napi tevékenységes" felhasználói fiókok. Külön fizikai és virtuális gépek vannak támogatásra, menedzselésre, adminisztrációra. Az adminisztráció csak elkülönített, különösen megerősített fizikai eszközön történik, kizárólag e célra. Minden fiók hardveres tokennel védett. Minden rendszer központilag menedzselt, és olyan biztonsági szabályzatok vannak érvényben, amelyek garantálják, hogy minden eszköz banki szintű biztonsági elvárásoknak felel meg.
Források
Ez a cikk erősen inspirálódott Anthony N. Simon Panelbear-ről írt cikkéből.