这个博客现在不是纯静态站。文章页面、登录态、写作台、搜索、收藏、评论和聊天室都需要服务端参与,所以项目使用 Astro 的 SSR 模式,再由 Express 承载生产服务。
Astro 官方文档里把这种模式叫 on-demand rendering:页面不再只在构建时生成,而是在请求到来时由服务端入口处理。Node 部署目标则通过 @astrojs/node adapter 输出可运行的 server bundle。相关文档可以看:
当前线上结构大致是这样:
Nginx
-> /blog/ 反向代理
-> Node server.mjs
-> Astro SSR handler
-> SQLite 数据库
-> WebSocket 聊天服务
为什么外面还包一层 Express?主要是为了统一处理几件 Astro 之外的事:静态资源缓存、WebSocket upgrade、SQLite 聊天记录,以及一些安全响应头。这样博客仍然保持轻量,但功能边界更清楚。
SQLite 用在个人博客上很合适。它不需要单独维护数据库服务,备份就是一个文件;文章、用户、会话、评论、点赞、收藏和活动流都能放在同一个库里。这个站点启用了外键约束,表之间不会轻易留下孤儿数据。后续如果互动量变大,可以再考虑 WAL 和备份策略。SQLite 官方对 WAL 的说明在这里:Write-Ahead Logging。
部署流程目前是 release 目录式发布:
/var/www/mint-blog/releases/20260629-140111
/var/www/mint-blog/current -> releases/...
每次发布会先上传压缩包,在新 release 里安装生产依赖、构建 Astro,再切换 current 软链接并重启 systemd 服务。这样即使构建失败,也不会把线上站点切到半成品目录。
这套方式不酷,但可靠。对一个个人站来说,最重要的是能写、能查、能修,出问题时也知道从哪里下手。

LETTERS / 评论
讨论区
还没有回应。登录后可以留下第一条评论。
登录后评论 →