更新于2021年:Docker Django和Intercooler是构建SaaS的必备之选

2021-01-31 07:14:20

本文已更新。它以前的日期是2020年。变化很小,但我在需要的地方注明。

我最近发表了一些关于Django是应用程序很好框架的想法。这篇文章对此进行了扩展,以涵盖从开发到生产环境的其他基础架构。

我已经使用此堆栈(或看起来很像它的堆栈)在2018年,2019年,2020年以及现在的2021年构建小型SaaS应用程序。

Linux服务器/ VM托管在任何地方(我喜欢Azure,Digital Ocean或Scaleway)(编辑:2021年-正在将所有内容转移到Hetzner的专用服务器的过程中。)

Intercoolerjs用于轻松,流畅地完成类似于Ajax的前端工作(编辑:2021年– Intercooler的创建者发布了HTMX,它是IntercoolerJS的后继者。)

用于CI / CD的Bitbucket管道(编辑:2021年-我不再为个人项目而烦恼CI / CD。它使用过多的工具毫无益处)

对于较小的项目,我在docker容器中本地运行测试,然后直接推送到生产环境中。我不必担心完整的CI / CD,因为我不需要这一切的复杂性。也就是说,我确实喜欢Bitbucket Pipelines。

您的东西需要一个家(是的,即使在无服务器的世界中,大声笑)。我个人的偏好是Azure,Digital Ocean(会员链接)或Scaleway。他们每个人都提供足够的计算,网络选项,存储和基本服务,以构建概念验证或您可能需要的任何东西。

这里另一个值得一提的是赫兹纳。他们提供了高质量的硬件,服务和价格。

对于那些附带项目和许多企业应用程序,规模不是问题。这意味着我将不会同时服务于成千上万的用户或处理数TB的数据。因此,我可以使用较小的产品-通常在$ 20 /月以下。甚至Azure(三个中最昂贵的)也提供了可爆发的VM。通常,我喜欢使用Scaleway的Developer系列服务器。

注意,我的堆栈中缺少Kubernetes吗?如果规模不成问题,那么您就不需要Kubernetes。

我不依赖操作系统供应商(Ubuntu)来确保在新VM上运行最新的Docker。因此,我使用了不错的小弯度技术。

这种可固化的单线将为您的机器运行提供最佳和最新版本。

自从我发现Traefik以来,它就是上帝的礼物。 Nginx很棒,但是它不是为Docker Universe构建的。 Traefik具有两项杀手级功能,为我节省了数小时的时间:

使用LetsEncrypt的自动TLS。从字面上看,一劳永逸。使用正确的API密钥和DNS提供商,您还可以使用DNS进行验证。

使用docker标签的自动不重载配置。当您启动新服务时,Traefik将自动接受更改,因为它侦听所有与Docker相关的事件。这使得根据需要添加,删除或合并服务变得异常便利,而没有任何麻烦。

我对Traefik的唯一评论是学习曲线有些许。您必须决定如何配置它(配置文件,命令行选项,yaml或docker标签,或组合使用!)

经过反复尝试,PostgreSQL从未让我失望。我通常将这些容器之一附加到需要它的项目上,而不会遇到任何困难。我只是旋转容器,绑定端口,然后将数据卷绑定到主机磁盘。完成并完成。

版本:' 3.1'服务:db:容器名称:postgres主机名:postgres图像:postgres:11重新启动:始终环境:POSTGRES_PASSWORD:secretsonly卷:-./data:/var/lib/postgresql/数据端口:-5432:5432网络:-网络网络:网络:外部:真

Docker可以很好地部署在容器中,并且我已经做了几年了。将您的开发环境与您的生产环境相匹配的好处不能被夸大,我感谢Docker。

编辑:2021年,我有了一个参考Django项目,用作新项目的模板:https://github.com/simplecto/django-reference-implementation

此外,对于异步任务,我只使用标准框架中的自定义Django命令。这里的模式是一个带有sleep()周期的简单while循环。它轮询数据库以进行相关操作,然后执行该操作。

编辑:2021年-这在很大程度上取得了回报。我已经使用这种模式运行网站截图项目已有一年多了。每天大约需要1500个网站屏幕截图。所有这些都是由Django命令安排和管理的。

关于这一点,我有很多话要说,但是这必须要写在一系列文章中。 tldr;在这里,我将这个可爱的小JavaScript库与jQuery一起使用(是的,到了2020年,我仍然使用jQuery),使我的应用程序的某些部分感觉像是单页应用程序,但实际上不是。

IntercoolerJS保留了那古老的" Ajax" (记住那个词)的好处,并允许我从后端使用HTML更新DOM。它是无缝的,平滑的,并且对于登录和小型表单更新等操作确实非常方便。

我犯错了。很多错误-但是没有必要向我的用户展示,对吧? Sentry为我提供了一种简便,便捷的方法来捕获生产错误。关于它们的一些很酷的事情:

与您的Git仓库和问题跟踪系统紧密集成,可全面跟踪生产缺陷。

编辑:2021年-我不再使用CI / CD来部署我的单人项目。这太多了工具和复杂性。我只需要使用PyCharm进行测试,然后直接从我的开发机器上交付生产。

今天有很多CI / CD产品,但是我对Bitbucket提供的称为Pipelines的产品感到满意。他们每月为您提供数百分钟的免费时间,您可以选择充值以支付少量费用。我很少遇到问题,我非常喜欢他们的YAML配置/指令文件。

使用bitbucket-pipelines.yml文件,我可以通过旋转多个Docker容器,加载数据库并在短短几分钟内运行数百个测试来进行完整的端到端测试。这对于加快我们团队的工作速度以及每天实现5次以上的生产推动至关重要。

最后,我们来谈谈一些技术,该技术在很大程度上是可选的,但很高兴拥有。 Zerotier是一种独特的网络/ VPN,可用于链接所有个人计算机。它可通过防火墙(在家中,办公室中)工作,并提供1分钟的轻松设置。

在我上一家公司中使用ZeroTier,我们能够删除SSH跳转服务器,这在密钥管理和单台计算机上的共享带宽方面造成了麻烦。

Zerotier可在Linux,Mac,Windows,Android和iPhone上运行,因此您几乎可以覆盖其中。

ZeroTier的一个缺点是我不完全了解它的工作原理。它就像MacOS或iPhone一样,可以正常工作。正如预期的那样,我很少(从来没有)有问题。从用户体验的角度来看,这是一个优势,但是是WTF?从CTO的角度来看。

希望这次更深入的讨论会引起人们对Docker,Django,Traefik尤其是IntercoolerJS的兴趣和好奇。它简单,易于使用,并让您在时机成熟时逐渐成长。

编辑2021年-如您所见,没有太大变化。 我已经能够向我的公共存储库添加更多代码,以充实一年多以前在这里表达的想法。