百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

亲测推荐 2021 年 SaaS 技术栈

nanshan 2024-11-26 06:51 28 浏览 0 评论

我最近发布了个人对Django做为一款优秀应用框架的一些考虑。本文基于此从架构角度做进一步扩展,介绍从开发到生产环境的整体技术栈考虑。


2018 年至今,我一直使用该技术栈构建一些小型 SaaS 应用。


本文最初发布于 www.simplecto.com,经原作者授权,由 InfoQ 翻译并分享。

整体技术栈

  • 随处部署的 Linux 服务器和虚拟机:我使用了 Azure、Digital Ocean 和 Scaleway,并计划在 2021 年将所有部署迁移到Hetzner提供的专用服务器上。
  • Docker:就是我们常用的 Docker.
  • Traefik:使用 LetsEncrypt 证书的反向代理和 TLS。
  • Postgresql:运行在 Docker 中的数据库。
  • Django:同样运行在容器中。
  • IntercoolerJS:提供平滑易用的类 Ajax 前端应用支持。Intercooler 的创作者在 2021 年发布了HTMX,是 IntercoolerJS 的更新换代。
  • Sentry:捕获生产环境中软件缺陷。只需在配置文件中添加几行配置。
  • Bitbucket Pipelines 替代 CI/CD:鉴于 CI/CD 引入了过多繁琐无用的工具,我在 2021 年不再对个人项目考虑 CI/CD。
  • ZeroTier:实现 VPN 和控制层。

我在开发小型项目时,采用本地 Docker 容器运行测试,进而直接推送到生产环境。我不考虑使用繁琐的 CI/CD,而是选择了 Bitbucket Pipelines。



上图给出了我所采用技术栈的概览,图中有很多需要详细展开阐述的部分。下面换成列表方式展示。

  • 虚拟机
  • Docker
  • Django
  • 挂载数据磁盘卷
  • 使用长时间运行 Django 命令做为 Workers
  • 挂载数据磁盘卷
  • Postgres
  • 挂载数据磁盘卷
  • Traefik
  • Zero-Tier
  • SSH


托管环境

即便是无服务器架构,也需要一个云服务托管环境。我个人推荐Azure、Digital Ocean和Scaleway。每家都为计算、联网、存储和基本服务提供了充分的选项,支持用户任何构建需求。


同样推荐Hetzner,它提供了各服务层级的硬件、服务和价格。

虚拟机

一些企业应用和个人副业(side projects),并不需要同时为成千上万的用户提供 TB 级数据服务,因此可扩展性并非主要关注问题。对于此,我们可选用最小托管服务选项,通常不高于每月 20 美元。即便是服务价格相对最贵的 Azure,也可选用 Burstable 服务质量的虚拟机。个人推荐Scaleway的开发层级服务器。


注意:在我的技术栈中并没有 Kubernetes,因为我并未考虑可扩展性。

Docker

为确保新的虚拟机运行在最新版 Docker 上,我并没有依赖操作系统本身,而是使用了 curl|bash 方式,即:


curl -s https://get.docker.com | sudo bash

复制代码


运行上面一行命令,就能获取最适用于当前运行环境的最新版本。

Traefik 实现反向代理

Traefik 对我简直是天赐之选。尽管 Nginx 也很强大,但其并非针对 Docker 环境构建。Traefik 的两个杀手级特性,为我节省了大量时间:

  1. 使用 LetsEncrypt 实现自动 TLS。简而言之,一旦设置,无需操心。结合适用的 API 和 DNS 服务提供商,还可以使用 DNS 验证。
  2. 使用 Docker label 实现无需重新加载的自动配置。一旦新服务发布,Traefik 通过监听所有 Docker 相关服务而自动发现更改。这使得服务的添加、移除和合并非常方便,不存在任何麻烦。

我对 Traefik 唯一意见是学习曲线略为陡峭。用户必须自行确定如何进行配置,包括配置文件、命令行选项、YAML、Docker label,乃至组合使用。


提示:我发布了自己使用的Traefik生产环境配置文件,供参考。

Postgres 数据库

亲测推荐,PostgreSQL 从不会令我失望。PostgreSQL 容器可毫无问题地添加到任何项目中。我只需简单地启动容器,绑定端口,挂接数据卷到主机磁盘,仅此足矣。


docker-compose.yml
version: '3.1'




services:




  db:
    container_name: postgres
    hostname: postgres
    image: postgres:11
    restart: always
    environment:
      POSTGRES_PASSWORD: secretsonly
    volumes:
      - ./data:/var/lib/postgresql/data
    ports:
      - 5432:5432
    networks:
      - web




networks:
    web:
        external: tr

复制代码


