每當我看到工程師們在寫他們的技術棧時,我總是好奇能學到新的工具。特別是當你一個人做事時,你總是在尋求從別人的經驗中學習。
2015 年,我對當時的密碼管理器感到沮喪,特別是沒有什麼合適的選擇給運行私有伺服器的人。我開始著手開發 Psono,一個開源的密碼管理器,它具有相當不錯的加密等級和安全的共享選項。Psono 從來不是打算作為 SaaS 運行的,否則我可能會一開始就支持多租戶。
給你一點 Psono 規模的概覽。目前 Psono 在大約 70 個國家被本地安裝,有超過 4000 次安裝。單單 Psono SaaS 現在就被超過 15,000 人使用,他們中的大多數人都在使用我們的 免費社區版 Psono,這與我們的付費企業產品運行在相同的技術棧上。
典型的 Psono 安裝包括一個數據庫、伺服器、兩個網絡客戶端(分別針對普通用戶和管理員)、iOS 和 Android 應用,以及 Chrome 和 Firefox 的瀏覽器擴展。客戶可以在此基礎上安裝一個 LDAP 閘道或文件伺服器。
除此之外,我有很多基礎設施。從推動公司主頁和產品頁面開始,我有一個企業產品的授權伺服器、一個處理報價單和發票的中央 ERP 系統、一家人們可以購買 Psono SaaS 並管理其安裝的商店,以及一個擁有 OIDC 的身份驗證服務。
整篇文章中你會看到我偏好於老舊但穩定的技術。
語言
- Python:所有後端代碼都是用 Python 編寫的。Python 的最大優勢在於其豐富的生態系統。缺乏類型(很多人認為這是一個缺點)讓你能極快地寫出你的網絡服務,這對於初創公司而言是需要在編程語言中尋找的關鍵方面之一。
- Javascript:哦不...誰會想到...反正 2015 年已經不可能不使用 Javascript 建立任何網站了。;)
Python 是我做網絡服務最喜歡的語言。(我在這裡不會細談為什麼其他 XY 語言不如 Python。那會成為另一篇博文。)有一個缺點是你必須應對的,那就是能夠可靠地發布所有依賴項的代碼,這對於本地安裝你的軟件並在遇到問題時向你尋求支持的人尤其關鍵。(關於速度方面,其他人可能會在這裡添加意見,但速度其實不重要。Python 已經夠快了。)
框架
- Django:"對一個獨立開發者來說,它就像一種超能力"(容我引用 Athony N. Simons)。和它的生態系統結合在一起,它幾乎解決了你可能遇到的所有問題。認證、模板、電子郵件、數據庫遷移、totp...等等。
- Django Rest Framework:它目前提供所有的 API 並且做得非常好。不同的層(序列化、認證、權限、視圖)讓你的代碼保持極其乾淨。
- React:我最近剛把普通網絡客戶端遷移到 React。舊的網絡客戶端(請記住,它最早開始於 2015 年)是用 AngularJS 編寫的,為了保持向後兼容,努力不小,例如所有通向用戶的路徑不應該改變,因為他們可能在文檔中書籤鏈接到秘密或在使用所謂的鏈接共享。此外,人們使用自定義的商標註冊,包括自己的徽標等等,所以系統上的路徑不應該改變。
- webpack:我想在這裡提及它,因為它目前是我唯一不滿意的部分。它慢,讓人頭疼,難以學習...唯一的好處是你永遠不會被困住。你可能遇到的任何問題都已經在 Stackoverflow 上有人問過,你可以找到解決方案。
- Gatsby:為公司和產品提供靜態網站。在早些時候,我使用的是 Wordpress,但由於更新的管理開銷以及網站可能被入侵的持續恐懼(以及潛在的負面宣傳),讓我們轉而使用 Gatsby。至今從未後悔。
- Vuepress:我能找到的最合適的文檔管理系統。它編譯成靜態網站,看起來現代,目前推動着 Psono 的文檔。
- Material UI:推動前端的主要庫。功能豐富,與 React 完美配合,對比舊的基於 Bootstrap 的主題,看起來相當現代。
當然還有其他無數值得在此提及的,但這些是根據我個人意見"最重要"的那些。
數據庫
即 Django 支持多數據庫,我很早就碰到要支持 Django 的所有數據庫或僅支持某個數據庫的問題。這個問題的根源在於我在數據庫中存儲嵌套的樹結構。所以是有多個根和共享分支的樹。有效地查詢這些是至關重要的,所以在探索了所有可用選項之後,我決定使用 Postgre 的 ltree 擴展。
如果你計劃開發任何東西並希望獨立運行它,那麼它需要在雲端可靠運行,由雲提供商管理。你很可能也不希望被廠商鎖定,所以沒有雲特定的東西,這樣你的選擇就非常受限。
我的決定:
- Postgres:你可以選擇的兩個開源數據庫是 MariaDB 或 Postgres。起初我總是打算使用 Maria(主要是因為 Maria DB 的 Galera Cluster,這種受到"年輕開發者需要計劃超高速增長"故事誤導的想法 ;D),但由於缺少 ltree 擴展讓我不得不做其他選擇。如今,即便是 Postgres 分庫選項的所有開發,我從未後悔過這個選擇。
- Redis:計劃用作大安裝的緩存。在這裡你也可以選擇 Redis 或 Memchache。兩者都是優秀的選擇,但主要是由於如今 Redis 協議已經成為緩存的事實標準,所以我選擇了 Redis。我唯一遇到的困擾是它是單線程的。
基礎設施
僅僅是一個 Psono 依賴的基礎設施小概覽:
- Gitlab:Gitlab 支持 Psono 的所有自動化。值得注意的是,Psono 的每一部分都是自動化的,這是我能夠管理發布和維護整個 Psono 生態系統的關鍵之一。2015 年時,每個開源項目都在 Github 上運行,但 Gitlab 是(而且仍然是)如此強大,功能上也居於上風(除了 Github 的搜索功能)。Gitlab 提供構建、版本發布、我們使用的每一個軟件的漏洞掃描。
- Cloudflare:可能是我在過去十年中知道的最有創新力的公司。可以公平地說,Cloudflare 如今正在驅動互聯網。它為我提供了可靠的名稱伺服器,TLS,一個不錯的 CDN,以及如其邊緣計算者這樣的高級功能。DDoS 保護和 WAF 功能額外提供了一定的價值,對於密碼管理器這一點相當重要。我想使用他們的 SSL 服務讓 SaaS 客戶配置自己的域名,但 Cloudflare 的企業級價格門檻太高。我仍然希望他們能將其作為一個獨立插件發布,讓人們可以購買。
- namecheap:我用於域名和 SSL 證書的首選解決方案。
- Google Cloud Run:所有後端伺服器都運行在 Google Cloud Run 上,這在需要生成服務艦隊時是極其經濟和可靠的。一旦你的技術棧運行起來,就會表現很好。這裡有最頂尖的 API/CLI 集成,是一大加分。這裡有幾個不利之處,比如來自 Google 缺少支持,或者可能 Google 會在某個時候決定作為雲服務提供商的第三位不值得而取消產品。
- Artifactory:保護我的構建管道免受 npm 中斷,並存儲我的構建工件(在 2015 年這不包括在 Gitlab 中)。
- Docker Hub:存儲所有的 Docker 容器,進行一些附加的安全掃描,並分發我的容器。
- Mailgun:處理所有郵件。與大多數電子郵件解決方案提供商相比,Mailgun 有可靠的日誌和分析功能。他們的支持是一流的。唯一的問題是他們的電子郵件有時會被發送到垃圾郵件收件箱(即便 SPF, DMARC 等都設置妥當),但除此之外,他們做得很好。
- Poeditor:處理所有翻譯。好處是貢獻者可以申請訪問權限,如果你希望外部人員幫忙翻譯您的項目,這是至關重要的。他們的支持很棒,你會得到非常快速的回應。
- Docker:對於整個項目來說,這是最佳的決策之一。特別是當我使用 Python 時,想要將工作的 Python 代碼與所有 Python/OS 庫依賴項一同發布是很困難的。如果事情應該在客戶的內部運行並且要求他們能夠更新和維護系統,Docker 使我們能夠做到這一切,並給予我對已安裝包的完全控制,這解決了至少 70%的所有支持問題(同時引入 20%的新問題,因為人們不熟悉 Docker ;D)。
監控
所以事情可能出錯,你需要知道什麼時候發生並得到一些對問題的洞察。這就是這些工具大顯身手的地方:
開發基礎設施
一個簡短的介紹,我的本地開發堆疊看上去是怎樣的:
- Windows with WSL:我可能會因此受到很多批評,但是的,我是運行在 Windows 上。過去幾年,我一直在某個地方有一個 Linux VM,會連接到該 VM 進行開發,但如今,它由 WSL 驅動。我得到了兩個世界中最好的一面。
- Pycharm / Webstorm:我使用 Jetbrains 的 IDE。遠程開發功能對我的開發工作流程至關重要,並且這個"內置功能"策略適合我。有時我會打開大約 20 個項目,這需要一台有足夠 RAM 的像樣硬件。VSCode 看起來是個不錯的替代品,但在過去幾年裡我習慣了 Jetbrains,要學習新東西總是需要一些我目前不願意投入到這方面的精神力量。我會說每個人都應該使用自己習慣的東西。
支援
有些工具當然是必要的,用於處理使用產品的人們的支援:
- Freshdesk:一個典型的電子郵件票務軟件。它幫助我記錄各種客戶的請求。在早期,它提供了不錯的免費層,這對於創始階段至關重要。
- Discord:有些人可能更喜歡聊天或者需要更直接的對話/幫助。這就是 Discord 大顯身手的地方。
其他
有一些其他工具我想提到,可能對其他人有幫助。特別是對於想在德國運營業務的人們的銀行:
- Odoo:最好的 ERP 系統。其開源版是免費的,可以通過一些 Python 和 XML 知識輕鬆擴展。它的定制和與自定義 API 的集成選項是一流的。
- Holvi:我們的主要銀行賬戶。在德國,你需要擁有一個銀行允許你設立創始賬戶,德語為 "Gründerkonto" ,它是與尚未完全註冊的公司綁定的銀行賬戶,你可以在其中轉移註冊公司所需的初始資金。這有點雞蛋問題。而允許這一點的主要銀行通常會花費你一條腿和一隻膀臂。注冊過程也很順利。唯一的缺點是缺乏對國際支付的支持,而這就是下一個服務派上用場的地方。
- Wise:我們的第二個銀行賬戶。他們的費用非常低(例如,沒有每月費用),設置過程也很順利,他們聯系好,允許國際銀行轉賬,而且轉賬非常快,所以你不必等待數週或更久。
安全
我想這可以是另一篇博文,講述我們如何結構用戶賬戶、基礎設施、訪問權限。由於這是對 Psono 安全性最為關鍵的方面之一,我不打算深入詳細探討,而是嘗試保持足夠的模糊。我們使用的是 Google Cloud 和 Azure 服務。這兩者的用戶和群組完全分開。專門有用戶用於管理任務,還有用戶賬戶用於日常工作。我使用不同的物理和虛擬系統來訪問/支持/管理/管理 Psono。管理任務僅在一個獨立的,特別加固的實 physical 設備上進行,該設備專門用於這些任務。每個賬戶都用硬件令牌保護。所有系統都集中管理,而且有安全策略保證所有設備遵循銀行通常會採取的安全標準。
致謝
這篇文章受到 Anthony N. Simon 關於 Panelbear 的文章 的啟發。