梦畔栖萤
返回文章列表
3245 字17 分钟浏览量: -

为静态博客装上轻量评论:用 Artalk 自建私有化评论系统

折腾#Artalk / 评论系统 / 静态博客 / 自托管 / Docker / Nginx / GitHub OAuth / 博客

前情提要

上篇文章 里,我们从头搭好了一个 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
# 安装 Docker
curl -fsSL https://get.docker.com | sudo bash
# 将当前用户加入 docker 组,省的以后每次都 sudo
sudo usermod -aG docker $USER
# 重新登录使权限生效,或者直接
newgrp docker
# 验证安装
docker --version

其他系统的安装方式可以参考 Docker 官方文档

继续,找一个合适的位置放 Artalk。我把它和博客文件夹放在同一级目录下:

Terminal window
cd ~
mkdir artalk
cd artalk

接着运行以下命令:

Terminal window
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_DEFAULTATK_SITE_URL

但在安装完毕进入管理后台后,务必将站点名和站点网址设置为和你博客的配置完全一致。比如你的博客叫 “xxx’s Blog”,这里就得填 xxx's Blog,一个字都不能差。

编辑生成的 data/artalk.yml,只需要改几个关键项:

Terminal window
sudo nano data/artalk.yml
# 信任的来源域名,填你自己的博客域名
trusted_domains:
- "https://blog.yourdomain.com"
# 如果你的开发和部署不在同一台机器上,还得补上以下两条规则
- "http://localhost:4321"
- "http://你的开发机IP:4321"

这样做主要是为了让 Artalk 后端接受以上域名的跨域请求。

二进制安装

如果你不想用 Docker,二进制部署也很简单。Artalk 是 Go 写的,编译出来就是一个单文件,不依赖任何运行时。

首先 SSH 登录到服务器,创建目录:

Terminal window
cd ~
mkdir artalk
cd artalk

Artalk Releases 页面找到最新的 artalk_linux_amd64.tar.gz(根据你服务器使用的架构选择),用 wget 拉下来:

Terminal window
wget https://github.com/ArtalkJS/Artalk/releases/latest/download/artalk_linux_amd64.tar.gz
tar -xzf artalk_linux_amd64.tar.gz
ls -lh artalk # 确认可执行文件存在

配置内容和上面 Docker 版本基本一致:

trusted_domains:
- "https://blog.yourdomain.com"
# 如果在本地开发机调试,加上下面两条
- "http://localhost:4321"
- "http://你的开发机IP:4321"

注册 systemd 服务

Terminal window
# 先手动测试一下
./artalk server -c artalk.yml

看到 [INFO] listening on 127.0.0.1:23366 就说明一切正常,按 Ctrl + C 退出。

确认没问题后,用 systemd 注册为服务,实现开机自启和后台运行:

Terminal window
sudo nano /etc/systemd/system/artalk.service
[Unit]
Description=Artalk Comment Server
Documentation=https://artalk.js.org
After=network.target
[Service]
Type=simple
User=username
WorkingDirectory=/home/username/artalk
ExecStart=/home/username/artalk/artalk server -c /home/username/artalk/artalk.yml
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5s
Restart=on-failure
RestartSec=5
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
[Install]
WantedBy=multi-user.target

[!NOTE] 几个值得关注的新增选项

  • ExecReload / ExecStop:优雅地重载和停止服务,而不是直接 kill 进程
  • LimitNOFILE / LimitNPROC:提高文件和进程数上限,避免高并发时瓶颈
  • PrivateTmp=true / ProtectSystem=full:隔离临时目录和系统文件,即使 Artalk 被攻破也无法篡改系统
  • Restart=on-failure:仅在异常退出时自动重启,避免覆盖你手动 systemctl stop 的操作
Terminal window
sudo systemctl daemon-reload
sudo systemctl enable --now artalk
sudo systemctl status artalk

看到 active (running) 就搞定了。

创建管理员账户

