artalk的安装和配置保姆级教程
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 | docker run -d \ |
需要修改ATK_SITE_DEFAULT和ATK_SITE_URL为你实际的值。
注意:如果你是用1panel镜像安装的,最后一行需要改为docker.1panel.live/artalk/artalk-go。
以上是官方的启动示例。如果你觉得麻烦的话最简的启动应该是这样的(你需要在后台手动设置站点):
1 | docker run -d \ |
完成后,在你的公网ip下的8080端口就是Artalk的后台了,如果已经有别的东西使用了8080端口可以换一个。别忘了服务器策略组(防火墙)里面放行端口!
看到这个就成功了:
配置
本节讲主要的安装和配置流程,技术栈选用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 | # Artalk |
其他主题或系统可以查看官方教程来配置:https://artalk.js.org/zh/guide/deploy.html
注意:artalk前端默认以https的协议来请求后端,请确保绑定了域名并部署了SSL。如果直接用http请求会失败,浏览器安全要求不允许https站点请求http接口。
以下是EdgeOne的相关配置教程,其他技术栈可以去找其他的相关教程。
EdgeOne反向代理回源
在EO中添加新的域名,核心要点如下:
回源协议用HTTP,端口填上面启动docker映射的8080端口。(这样做就不需要在Artalk后台设置里面配置源站SSL了)
完成后去申请免费SSL证书即可,按钮很明显我就不再赘述了。
最后后端地址直接用你的域名即可,这里不需要加端口号了,因为EO回源已经做了端口转换了。相当于做了一层反向代理了。
到这里还没结束,如果这时候你去访问还是会失败。由于浏览器的安全策略,www.b23.kim和service.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的站点加速->规则引擎中添加以下规则:
没有用的旧设置
匹配类型选HOST,值填你绑定到能访问后端服务的域名,我这里是service.b23.kim
操作选择修改HTTP响应头,类型增加,头部名称Access-Control-Allow-Origin,值为允许访问的域。
注意:不建议直接设置为*,设置仅能自己站点确保信息安全。
嘶……等我写到这里的时候发现根本不工作啊,响应头为什么没设置上?直到我看了EO的官方文档才发现不能那么写,比较反直觉(What the F**)
必须得这样才行:
也就是说操作这里这种情况下只支持变量。。。
而且操作类型不能是增加,得是设置才行。
参考:https://edgeone.ai/zh/document/46185 (我不确定是不是只有我一个人被坑了)
设置数据库
没有数据库是没办法评论的,要想评论需要先有一个数据库。
淘汰选手1
这里我推荐Supabase,免费大碗足够用!官网:https://supabase.com/
注册登录,初始创建项目会让你设置数据库密码,保存好它。
来到项目首页总览(Projcet Overview),在这个地方往下翻:
在这个地方点击连接:
最后点击一下这里:
里面这四个就是我们要用到的东西了。
不过免费版只能ipv6访问,不支持v4。也就是说它只有v6公网。这家的数据库能不能用取决于你的服务器是否支持ipv6,不过我这里用的是腾讯云的所以应该没啥问题
1 | failed to connect to `user=root database=artalk`: [2406:da14:***:****:****:****:****:eae4]:5432 |
结果还是燃尽了。。。。服务器不支持纯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文件,然后把它放到和配置文件同级的目录:
接下来去artalk后台配置属地相关,也可以手动修改artalk.yml配置文件
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 | ip_region: |
在后台是这样的:
主要是注意docker容器里的文件实际路径并不完全总是跟随操作系统里的,这俩不一样。很容易引起混淆。
另外,由于我们不是直接DNS解析的源站ip,而是使用了EdgeOne来反向代理了。这样源站只能获得EO节点的ip地址,而不是访问用户的地址。
因此我们需要配置artalk来正确处理这种情况。
对于EO,这个是他们回源时的默认头文档:https://cloud.tencent.com/document/product/1552/87654
我们只需要设置让它读取回源标头EO-Connecting-IP就能获取节点获取的IP了。
对应的配置文件内容:
1 | # Web server |
设置完成后需要重启容器才能生效。
邮件推送
你可以配置邮件通知,实现邮件验证码和评论被回复的通知的发送。
本文将以阿里云邮件推送作为示范。
首先去RAM访问控制创建一个用户:https://ram.console.aliyun.com/users
这里选择“使用永久 AccessKey 访问”来在创建用户的同时创建接口调用凭据
创建完成后请立刻复制AccessKey和AccessSecret,切换页面后将不再能获取。
为了确保安全和可访问性,你需要给予对应的权限:
权限名称为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和客户端密钥。
填入这两个参数即可成功接入,域名为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 和属地信息将全部显示为代理服务器的信息。





















