← 返回文章列表

Nucleus · 诞生

本文讲述了Nucleus-凝核是如何诞生的...

Nucleus · 诞生

Nucleus · 诞生

今天是 blog.poachedegg.cn 上线的日子。

先交代一下背景:从第一行代码到今天上线,我是架构师,写代码的是 AI。 GLM5.3 负责编排,一群 subagent 协同 GLM5.3Flash 负责执行。 那么我们现在就把这套架构和取舍记下来。


开发模式:架构师 + AI 流水线

先说清楚一件事:我没有逐行写过这个网站的代码。但这不意味着我没事干, 恰恰相反,我干的是更费脑子的那部分。

我的日常工作大概长这样。要动一个功能之前,先把任务拆开, 写成一份五要素简报:目标、范围、约束、期望产出、验收标准,然后派给子代理。 简报写得越具体,返回的东西就越能直接用;写得含糊,就要来回返工。 所以我很快就养成了一个习惯:派活之前,自己在脑子里先过一遍验收标准。

子代理是有分工的,而且分工很严:探索的只读,实现的只写, 测试的跑测试,审查的只报问题不动手改。写权限的代理绝不并行, 两个代理同时改一个仓库,那场面我想都不敢想。 这条纪律不是 AI 自己悟出来的,是我作为架构师定死的规矩,效果很好。

流程上还有一道我认为最值的工序:实现代理写完,审查代理复审。 复审不是走过场,它真的会揪问题,有一次揪出一个"极端情况下用户会被永久误伤"的 边角缺陷,修掉才算完。这种一放一收的节奏,比单枪匹马写代码踏实多了。

这套模式最后跑通了博客、账号体系、3D 塔防和全套部署, 收尾的 E2E 测试五十三个用例全绿。要说心得就一句话:

AI 负责吞吐,人负责判断。缺了后半句,前面再快也是白搭。


总体架构:一台小服务器的正确姿势

全站跑在一台 3M 带宽的云服务器上。这个条件决定了架构的基调: 按"个人站的正确尺寸"来设计,不堆料,每一层都选够用且我能驾驭的。

入口只有 nginx,三个域名三个 server 块:主站、后台、图片域。 API 和页面在同一个域名下由 nginx 分流,浏览器从头到尾不发一个跨域请求, 连 CORS 都只是兜底配置。

后端是一个 Go 单体。编译出一个静态二进制,systemd 直接拉起, 内存占用实测 5.5MB。我没上微服务,一台机器一个站, 拆微服务不是架构升级,是给自己找运维麻烦。

数据库、缓存、对象存储、消息队列这四件套全部 Docker 化, 端口一律只绑在 127.0.0.1,从公网一个都摸不到。 前台 Nuxt、后台 Vite,全部是构建好的产物,服务器上没有运行时编译这回事。

这套分层最让我满意的不是性能,是每一层都能单独替换。 哪天 MinIO 换成别的对象存储,或者前台换个框架,动的是一层,不是全身手术。 我觉得这比追新潮技术重要多了。


前端取舍:Nuxt 却关掉 SSR

用 Nuxt 是看中它的工程化,但所有页面我都设了 ssr: false, 听起来像买椟还珠,其实是算过账的。

SSR 的好处无非 SEO 和首屏。SEO 这边,服务端直接吐 RSS 和 sitemap, 搜索引擎和订阅器从这里进门就够了。真实访客那边, 这是一个重交互的站,首屏有原子轨道、星野、滚动剧场, 这些东西本来就得靠客户端跑,SSR 帮不上忙,反而多出一堆水合的麻烦。

砍掉 SSR 之后,动画系统想怎么写就怎么写。这笔账对我来说很好算。


安全:无面板,是最早定下的决定之一

这台服务器没装任何管理面板。说实话,一开始也有点手痒, 点几下就能建站的面板谁不心动。 但这就是我鞭策自己运维能力的方式。

道理不复杂。面板本身就是攻击面,一个暴露在公网的管理入口, 历史上拖出来的洞比业务代码多得多。我宁可手写 nginx 配置、手敲 systemd, 让服务器上每一个暴露面都经过我自己的眼睛。

上线那晚就是这么过的:从域名证书、端口冲突、依赖容器到 systemd 服务, 全程命令行,没点开过一次网页面板。中途也有磕绊,比如前台服务死活起不来, 查下来是服务器上压根没装 Node。这种坑面板也会让你踩, 区别是踩的时候你知不知道自己在踩。

具体的防线列一下,不全,但都是实打实配了的:

  • 公网只开 443,80 只留给签证书,其余全部回环;
  • CSP、HSTS、X-Frame-Options 这些安全响应头由 nginx 统一注入;
  • Markdown 服务端渲染,禁用原始 HTML,XSS 从入口堵死;
  • 图片上传三重校验,登录和验证码多维限速;
  • 反向代理下只信显式配置网段的 XFF 解析,伪造请求头无效;
  • 游戏排行榜服务端权威,客户端上报的每一局按同一套数值规则重演, 作弊局静默标记,不上榜;
  • SELinux 内核级防护。

最后单独说说 SELinux。Rocky Linux 出厂默认就开着它,这是内核级的强制访问控制: 每个进程能碰哪些文件、哪些端口、哪些资源,白纸黑字写在策略里, 就算进程以 root 身份运行,策略说了也不算。网上大量教程的第一步就是把它关掉, 图省事。我没关。它的价值在于纵深:万一应用层真被撕开一道口子, 攻击者拿到的也只是一个被策略困住的壳,横移不了,提权不了。 这和我不装面板是同一个思路,默认收紧,按需一点点放开。

安全不是上线前突击补的一章,它是贯穿在每个决策里的约束条件。


关于带宽

3M 带宽,算下来每秒三百多 KB。一张没压缩过的手机照片普遍 4MB 起, 也就是说,一张原图就能让访客盯十秒进度条。所以图片是重点整治对象: 前端先压缩一道,后端再验一遍,扔进队列异步转成 WebP, 最终出现在文章里的图普遍就几百 KB。

静态资源全部内容寻址,缓存直接给到一年不变; 能 gzip 的全开。带宽小不可怕,可怕的是每一字节都不假思索地往外扔。


写在最后

架构师加 AI 的协作,不是"让 AI 写个网站"一句话那么轻巧。 判断力、约束、验收标准,一样都不能少。但反过来说, 这套流水线确实让一个人撑起了一个从前需要小团队才敢碰的项目, 备案下来、域名点亮的那一刻,还是很爽的。

凝核,凝而聚之,核而生光。 这里是它诞生的第一天。