应用artalk评论区
文档目标
本文档旨在完整阐述如何在基于 Jekyll 构建的个人博客(域名:klizzz.com)中集成 Artalk 评论系统。
包括:Artalk 服务端的 Docker 部署、MySQL 适配、Nginx 反向代理配置、博客前端集成,以及后期的维护与故障排查方法。
通过本文档,可实现每篇博文的评论功能落地,并掌握 Artalk 系统的基本运维能力。
一、背景介绍
1. Artalk 是什么
Artalk 是一款开源的自托管评论系统,基于 Go 语言开发(服务端)+ JavaScript(前端)构建,具备轻量、无第三方依赖(可完全私有化部署)、支持 Markdown、多站点管理、数据存储适配 SQLite/MySQL 等特性。相比Disqus、Gitalk 等评论工具,Artalk 无需依赖第三方平台账号(如 GitHub),且部署和运维成本低,适合个人博客、小型站点使用。
官方仓库:https://github.com/ArtalkJS/Artalk
| 官方文档:[📦 程序部署 | Artalk](https://artalk.js.org/zh/guide/deploy.html) |
2. 博客现状与需求
本文适配的博客基于 Jekyll 框架构建,部署在blog.klizzz.com子域名下,主域名klizzz.com通过 Nginx 反向代理嵌入博客内容。
博客的详细信息和搭建过程见文档:部署个人博客
Jekyll-Chirpy 原有架构无评论功能,需通过部署 Artalk 服务端、配置 Nginx 反向代理、修改博客模板(post.html)实现评论区功能。
二、Artalk 实现
1. 环境
- 服务器配置:Ubuntu 2c2g
- 服务器环境:Docker、MySQL、Nginx
- 端口开放:8080(Artalk 所需的正式端口)、23366(Artalk 默认端口);
2. Artalk 服务端部署(Docker方式)
2.1 目录准备
创建 Artalk 专属目录,用于存放配置文件和数据(后续挂载到 Docker 容器):
1
mkdir -p /var/artalk && cd /var/artalk
切换到为 ArTalk 创建的目录中:
1
cd /var/artalk
2.2 启动 Artalk 容器
先启动容器,验证基础服务可用性:(默认是 SQLite 的数据库)
1
2
3
4
5
6
7
docker run -d \
--name artalk \
--restart always \
--network host \
-v $(pwd)/artalk.yml:/app/artalk.yml \
-v $(pwd)/data:/data \
artalk/artalk-go
- 参数说明:
--network host:使用主机网络,容器直接监听服务器8080端口;-v $(pwd)/artalk.yml:/app/artalk.yml:挂载配置文件到容器内;-v $(pwd)/data:/data:挂载数据目录(SQLite数据库/日志等)。
上面的命令合并为一行:
1
docker run -d --name artalk --restart always --network host -v $(pwd)/artalk.yml:/app/artalk.yml -v $(pwd)/data:/data artalk/artalk-go
2.3 验证服务启动
检查 8080/23366 端口是否被 Artalk 监听:(我在实操过程中发现默认端口号是 23366)
1
2
netstat -tulnp | grep 8080
netstat -tulnp | grep 23366
若输出包含 artalk-go 进程,说明启动成功;若失败,查看容器日志:
1
docker logs artalk
3. Artalk 配置修改(适配MySQL)
默认 Artalk 使用 SQLite 存储数据,为提升数据可靠性和可维护性,按照如下步骤修改为 MySQL 存储。
3.1 编辑配置文件
修改/var/artalk/artalk.yml(无则新建),重点配置数据库部分:(配置文件以服务器实际运行为准)
1
2
3
4
5
6
7
8
9
10
11
12
13
# Database 配置段
db:
type: mysql # 数据库类型改为mysql(默认sqlite)
file: ./data/artalk.db # SQLite路径保留(不影响MySQL使用)
table_prefix: "" # 表前缀(可选,如atk_)
name: artalk # MySQL数据库名(需提前手动创建)
host: localhost # MySQL地址(本地/远程IP)
port: 3306 # MySQL端口(默认3306)
user: root # MySQL用户名(需提前创建好)
password: "你的MySQL密码" # 密码(特殊字符需转义,保留引号)
charset: utf8mb4 # 字符集(兼容emoji)
ssl: false # 无需SSL则关闭
prepare_stmt: true # 开启预编译语句(性能优化)
3.2 重启容器使配置生效
1
docker restart artalk
其它可能会用到的命令:
1
2
3
4
# 停止容器:
docker stop artalk
# 删除容器:
docker rm artalk
4. 创建 Artalk 管理员账号
通过容器命令行创建 Artalk 管理员账号(用于登录 Artalk 后台管理评论):
1
docker exec -it artalk artalk admin
按提示输入:
- Username:管理员用户名(如 admin);
- Email:登录邮箱(用于后台登录);
- Password:登录密码;
- Retype Password:确认密码。
5. Nginx 反向代理配置(对外暴露Artalk)
按照上述操作后,Artalk 服务端现已在监听 8080 端口,需通过 Nginx 反向代理将https://klizzz.com/artalk/ 映射到内网 8080 端口,实现 HTTPS 访问,以保证服务正常。
5.1 修改 Nginx 配置文件
修改主域名的 Nginx 的配置文件:/etc/nginx/conf.d/klizzz.com.conf
在主域名 klizzz.com 的 server 块中新增 Artalk 代理配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# ......其它配置......
# ============ 主门户域名配置(klizzz.com核心配置)============
server {
server_name www.klizzz.com klizzz.com;
listen 443 ssl;
# 网站根目录:
root /var/www/klizzz.com;
index portal/index.html index.html index.htm;
# ......其它原配置......
# 2026年4月28日 增加 Artalk 代理
location /artalk/ {
proxy_pass http://127.0.0.1:8080/;
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;
}
# ......其它原配置......
}
# ......其它配置......
5.2 验证Nginx配置并重启
1
2
nginx -t # 验证配置语法
systemctl restart nginx # 重启Nginx
6. 博客前端集成 Artalk(修改Jekyll模板)
修改博客的模板配置文件:/var/myblog/blog/_layouts/post.html
在 div.content 标签内、文章内容后添加以下代码:(实际代码以服务器线上版本为准)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- Artalk评论区(2026年4月28日新增) -->
<link href="https://www.klizzz.com/artalk/dist/Artalk.css" rel="stylesheet" />
<script src="https://www.klizzz.com/artalk/dist/Artalk.js"></script>
<div id="Comments"></div>
<script>
// 初始化Artalk评论区
Artalk.init({
el: '#Comments', // 绑定评论区DOM元素
pageKey: window.location.pathname, // 页面唯一标识(URL路径)
pageTitle: document.title, // 页面标题(自动获取)
server: 'https://www.klizzz.com/artalk', // Artalk服务端地址(Nginx代理后)
site: 'blog4klizzz', // Artalk站点名(与服务端配置一致)
})
</script>
修改模板后,重新构建 Jekyll 博客使配置生效:
1
2
cd /var/myblog/blog
jekyll build # 生成静态文件到_site目录
三、后期维护指南
1. 日常运维命令
1.1 Artalk 容器管理
1
2
3
4
5
6
7
8
# 重启Artalk
docker restart artalk
# 停止并删除Artalk容器(如需重装)
docker stop artalk && docker rm artalk
# 查看Artalk日志(排查故障)
docker logs -f artalk # -f 实时查看日志
1.2 数据备份
- MySQL 数据:定期备份
artalk数据库(如使用mysqldump); - Artalk 配置:备份
/var/artalk/artalk.yml; - Docker 数据卷:备份
/var/artalk/data目录(含日志/临时文件)。
2. 常见问题排查
2.1 评论区无法加载
- 检查 Nginx 代理配置:确认
/artalk/路径反向代理到 8080 端口,且 Nginx 已重启; - 检查 Artalk 容器状态:
docker ps确认artalk容器运行中; - 检查浏览器控制台:F12 查看是否有 JS/CSS 加载失败(如跨域、404);
- 检查 Artalk 服务端日志:
docker logs artalk查看是否有数据库连接错误。
2.2 评论提交失败
- 确认 Artalk 站点名:前端
site配置需与服务端管理员创建的站点名一致; - 检查 MySQL 权限:确认 Artalk 配置的 MySQL 账号有
artalk数据库的读写权限; - 检查端口放行:服务器防火墙/安全组未屏蔽 8080 端口(内网)、443 端口(外网)。
2.3 管理员无法登录
- 重新创建管理员账号:
docker exec -it artalk artalk admin重置密码; - 检查 Artalk 配置:确认
server地址正确(需带/artalk后缀)。
3. 版本升级
Artalk 版本更新时,按以下步骤升级:
- 停止旧容器:
docker stop artalk && docker rm artalk; - 拉取最新镜像:
docker pull artalk/artalk-go; - 重新启动容器(与部署的命令一致):
1 2 3 4 5 6 7
docker run -d \ --name artalk \ --restart always \ --network host \ -v $(pwd)/artalk.yml:/app/artalk.yml \ -v $(pwd)/data:/data \ artalk/artalk-go
4. 头像
所有登录用户的头像现在都只显示一个默认 “拉取不到” 的头像,太丑了。
后续看看有没有办法改成一个随机或是默认的什么头像。
四、相关理论知识
1. 反向代理的作用
本文中 Nginx 反向代理/artalk/路径的核心价值:
- 协议转换:将外网 HTTPS 请求转换为内网 HTTP 请求(Artalk 服务端仅监听 8080 端口,无 HTTPS);
- 端口隐藏:对外仅暴露 443 端口,避免 8080 端口直接暴露在公网,提升安全性;
- 域名统一:评论系统与博客使用同一域名(klizzz.com),避免跨域问题。
2. Docker 部署的优势
- 环境隔离:Artalk 的运行环境(Go、依赖库)与服务器系统隔离,避免版本冲突;
- 快速部署/回滚:无需手动编译 Go 代码,通过镜像一键部署,回滚仅需重启旧版本容器;
- 自启动:
--restart always确保服务器重启后 Artalk 自动恢复运行。
3. 数据存储选型(SQLite vs MySQL)
- SQLite:轻量、无需额外部署,适合小流量博客,但并发性能低、数据备份较繁琐;
- MySQL:适合中高流量场景,支持远程访问、数据备份/恢复更成熟,本文选择 MySQL 以提升可维护性。
4. Jekyll 模板集成原理
Jekyll 是静态站点生成器,post.html作为文章模板,所有文章都会继承该模板的结构。在模板中嵌入 Artalk 前端代码后,每篇文章生成静态 HTML 时都会包含评论区 DOM 和初始化脚本,从而实现所有文章的评论功能统一落地。
5. Artalk 中的 “站点”
用于区分不同业务维度的核心标识,一个 Artalk 服务端可同时为多个独立网站/博客提供评论服务,通过“ 站点名” 隔离不同站点的评论数据。例如本文中配置的blog4klizzz(前端)/klizzz's blog(测试用)即为 Artalk 为当前博客分配的唯一站点标识,所有该博客的评论数据都会关联到这个站点名下,避免与其他站点数据混淆。