我为什么把评论系统部署在 VPS + SQLite

2026-07-06T18:10:00+08:00

@
我为什么把评论系统部署在 VPS + SQLite

我最近想给博客加评论系统。

一开始看了一圈方案,发现评论这件事很容易被做复杂:GitHub Issues、Discussions、Vercel、Serverless、云数据库、对象存储、验证码、邮件通知、反垃圾服务。每一个单独看都不难,但拼在一起,就会变成一个小型运维项目。

我的需求其实很朴素:

  1. 不想把评论托管到 GitHub。
  2. 不想为了评论系统再引入一堆云服务。
  3. 数据最好在自己手里,能备份,能迁移。
  4. 早期博客流量不大,不需要一上来就搞复杂架构。

所以最后我选了 Waline,并且准备直接部署在自己的 VPS 上,用 SQLite 存评论数据。

这不是最“现代云原生”的方案,但它足够简单,也足够可控。

为什么不是 GitHub 托管评论

GitHub Issues 类评论系统最大的好处是轻。比如 utterances、giscus 这类方案,本质上是把每篇文章对应到 GitHub 的 issue 或 discussion,前端加载一个组件,评论就能跑起来。

如果博客本来就是面向开发者,并且读者都有 GitHub 账号,这确实很舒服。

但我不太想这么做。

第一,评论数据不在自己手里。它当然可以导出,但日常形态还是依赖 GitHub。哪天想迁移,评论和文章之间的映射、用户身份、回复关系,都要再处理一次。

第二,评论门槛变高。很多读者只是想随手留一句话,让他登录 GitHub,心理成本其实不低。

第三,我不希望一个中文个人博客的互动入口默认绑定到开发者平台。博客可以聊 AI、工具、交易、内容运营,也可以聊一些更日常的东西。评论系统最好别先替读者筛选身份。

所以我的方向是:评论系统可以轻,但数据要尽量留在自己这边。

为什么选 Waline

Waline 对我来说比较像一个平衡点。

它不是只有前端组件,也不是完整论坛系统。它有服务端,有管理后台,有数据库,也有比较成熟的博客主题集成。对 Hugo 来说,接入成本很低,我现在用的 Dream 主题本身就支持 Waline。

我看重的点主要有几个:

  • 可以匿名评论,不强迫读者用 GitHub 登录。
  • 有后台管理,评论、审核、用户都能看。
  • 支持评论审核,刚上线时可以先人工放行。
  • 支持多种数据库,早期可以 SQLite,后面需要再迁移。
  • 前端接入轻,Hugo 里加一段配置或 partial 就够。

它不是最强大的社区系统,也不应该被当成论坛。但给个人博客做评论区,刚好合适。

为什么不用 Vercel + 云数据库

Waline 官方推荐过 Vercel 这类部署方式,早期博客用免费额度也确实能跑。

但我想了一下,还是觉得没必要。

Vercel 本身不复杂,云数据库也不复杂,可是一旦组合起来,事情就变成:

  • Vercel 项目在哪里。
  • 数据库在哪里。
  • 环境变量在哪里。
  • 免费额度还够不够。
  • 域名怎么绑。
  • 以后迁移时评论数据怎么搬。

这些都能解决,但它们不是我真正关心的问题。

评论系统对我来说不是核心业务,只是博客旁边的一张小桌子。我希望它安静地放在那里,能用,能备份,别让我为了它维护一串服务依赖。

既然我已经有 VPS,那最简单的方案就是把 Waline 跑在 VPS 上。

VPS + SQLite 的好处

这个方案的结构很直接:

fomoxx.com 文章页面
        |
        | 加载 Waline 前端组件
        v
comments.fomoxx.com
        |
        | Nginx / Caddy 反向代理
        v
Waline Docker 容器
        |
        v
SQLite 文件

它的优点很明显。

第一,依赖少。一个 Docker 容器,一个数据目录,一个反代配置,就可以跑。