无论选择哪种部署方式,都需要创建一个管理员账户来管理评论。

Terminal window
# 转到你的 artalk 所在文件夹
cd artalk
# Docker 用户
docker exec -it artalk artalk admin
# 二进制用户
./artalk admin

按提示输入用户名、邮箱和密码。这个账户用来登录 Artalk 的后台管理面板,管理评论、审核、站点设置等。

[!CAUTION] 注意 填写信息时请务必小心——输入过的内容无法修改。但凡按错一个字母,只能 Ctrl + C 重新来过。

验证运行状态

确认服务正常运行:

Terminal window
# Docker 用户
docker ps --filter name=artalk
docker 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/ 路径下。这样做有两个好处:

  1. 同域访问——前端 JS 请求 /artalk/ 就是同域请求,不存在跨域问题,省去一堆 CORS 配置
  2. 复用证书——同域意味着直接复用博客的 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_passhttp://127.0.0.1:8080/ 后面那个 / 不能省,它会让 Nginx 把 /artalk/xxx 转发到后端的 /xxx。如果漏了,后端收到的请求会是 /artalk/xxx,导致路由匹配不上。

最后检查并重载:

Terminal window
sudo nginx -t
sudo 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,
},
};

就这么简单。保存后重新构建:

Terminal window
pnpm build

现在访问任意一篇文章,滑到最底下——评论区就在那里了。试试发一条测试评论吧:填上昵称和邮箱,随便写点什么,点击提交。搞定,你的博客现在会倾听,也会回应了。

想确认一切正常?打开 https://blog.yourdomain.com/artalk/,用刚才创建的管理员账户登录,在后台看到你刚发的那条评论静静地躺在那儿——从部署到上线,每一步都踩实了。

Artalk 管理面板

Artalk 的后台管理面板地址就是你的反代地址,即 https://blog.yourdomain.com/artalk/。登录管理面板后,点击左侧的“设置”:

  • 审核评论:可以打开“先审后发”模式,人工过滤后再展示
  • 管理站点:一个 Artalk 实例可以为多个站点服务(如果你有好几个博客的话)
  • 邮件通知:配置 SMTP 后,有人回复你的评论时会自动发邮件通知
  • 数据迁移:支持从 Typecho、WordPress、Valine 等平台导入评论数据
  • 垃圾检测:内置简单的关键词过滤和重复检测

配置头像

评论区的默认头像不好看,不如我们来接入 Gravatar。

  1. 进入管理后台
  2. 设置
  3. 界面配置
  4. 头像 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 应用:

  1. 登录 GitHub,点击右上角头像 → Settings
  2. 左侧边栏拉到最底部,点击 Developer settings
  3. 选择 OAuth AppsNew 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 IDClient Secret

填入管理后台

拿到 Client ID 和 Secret 后,回到 Artalk 管理后台,点击左侧 设置登录GitHub

  1. 勾选 启用
  2. 填入 Client ID
  3. 填入 Client Secret
  4. 点击页面右下角的 保存

保存后无需重启,立刻生效。打开任意一篇博客文章,评论区顶部应该会出现一个 “通过 GitHub 登录” 的按钮。


写在最后

回到上一篇结尾说的那句话——博客最怕的不是没人看,而是自己不知道写什么。现在评论区也有了,你写的东西终于有了被回应的可能。

选 Artalk 不选其他方案,说到底和选 Astro 搭博客是一个逻辑:够用就好,数据握在自己手里。云计算时代,“别人的服务”随时可能关停、涨价、改政策,但你把数据放在自己服务器上,这些都不是问题。

当然,自托管也有代价——你需要维护它、升级它、备份它。对我来说,这点“折腾”恰恰是乐子的一部分。否则也不会坐在这里写第二篇教程了

下一步?我可能会折腾邮件通知(有人回复你的评论时自动发邮件)、管理面板的样式微调,或者琢磨一下怎么让评论区更好看一点。等折腾完了,又是一篇文章。


参考链接

站内

站外

评论