技术说明
这个网站背后的技术,你要是好奇的话
声明:主要的活是Agent干的,我负责提供想法和审批,一些数字规则可能没来得及更新
网站架构
整个站分成两半:前端是 Astro 生成的纯静态页面——你在浏览器里看到的笔记、目录、知识图谱、页宠,全是构建时就生成好的 HTML/CSS/JS,不需要服务器实时计算,所以加载很快;后端是服务器上的几个 PHP 小接口加一个 MySQL 数据库,负责两件浏览器干不了的事:把评论存进大家的公共账本,以及替访客保管 AI 的钥匙、转发聊天。
服务器是一台阿里云的轻量 ECS,前面挂着 nginx,静态文件直接返回,碰到 /api/ 开头的请求就交给 PHP 处理。域名解析到服务器 IP,HTTPS 证书由宝塔面板自动续期。
笔记是怎么变成网页的
笔记在本地用 Obsidian 写 Markdown,仓库里一个 prepare-content.mjs 脚本负责把它们变成网站:扫描所有 .md 文件,解析 frontmatter(标题、简介),把 Obsidian 的 双链 转成真正的页面链接,图片复制进静态目录,最后汇总出一份笔记索引 notes.json 和知识图谱数据 graph.json。之后 Astro 按索引给每篇笔记生成一个独立页面,整个流程就是一条命令 npm run build。
所以「改笔记 → 构建 → 上传 dist 目录」三步,网站就更新了。
页面与知识图谱
首页那张会动的图谱用的是 d3-force 力导向布局:每篇笔记是一个节点,笔记之间的 双链 是连线,数据就来自构建时生成的 graph.json。侧边栏目录、搜索(Ctrl + Q 或 / 唤起)也都是构建时生成的索引在本地完成的,不经过服务器。
页宠与小狗
页宠是一个普通的 Astro 组件(NoteCompanion.astro):拖动、回边动画、气泡都是原生 JS。聊天分两层
- 本地规则引擎内置了一套关键词台词,零成本、零延迟;
- AI 模式则由浏览器把消息发给服务器上的
chat.php,由它带着人设提示词去调 模型提供商的接口,再把回复转成 JSON 返回。
几条设计原则:
- API key 只存在服务器的配置文件里,前端永远接触不到;
- 聊天记录只存在访客自己的浏览器(localStorage,保留最近 200 条),服务器不留存,换设备不同步;
- 发给 AI 的上下文只带最近几条,控制花费;
- 限流双闸:按浏览器 cookie 和 IP 各记一本账(MySQL 里两张表),有最小间隔和每小时额度,超了就返回 429,前端自动退回固定台词;
- 聊天内容由 AI 生成,只起陪伴作用。
评论系统
评论同样不需要登录:提交后服务器根据浏览器特征用 HMAC 哈希出一个匿名身份,从词库里分配一个「形容词 + 动物」的随机昵称,同一台电脑上的昵称固定不变。评论内容、昵称存在 MySQL 里,敏感内容可以后台隐藏。防刷和聊天共用一套思路:cookie 一本账、IP 一本账,超额返回 429。
隐私
- 页宠聊天记录只在你自己的浏览器里,可清空,服务器不留存聊天内容;
- 评论会存在服务器数据库里(这是评论区的基本功能),但只绑定随机昵称,不收集邮箱、IP 明文等个人信息(限流用的 IP 在账本里也做了哈希);
- 全站没有埋点、没有统计脚本。
后续改进
别整这花里胡哨的了,哎
留言区
不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。