artalk是一个自托管的评论系统。优点是功能比较多,能满足大部分需求。缺点是需要自己先有一台独立的应用服务器(Serverless那种不行,因为:https://blog.hzchu.top/2025/%E4%B8%80%E7%A7%8D%E5%9C%A8Vercel%E4%B8%8A%E8%BF%90%E8%A1%8CArtalk%E7%9A%84%E6%80%9D%E8%B7%AF/

判断依据:拥有公网IPv4地址、并能自主安装运行Docker

前置条件准备好以后,下面我们将正片开始,Let’s go!

安装

使用docker来安装:

1
docker pull docker.1panel.live/artalk/artalk-go

依旧是我们的老熟人1panel镜像,如果不行就可以换一个。
安装完成后会显示这个:
宝塔终端

然后你就可以用官网提供的命令通过环境变量携带配置来启动。

1
2
3
4
5
6
7
8
9
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

需要修改ATK_SITE_DEFAULTATK_SITE_URL为你实际的值。

注意:如果你是用1panel镜像安装的,最后一行需要改为docker.1panel.live/artalk/artalk-go

以上是官方的启动示例。如果你觉得麻烦的话最简的启动应该是这样的(你需要在后台手动设置站点):

1
2
3
4
5
docker run -d \
--name artalk \
-p 8080:23366 \
-v $(pwd)/data:/data \
docker.1panel.live/artalk/artalk-go

完成后,在你的公网ip下的8080端口就是Artalk的后台了,如果已经有别的东西使用了8080端口可以换一个。别忘了服务器策略组(防火墙)里面放行端口!
看到这个就成功了:
Artalk后台

配置

本节讲主要的安装和配置流程,技术栈选用EdgeOne来反代回源

设置管理员与站点

你可能会问,默认的管理员账号和密码是什么?我也不知道。
不过你可以通过命令来设置一个管理员账号。

1
docker exec -it artalk artalk admin

在接下来的页面中按照顺序输入你的用户名、邮箱(不需要实际存在,可以随便写)和密码:
管理员创建
密码输入的时候不会显示,务必留意。
一般情况下操作实时生效,如果创建了还登不上重启容器即可。
如果不满意后面还可以改

登录成功后界面默认是英文的,如果看不懂或者不习惯可以改语言。
语言选项
在左边的Settings里面有个Language选项,点击后在下拉菜单里面选择zh-CN,点击Apply。最后浏览器刷新一下就变成中文了。

下一步,找到“站点”那一个选项卡(如果你是通过环境变量指定的那么可以跳过这一步):
站点设置
可以发现它默认自带了一个默认站点。你可以删除它也可以直接建一个新的。
其中:
站点名称是一个任意字符串,用来标识调用者。
站点URLs是一个网页链接,用来前端在“通知中心”点击评论时要跳转到的域,不填留空前端点击的时候目标会变成评论区绑定的域名(未定义行为)。同时也是OAuth登录方式的 可信回调域名。建议同时给localhost也设置一个以便开发调试,使用,进行分隔多个值。我设置的是:https://www.b23.kim,http://localhost(latest[2.9.1]版本这里似乎有bug,跳转只会识别第一个,所以localhost写不写都一样了。但是如果是OAuth回调的话依然正常信任)

如果站点配置和自己接入的实际页面的域名不匹配,OAuth会拒绝回调并拒绝传递Token:
不可信的站点
因此,请配置正确并尝试自己走一遍登录流程。如果你不打算接入OAuth的话这里配置不配置都一样了

前端接入

在前端,对于butterfly主题,你可以这样编辑配置:

1
2
3
4
5
6
7
8
# Artalk
# https://artalk.js.org/guide/frontend/config.html
artalk:
server: #Artalk的后端地址,用于上传评论、获取数据等交互。注意:末尾不要加斜杠
site: #站点名称,填你后台或Docker启动时环境变量设置的
# Use Artalk visitor count as the page view count
visitor: false #是否启用访问人数统计(会替代默认的不蒜子)
option: #其他选项,一般不用管

其他主题或系统可以查看官方教程来配置:https://artalk.js.org/zh/guide/deploy.html

注意:artalk前端默认以https的协议来请求后端,请确保绑定了域名并部署了SSL。如果直接用http请求会失败,浏览器安全要求不允许https站点请求http接口。

以下是EdgeOne的相关配置教程,其他技术栈可以去找其他的相关教程。

EdgeOne反向代理回源

在EO中添加新的域名,核心要点如下:
EdgeOne配置
回源协议用HTTP,端口填上面启动docker映射的8080端口。(这样做就不需要在Artalk后台设置里面配置源站SSL了)

完成后去申请免费SSL证书即可,按钮很明显我就不再赘述了。
最后后端地址直接用你的域名即可,这里不需要加端口号了,因为EO回源已经做了端口转换了。相当于做了一层反向代理了。

到这里还没结束,如果这时候你去访问还是会失败。由于浏览器的安全策略,www.b23.kimservice.b23.kim不是同一个域会拒绝连接。

1
Access to fetch at 'https://service.b23.kim/api/v2/conf' from origin 'http://localhost:4000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

解决方法也很简单,在EO的站点加速->规则引擎中添加以下规则:

没有用的旧设置

EO规则设置
匹配类型选HOST,值填你绑定到能访问后端服务的域名,我这里是service.b23.kim
操作选择修改HTTP响应头,类型增加,头部名称Access-Control-Allow-Origin,值为允许访问的域。

注意:不建议直接设置为*,设置仅能自己站点确保信息安全。

嘶……等我写到这里的时候发现根本不工作啊,响应头为什么没设置上?直到我看了EO的官方文档才发现不能那么写,比较反直觉(What the F**)
必须得这样才行:
EO新设置
也就是说操作这里这种情况下只支持变量。。。
而且操作类型不能是增加,得是设置才行。
参考:https://edgeone.ai/zh/document/46185 (我不确定是不是只有我一个人被坑了)

设置数据库

没有数据库是没办法评论的,要想评论需要先有一个数据库。

淘汰选手1

这里我推荐Supabase,免费大碗足够用!官网:https://supabase.com/

注册登录,初始创建项目会让你设置数据库密码,保存好它。
来到项目首页总览(Projcet Overview),在这个地方往下翻:
Overview

在这个地方点击连接:
Connect to your project

最后点击一下这里:
Connection String
里面这四个就是我们要用到的东西了。
不过免费版只能ipv6访问,不支持v4。也就是说它只有v6公网。这家的数据库能不能用取决于你的服务器是否支持ipv6,不过我这里用的是腾讯云的所以应该没啥问题

1
2
failed to connect to `user=root database=artalk`: [2406:da14:***:****:****:****:****:eae4]:5432
dial tcp [IPv6地址]:5432: connect: network is unreachable

结果还是燃尽了。。。。服务器不支持纯v6网络。那算了,换下一家吧。

OK这次换了tidbcloud。应该没这个问题了(免费计划虽然只有5GB容量,不过也足够评论用了)
这个地方的教程我懒得写了,总之需要注意数据库密码只会在第一次生成的时候才显示,保存好它。
数据库类型选择mysql

数据库配置完成后应该就没问题了,评论不会报错了。

当然你也可以直接用SQLite,最省心

设置ip属地显示

(写完这节才发现问题的诸葛博主):[2.9.1]Artalk 仅兼容 3.0.0 版本之前的 ip2region.xdb 文件。请从以下地址下载,配置的时候去掉下面截图里面所有的新版特有的_v4
https://github.com/lionsoul2014/ip2region/blob/v2.12.0/data/ip2region.xdb
(详见文末「避坑指南:IP属地库版本」)

下载属地数据库xdb文件,然后把它放到和配置文件同级的目录:
属地数据存放位置(这里截图里的是之前我试过的新版v4文件,别用这个)

接下来去artalk后台配置属地相关,也可以手动修改artalk.yml配置文件
artalk后台错误配置

1
{"level":"WARN","ts":"2025-12-29T17:10:15.088+0800","caller":"[config/base.go:203]","msg":"未找到 IP 数据库文件:\"/****/data/ip2region_v4.xdb\",IP 属地功能已禁用,参考链接:https://artalk.js.org/guide/frontend/ip-region.html"}

。。。我服了
其实问题出在挂载目录和实际目录的区别。如果你像我一样用的-v $(pwd)/data:/data \这种方式的挂载,artalk.yml配置里面的应该是/data/ip2region.xdb,而不是文件系统里的全限定路径。
以下是一个正确的配置:

1
2
3
4
ip_region:
enabled: true
db_path: /data/ip2region.xdb #没有_v4
precision: city

在后台是这样的:
artalk后台正确配置(请手动忽略_v4)

主要是注意docker容器里的文件实际路径并不完全总是跟随操作系统里的,这俩不一样。很容易引起混淆。

另外,由于我们不是直接DNS解析的源站ip,而是使用了EdgeOne来反向代理了。这样源站只能获得EO节点的ip地址,而不是访问用户的地址。
因此我们需要配置artalk来正确处理这种情况。
对于EO,这个是他们回源时的默认头文档:https://cloud.tencent.com/document/product/1552/87654
artalk后端服务器配置
我们只需要设置让它读取回源标头EO-Connecting-IP就能获取节点获取的IP了。
对应的配置文件内容:

1
2
3
4
5
6
# Web server
http:
# Body size limit (unit: MB)
body_limit: 100
# Proxy Header (fill `X-Forwarded-For` to get user real IP if behind a trusted reverse proxy or CDN)
proxy_header: "EO-Connecting-IP"

设置完成后需要重启容器才能生效。

邮件推送

你可以配置邮件通知,实现邮件验证码和评论被回复的通知的发送。
本文将以阿里云邮件推送作为示范。

首先去RAM访问控制创建一个用户:https://ram.console.aliyun.com/users
创建RAM用户
这里选择“使用永久 AccessKey 访问”来在创建用户的同时创建接口调用凭据

完成创建

创建完成后请立刻复制AccessKeyAccessSecret,切换页面后将不再能获取。

为了确保安全和可访问性,你需要给予对应的权限:
权限授予
权限名称为AliyunDirectMailFullAccess,仅需授予这一个权限就能发送邮件了

前往阿里云邮件推送产品页,然后点击“申请开通”(免费200封邮件,超出后按每1000封两块钱的费用,还是挺划算的)
地址:https://www.aliyun.com/product/directmail
完成后,在控制台进行添加“发信域名”和“发信地址”。
发信域名是你邮箱@后面的内容,支持顶级和二级。例如b23.kim或者mail.b23.kim这样的二级。
发信地址是你邮箱@前面的内容,例如verify,结合域名就是verify@b23.kim或者verify@mail.b23.kim

回到Artalk后台,在设置 -> 邮件通知
1.编辑“发信人地址”为你阿里云后台配置的地址
2.发送方式方式选择ali_dm
然后在下面的 阿里云邮件推送 那一栏填写三个参数
AccessKeyId:阿里云RAM用户的AccessKey
AccessKeySecret:阿里云RAM用户的AccessSecret
AccountName:你的发件地址,我这里是verify@mail.b23.kim

保存以后,你就能用邮件通知和邮箱类型的社交登录的验证码校验了。
如果许久没有邮件同时,就需要检查是否遇到错误。在https://actiontrail.console.aliyun.com/access-keys/events 可以查看云端调用时的错误日志

接入OAuth登录

在社交登录中有一个OAuth的选项允许你接入列表之外的其他通用登录方式,这一节我们使用Casdoor来实现自定义登录方式的接入。
由于Casdoor采用非标准OAuth接口约定,我们需要“赛博飞线”来强制兼容Artalk,具体配置看这一篇:https://www.b23.kim/details/ce4b38f27c8d.html

在Casoor的后台,找到你要让Artalk登录到的 应用,复制其中的客户端ID客户端密钥
Artalk OAuth
填入这两个参数即可成功接入,域名为Casdoor后端所使用到的域名。
有关Casdoor的搭建请看这篇:https://www.b23.kim/details/808a9f471a72.html

Casdoor需要给Artalk发送登录完成后的回调,Artalk的回调地址填写为https://你的Artalk后端域名/api/v2/auth/{provider}/callback。填写完成后Artalk给Casdoor发起登录请求时会自动带上这个回调地址,不要忘记在Casdoor的 应用 中添加这个路径为可信回调地址(重定向 URLs)

坑点

artalk的后端似乎有点bug,配置改错了就会导致全局崩溃。这种情况下只能通过手动修改配置文件来解决(你连后台都进不去)
如果你找不到配置文件在哪,直接根目录里面全局搜索artalk.yml即可。(不过一般默认在/root/data下面)

而且我更推荐直接改配置文件。因为后端点“应用”会报错fetch error,但其实配置已经应用上了(奇怪的bug)

IP属地的配置,不能直接啥都不改把开关打开就保存,也会导致全局崩溃进不去后台只能改配置文件恢复(好脆弱的说……)
需要参考官方文档配:https://artalk.js.org/zh/guide/frontend/ip-region.html
艹,删库了。 好吧其实并没有,只是这个文档常年没人维护了链接到的资源move了而已。如果你需要配置ip属地显示的话:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region_v4.xdb(不要用这个!)
目前latest(2.9.1)版本的artalk 仅支持3.0.0之前的旧版本xdb。要使用请下载之前的版本:https://github.com/lionsoul2014/ip2region/blob/v2.12.0/data/ip2region.xdb 否则功能将无法启用且日志可能无明确报错。
其他人的讨论

所以我这才意识到IP属地不显示的问题出在了哪,上面配置“ip属地”的部分就别用当时我写的新版本区分v6和v4两个文件的了,用这个兼容旧版只有一个文件的这种吧。artalk这个项目感觉没人维护了都,这种兼容问题日志里面都不报的,我和别人一起排查半天才知道。如果有生之年能看到这个项目更新的话记得看看这个问题修没修。

如果使用了 CDN 或反向代理(如 EdgeOne、Nginx),必须正确配置 proxy_header,否则评论者的 IP 和属地信息将全部显示为代理服务器的信息。