如何以安全的方式持续升级发行版中的所有内容(包括某些 Debian 发行版)?
为什么我问这个问题
我问这个问题是因为当我的Nginx环境安装脚本变得越来越大并且需要越来越多的时间来维护时,我觉得我做错了什么。
由于学习、实践和公共共享,维护脚本是我可以并且喜欢处理的事情,尽管我很快必须作为一名员工出去工作,并且维护这些脚本的时间会更少。鉴于这些情况,我总是有这样的恐惧:
-- 如果我当前的发行版 LTS 不再受支持怎么办?
-- 即使它是 Debian 稳定版而不是其他东西,我也可能会因为几个月前的旧发行版而存在安全漏洞,但也不会超过这个时间。
-- 如果由于发行版过时等原因,配置良好的配置
unattended-upgrades
不足以让我保持安全,该怎么办?
目前,我在 DigitalOcean 中支付了 5 美元购买 Droplet,我真的不知道对我来说拥有具有以下特征的 LEMP 堆栈的最佳解决方案是什么:
- 可免费访问 Bash。
- 无人值守升级。
- CSF-LFD 和 Maldet。
- Certbot 处理的 Web 应用程序配置。
- 我在 cron 中创建的即时自动 cron 备份(在我的脚本中可用)。
- 自动发行版升级(例如从 Ubuntu 16.04 到 18.04,以及当时从 18.04 到 20.04 等等),无需我手动移动数据,即使使用
rsync
. - WordPress 网站
- WP-CLI
- 所有 VPS 的价格不超过 10 美元。
我不确定 Ansible 还是 Salt 是答案(Ansible 在我看来并不容易学习,尽管它被宣传为易于学习,而且我担心我没有时间研究它未来 3 个月将进行深入研究)。
我不确定 Azure 是答案(只是因为价格,我知道像我想要的环境在 Azure 中至少要花费 15 美元)。
也许我需要一个在每个基本方面都具有持续交付的发行版(假设有一个)。
故事基本上就是这样。
答案1
良好的 CI(持续集成)至少依赖于三件事:
- 脚本化部署
- 带外测试环境
- 自动化测试覆盖整个表面。
你目前只有#1。另一个 VPS 可以作为 #2,但您没有任何(明显的)测试。
但在我们进一步讨论之前,先简单说明一下支持基于节奏的版本。
Ubuntu LTS 版本在发布后五年内会获得更新。不是每个包,而是 LEMP 所需的一切。这些更新向后移植未来版本的安全修复程序,以便您获得带有现代修复程序的旧主要版本(如果可能)。这意味着事情继续进行。
滚动发布可以随时更新所有内容。您不知道破坏性配置的更改(例如 systemd)何时会发生,也不知道修复需要多少工作。如果您自动安装更新,这也意味着没有可预测的时间间隔。
对于 Ubuntu LTS,您知道每 4-5 年您需要在服务器上花费一两个小时来指导其完成升级。当你这样做时你可以选择在下一个 LTS 发布后的 3 年内。这是主要功能,而不是缺陷。
对于你的作战计划,我会(也许有争议)完全禁用自动更新,并将其替换为相对地简单的脚本:
- 启动第二个 VPS(使用供应商的 API,因此您只需在运行时付费)。基于相同操作系统版本的模板(例如 Ubuntu 16.04,如果您的主 VPS 位于该版本上)。
- 更新到最新版本的软件、部署您的内容并恢复数据库
- 运行您的测试套件并报告所有服务的正面或负面结果
- 失败时向您发送电子邮件,
apt dist-upgrade
成功时在主 VPS 上运行。
关键是你能得到大声如果您没有收到更新,请反馈。是的,您也需要对此进行测试。
您可以转向 Ansible (等),但这不是您的主要问题。编写测试是。
这是一项繁重的工作,但这些东西也可以让你很好地进行扩展和扩展。如果您已经拥有负载平衡集群,则可以分离一个集群,对其进行更新并进行测试,然后再将其重新引入集群。