一个只记录日常的站
用同一套零依赖静态站方法搭起:一份 HTML 模板加一份数据 JSON,内容分短札、摘录、随笔三类,底色是历史与哲学。不注册、不互动、不交易,联系只留一个邮箱。
把亲手搭起来、或亲手改过的几个站按时间归档,过程与坑都写下来。
用同一套零依赖静态站方法搭起:一份 HTML 模板加一份数据 JSON,内容分短札、摘录、随笔三类,底色是历史与哲学。不注册、不互动、不交易,联系只留一个邮箱。
对接历史事件数据源,按朝代与年份排列事件,支持纪年换算与关键词检索。所有内容构建期拉取渲染,可追溯来源;空数据区块自动隐藏,不留空白。
本站本身即是那套方法的样板:记录零依赖静态站的搭法、埋点与收录的口径、个体工商户经营性备案下的合规边界,以及 GitHub SSH 推送部署。
建站、埋点与收录的实测笔记。
站点文章过百后,前端 Fuse.js 全量加载 JSON 已让首屏明显变慢,遂改为构建期生成 SQLite FTS5 索引、后端只暴露一个查询接口。做法是写脚本遍历 Markdown 的 front matter 与正文,用 better-sqlite3 建表并插入,正文走 unicode61 分词、标题加权,同时把每篇的 slug 与摘要存成普通列便于回显。踩坑有三:一是中文分词默认按字切,长词检索命中差,改为在写入前做一次简单的二元切分并保留原串;二是索引文件随构建产物一起发布,被静态托管当普通文件下载,改用反向代理只允许 POST 查询;三是增量构建时表结构不一致导致查询报错,最终每次全量重建并加版本号校验。结论:百来篇文章索引不到 2MB,查询延迟稳定在毫秒级,比纯前端方案省下首屏体积。
把跑了两年的Nginx静态站迁到Caddy,起因是每次续签Let's Encrypt证书都要手动改配置并reload,而Caddy能自动完成签发与续期。做法:先用caddy adapt把现有server块转成Caddyfile作对照,再手写站点配置,用root指向静态目录、file_server开启目录服务、encode gzip zstd压缩、header设置缓存与安全头,最后加handle_errors自定义404。坑有两个:一是Caddy默认以caddy用户运行,站点目录权限不足导致403,改成目录组可读并给caddy组授权才通;二是原有的rewrite规则顺序在Caddy里被handle块重新排序,伪静态页面一度502,改用try_files等价写法后恢复。上线后证书自动续期正常,配置从80行降到30行,内存占用也更低。结论:纯静态站迁Caddy收益明显,但迁移前务必逐条核对rewrite与权限。
本站一直是纯静态页,想加评论又不想引第三方脚本,于是选了自托管方案:在轻量服务器上用 Docker 起服务,配 SQLite 存储、反向代理转发到子域名,前端只嵌一段轻量脚本。坑主要三处:跨域与 Cookie 属性导致登录态丢失,需显式配置 SameSite 与允许来源;容器重启后数据没持久化,卷挂载漏写路径,评论丢了一次;邮件通知依赖外部 SMTP,被限流后改为延迟重试。最终把数据目录纳入备份脚本,评论可用且无外部依赖。
站点跑在一台小内存 VPS 上,缓存目录和 journal 日志长期累积后会触发磁盘告警。我的做法是写一个清理脚本,用 find 按修改时间删除超过 14 天的缓存文件,再对 journalctl 做 vacuum-time 收缩,最后用 systemd timer 每天凌晨触发,而不是塞进 crontab,这样能拿到执行状态和日志。踩过的坑有两个:脚本里用了相对路径,timer 环境下工作目录不是预期值,改成绝对路径才生效;另外删除前没加 -xdev,差点跨挂载点清到备份盘。结论是定时任务要显式声明路径与挂载范围,并用 systemctl list-timers 验证触发情况。
博客原先挂在托管平台上,为了能自己控制缓存和证书,我把它迁到一台自建 VPS。做法是:用 Caddy 反代静态目录并自动签发 Let's Encrypt 证书,用 rsync 从本地推送构建产物,systemd 单元保证 Caddy 开机自启,再用 cron 每天做一次增量备份。遇到的坑主要有三个:一是 DNS 切换后旧解析残留,导致证书签发校验失败,靠提前降低 TTL 并等待 TTL 过期解决;二是 rsync 默认权限导致静态文件不可读,加 --chmod 修正;三是防火墙只放行 80/443,忘了放行 SSH,差点把自己锁在外面。结论是自建部署可控性明显提升,但要把证书、备份、防火墙三件事当成日常运维项,不能一次配置完就不管。
没找到答案?直接联系我。