Sempre que veig enginyers escrivint sobre el seu stack, sento curiositat per conèixer noves eines. Especialment quan portes les coses en solitari, sempre busques aprendre de l’experiència dels altres.
L’any 2015 estava frustrat amb el nivell actual dels gestors de contrasenyes, especialment perquè no hi havia res decent per a persones que gestionaven servidors privats. Vaig començar a treballar en Psono, un gestor de contrasenyes de codi obert amb un nivell d’encriptació decent i opcions segures per a compartir. Psono mai no es va concebre per funcionar com a SaaS, si no, segurament hauria incorporat el suport multi-llogater des del principi.
Perquè us feu una idea de l’escala de Psono: actualment, Psono està instal·lat localment a uns 70 països, amb més de 4.000 instal·lacions. Només el SaaS de Psono és emprat per més de 15.000 persones, la majoria de les quals utilitzen la nostra edició comunitària gratuïta de Psono que funciona sobre la mateixa arquitectura que el nostre producte Enterprise de pagament.
L’stack típic d’una instal·lació de Psono consisteix en una base de dades, un servidor, dos clients web (un per a usuaris regulars i un per a administradors), apps per a iOS i Android, extensions per als navegadors Chrome i Firefox. Un client pot instal·lar un gateway LDAP o un servidor d’arxius a més d’això.
A part, tinc força més infraestructura. Des de la pàgina web per a l’empresa i la del producte, un servidor de llicències per al producte Enterprise, un sistema ERP centralitzat per gestionar pressupostos i factures, una botiga on la gent pot adquirir el SaaS de Psono i gestionar la seva instal·lació, i un servei d’autenticació amb OIDC.
Al llarg de l’article veureu que prefereixo la tecnologia “vella i avorrida”.
Llenguatges
- Python: Tot el codi del backend està escrit en Python. El gran avantatge de Python és el seu ric ecosistema. L’absència de tipus (que molta gent veu com una mancança) fa que sigui molt ràpid escriure el teu webservice, cosa que per a una startup és un dels aspectes clau a tenir en compte en un llenguatge de programació.
- Javascript: Oh, no... qui ho hauria dit... Ja el 2015 era impossible crear una web sense Javascript. ;)
Python és el meu llenguatge favorit per als serveis web. (Em deixo aquí les meves reflexions sobre per què no és millor XY que Python. Això donaria per a tot un altre article de blog.) Només hi ha un inconvenient que has de compensar, que és la possibilitat d’entregar codi amb totes les dependències de manera fiable, especialment crucial si la gent instal·la el teu software localment i et demana suport si tenen problemes. (Pel que fa a la velocitat, que potser altres comenten aquí, no importa; Python és prou ràpid.)
Frameworks
- Django: “És com tenir superpoders per a desenvolupadors solitaris” (si em permeto citar Athony N. Simons aquí). Juntament amb l’ecosistema resol gairebé tots els problemes que t’hi puguis trobar: autenticació, plantilles, email, migracions de base de dades, totp... només per citar-ne alguns.
- Django Rest Framework: Actualment alimenta totes les APIs i fa una gran feina. Les diferents capes (serialització, autenticació, permisos, vistes) mantenen el codi extremadament net.
- React: Recentment he migrat el client web regular a React. L’antic client web (recordeu que es va començar el 2015) estava escrit en AngularJS i va ser una gran empresa mantenir la retrocompatibilitat amb el client antic, per exemple, que tots els camins de l’usuari no canviessin, ja que podien haver-hi enllaços guardats als seus secrets o compartir enllaços a la documentació. A més, molta gent utilitzava branding personalitzat amb els seus propis logotips i era important que els camins del sistema no canviessin.
- webpack: Volia mencionar-lo aquí perquè és l’única part actualment amb la qual no estic content. És lent, desesperant, difícil d’aprendre... L’únic avantatge és que mai et quedes encallat: qualsevol problema que tinguis segur que ja ha estat demanat a Stackoverflow i hi trobaràs una solució.
- Gatsby: Proporciona les webs estàtiques de l’empresa i del producte. Fa temps utilitzava Wordpress, però la gestió de les actualitzacions i la por constant que la web fos compromesa (i la mala premsa) ens va fer canviar a Gatsby. Fins ara, no he mirat enrere.
- Vuepress: El millor sistema de gestió documental que he trobat. Compila a webs estàtiques, té un aspecte modern i actualment ofereix el motor de la documentació de Psono.
- Material UI: La llibreria principal del frontend. Té moltes funcionalitats, s’integra perfectament amb React i resulta molt moderna, en contraposició amb els temes antics basats en Bootstrap.
N’hi ha, evidentment, moltes més que mereixerien ser esmentades, però aquestes són les “més importants” segons la meva opinió.
Bases de dades
Tot i que Django suporta diverses bases de dades, ben d’hora vaig topar amb la qüestió de si donaria suport a totes o només a una en concret. La raó era que emmagatzemava estructures arborals niades a la base de dades, és a dir, arbres amb múltiples arrels i branques compartides. Poder consultar-les eficaçment era clau, així que després d’explorar totes les opcions vaig optar per l’extensió ltree de Postgres.
Si vols desenvolupar alguna cosa i portar-la tu sol, cal que funcioni de manera fiable al núvol, gestionada pel proveïdor, però segurament tampoc vols quedar tancat amb un proveïdor, així que has d’evitar serveis específics d’un únic núvol, limitant força les opcions.
La meva decisió:
- Postgres: Hi ha dues bases de dades de codi obert entre les que pots triar: MariaDB o Postgres. Al principi volia apostar per Maria (sobretot pel Galera Cluster de MariaDB, una d’aquestes històries de desenvolupador jove mal orientat preveient un creixement hiperbòlic ;D), però la manca de l’extensió ltree va ser determinant. Avui dia, amb tot el desenvolupament que rep Postgres en sharding no m’he penedit mai de la decisió.
- Redis: Planificat per utilitzar-lo com a cache en instal·lacions grans. Aquí pots triar Redis o Memcached. Tots dos són excel·lents, però el protocol de Redis, convertit en estàndard de facto pel caching, va decantar la balança. L’únic inconvenient que he notat amb Redis és que només treballa amb un sol fil d’execució.
Infraestructura
Un petit resum de la infraestructura on confia Psono:
- Gitlab: Gitlab impulsa l’automatització de tot Psono. De fet, tot a Psono és automàtic, que és com puc gestionar les publicacions i mantenir l’Ecosistema Psono. El 2015 tots els projectes open source eren a Github, però Gitlab era (i és) molt més potent i amb moltes més funcionalitats (excepte l’ús del buscador de Github). Gitlab alimenta les builds, releases, escaneigs de vulnerabilitats de TOT el programari que usem.
- Cloudflare: Probablement la companyia amb més innovació que conec i que m’ha influït els últims 10 anys. Es pot afirmar que avui dia Cloudflare mou Internet. Ofereix servidors DNS robustos, TLS, un CDN excel·lent i funcionalitats avançades com els seus edge workers. La protecció DDoS i el WAF són un plus, molt important per a un gestor de contrasenyes. M’encantaria utilitzar el servei de SSL “as a service” perquè els clients puguin configurar el seu domini, però el mur de pagament de l’Enterprise de Cloudflare és massa. Encara espero que algun dia l’ofereixin com a plugin independent que es pugui adquirir.
- namecheap: La meva solució de confiança per a dominis i certificats SSL.
- Google Cloud Run: Tots els servidors backend s’executen a Google Cloud Run, que és molt eficient i fiable per desplegar una flota de serveis. Un cop tens l’stack funcionant, fa una gran feina. El seu API i integració amb la línia de comandes són excel·lents. L’inconvenient: el suport de Google és escàs i sempre hi ha el risc que decideixin cancel·lar el producte.
- Artifactory: Protegeix la pipeline de builds contra caigudes a npm i emmagatzema els artefactes (cosa que el 2015 Gitlab no feia).
- Docker Hub: Emmagatzema tots els containers de docker i fa alguns escaneigs de seguretat i distribució extra.
- Brevo: Gestiona els emails. A diferència d’altres proveïdors, Brevo té un registre i una anàlisi de logs molt bones. El suport és excel·lent. L’únic problema: alguna vegada els seus emails acaben a la “spam inbox” (fins i tot amb SPF, DMARC, etc. correctes), però fora d’això fan molta bona feina.
- Poeditor: Gestiona totes les traduccions. El bo és que els col·laboradors poden demanar accés, cosa crucial si vols que externs ajudin a traduir el teu projecte. El suport és fantàstic i reps resposta molt ràpida.
- Docker: Una de les millors decisions de tot el projecte. Sobretot perquè faig servir Python i empaquetar Python amb totes les dependències (també del sistema operatiu) és difícil. Si s’ha d’instal·lar “on premise” a client i cal garantir actualitzacions i manteniment, Docker permet fer-ho i em dóna control total sobre els paquets instal·lats, resolent almenys el 70% de totes les incidències de suport (mentre en crea un 20% de noves, perquè la gent no coneix Docker ;D)
Monitorització
És inevitable que alguna cosa falli i cal saber-ho i comprendre’n la causa. Aquí entren aquestes eines:
- Google Cloud logging: Si ets a Google, la solució natural.
- Sentry: El meu sistema número ú per informes d’errors. Un cop el proves, no vols prescindir-ne. M’ofereix la visibilitat necessària sobre tots els errors.
- Uptimerobot: Executa healthchecks sobre els serveis i m’avisa si algun cau. Per cert, la pàgina de status pública de Psono és https://stats.psono.com/. Mostra només una petita part dels serveis que monitoritza per a mi, però espero que sigui un exemple de la fiabilitat del sistema.
Infraestructura de desenvolupament
Un breu resum de com és el stack de desenvolupament local:
- Windows amb WSL: Sortiré escaldat per això, però sí, treballo amb Windows. Durant anys sempre tenia una VM amb Linux on m’hi connectava per desenvolupar, però ara tot ho faig amb WSL i aprofito el millor d’ambdós mons.
- Pycharm / Webstorm: Faig servir els IDEs de Jetbrains. El desenvolupament remot és clau en el meu entorn i la filosofia “batteries included” m’agrada molt. De vegades tinc 20 projectes oberts i cal maquinari amb força RAM. VSCode sembla actualment una bona alternativa, però després d’anys amb Jetbrains em resisteixo a invertir temps en aprendre alguna cosa nova. Tothom hauria de fer servir allò a què està acostumat.
Suport
Hi ha una sèrie d’eines essencials per atendre el suport als usuaris del producte:
- Freshdesk: Típica eina de ticket per email. M’ajuda a seguir les peticions dels clients. Durant la fundació era important el free tier, i Freshdesk en tenia un de decent.
- Discord: Algunes persones prefereixen el xat o necessiten una conversa/ajuda més directa. Aquí Discord va molt bé.
Altres
Altres eines que val la pena esmentar, especialment els bancs per als qui vulguin gestionar el negoci des d’Alemanya:
- Odoo: El millor sistema ERP. L’edició open source és gratuïta i fàcil d’ampliar amb Python i una mica de XML. Les opcions de personalització i integració amb APIs pròpies són excel·lents.
- Holvi: El nostre banc principal. A Alemanya cal un banc que permeti obrir un compte de fundador (“Gründerkonto”), o sigui, vinculat a una empresa encara no registrada i per transferir el capital inicial. Un peix que es mossega la cua. I els grans bancs que ho permeten són cars. El procés de registre va anar força rodó. L’únic inconvenient és el suport internacional limitat, però aquí el següent servei ajuda.
- Wise: El nostre segon compte bancari. Les comissions són molt baixes (sense comissions mensuals), l’obertura és senzilla, tenen bona connexió i permeten transferències internacionals ràpides.
Seguretat
Suposo que això mereixeria una entrada de blog sencera sobre com estructurem els comptes d’usuari, infraestructures, permisos d’accés. Com que és un dels aspectes més crucials per a la seguretat de Psono, no entraré en detalls aquí i seré bastant general. Empren tant serveis de Google Cloud com d’Azure. Cadascun amb usuaris i grups completament separats.
Hi ha usuaris dedicats per a tasques d’administració i comptes d’usuari per a la feina diària. Per accedir/suportar/gestionar/administar Psono utilitzo diferents sistemes físics i virtuals.
Les tasques administratives només es realitzen des d’un dispositiu físic separat i especialment protegit, que només es fa servir per aquestes tasques. Cada compte està protegit amb tokens de hardware.
Tots els sistemes es gestionen de manera centralitzada i hi ha polítiques de seguretat en vigor per garantir que tots compleixen els estàndards que trobaríeu habitualment als bancs.
Agraïments
Aquest article s’inspira fortament en l’article d’Anthony N. Simon sobre Panelbear.