每当我看到工程师们写关于他们的技术栈时,我总是好奇地想学习新的工具。尤其是当你独自运营时,你总是希望能从别人的经验中学习到东西。
在 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 的最大优点是其丰富的生态系统。缺乏类型(很多人认为这是一个缺点)使得编写 Web 服务非常快,这在创业初期是选择编程语言时需要关注的关键方面之一。
- Javascript:哦不...这谁能想到呢...在 2015 年,要创建任何网站几乎是不可能没有 Javascript 的。;)
Python 是我为 Web 服务最喜欢的编程语言。(我这里只是略去我为什么不选 XY 的想法,那会填满另外一篇博客文章。)唯一需要应对的缺点是将代码与所有依赖项一起可靠发货的可能性,特别是当人们在本地安装你的软件并在遇到问题时寻求支持时。(速度方面,其他人可能会加入讨论但实际上并不重要。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 集群,这些误导的“年轻开发者需要计划超高速增长”的故事之一 ;D),但由于缺少 ltree 扩展,我不得已选择了 Postgres。如今,随着 Postgres 分片选项的开发,我从未后悔过这个决定。
- Redis:计划用作大型安装的缓存。这里你可以选择 Redis 或 Memcache。两者都非常出色,但由于 Redis 协议如今是缓存的事实标准,所以我选择了 Redis。我唯一遇到的缺点是 Redis 是单线程的。
基础设施
Psono 依赖的基础设施简要概述:
- Gitlab:Gitlab 为 Psono 提供所有自动化支持。值得一提的是,Psono 的一切都是自动化的,这是我能够管理发布和维护整个 Psono 生态系统的关键方面之一。2015 年,每个开源项目都在 GitHub 上运行,但 Gitlab 当时(现在依然如此)功能强大且优势明显(除了 GitHub 的搜索功能外)。Gitlab 驱动构建、发布、每个我们使用的软件的漏洞扫描。
- Cloudflare:可能是过去 10 年中对我影响最大、最具创新能力的公司。可以肯定地说,Cloudflare 如今正在支撑互联网。它为我提供了可靠的域名服务器、TLS、出色的 CDN 和高级功能如其边缘工作器。DDoS 保护和 WAF 功能提供了额外的安全性,作为密码管理器非常重要。我很想使用他们的 SSL 服务来允许 SaaS 用户配置自己的域名,但 Cloudflare 企业级的付费墙实在太高。我仍然希望他们能将其作为独立插件发布供人们购买。
- namecheap:我选择的域名和 SSL 证书解决方案。
- Google Cloud Run:所有后端服务器都运行在 Google Cloud Run 上,这在需要生成一系列服务时非常经济高效且可靠。一旦你的栈运行起来,它的表现非常出色。顶级的 API/CLI 集成在这里是一大优点。有几个缺点,比如谷歌的支持不足,或谷歌可能在某个时候决定作为第三大云服务提供商并不值得并取消该产品。
- Artifactory:保护我的构建流水线免于 npm 中断,并存储我的构建工件(2015 年 Gitlab 中没有捆绑这个功能)。
- Docker Hub:存储所有 Docker 容器,进行一些额外的安全扫描和容器分发。
- Mailgun:处理所有电子邮件。与大多数电子邮件解决方案提供商相比,Mailgun 拥有出色的日志记录和分析功能。他们的支持也非常出色。唯一的问题是他们的邮件有时会被发送到垃圾邮件箱(即使 SPF、DMARC 等都已到位),但除此之外,他们的表现非常出色。
- Poeditor:处理所有翻译。有趣的是,贡献者可以请求访问权限,这对于希望外部人士帮助翻译项目非常关键。他们的支持很棒,回复也非常及时。
- Docker:整个项目做出的最佳决策之一。尤其是我使用 Python,并且将 Python 代码以及所有 Python/操作系统库依赖项一起发货非常困难。如果事情应该在客户端本地运行,并且要求客户能够更新和维护系统。Docker 允许我们做到这一点,并让我完全控制已安装的软件包,从而解决了至少 70%的支持问题(虽然引入了 20%的新问题,因为人们不习惯 Docker ;D)。
监控
事情可能会出错,你需要知道何时发生并获得一些关于问题的见解。这些工具派上用场:
开发基础设施
简要概述我的本地开发栈:
- Windows with WSL:我可能会因为这个受到很多批评,但没错,我在 Windows 上运行。在过去的几年里,我总是有一个 Linux 虚拟机进行开发,但现在,它由 WSL 支持。我从两个世界中获取了优势。
- Pycharm / Webstorm:我使用 Jetbrains 的 IDE。远程开发功能对我来说至关重要,这种“电池全包”的理念非常适合我。有时候我会打开大约 20 个项目,这需要足够的硬件和内存。VSCode 似乎是一个不错的替代品,但在过去几年里,我习惯了 Jetbrains,学习新东西总是需要一些精神力量,而我目前不愿在这方面投资。我认为每个人都应该使用他习惯的东西。
支持
当然,需要处理使用该产品的人的支持请求的工具:
- Freshdesk:典型的电子邮件票务软件。它帮助我跟踪各种客户请求。早期,提供了一个体面的免费层,这在初创阶段尤其重要。
- Discord:有些人可能更喜欢聊天或需要更直接的交流/帮助。那就是 Discord 派上用场的地方。
其他
还有一些其他工具,我想提及一下,可能对其他人有帮助。特别是那些打算在德国运营业务的人:
- Odoo:最好的 ERP 系统。它的开源版本是免费的,并且可以通过一些 Python 和 XML 知识轻松扩展。其定制和与自定义 API 集成的选项非常出色。
- Holvi:我们的主要银行账户。在德国,你需要一个允许你设置“创始人账户”的银行帐户,用德语说“Gründerkonto”,即与尚未完全注册的公司关联的银行账户,并可以转移注册公司所需的初始资金。这个问题有点像鸡蛋问题。通常允许的银行费用高昂。注册过程也非常顺利。唯一的缺点是缺乏国际支付支持,而下面的服务就派上用场了。
- Wise:我们的第二个银行账户。他们的费用非常低(例如,没有月费),设置过程顺利,他们关系良好,允许国际银行转账,转账迅速,所以你不必等待几周或类似的时间。
安全
我猜这可以成为一篇关于我们如何构建用户账户、基础设施、访问权限的单独博客文章。由于这是 Psono 安全性最关键的方面之一,我在这里不会详细介绍,尝试尽可能模糊。我们使用 Google Cloud 和 Azure 服务。两者的用户和组是完全分开的。我们有专门用于管理任务的用户和“日常操作”用户账户。有不同的物理和虚拟系统,我用来访问/支持/管理/管理 Psono。管理任务仅在特定的、特别强化的物理设备上进行,这些设备专门用于这些任务。每个账户都有硬件令牌保护。所有系统都被集中管理,并有安全策略以确保所有设备遵循你通常在银行中发现的安全标准。
致谢
本文受到 Anthony N. Simon 关于 Panelbear 的文章 的大量启发。