Kiedy widzę inżynierów piszących o swojej technologii, zawsze jestem ciekawy, aby poznać nowe narzędzia. Zwłaszcza gdy prowadzisz wszystko samodzielnie, zawsze szukasz, aby uczyć się z doświadczeń innych.
W 2015 roku byłem sfrustrowany obecnym poziomem menedżerów haseł, zwłaszcza że nie było nic sensownego dla osób prowadzących prywatne serwery. Zacząłem pracować nad Psono, menedżerem haseł open source z odpowiednim poziomem szyfrowania i bezpiecznymi opcjami udostępniania. Psono nigdy nie miało być prowadzone jako SaaS, w przeciwnym razie prawdopodobnie od początku wprowadziłbym wsparcie dla wielu najemców.
Aby dać wam nieco ogólny zarys skali Psono: obecnie Psono jest zainstalowane lokalnie w około 70 krajach, z ponad 4000 instalacji. Samo Psono SaaS jest obecnie używane przez ponad 15,000 osób, większość z nich korzysta z naszej darmowej edycji społecznościowej Psono, która działa na tej samej technologii co nasz płatny produkt Enterprise.
Stos typowej instalacji Psono składa się z bazy danych, serwera, dwóch klientów www (jednego dla zwykłych użytkowników i jednego dla administratorów), aplikacji dla iOS i Android, rozszerzeń przeglądarek dla Chrome i Firefox. Klient może zainstalować bramę LDAP lub serwer plików na wierzchu tego.
Oprócz tego mam również wiele więcej infrastruktury. Począwszy od strony internetowej do zasilania strony głównej firmy i strony produktu, mam serwer licencyjny dla naszego produktu enterprise, centralny system ERP do obsługi ofert i faktur, sklep, gdzie ludzie mogą kupić Psono SaaS i zarządzać swoją instalacją oraz usługę uwierzytelniania z OIDC.
W trakcie artykułu zobaczycie, że preferuję starą i nudną technologię.
Języki programowania
- Python: Cały kod backendu jest napisany w Pythonie. Największą zaletą Pythona jest jego bogaty ekosystem. Brak typów (wielu ludzi uważa to za wadę) sprawia, że pisanie usługi sieciowej jest niezwykle szybkie, co jako startup jest jednym z kluczowych aspektów, na które powinieneś zwracać uwagę przy wyborze języka programowania.
- Javascript: Och nie... kto by pomyślał... Po prostu niemożliwe jest stworzenie jakiejkolwiek strony internetowej bez Javascript, już w 2015 roku. ;)
Python jest moim ulubionym językiem do usług sieciowych. (Pomijam moje myśli, dlaczego nie XY jest lepszy od Pythona. To by wypełniło inny artykuł na blogu.) Jest tylko jedna wada, z którą musisz sobie poradzić, a mianowicie możliwe jest dostarczanie kodu ze wszystkimi niezawodnymi zależnościami, co jest szczególnie kluczowe, jeśli ludzie instalują twoje oprogramowanie lokalnie i proszą o wsparcie, jeśli napotkają problemy. (W kwestii prędkości, którą inni mogą dodać tutaj, nie ma znaczenia. Python jest wystarczająco szybki).
Frameworki
- Django: "To jak supermoc dla solo deweloperów" (jeśli mogę tu zacytować Athony N. Simonsa). Razem z ekosystemem rozwiązuje prawie wszystkie problemy, które mogą się pojawić. Uwierzytelnianie, szablony, e-mail, migracje bazy danych, totp,... tylko kilka z nich.
- Django Rest Framework: Obecnie zasila wszystkie API i super się sprawdza. Różne warstwy (serializacja, uwierzytelnianie, uprawnienia, widoki) utrzymują twój kod wyjątkowo czysty.
- React: Niedawno przeniosłem standardowego klienta webowego na React. Stary klient webowy (proszę pamiętać, że został rozpoczęty w 2015 roku) był napisany w AngularJS i było to dość dużą przygodą, aby zachować kompatybilność wsteczną z starym klientem, np. wszystkie ścieżki do użytkownika nie powinny się zmieniać, ponieważ mogą mieć zakładki z linkami do tajemnic w swojej dokumentacji lub używają tzw. udostępniania linków. Również ludzie używali niestandardowego brandingu z własnymi logo i tak dalej, gdzie ścieżki w systemie nie powinny się zmieniać.
- webpack: Chciałem to tutaj wspomnieć, ponieważ obecnie jest to jedyna część, z której jestem niezadowolony. Jest wolny, irytujący, trudny do nauki... jedyną zaletą, jaką posiadasz, jest fakt, że nigdy nie utkniesz. Każdy problem, który możesz napotkać, został już zadany na Stackoverflow i znajdziesz rozwiązanie.
- Gatsby: Zasila nasze statyczne strony internetowe dla firmy i produktu. Wcześniej używałem Wordpressa, ale z powodu nadmiernego zarządzania aktualizacjami i ciągłego strachu przed atakiem na stronę (i potencjalną negatywną opinią) przeszliśmy na Gatsby. Jak dotąd nigdy nie patrzyłem wstecz.
- Vuepress: Najbardziej sensowny system zarządzania dokumentacją, który mogłem znaleźć. Komplikuje się do statycznych stron internetowych, wygląda nowocześnie i obecnie zasila dokumentację Psono
- Material UI: Główna biblioteka zasilająca frontend. Jest bogata w funkcje, dobrze współpracuje z Reactem i wygląda całkiem nowocześnie, w przeciwieństwie do starszych tematów opartych na Bootstrap.
Z pewnością istnieje wiele innych, które zasługiwałyby na wspomnienie tutaj, ale według mojej opinii to te są "najważniejsze".
Bazy Danych
Mimo że Django obsługuje wiele baz danych, dość wcześnie napotkałem pytanie, czy chcę wspierać wszystkie bazy danych Django, czy tylko jedną konkretną. Korzeniem tego pytania był fakt, że przechowywałem zagnieżdżone struktury drzew w bazie danych. Tak więc drzewa z wieloma korzeniami i współdzielonymi gałęziami. Efektywne zapytania do nich były kluczowe, więc po zbadaniu wszystkich dostępnych opcji zdecydowałem się na rozszerzenie ltree Postgre.
Jeśli planujesz rozwijać cokolwiek i prowadzić to solo, musi to działać niezawodnie w chmurze, zarządzane przez dostawcę chmury. Najprawdopodobniej również nie chcesz być uzależniony od dostawcy, więc nic specyficznego dla chmury, co dość mocno ogranicza twoje opcje.
Moja decyzja:
- Postgres: Są dwie otwarte bazy danych, z których możesz wybierać. MariaDB albo Postgres. Zawsze planowałem iść z Marią (głównie z powodu klastra Galera Maria DB, jednej z tych błędnie "młodych deweloperów musi planować hiperwzrost" historii ;D) lecz brak rozszerzeń ltree zmusił mnie. Obecnie z całą rozwijającą się w Postgres opcją sharding, nigdy nie żałowałem tej decyzji.
- Redis: Planowany jako pamięć podręczna dla większych instalacji. Tutaj również możesz wybrać Redis albo Memcache. Oba są doskonałe, ale głównie z powodu tego, że protokół Redis jest obecnie de facto standardem dla pamięci podręcznej, zdecydowałem się na Redis. Jedyną wadą, jaką kiedykolwiek doświadczyłem z Redis, jest to, że jest jednowątkowy.
Infrastruktura
Krótki przegląd infrastruktury, na której opiera się Psono:
- Gitlab: Gitlab zasila całą automatykę Psono. Warto zauważyć, że wszystko w Psono jest zautomatyzowane, co jest jednym z kluczowych aspektów, jak mogę zarządzać uwalnianiem i utrzymać cały ekosystem Psono. W 2015 roku każdy projekt open source działał na github, ale Gitlab był (i nadal jest) tak potężny i przewyższa funkcjonalnie (z wyjątkiem wyszukiwania na github). Gitlab zasila kompilacje, wersje, skanuje podatność KAŻDEGO używanego oprogramowania.
- Cloudflare: Prawdopodobnie najbardziej innowacyjna firma, jaką znam, która na mnie wpłynęła przez ostatnie 10 lat. Uczciwie można powiedzieć, że Cloudflare obecnie zasila internet. Zapewnia mi niezawodne serwery nazw, TLS, przyzwoitą CDN i zaawansowane funkcje, takie jak ich edge worker. Ochrona przed DDoS i funkcjonalność WAF dodają pewnej dodatkowej wartości, która jako menedżer haseł jest dość ważna. Chciałbym skorzystać z ich usługi SSL, aby umożliwić klientom SaaS konfigurowanie własnych domen, lecz zapora Cloudflare na poziomie Enterprise jest po prostu zbyt trudna. Nadal mam nadzieję, że uwolnią to gdzieś jako niezależną wtyczkę, którą można kupić.
- namecheap: Moje ulubione rozwiązanie dla domen i certyfikatów SSL.
- Google Cloud Run: Wszystkie serwery backendowe działają na Google Cloud Run, które jest niezwykle opłacalne i niezawodne, gdy chcesz wykorzystywać flotę usług. Kiedy masz już działającą technologię, robi świetną robotę. Ich integracja API / cli jest absolutnym plusem. Istnieją pewne wady, takie jak brak wsparcia od Google lub groźba, że Google może zdecydować, że bycie numerem 3 jako dostawca usług w chmurze może nie być warte i anulują produkt.
- Artifactory: Chroni moją linię produkcyjną przed awariami npm i przechowuje moje artefakty budowy (które nie były bundlowane w Gitlab w 2015)
- Docker Hub: Przechowuje wszystkie kontenery dockera i wykonuje dodatkowe skanowanie zabezpieczeń i dystrybucję moich kontenerów.
- Mailgun: Obsługuje wszystkie e-maile. W przeciwieństwie do większości dostawców rozwiązań e-mail, Mailgun ma przyzwoitą funkcjonalność rejestrowania i analizy. Ich wsparcie jest najnowocześniejsze. Jedynym problemem jest to, że czasami ich e-maile trafiają do skrzynki spamowej (nawet z SPF, DMARC i innymi ustawionymi), ale poza tym robią świetną robotę.
- Poeditor: Obsługuje wszystkie tłumaczenia. Miłe jest to, że współpracownicy mogą żądać dostępu, co jest kluczowe, jeśli chcesz, aby osoby zewnętrzne pomogły w tłumaczeniu Twojego projektu. Ich wsparcie jest doskonałe i odpowiedzi są bardzo szybkie.
- Docker: Jedna z najlepszych decyzji dla całego projektu. Zwłaszcza że używam Pythona i wysyłanie działającego kodu Pythona ze wszystkimi zależnościami biblioteki Pythona / OS jest trudne. Jeśli coś ma działać z klientem na miejscu i wymagane jest, aby mógł on aktualizować i zarządzać systemem. Docker pozwala nam na to wszystko i daje mi pełną kontrolę nad zainstalowanymi pakietami, co rozwiązuje co najmniej 70% wszystkich problemów wsparcia (wprowadzając 20% nowych problemów, ponieważ ludzie nie są przyzwyczajeni do Dockera ;D).
Monitoring
Rzeczy mogą się nie udać i musisz wiedzieć, kiedy to się dzieje i uzyskać pewne wglądy w problem. Tu wchodzą w grę te narzędzia:
- Google Cloud logging: Jeśli jesteś na Google, naturalnym rozwiązaniem
- Sentry: Moje numer jeden rozwiązanie do raportowania błędów. Po wypróbowaniu go nigdy nie będziesz chciał z niego zrezygnować. Daje mi niezbędny wgląd w wszystkie błędy.
- Uptimerobot: Wywołuje kontrolę zdrowia moich różnych usług i powiadomi mnie, jeśli coś się zawiesi. Publiczna strona statusowa Psono można znaleźć tutaj https://stats.psono.com/, co jest tylko małą częścią usług, które to monitoruje dla mnie, ale mam nadzieję, że pokazuje trochę niezawodność systemu.
Infrastruktura rozwojowa
Mały przegląd tego, jak wygląda mój lokalny stos rozwojowy:
- Windows with WSL: Prawdopodobnie dostanę dużo hejtu za to, ale tak, pracuję na Windows. W przeszłości zawsze miałem gdzieś maszynę wirtualną Linux, do której się łączyłem w celu programowania, ale obecnie wszystko jest obsługiwane przez WSL. Mam najlepsze z obu światów.
- Pycharm / Webstorm: Używam IDE Jetbrain. Funkcjonalność zdalnego programowania jest kluczowa dla mojego workflow i ta filozofia "baterie w zestawie" bardzo mi odpowiada. Czasami mam otwartych około 20 projektów, co wymaga porządnego sprzętu z wystarczającą ilością RAM. VSCode wydaje się być nową dobrą alternatywą, lecz na przestrzeni ostatnich kilku lat przyzwyczaiłem się do Jetbrains i nauka czegoś nowego zawsze wymaga pewnej siły mentalnej, której obecnie nie jestem gotów inwestować. Chciałbym, żeby każdy używał czegoś, z czego jest przyzwyczajony.
Wsparcie
Istnieją pewne narzędzia, które są oczywiście wymagane do obsługi wsparcia użytkowników korzystających z produktu:
- Freshdesk: Typowe oprogramowanie e-mail ticket. Pomaga mi śledzić różne zgłoszenia klientów. W wcześniejszych czasach oferowało przyzwoity darmowy poziom, co zwłaszcza na etapie zakładania firmy było kluczowe.
- Discord: Niektórzy ludzie mogą preferować czat lub wymagać bardziej bezpośredniej rozmowy / pomocy. Tutaj przydaje się discord.
Inne
Istnieją pewne inne narzędzia, które chciałem wspomnieć, które mogą być pomocne dla innych. Zwłaszcza banki dla osób, które chcą prowadzić swoją działalność w Niemczech:
- Odoo: Najlepszy system ERP. Jego edycja open source jest darmowa i można ją łatwo rozszerzać przy pomocy Pythona i trochę wiedzy z zakresu XML. Jego opcje personalizacji i integracji z niestandardowymi API są najwyższej klasy.
- Holvi: Nasze główne konto bankowe. W Niemczech potrzebujesz banku, który pozwoli założyć Konto Założycielskie, w języku niemieckim "Gründerkonto", więc konto bankowe, które jest powiązane z firmą, która nie jest jeszcze całkowicie zarejestrowana i gdzie można przelać początkowe środki wymagane do rejestracji firmy. Trochę kurczakowe problem. A duże banki, które to umożliwiają, zwykle kosztują fortunę. Proces rejestracji również przebiegał dość bezproblemowo. Jedyną wadą jest brak wsparcia dla międzynarodowych płatności, ale tutaj przydaje się następna usługa.
- Wise: Nasze drugie konto bankowe. Ich opłaty są niezwykle niskie (np. brak miesięcznych opłat), proces setup działa bezproblemowo, są dobrze skomunikowani i pozwalają na międzynarodowe