用于 Web 的容器化 Django

Django 很好地支持发布到容器中,我多年以来一直这么用。我反复强调开发环境和生产环境匹配的重要性,Docker 为我实现了一切。


我在 2021 年新推出了一个 Django 项目,用做新项目的模板,参见https://github.com/simplecto/django-reference-implementation。

实现异步任务的 Django 命令

我使用做为标准框架组成的自定义Django命令实现异步任务。该模式采用具有 sleep()的 while 循环,轮询数据库相关操作,并采取相应的动作。


截止 2021 年,我已使用这一模式运行一个网站截屏项目一年多,回报丰厚。该项目每日对 1500 个网站做截屏,所有操作由 Django 命令计划和管理。项目地址:https://github.com/simplecto/screenshots。

IntercoolerJS 降低了复杂性

这里如果展开说,需推出多个帖子,恐怕内容太长,以至于不会有人愿意读。我结合 JQuery 和这个小型 JavaScript 库,实现部分类似单页应用的效果,尽管事实上并非单页应用。


IntercoolerJS 保留了 Ajax 的传统优点,从后端 HTML 更新 DOM,无缝且平滑,非常便于实现用户登录和更新小型表单等元素。


强力推荐访问IntercoolerJS官网。


其创立者在 2021 年继承发展了 IntercoolerJS,推出了HTMX。

Sentry 捕获生产中错误

任何应用都会出错,但不应向用户展示。Sentry 提供了一种捕获生产中软件缺陷的易用便捷方式,其特性包括:


  1. 开源许可,可在生产中任意部署。
  2. 只需在 Django 项目的 settings.py 中添加几行配置,即可生效。
  3. 与 Git 代码库和问题追踪系统紧密集成,提供全生产环境的缺陷可追踪能力。

另一个优点是,随时能在生产环境中禁用。


更多信息,可访问Sentry官网。

Bitbucket Pipelines 替代 CI/CD

2021 年,我不在个人项目的部署中使用 CI/CD。其中存在太多工具,复杂性高。我只是使用 PyCharm 运行测试,然后从开发设备直接交付生产环境。


当前存在多种 CI/CD 解决方案,但是我推荐 Bitbucket 提供的 Pipelines 的服务。该服务每月提供数百分钟的免费使用,只需很少费用就能提供自上而下的功能。我自己在使用中很少碰到问题,很喜欢它们的 YAML 配置文件。


我使用 bitbucket-pipelines.yml 文件,实现跨多个 Docker 容器的完全端到端测试,加载数据库,并在几分钟内执行数以百计的测试。该服务是我们团队高效的关键,支持生产环境中每日五次以上 Push。


更多信息,访问Bitbucket官网。

ZeroTier 实现 VPN

最后,推荐一种在很大程度上是可选的、但是最好应具备的技术。Zerotier 是一种独树一帜的网络/VPN 服务,我用其连接所有的个人计算机。它可穿透防火墙联通家庭和办公场所,一分钟即可配置好。


如果所有设备使用 ZeroTier,就可以避免 SSH 中令人头疼的密钥管理,单机上共享带宽。

Zerotier 可运行在 Linux、Mac、Windows、Android 和 iPhone 上,覆盖大部分设备。


ZeroTier 的一个问题在于,我并不完全了解它的工作机制。和 MacOS 和 iPhone 类似,它们会按用户期望工作,并不出问题,只是从用户体验角度看有些不爽。但对于一名 CTO,谁又会去关心具体的细节呢?

总结

希望上面的深入介绍能激发读者对 Docker、Django、Traefik,尤其是 IntercoolerJS 的兴趣。它们简单、易于使用,能在适当时大展身手。

关注我并转发此篇文章,即可获得学习资料~若想了解更多,也可移步InfoQ官网,获取InfoQ最新资讯~

相关推荐

0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)

文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...

ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes

为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...

生产环境starrocks 3.1存算一体集群部署

集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...

在CentOS上添加swap虚拟内存并设置优先级

现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...

国产深度(deepin)操作系统优化指南

1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...

postgresql-15.4 多节点主从(读写分离)

1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...

Docker 容器 Java 服务内存与 GC 优化实施方案

一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...

虚拟内存设置、解决linux内存不够问题

虚拟内存设置(解决linux内存不够情况)背景介绍  Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...

Elasticsearch性能调优(5):服务器配置选择

在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...

Es如何落地

一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...

针对Linux内存管理知识学习总结

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...

MySQL进阶之性能优化

概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...

Linux Cgroups(Control Groups)原理

LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...

linux 常用性能优化参数及理解

1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...

如何在 Linux 中使用 Sysctl 命令?

sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...

取消回复欢迎 发表评论: