像素茶艺v2的前前后后

2025年12月9日,我开始去写像素茶艺v2。今年的4月9日,我们终于将像素茶艺v2全面部署起来了,恰好距离我新建文件夹过去了四个月。像素茶艺v2的开发、乃至像素茶艺运营至今都实属不易,故而撰此文记录像素茶艺v2的前前后后,以飨读者。

一、从像素茶艺v1说起

像素茶艺地图站是我和N帝开发并运营的Minecraft地图分发平台。茶站诞生的导火索和直接原因当然是MCBBS的暴死。长期以来,我和地形圈的许多人都对MCBBS(至少是创世匠艺大版、展示&共享版)的管理方式颇有微言。不过死者为大,MCBBS的生前此处我也不必多说,读者可自行了解。2024年1月22日起,MCBBS开始闭站维护,不久以后MCBBS将永久关闭的传言就基本上被证实了并非传言。2024年2月26日,我们正式把像素茶艺地图站进行了公开测试。彼时的像素茶艺地图站甚至没有一个域名,挂着一个IP就匆忙推出。当时的我们也难以想象像素茶艺会有一个前后端分离的、现代化的v2版本。

像素茶艺v1使用的是基于PHP的WordPress CMS。为什么要用这个?只有一个原因:简单快捷。在MCBBS暴死的一个月以后,我们就能完成像素茶艺地图站的基本功能的开发。这得益于WordPress的强大。后来MGC图形学社区赞助了我们一个有备案的子域名,完成了HTTPS部署。网站的功能也日益完善。

那么为什么我们要开发像素茶艺v2?因为像素茶艺v1基于WordPress,正如基于DiscuzX的MCBBS在后期几乎无力对任何用户反馈进行处理,只能回复一句“等v4”一样,使用这种高耦合度的系统就意味着难以去自定义。短短一年里我们给像素茶艺地图站v1打了三四十个插件,其中不乏一些破解版插件。对于一些更高程度的自定义需求,我们会去修改function.php,这是WordPress的自定义函数文件,可以起到类似于打插件的作用,因为我们没有真正的开发WP插件的经验。再后来我们又有了比这还高的自定义需求,我们便去直接修改WordPress系统的源码。这使得像素茶艺再也不能更新自身的内核版本。

以上只是我们抛弃v1的根本原因。而直接原因是去年11月末,像素茶艺v1被一个东南亚IP进行了RCE(远程代码运行)攻击。我们并不知道他选择黑入我们的原因是什么,或许是练手。总之,他为自己的站内账户拿到了管理员权限,并安装了文件管理器开始破坏我们的网站。我们不得不暂时关停网站并进行回滚和系统加固。然而对于这种程度的系统,所谓加固也只是拉一下WAF的清洗强度,同时降低用户权限而已。像素茶艺v1终于到了摇摇欲坠的程度。像素茶艺v2的开发开始了。

二、v2的技术选型

像素茶艺v2当然需要是现代的。前端方面,我们选用了React,并使用了RadixUI这一零样式UI框架,再加上TailwindCSS的原子化CSS框架。这样做的好处是方便,相较于AntDesign这种比较预制的框架,我们不需要再去写很多繁复的内容去覆盖其原本的样式。后端方面,最初的设计是Flask或FastAPI,这是因为我对Python的语法比较熟悉。后来经过花开的建议改用了Golang的GIN框架。(感谢花皇提出的许多建设性意见)GIN的好处是性能起飞,随便甩Python几条街。数据库选择了MySQL(其实我应该用PostgreSQL的)。对象存储选择了MinIO(使用了Pigsty维护的版本),大厂对象存储如同抢钱,自建MinIO再套个CDN非常省钱。CDN方面当然是赛博菩萨Cloudflare。数据统计使用自托管的Umami。富文本编辑与渲染使用Milkdown。人机验证使用基于工作量证明的Cap.js。以上这些服务可以轻轻松松地运行在一台2c4g的服务器上,我们预计能硬扛非常高的并发(太久没人DDoS我们了,无法得知真实数据)。

三、v2的开发

以上技术栈当然不是一开始就定下来的。只有前端是刚开始写就定好的。因为我对前端比较熟悉,所以从前端开始写,很快就写出了大部分的页面。最狗屎的部分是富文本编辑器Milkdown,这鬼东西有一点自定义需求就极其困难,文档还极度过时。只有用它封装好的Crepe Editor非常方便。不过我确实非常喜欢他的设计,于是没办法开始硬吃。得益于Deepwiki,即便他自己的文档非常狗屎,我也能对正确的写法知道得七七八八。这个富文本编辑器到最后我还在继续折腾。主要是对接OSS、添加自定义颜色语法、添加自定义B站嵌入视频语法、以及重载这些非常难搞。

后面我开始使用Github Copilot开始辅助我写一些页面。再后来花皇推荐我换了Codex。AI加持使得我的开发效率提升了很多。v2的前端部分很快就写完了。

后端是最困难的,因为我既没写过后端,更不会Golang。好在有Vibe Coding的帮助,我只读了一点点Go语言圣经和GIN的文档就开始去写。基本上提一个需求以后自己稍微改改就可以,甚至许多需求Codex可以完全做到不用我再改。后端基本上AI和我是91开(怎么还有暗广)。

最后部署方案上使用的是Docker,写个容器编排。前端丢给基于Nginx的OpenResty,再把后端映射到80端口下的api地址。这都非常常规,不必多说了。CDN倒是折腾了很多,但这主要是为了用SaaS来实现优选才要折腾,这方面网上的教程也有很多。(最后几十条DNS规则,Nginx配置比命长,我现在自己都看不懂这都是啥。计算机网络真是太神奇了。)

随后是把旧的地址转发到新的。我的实现方案是写了个Cloudflare Worker,依旧白嫖赛博菩萨这一块。新旧地址的对应完全是通过Excel的Xlookup函数完成的,这才叫真正的数据库管理软件(

终于在4月9号,我们把这堆破事都折腾完了,像素茶艺v2正式部署。v1彻底退出历史舞台。最后感谢花皇给的许多建议、感谢虹梦不断接受我的骚扰帮我测试v2、感谢像素茶艺v2内测群的全体群友、感谢N帝纯手工搬运了所有贴子。感谢像素茶艺地图站的全部创作者。

最后可以来看看像素茶艺v2的宣传片。感谢你读到这里。

使用 Hugo 构建
主题 StackJimmy 设计