Immer wenn ich sehe, dass Ingenieure über ihren Stack schreiben, bin ich neugierig, neue Werkzeuge kennenzulernen. Besonders wenn man Dinge alleine betreibt, ist man immer darauf aus, aus den Erfahrungen anderer zu lernen.
Im Jahr 2015 war ich frustriert über das damalige Niveau der Passwortmanager, insbesondere darüber, dass es nichts Vernünftiges für Leute gab, die private Server betreiben. Ich begann mit der Arbeit an Psono, einem Open-Source-Passwortmanager mit einem guten Verschlüsselungsniveau und sicheren Freigabeoptionen. Psono war nie als SaaS gedacht, sonst hätte ich wahrscheinlich von Anfang an Unterstützung für mehrere Mandanten eingebaut.
Damit du einen Überblick über den Umfang von Psono bekommst: Psono ist derzeit in etwa 70 Ländern lokal installiert, mit mehr als 4000 Installationen. Psono SaaS allein wird derzeit von über 15.000 Menschen genutzt, die meisten von ihnen verwenden unsere kostenlose Community-Edition von Psono, die auf dem gleichen Tech-Stack wie unser kostenpflichtiges Enterprise-Produkt läuft.
Der Stack einer typischen Psono-Installation besteht aus einer Datenbank, einem Server, zwei Webclients (einer für reguläre Benutzer und einer für Administratoren), Apps für iOS und Android, Browsererweiterungen für Chrome und Firefox. Ein Kunde kann zusätzlich ein LDAP-Gateway oder einen Dateiserver installieren.
Neben diesen Komponenten habe ich noch viele weitere Infrastrukturen im Einsatz. Angefangen bei der Website, die die Unternehmens-Homepage und die Produktseite betreibt, habe ich einen Lizenzserver für unser Enterprise-Produkt, ein zentrales ERP-System zur Verwaltung von Angeboten und Rechnungen, einen Shop, in dem man Psono SaaS kaufen und seine Installation verwalten kann, und einen Authentifizierungsdienst mit OIDC.
Im Laufe des Artikels wirst du sehen, dass ich alte und bewährte Technik bevorzuge.
Programmiersprachen
- Python: Der gesamte Backend-Code ist in Python geschrieben. Der größte Vorteil von Python ist sein reichhaltiges Ökosystem. Das Fehlen von Typen (was viele Leute als Nachteil betrachten) macht es extrem schnell, deinen Webdienst zu schreiben, was als Startup einer der Schlüsselaspekte ist, auf die du bei einer Programmiersprache achten solltest.
- Javascript: Oh nein... wer hätte das gedacht... Es ist einfach unmöglich, eine Website ohne Javascript zu erstellen, schon 2015 war das so. ;)
Python ist meine Lieblingssprache für Webdienste. (Ich lasse hier meine Gedanken darüber aus, warum nicht XY besser als Python ist. Das würde einen weiteren Blogartikel füllen.) Es gibt nur einen Nachteil, dem man begegnen muss, und das ist die Möglichkeit, Code mit allen Abhängigkeiten zuverlässig zu versenden, was besonders wichtig ist, wenn Leute deine Software lokal installieren und Unterstützung benötigen, wenn sie auf Probleme stoßen. (Geschwindigkeitstechnisch, was andere Leute hier vielleicht hinzufügen könnten, spielt keine Rolle. Python ist schnell genug).
Frameworks
- Django: "Es ist wie eine Superkraft für Einzelentwickler" (wenn ich hier Anthony N. Simons zitieren darf). Zusammen mit dem Ökosystem löst es fast alle Probleme, auf die du stoßen könntest. Authentifizierung, Templates, E-Mail, Datenbankmigrationen, TOTP... nur um einige zu nennen.
- Django Rest Framework: Es treibt derzeit alle APIs an und leistet großartige Arbeit. Die verschiedenen Ebenen (Serialisierung, Authentifizierung, Berechtigungen, Ansichten) halten deinen Code extrem sauber.
- React: Ich habe kürzlich den regulären Webclient auf React migriert. Der alte Webclient (denke daran, dass er 2015 gestartet wurde) war in AngularJS geschrieben, und es war ein ziemliches Unterfangen, die Rückwärtskompatibilität mit dem alten Client zu gewährleisten, z.B. sollten alle Pfade zum Benutzer unverändert bleiben, da sie möglicherweise Links zu Geheimnissen in ihrer Dokumentation gespeichert haben oder sogenannte Linkfreigaben verwenden. Außerdem nutzten die Leute benutzerdefinierte Branding mit eigenen Logos usw., bei denen sich die Pfade im System nicht ändern sollten.
- webpack: Ich wollte es hier erwähnen, da es derzeit der einzige Teil ist, mit dem ich unzufrieden bin. Es ist langsam, nervenaufreibend, schwer zu lernen... der einzige Vorteil ist, dass man nie stecken bleibt. Jedes Problem, das man möglicherweise hat, wurde bereits auf Stackoverflow gestellt, und man findet eine Lösung.
- Gatsby: Es treibt unsere statischen Websites für das Unternehmen und das Produkt an. In früheren Zeiten habe ich WordPress verwendet, aber der Verwaltungsaufwand mit Updates und die ständige Angst, dass die Website kompromittiert wird (und die potenziell negative Publicity), veranlassten uns, auf Gatsby umzusteigen. Bisher habe ich das nicht bereut.
- Vuepress: Das beste Dokumentationsverwaltungssystem, das ich finden konnte. Es kompiliert zu statischen Websites, sieht modern aus und treibt derzeit die Psono-Dokumentation an.
- Material UI: Die Hauptbibliothek, die das Frontend antreibt. Es ist funktionsreich, arbeitet gut mit React zusammen und sieht ziemlich modern aus, im Gegensatz zu älteren Bootstrap-basierten Themen.
Es gibt sicherlich viele andere, die hier erwähnt werden sollten, aber das sind die "wichtigsten" meiner Meinung nach.
Datenbanken
Obwohl Django mehrere Datenbanken unterstützt, stieß ich ziemlich früh auf die Frage, ob ich alle Django-Datenbanken oder nur eine bestimmte unterstützen möchte. Der Grund für diese Frage war, dass ich verschachtelte Baumstrukturen in der Datenbank speicherte. Also Bäume mit mehreren Wurzeln und gemeinsamen Ästen. Diese effizient abzufragen, war entscheidend, also entschied ich mich nach der Erkundung aller verfügbaren Optionen für die ltree-Erweiterung von Postgre.
Wenn du planst, etwas zu entwickeln und es alleine zu betreiben, muss es in der Cloud zuverlässig laufen, verwaltet vom Cloud-Anbieter. Du möchtest wahrscheinlich auch nicht an einen Anbieter gebunden sein, also nichts Cloud-spezifisches, was deine Auswahl ziemlich einschränkt.
Meine Entscheidung:
- Postgres: Es gibt zwei Open-Source-Datenbanken, aus denen du wählen kannst. MariaDB oder Postgres. Ich plante immer, Maria zu verwenden (hauptsächlich wegen Maria DB's Galera Cluster, eine dieser fehlgeleiteten "jungen Entwickler müssen für Hyperwachstum planen"-Geschichten ;D), aber aufgrund der fehlenden ltree-Erweiterungen waren mir die Hände gebunden. Heutzutage, mit all der Entwicklung, die in Postgres-Sharding-Optionen fließt, habe ich diese Entscheidung bisher nie bereut.
- Redis: Geplant als Cache für größere Installationen. Auch hier kannst du zwischen Redis oder Memcache wählen. Beide sind ausgezeichnet, aber hauptsächlich aufgrund des mittlerweile de facto Standards von Redis-Protokollen für das Caching habe ich mich für Redis entschieden. Der einzige Nachteil, den ich jemals mit Redis erlebt habe, ist, dass es Single-Threaded ist.
Infrastruktur
Ein kleiner Überblick über die Infrastruktur, auf die Psono angewiesen ist:
- Gitlab: Gitlab treibt die gesamte Automatisierung von Psono an. Bemerkenswert ist, dass alles in Psono automatisiert ist, was einer der Schlüsselaspekte dafür ist, wie ich Releases verwalten und das gesamte Psono-Ökosystem pflegen kann. Im Jahr 2015 lief jedes Open-Source-Projekt auf GitHub, aber Gitlab war (und ist immer noch) so mächtig und funktionell überlegen (mit Ausnahme der Suchfunktionalität von GitHub). Gitlab treibt Builds, Releases und Schwachstellenscans für JEDES Stück Software an, das wir verwenden.
- Cloudflare: Wahrscheinlich das innovativste Unternehmen, das ich in den letzten 10 Jahren kennengelernt habe und das mich beeinflusst hat. Es ist fair zu sagen, dass Cloudflare heutzutage das Internet antreibt. Es stellt mir zuverlässige Nameserver, TLS, ein anständiges CDN und erweiterte Funktionen wie ihren Edge-Worker zur Verfügung. Der DDoS-Schutz und die WAF-Funktionalität bieten ein gewisses Extra, das als Passwortmanager ziemlich wichtig ist. Ich würde gerne ihre SSL-as-a-Service-Funktion verwenden, um SaaS-Kunden zu ermöglichen, ihre eigenen Domains zu konfigurieren, aber die Paywall des Enterprise-Levels von Cloudflare ist einfach zu hoch. Ich hoffe immer noch, dass sie es irgendwann als unabhängiges Plugin veröffentlichen, das man kaufen kann.
- namecheap: Meine bevorzugte Lösung für Domains und SSL-Zertifikate.
- Google Cloud Run: Alle Backend-Server laufen auf Google Cloud Run, was extrem kostene
ffizient und zuverlässig ist, wenn du eine Flotte von Diensten starten möchtest. Sobald dein Stack läuft, macht es einen großartigen Job. Ihre erstklassige API-/CLI-Integration ist hier ein absolutes Plus. Es gibt einige Nachteile, wie den fehlenden Support von Google oder die Bedrohung, dass Google irgendwann entscheidet, dass es sich als drittgrößter Cloud-Service-Anbieter nicht lohnt, und sie das Produkt einstellen.
- Artifactory: Schützt meine Build-Pipeline vor npm-Ausfällen und speichert meine Build-Artefakte (die 2015 nicht in Gitlab gebündelt waren).
- Docker Hub: Speichert alle Docker-Container und führt einige zusätzliche Sicherheitsüberprüfungen und die Verteilung meiner Container durch.
- Mailgun: Handhabt alle E-Mails. Im Gegensatz zu den meisten E-Mail-Lösungsanbietern hat Mailgun anständige Protokollierungs- und Analysemöglichkeiten. Ihr Support ist erstklassig. Das einzige Problem ist, dass ihre E-Mails manchmal im Spam-Postfach landen (selbst mit SPF, DMARC usw.), aber abgesehen davon leisten sie großartige Arbeit.
- Poeditor: Handhabt alle Übersetzungen. Das Schöne ist, dass Mitwirkende Zugang anfordern können, was entscheidend ist, wenn du Externen helfen möchtest, dein Projekt zu übersetzen. Ihr Support ist fantastisch und du erhältst extrem schnelle Antworten.
- Docker: Eine der besten Entscheidungen für das gesamte Projekt. Besonders, da ich Python benutze und funktionierenden Python-Code mit allen Python-/OS-Bibliotheksabhängigkeiten zu versenden, ist schwierig. Wenn Dinge bei einem Kunden vor Ort laufen sollen und die Anforderung besteht, dass er das System aktualisieren und warten kann, ermöglicht Docker all dies und gibt mir die volle Kontrolle über die installierten Pakete, was mindestens 70 % aller Supportprobleme löst (während 20 % neue Probleme entstehen, da die Leute nicht an Docker gewöhnt sind ;D).
Monitoring
Dinge können schiefgehen, und du musst wissen, wann das passiert, und Einblicke in das Problem erhalten. Hier kommen diese Tools ins Spiel:
- Google Cloud logging: Wenn du auf Google bist, deine natürliche Lösung.
- Sentry: Meine Nummer eins für Fehlerberichte. Sobald du es ausprobierst, wirst du es nie mehr missen wollen. Es gibt mir die notwendigen Einblicke in alle Fehler.
- Uptimerobot: Ruft den Healthcheck meiner verschiedenen Dienste auf und benachrichtigt mich, wenn etwas ausfällt. Die öffentliche Statusseite für Psono findest du übrigens hier: https://stats.psono.com/, die nur einen kleinen Bruchteil der Dienste überwacht, die dieses System für mich überwacht, aber hoffentlich ein wenig die Zuverlässigkeit des Systems demonstriert.
Entwicklungsinfrastruktur
Ein kleiner Überblick darüber, wie mein lokaler Entwicklungsstack aussieht:
- Windows mit WSL: Ich werde wahrscheinlich viel Kritik dafür bekommen, aber ja, ich arbeite auf Windows. In den letzten Jahren hatte ich immer irgendwo eine Linux-VM, mit der ich mich für die Entwicklung verbunden habe, aber heutzutage läuft alles über WSL. Ich bekomme das Beste aus beiden Welten.
- Pycharm / Webstorm: Ich benutze Jetbrain IDEs. Die Remote-Entwicklungsfunktionalität ist entscheidend für meinen Entwicklungsworkflow und diese "Batterien inbegriffen"-Philosophie passt gut zu mir. Manchmal habe ich etwa 20 Projekte geöffnet, was eine anständige Hardware mit genügend RAM erfordert. VSCode scheint heutzutage eine gute Alternative zu sein, aber im Laufe der letzten Jahre habe ich mich an Jetbrains gewöhnt, und etwas Neues zu lernen, erfordert immer eine gewisse geistige Stärke, die ich derzeit nicht bereit bin, in dieses Thema zu investieren. Ich würde sagen, jeder sollte das verwenden, was er gewohnt ist.
Support
Es gibt natürlich bestimmte Tools, die erforderlich sind, um den Support für Benutzer des Produkts zu gewährleisten:
- Freshdesk: Eine typische E-Mail-Ticket-Software. Sie hilft mir, den Überblick über die verschiedenen Kundenanfragen zu behalten. In den frühen Zeiten bot sie ein anständiges kostenloses Tier, was besonders in der Gründungsphase entscheidend ist.
- Discord: Einige Leute bevorzugen möglicherweise Chat oder benötigen eine direktere Kommunikation/Hilfe. Hier kommt Discord ins Spiel.
Sonstiges
Es gibt bestimmte andere Tools, die ich erwähnen wollte, die für andere nützlich sein könnten. Insbesondere die Banken für Leute, die ihr Geschäft in Deutschland führen möchten:
- Odoo: Das beste ERP-System. Die Open-Source-Edition ist kostenlos und kann mit Python- und XML-Kenntnissen leicht erweitert werden. Ihre Anpassungs- und Integrationsmöglichkeiten mit benutzerdefinierten APIs sind erstklassig.
- Holvi: Unser Hauptbankkonto. In Deutschland benötigst du eine Bank, die dir ermöglicht, ein Gründerkonto einzurichten, also ein Bankkonto, das an eine noch nicht vollständig registrierte Firma gebunden ist, auf dem du das anfängliche Kapital überweisen kannst, das zur Registrierung der Firma erforderlich ist. Ein kleines Problem von "Was war zuerst, das Huhn oder das Ei". Und die großen Banken, die dies ermöglichen, kosten in der Regel ein Vermögen. Der Registrierungsprozess funktionierte auch ziemlich reibungslos. Der einzige Nachteil ist der fehlende Support für internationale Zahlungen, aber dafür ist der nächste Dienst praktisch.
- Wise: Unser zweites Bankkonto. Ihre Gebühren sind extrem niedrig (z.B. keine monatlichen Gebühren), der Einrichtungsprozess funktioniert reibungslos, sie sind gut vernetzt und ermöglichen internationale Banküberweisungen, und die Überweisungen werden schnell durchgeführt, sodass du nicht wochenlang warten musst.
Sicherheit
Ich denke, dies könnte ein separater Blogpost darüber sein, wie wir Benutzerkonten, Infrastruktur und Zugriffsrechte strukturiert haben. Da dies einer der entscheidendsten Aspekte der Sicherheit von Psono ist, werde ich hier nicht ins Detail gehen und versuchen, vage genug zu bleiben. Wir verwenden sowohl Google Cloud als auch Azure-Dienste. Beide mit völlig getrennten Benutzern und Gruppen. Es gibt Benutzer, die für Verwaltungstätigkeiten bestimmt sind, und Benutzerkonten für das "tägliche Geschäft". Es gibt verschiedene physische und virtuelle Systeme, die ich benutze, um Psono zuzugreifen/zu unterstützen/zu verwalten/zu administrieren. Verwaltungstätigkeiten werden nur auf einem separaten, speziell gehärteten physischen Gerät durchgeführt, das ausschließlich für diese Aufgaben verwendet wird. Jeder Account ist durch Hardware-Token geschützt. Alle Systeme werden zentral verwaltet, und es gibt Sicherheitsrichtlinien, die sicherstellen, dass alle Geräte die Sicherheitsstandards einhalten, die man normalerweise in Banken findet.
Credits
Dieser Artikel wurde stark inspiriert von Anthony N. Simons Artikel über Panelbear.