每当我看到工程师们写关于他们的技术栈时,我总是好奇地想学习新的工具。尤其是当你独自运营时,你总是希望能从别人的经验中学习到东西。
在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的文章 的大量启发。