服务器 - 开端


一切的开始

也许是我这个人控制欲太强, 博客写着写着就越钻越深. 最早是从 19 年的年初开始, 在知乎上新建了个专栏. 由于知乎编辑器有 bug, 把我写好的草稿弄没了, 加之知乎编辑器支持的功能偏少, 我渐渐的就开始研究起了 GitHub Pages. 到了年底, 我开始把知乎上的文章转移到了 Pages. 在反复试用后, 我最终选择了 Less Or More 作为模板搭建了我的博客.

虽然 GitHub 支持自动化 Jekyll build 与部署, 但是仅仅是本地写 markdown, 再 push 到 GitHub 等它编译非常不方便. 我没有办法快速的看到 CSS 渲染后的效果, 也难以 debug. 由于不熟悉前端的技术, 在反复修改中我的 git log 里出现了大量修复小细节的 commits. 为了方便继续写博客, 转向本地化编译势在必行. 但是由于我个人使用的是 Windows 系统, 使用 Ruby 并不方便. 最后我把目光投向了树莓派. 趁我 20 年初回国开会的机会在淘宝上买了个 理财产品 树莓派 4B (20 年 600 RMB 买的, 到 22 年同配置已经涨到 1400 RMB 了).

但是由于疫情的到来, 生活的各个方面都被打乱了. 最终新加坡也开始封城 (由于新加坡一定要与中国政府区分开, 所以他们把这个政策命名为 circuit break 断路器), 我无法再进入办公室. 由于 NTU 提供的学校 VPN 非常不稳定, 而且无法使用 PAC 模式, 我对树莓派的主要研究也被导向了如何对办公室的服务器做反向隧穿, 让我在家也能访问服务器. 虽然在封城期间不管是科研还是生活都很混乱, 所以我也一直没有更新博客, 但是对反向隧穿的研究也让我对防火墙和各种网络协议熟悉了起来. 另外为了获得公网 IP, 我租用了一台 Digital Ocean 的服务器, 对一些远程管理的技术也开始有所了解. 这是我第一次真正接触个人服务器. 虽然之前由于各种原因, 我也维护过 Windows 云服务器, 但是 Windows 过于复杂, 再踩了各种坑之后真心的说, 非常不推荐个人或者小型团队使用. 到了下半年, 新加坡逐渐的开放了, 我才又回到办公室把反向隧穿的服务停了, 重新开始管理博客. 不过一直到了 21 年, 趁着写一些矩阵分析的笔记的机会, 我才真的开始更新博客. 这一次就开了潘多拉的盒子了, 各种折腾的事情就没停下来. 首当其冲的就是我给树莓派焊了一个控制电路, 然后做了一个风扇的 PWM 温控程序.

Rassperry Pi

GitHub Pages

GitHub 提供的这个 Pages 服务还是比较方便的. 虽然没有 Word Press 的图形化编辑的能力, 但是由于是由 Jekyll 驱动, Pages 有非常高的自由度. 另一方面, 由于 GitHub 选择了 Jekyll, 也让 Jekyll 形成了最大的静态网站社区. 我使用 GitHub Pages 也有 2 年了. 不得不说这是自己动手写网站的入门首选. 在让使用者接触前端的细节的同时, 又隐藏了很多复杂的流程.

Jekyll 是用 Ruby 编写的. 对于不做前端的人来说, 这是一个非常陌生的语言. 特别对我们这些主要接触的是科学计算的用户而言, 从包管理器到使用逻辑都非常不习惯. 好在只是使用 Jekyll 的话, 只要按步骤安装 Ruby 即可. 写博客的话只需要套用模板, 不需要去动 Gemfile 之类的内容. 我在树莓派上一开始也只是安装了 Jekyll. 由于我套用的模板是用 Less 写的, 在最初的使用中我也完全没有使用任何的 Ruby 包 (在 Ruby 中叫做 gems). 但是由于这个模板已经非常老旧, 不支持 Jekyll 的很多新特性, 而且含有很多冗余代码, 我自己对这个模板进行了多次的大修. 不过由于 Node.js 和 Less 的存在, 这个模板中大量的代码我至今没完全理解. 我这奇怪的控制欲让我现在又开始自己仿照这个模板重构所有的代码.

在 Jekyll 的使用中, 由于各种折腾, 让我对网页三剑客 html, css, javascript 研究了不少时间. 在之后重构模板的过程中, 我又慢慢接触了 SCSS 和 Ruby gems 等内容. 这段过程让我充分体验到了前端是一种很”脏”的环境. 由于前端是与人打交道, 各种前端的语言定义了非常多奇怪的功能. 这些代码并不太难理解, 但是为了满足各种细节功能, 前端不得不使用大量繁杂的代码. 特别是 CSS 中, 由于大量的奇怪需求无法标准化, 很多样式只能自己定义标准. 这使得 html, css, javascript 之间产生了很强的耦合, 每次修改起来都非常的麻烦. 某种程度上来说, 前端并不是一个非常适合业余程序员琢磨的东西.

自建服务器

在琢磨了 Jekyll 这么久之后, 前一段时间我突然决定搭建一个自己的服务器, 把我的网站从 Pages 转移到自己的服务器上. 在研究了一段时间的服务器相关的知识后, 我参考 B 站 UP 主我不是咕咕鸽博客, 在我的服务器上装上了 Portainer, Nginx Proxy Manager 等管理软件. 最终我在 NameSilo 上购买我现在这个域名 q-canon.top. 我大概前前后后花了半个月的时间踩完了服务器前期的各种坑, 最终稳定的实现了各种正常的和奇怪的功能. 现在看来 Digital Ocean 的 5 美元一个月的服务器 (下个月要涨价到 6 美元了) 完全足够搭建一个功能丰富的服务器. 我统计了一下各种服务的内存占用 (Docker 容器):

服务 内存占用
网页 2.4 MB
Nginx Proxy Manager 85 MB
qBittorrent 24 MB
partainer 14.5 MB
Grafana 34.4 MB
Prometheus 34.7 MB
v2ray 5.6 MB

加一些额外的小功能, 我 1G 内存的服务器只使用了 70% 的内存. 加上 Digital Ocean 每个月 1T 的流量, 以及不设上限的带宽, 除了无法搭建 Rocket.chat, 已经跑起了我目前需要的所有服务.

考虑到我以及在这方面花了这么多的时间, 我决定在这个网站中加入”服务器“这个栏目. 把我这几年踩过的坑记录一下.