关于本站
从数据库到反向代理都是自己配的,简单交代下它是怎么跑起来的。
这个站没有用现成的博客系统:文章、评论、标签全部存在数据库里,页面一律服务端渲染, 跑在一台自己维护的服务器上。下面几段说说它是怎么拼起来的——以及为什么这么拼。
架构
Astro 7 SSR + @astrojs/node(Node 22)。入口是自己写的一层server.mjs:既托管 HTTP 与静态资源,也用 ws 挂了一条 WebSocket—— 所以私信是实时推送的,不是轮询。
数据
全部状态收敛进一个 SQLite 文件(better-sqlite3,同步 API + 事务), 没有 Redis、没有独立数据库服务。全文检索直接用 FTS5,索引交给触发器维护, 文章增删改不需要手动同步。库和上传的图片都放在 /data 目录下, 重建容器、更新代码都不影响它;服务每天自动做一次一致性快照,保留最近 7 份。
安全与处理
bcrypt 存密码,session cookie 走 httpOnly + sameSite=lax; 全站响应头带 CSP 与 HSTS,登录接口按 IP 限流且失败文案统一(不泄露账号是否存在)。 头像经 sharp 自动旋转、居中裁剪成 256×256 的 WebP,上传后先进人工审核队列; 正文用 marked 渲染、再经 sanitize-html 白名单净化,杜绝脚本注入。
部署
代码托管在 GitHub,推送到 main 后由 GitHub Actions 自动 SSH 进服务器, 拉代码、重建镜像、替换容器,再轮询健康检查——全程约两分钟,人不用登录服务器。 前面挂 Caddy 负责反向代理、gzip/zstd 压缩与 Let's Encrypt 证书的自动申请和续期; 机器就是一台普通的 2 核 2G VPS,没有用任何托管平台。
一个仓库、一台机器、一个 .db 文件——够用,且好维护。