为静态博客装上轻量评论:用 Artalk 自建私有化评论系统
前情提要
上篇文章 里,我们从头搭好了一个 Astro 博客 —— 选了 Firefly 主题、配了 Nginx、上了 SSL 证书。博客跑起来了,但有个显而易见的问题:滚到页面底部,空空荡荡的。你写的东西发出去,读者看完就走了,连个说“写得不错”的地方都没有。
对于一个博客来说,评论区就是那个让单向输出变成双向交流的地方。没有它,博客就像一间没有访客留言簿的屋子,少了些有人驻足回应的温暖。
选择合适的后端
静态博客不像 WordPress 那样自带评论系统,所以我们需要额外选一个方案。网上的选择不少:
- Giscus:基于 GitHub Discussions,数据挂在你的 GitHub 仓库下。优点是免费、无需自建后端;缺点嘛,无法匿名评论,读者评论需要 GitHub 账号,不是每个人都有。
- Waline / Twikoo:两款流行的自托管评论系统,功能齐全,但都依赖 Node.js 服务端,对一台跑着其他服务的“家里云”来说不算友好。
- Disqus:老牌第三方评论,但广告多、隐私堪忧、国内加载慢。
- Artalk:Go 语言写的轻量评论系统,单二进制文件部署,支持中文,自带管理面板,数据完全私有化。
我选了 Artalk。原因很简单:轻量,自托管。不挑环境、不占资源,安安静静地跑在我的“家里云”上。更重要的是,所有评论数据都在我自己的服务器硬盘里,哪天第三方服务挂了、涨价了、跑路了,都和我没关系。
部署 Artalk 后端
Artalk 后端是一个 Go 程序,官方提供了多种安装方式:Docker、二进制文件、或者从源码编译。
本文讲解两种安装方式,喜欢用哪个就看哪个 —— Docker 安装 或 二进制安装。
Docker 安装
[!IMPORTANT] 重要 如果你还没有安装 Docker,先使用下面的命令安装(以 Ubuntu/Debian 为例):
Terminal window # 安装 Dockercurl -fsSL https://get.docker.com | sudo bash# 将当前用户加入 docker 组,省的以后每次都 sudosudo usermod -aG docker $USER# 重新登录使权限生效,或者直接newgrp docker# 验证安装docker --version其他系统的安装方式可以参考 Docker 官方文档。
继续,找一个合适的位置放 Artalk。我把它和博客文件夹放在同一级目录下:
cd ~mkdir artalkcd artalk接着运行以下命令:
docker run -d \ --name artalk \ -p 8080:23366 \ -v $(pwd)/data:/data \ -e "TZ=Asia/Shanghai" \ -e "ATK_LOCALE=zh-CN" \ -e "ATK_SITE_DEFAULT=Artalk 的博客" \ -e "ATK_SITE_URL=https://example.com" \ artalk/artalk-go[!NOTE] 提示
8080为外部服务应该监听的端口,可以自行修改,但23366为转发到容器内部 artalk 后端的端口,不建议改动。ATK_SITE_DEFAULT填写自己的博客站点名。ATK_SITE_URL填写你博客的网址。
[!CAUTION] 注意 可以在安装时不修改
ATK_SITE_DEFAULT和ATK_SITE_URL。但在安装完毕进入管理后台后,务必将站点名和站点网址设置为和你博客的配置完全一致。比如你的博客叫 “xxx’s Blog”,这里就得填
xxx's Blog,一个字都不能差。
编辑生成的 data/artalk.yml,只需要改几个关键项:
sudo nano data/artalk.yml# 信任的来源域名,填你自己的博客域名trusted_domains: - "https://blog.yourdomain.com" # 如果你的开发和部署不在同一台机器上,还得补上以下两条规则 - "http://localhost:4321" - "http://你的开发机IP:4321"这样做主要是为了让 Artalk 后端接受以上域名的跨域请求。
二进制安装
如果你不想用 Docker,二进制部署也很简单。Artalk 是 Go 写的,编译出来就是一个单文件,不依赖任何运行时。
首先 SSH 登录到服务器,创建目录:
cd ~mkdir artalkcd artalk去 Artalk Releases 页面找到最新的 artalk_linux_amd64.tar.gz(根据你服务器使用的架构选择),用 wget 拉下来:
wget https://github.com/ArtalkJS/Artalk/releases/latest/download/artalk_linux_amd64.tar.gztar -xzf artalk_linux_amd64.tar.gzls -lh artalk # 确认可执行文件存在配置内容和上面 Docker 版本基本一致:
trusted_domains: - "https://blog.yourdomain.com" # 如果在本地开发机调试,加上下面两条 - "http://localhost:4321" - "http://你的开发机IP:4321"注册 systemd 服务
# 先手动测试一下./artalk server -c artalk.yml看到 [INFO] listening on 127.0.0.1:23366 就说明一切正常,按 Ctrl + C 退出。
确认没问题后,用 systemd 注册为服务,实现开机自启和后台运行:
sudo nano /etc/systemd/system/artalk.service[Unit]Description=Artalk Comment ServerDocumentation=https://artalk.js.orgAfter=network.target
[Service]Type=simpleUser=usernameWorkingDirectory=/home/username/artalkExecStart=/home/username/artalk/artalk server -c /home/username/artalk/artalk.ymlExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDTimeoutStopSec=5sRestart=on-failureRestartSec=5LimitNOFILE=1048576LimitNPROC=512PrivateTmp=trueProtectSystem=full
[Install]WantedBy=multi-user.target[!NOTE] 几个值得关注的新增选项
ExecReload/ExecStop:优雅地重载和停止服务,而不是直接 kill 进程LimitNOFILE/LimitNPROC:提高文件和进程数上限,避免高并发时瓶颈PrivateTmp=true/ProtectSystem=full:隔离临时目录和系统文件,即使 Artalk 被攻破也无法篡改系统Restart=on-failure:仅在异常退出时自动重启,避免覆盖你手动systemctl stop的操作
sudo systemctl daemon-reloadsudo systemctl enable --now artalksudo systemctl status artalk看到 active (running) 就搞定了。
创建管理员账户
无论选择哪种部署方式,都需要创建一个管理员账户来管理评论。
# 转到你的 artalk 所在文件夹cd artalk
# Docker 用户docker exec -it artalk artalk admin
# 二进制用户./artalk admin按提示输入用户名、邮箱和密码。这个账户用来登录 Artalk 的后台管理面板,管理评论、审核、站点设置等。
[!CAUTION] 注意 填写信息时请务必小心——输入过的内容无法修改。但凡按错一个字母,只能
Ctrl + C重新来过。
验证运行状态
确认服务正常运行:
# Docker 用户docker ps --filter name=artalkdocker logs artalk
# 二进制用户sudo systemctl status artalk看到 active (running) 或 Up 就说明一切就绪。
[!TIP] 无论 Docker 还是二进制部署,Artalk 后端都监听在
127.0.0.1:23366。唯一的例外是:如果你在docker run时把外部端口改成了8080(如-p 8080:23366),那么 Nginx 反代时端口也要对应改成8080。本文后续的 Nginx 配置都以 Docker 映射的外部端口8080为例,请根据你的实际情况调整。
Nginx 反向代理
我们需要通过 Nginx 把 Artalk 后端反代到博客域名的 /artalk/ 路径下。这样做有两个好处:
- 同域访问——前端 JS 请求
/artalk/就是同域请求,不存在跨域问题,省去一堆 CORS 配置 - 复用证书——同域意味着直接复用博客的 SSL 证书,不用单独申请
打开上一篇写好的 Nginx 配置,在 HTTPS 的 server 块里加一段。端口注意:Docker 用户填 docker run 时映射的外部端口(本文示例是 8080),二进制用户填 23366:
server {
# ......
# Artalk API 反向代理 location /artalk/ { proxy_pass http://127.0.0.1:8080/; # Docker 用户填外部映射端口,二进制用户填 23366 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
# ......}[!IMPORTANT]
proxy_pass的http://127.0.0.1:8080/后面那个/不能省,它会让 Nginx 把/artalk/xxx转发到后端的/xxx。如果漏了,后端收到的请求会是/artalk/xxx,导致路由匹配不上。
最后检查并重载:
sudo nginx -tsudo systemctl reload nginx验证一下反代是否生效,可以使用浏览器访问 https://blog.yourdomain.com/artalk/,应该能看到 Artalk 的 API 响应页面。
前端集成
后端跑通了,接下来就是把 Artalk 接进我们的 Astro 博客。
好消息是,Firefly 主题内置了 Artalk 支持,你不需要自己写前端集成代码。只需要在配置文件中填上后端地址。
打开 src/config/commentConfig.ts:
import type { CommentConfig } from "../types/config";
export const commentConfig: CommentConfig = { // 评论系统类型,填 "artalk" type: "artalk",
artalk: { // Artalk 后端 API 地址 server: "https://blog.yourdomain.com/artalk", // 语言 locale: "zh-CN", // 启用文章阅读量统计(也就是"浏览量"功能) visitorCount: true, },};就这么简单。保存后重新构建:
pnpm build现在访问任意一篇文章,滑到最底下——评论区就在那里了。试试发一条测试评论吧:填上昵称和邮箱,随便写点什么,点击提交。搞定,你的博客现在会倾听,也会回应了。
想确认一切正常?打开 https://blog.yourdomain.com/artalk/,用刚才创建的管理员账户登录,在后台看到你刚发的那条评论静静地躺在那儿——从部署到上线,每一步都踩实了。
Artalk 管理面板
Artalk 的后台管理面板地址就是你的反代地址,即 https://blog.yourdomain.com/artalk/。登录管理面板后,点击左侧的“设置”:
- 审核评论:可以打开“先审后发”模式,人工过滤后再展示
- 管理站点:一个 Artalk 实例可以为多个站点服务(如果你有好几个博客的话)
- 邮件通知:配置 SMTP 后,有人回复你的评论时会自动发邮件通知
- 数据迁移:支持从 Typecho、WordPress、Valine 等平台导入评论数据
- 垃圾检测:内置简单的关键词过滤和重复检测
配置头像
评论区的默认头像不好看,不如我们来接入 Gravatar。
- 进入管理后台
- 设置
- 界面配置
- 头像 Gravatar
有两个值需要我们填写,分别是 API 地址 以及 API 参数。
这两个值我当时搜了好久都没找到明确的填法,后来自己摸索出来了。如果你也用 Artalk + Gravatar 的组合,直接复制下面两个值就行:
API 地址:
https://www.gravatar.com/avatar/API 参数:
sha256=1&d=mp&s=240填写完后,记得点击页面右下角的”保存”按钮。回到评论区,如果你的登录邮箱已经注册了 Gravatar 并配置好了头像,评论就会正确显示你的专属头像。
配置 GitHub 登录
目前读者评论需要手动填写昵称和邮箱,对一部分人来说是个小小的门槛。Artalk 支持 GitHub OAuth 登录,读者点一下就能用 GitHub 账号直接评论,省去手动填信息的麻烦。
创建 GitHub OAuth App
首先去 GitHub 创建一个 OAuth 应用:
- 登录 GitHub,点击右上角头像 → Settings
- 左侧边栏拉到最底部,点击 Developer settings
- 选择 OAuth Apps → New OAuth App
填写以下信息:
| 字段 | 值 |
|---|---|
| Application name | 你的博客名(随意) |
| Homepage URL | https://blog.yourdomain.com |
| Authorization callback URL | https://blog.yourdomain.com/artalk/api/v2/auth/callback |
[!IMPORTANT] 重要 别忘了去 Artalk 管理后台 → 设置 → 社交登录,勾选“启用社交登录”。默认的 Callback URL 为
https://example.com/api/v2/auth/{provider}/callback,把它改成https://blog.yourdomain.com/artalk/api/v2/auth/{provider}/callback。
点击 Register application,然后在新页面上点击 Generate a new client secret,记下 Client ID 和 Client Secret。
填入管理后台
拿到 Client ID 和 Secret 后,回到 Artalk 管理后台,点击左侧 设置 → 登录 → GitHub:
- 勾选 启用
- 填入 Client ID
- 填入 Client Secret
- 点击页面右下角的 保存
保存后无需重启,立刻生效。打开任意一篇博客文章,评论区顶部应该会出现一个 “通过 GitHub 登录” 的按钮。
写在最后
回到上一篇结尾说的那句话——博客最怕的不是没人看,而是自己不知道写什么。现在评论区也有了,你写的东西终于有了被回应的可能。
选 Artalk 不选其他方案,说到底和选 Astro 搭博客是一个逻辑:够用就好,数据握在自己手里。云计算时代,“别人的服务”随时可能关停、涨价、改政策,但你把数据放在自己服务器上,这些都不是问题。
当然,自托管也有代价——你需要维护它、升级它、备份它。对我来说,这点“折腾”恰恰是乐子的一部分。否则也不会坐在这里写第二篇教程了
下一步?我可能会折腾邮件通知(有人回复你的评论时自动发邮件)、管理面板的样式微调,或者琢磨一下怎么让评论区更好看一点。等折腾完了,又是一篇文章。