第二,数据清楚。评论都在 SQLite 文件里,备份就是备份一个目录。相比一堆云服务控制台,这种朴素反而让人安心。

第三,成本稳定。VPS 反正已经在付钱,评论系统多占一点点 CPU、内存和磁盘,不需要额外为 Serverless 或数据库免费额度分神。

第四,迁移不难。以后如果评论量真的起来,再迁到 PostgreSQL 或 MySQL,也比一开始就为了“可能的规模”把架构做重更合理。

大概怎么部署

我会用 Docker Compose 跑 Waline,把服务只暴露到本机端口,再用 Nginx 或 Caddy 做 HTTPS 反代。

一个简化版配置大概是这样:

services:
  waline:
    image: lizheming/waline:latest
    container_name: waline
    restart: unless-stopped
    ports:
      - "127.0.0.1:8360:8360"
    volumes:
      - ./data:/app/data
    environment:
      TZ: Asia/Shanghai
      SQLITE_PATH: /app/data
      SQLITE_DB: waline.sqlite
      JWT_TOKEN: "换成一串足够长的随机字符串"
      SITE_NAME: fomoxx
      SITE_URL: https://fomoxx.com
      SECURE_DOMAINS: fomoxx.com,comments.fomoxx.com
      COMMENT_AUDIT: "true"
      IPQPS: "60"

这里有几个配置我会优先打开。

COMMENT_AUDIT=true 表示评论需要审核后再展示。博客刚开评论区时,我宁愿多点一次审核,也不想让垃圾评论直接出现在文章下面。

SECURE_DOMAINS 用来限制允许调用评论服务的站点域名,避免别人随便拿我的 Waline 服务当公共接口。

IPQPS=60 是频率限制,同一个 IP 不要太频繁提交。它挡不住所有攻击,但能挡掉一部分低成本刷接口。

反代层我会单独使用 comments.fomoxx.com,而不是把评论服务挂在主站路径下。这样以后迁移、替换、限流、加防护都更清楚。

最重要的是备份

SQLite 最大的优点是简单,最大的风险也是简单:它就是一个文件。

所以这个方案一定要做备份。

我的最低要求是每天备份一次 Waline 的 data 目录,并且至少保留最近 7 天。如果 VPS 本身还有快照,那更好,但不要只依赖快照。

备份可以很朴素:

tar -czf waline-$(date +%F).tar.gz /opt/waline/data

然后再把压缩包同步到另一台机器、对象存储或本地 NAS。

个人博客的评论量不会像交易系统一样高,但评论一旦积累起来,就是内容的一部分。它不一定值钱,但很值得保留。

我的最终选择

所以这次的选择很简单:

  • 评论系统:Waline
  • 部署位置:自己的 VPS
  • 数据库:SQLite
  • 访问域名:comments.fomoxx.com
  • 展示策略:默认开启审核,通过后显示
  • 运维重点:备份数据目录,而不是追求复杂架构

我喜欢这个方案的地方在于,它没有假装自己很高级。

它只是把评论系统放回了它该在的位置:一个轻量、独立、可备份的小服务。

常见问题

Waline 适合个人博客吗?

适合。它有前端评论组件、后端服务和管理后台,支持审核、防刷、邮件通知和多种数据库。个人博客早期用 SQLite 就够了。

为什么不用 GitHub Issues 做评论?

GitHub Issues 类评论系统轻量,但评论数据和用户交互会绑定到 GitHub。对不想依赖 GitHub 托管评论的博客来说,Waline 自托管更合适。

SQLite 会不会不够用?

对早期个人博客评论量来说,SQLite 通常足够。真正要注意的是定期备份,而不是一开始就上复杂数据库。

评论会直接显示吗?

Waline 默认可以直接显示评论,但个人站点刚上线时更建议开启评论审核,先把垃圾评论和刷接口挡在前面。

© 2026 fomoxx

🌱 Powered by Hugo with theme Dream.