Hexo定制之家宽部署artalk评论

网站部署artalk评论系统,接收用户评论

实现方法

hexo部署Artalk
用J4125里面的宝塔面板的Docker

宝塔在debian服务器上
debian服务器上镜像Docker对应目录/data/artalk

灵感来源

从源文档默认使用docker -d 方式运行;服务器几次重启后,发现每次都需要手动去运行,很麻烦(也导致服务中断)
改用下面的Docker Compose的方式部署
20231119 重启整个J4125,仍然无效; 一设置如下修改指令,等待未来再次测试

1
2
#已启动容器通过 docker update 对设置 restart 选项
docker update --restart=always artalk

Docker Compose 部署

SSH里面:
cd 切换到想要安装artalk的数据目录
提供 docker-compose.yaml 文件可供参考:

1
2
3
4
5
6
7
8
9
10
11
version: "3.5"
services:

artalk:
container_name: artalk
image: artalk/artalk-go
restart: always
ports:
- 8282:23366
volumes:
- ./data/artalk:/data

在与配置文件相同的目录执行命令创建容器:

1
docker-compose up -d

转化 docker run 为 docker-compose

在线工具: Docker run to Docker compose converter

链接:https://it-tools.carlzeng.com:3/docker-run-to-docker-compose-converter

一些 Docker Compose 常用命令

1
2
3
4
5
docker-compose restart  # 重启容器
docker-compose stop # 暂停容器
docker-compose down # 删除容器
docker-compose pull # 更新镜像
docker-compose exec artalk bash # 进入容器

carlzeng@Debian11:/data/artalk$ ls
artalk.db artalk.yml

http://192.168.@@@:82/sidebar/#/login

carlzeng@Debian11:/$ docker exec -it artalk artalk admin
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/artalk/json”: dial unix /var/run/docker.sock: connect: permission denied
carlzeng@Debian11:/$ su
Password:
root@Debian11:/# docker exec -it artalk artalk admin
Error response from daemon: No such container: artalk

检测了BT面板里面的artalk容器配置,发现异常如下:
“Name” : “/q18qdroglehghc”,

用第二种方法:直接在ssh中输入docker命令

在root的根目录下执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker run -d \
--name artalk \
-p 8282:23366 \
-v /data/artalk:/data \
artalk/artalk-go




#每次服务器重启都要手动运行(如果想避免这样就用docker-compose方案):
docker start artalk

#切换使用docker-compose
# /data目录下新建yml文件
docker-compose -f artalk.yml up -d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker exec -it artalk artalk admin

WARN[0000] 未找到 IP 数据库文件:"./data/ip2region.xdb",IP 归属地功能已禁用,参考链接:https://artalk.js.org/guide/frontend/ip-region.html
--------------------------------
Create admin account
--------------------------------
Enter Username: ***
Enter Email: zeng.@icloud.com
Enter Password:
Retype Password:
--------------------------------
Name: ***
Mail: zeng.@icloud.com
--------------------------------

可以在正常在本地提交评论http://localhost:4000/blog/202309222344.html#Next
下一步:

添加到NexT的页脚模版comment位置

done, added in comments.njk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{%- if page.comments %}

<!-- CSS -->
<link href="https://cdn.bootcdn.net/ajax/libs/artalk/2.6.4/Artalk.css" rel="stylesheet">

<!-- JS -->
<script src="https://cdn.bootcdn.net/ajax/libs/artalk/2.6.4/Artalk.js"></script>


<!-- Artalk -->
<div id="Comments"></div>
<script>
Artalk.init({
el: '#Comments', // 绑定元素的 Selector
pageKey: '', // 固定链接 (留空自动获取)
pageTitle: '', // 页面标题 (留空自动获取)
server: 'http://192.168.@@@:82', // 后端地址
site: '@@@@ Notes - Local', // 你的站点名
})
</script>

....
.post-nav { border-bottom: 20px solid $gainsboro; 目前的局限:打开页面以后需要二次刷新页面才会出现评论

修改NexT的电脑端背景色为白色,(同步于手机端样式)

1
2
修改配置文件 
darkmode: false

2023年12月,修改回auto,这样搭配hexo的插件,可以动态适应页面的darkmode状态

映射或反向代理,提供给外网使用:https://chuanzhuo.github.io/blog/

如何给docker中的服务配置二级域名?
https页面可否嵌入http服务?
    需要升级到https
    Nginx Proxy Manager也可以代劳

家宽如何使用Nginx Proxy Manager反向代理 - YouTube https://vt.wooomooo.com/?p=67689
材料清单
    家宽+公网IP
    一级域名?

反向代理步骤
    1. 进入Nginx Proxy Manager官网,获取docker-compose.yml配置文件(需保存为这个文件名)
    1. 到这个docker-compose.yml文件的目录下,执行:docker-compose up -d
        /www/server/panel/data/compose/NginxPorxyManager/template
    1. 进入Nginx Proxy Manager 后台 
        http://192.168.@@@:81/login
    1. 端口转发
        这里的880和4443就是刚才在配置服务器的端口
        openwrt端口转发设置方法
        依次找到:网络–> 防火墙–> 端口转发。
        在新建端口转发设置栏中,输入你要转发的IP、端口和协议等内容。
        点击保存&应用便可即时生效。
        配置好以后,可以用外网IP访问转发的两个端口:
            http://123.118.31.119:880/
            http://123.118.31.119:4443/
    1. 特定域名
        A记录

    1. 配置New Proxy Host 在 Nginx Proxy Manager 后台    
        新增一条a.goodday.cc指向http://192.168.@@@:82


访问http://a.goodday.cc:880/
http://a.goodday.cc:4443/
错误:
    504 Gateway Time-out
    openresty

很大可能现在面临的问题是letsencrypt.org无法成功申请证书
有没有其他的SSL免费证书可用?


https://a.goodday.cc:4443/
错误:
    This site can’t be reachedThe webpage at https://a.goodday.cc:4443/ might be temporarily down or it may have moved permanently to a new web address.
    ERR_SSL_UNRECOGNIZED_NAME_ALERT

转换思路,取得域名
成功切换至域名(CF控制的 carlzeng.com)
    https://sharedblog.net/posts/2022-09-28-github-pages-custom-domain-name/

关闭DNS \*泛解析 A记录 的 ‘代理’,才能正常连接到NginxProxyManager的特点端口
等待生效后,方可正常

替换表情包

替换原来的https://cdn.jsdelivr.net/gh/ArtalkJS/Emoticons/grps/default.json
新的:https://cdn.klyang.com/json/emo.json

一有多几个人同时访问时,artalk就奔溃了,如何解决?

    Artalk Error
    Error: 请求超时或意外终止,无法获取评论列表数据
    点击重新获取
ping artalk.carlzeng.com -c4
PING artalk.carlzeng.com (172.67.@@@): 56 data bytes
本机是这种情况,用联通4G网络就能正常访问artalk评论

解决办法:在4G环境下,用管理员登录控制中心,应用一下配置;
重新回到电脑,就正常了,匪夷所思

根据ping结果可知,域名对应的IP正确了;而一段时间后又会变成CF?
ping artalk.carlzeng.com -c4
PING artalk.carlzeng.com (123.119.@@@): 56 data bytes

Artalk置入博客

不要自己修改NexT,测试使用插件:Artalk comment plugin for Hexo NexT
https://github.com/leirock/hexo-next-artalk

npm install hexo-next-artalk

这个插件方案可能可以解决,首页也会冒出评论框的尴尬。
    <script>
    Artalk.init({
      el:        '#Comments',
      pageKey:   '{{page.permalink}}',
      pageTitle: '{{page.title}}',
      server:    '{{theme.post_artalkserver}}',
      site:      '@@@@ Notes'
    })
    </script>

<!-- CSS.comments -->
  <link href="https://cdn.bootcdn.net/ajax/libs/artalk/2.6.4/Artalk.css" rel="stylesheet">
<!-- JS.comments -->
  <script src="https://cdn.bootcdn.net/ajax/libs/artalk/2.6.4/Artalk.js"></script>

  <span class="post-meta-item">
    <span class="post-meta-break"></span>
    <span class="post-meta-item-text">评论数{{__('symbol.colon')}}</span>
    <span id="ArtalkCount"></span>
  </span>

DDNS自动更新域名的最新IP地址

UI访问路径: 打开OpenWrt的管理页面, 服务 》 动态 DNS(DDNS)

URL地址: 192.168.6.1:8080/cgi-bin/luci/admin/services/ddns

新增一条:动态DNS 服务项 » CF_carlzeng_top

检查日志:

1
2
3
4
5
6
7
8
9
10
11
091427       : Registered IP '202.89.@@' detected
091427 info : Starting main loop at 2023-11-03 09:14
091427 : Detect current IP on 'network'
091427 : Current IP '221.218.@@' detected on network 'vwan3'
091427 : Update needed - L: '221.218.@@' <> R: '202.89.@@'
091427 : parsing script '/usr/lib/ddns/update_cloudflare_com_v4.sh'
091427 : #> /usr/bin/curl -RsS -o /var/run/ddns/CF_carlzeng_top.dat --stderr /var/run/ddns/CF_carlzeng_top.err --noproxy '*' --header 'X-Auth-Email: @@@@163.com' --header 'X-Auth-Key: ***PW***' --header 'Content-Type: application/json' --request GET 'https://api.cloudflare.com/client/v4/zones?name=carlzeng.com'
091428 WARN : CloudFlare reported an error:
091428 : {"success":false,"errors":[{"code":6003,"message":"Invalid request headers","error_chain":[{"code":6103,"message":"Invalid format for X-Auth-Key header"}]}],"messages":[],"result":null}
091428 ERROR : IP update not accepted by DDNS Provider
091428 : Waiting 3600 seconds (Check Interval)
update_cloudflare_com_v4.sh

这个设置有一个弊端, 当vwan3没有获取IP地址时(由于我使用了单线多播, 这样这种概率就出现了), 这个DDNS脚本是无法正常运作的.

image-20240818172727506

20240818 这个问题还是不知如何在UI界面上攻克, 估计要写脚本来轮询一个个的虚拟接口, 从一个获得在线pppoe接口稳定的方案中, 来获取外网IP地址. 然后根据这个IP地址定时推送给DDNS服务端

20241113 排查新的错误: Could not detect ‘zone id’ for domain.tld: ‘carlzeng.com’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 101538  note : PID '32710' terminated by 'SIGTERM' at 2024-11-13 10:15
101538 : last update: never
101538 : Detect registered/public IP
101538 : #> /usr/bin/host -t A aria2.carlzeng.com >/var/run/ddns/CF_carlzeng_com.dat 2>/var/run/ddns/CF_carlzeng_com.err
101538 : Registered IP '123.112.249.182' detected
101538 info : Starting main loop at 2024-11-13 10:15
101538 : Detect current IP on 'network'
101538 : Current IP '25.34.237.187' detected on network 'vwan3'
101538 : Update needed - L: '25.34.237.187' <> R: '23.112.249.182'
101538 : parsing script '/usr/lib/ddns/update_cloudflare_com_v4.sh'
101538 : Found Username 'Bearer' using Password as Bearer Authorization Token
101538 : #> /usr/bin/curl -RsS -o /var/run/ddns/CF_carlzeng_com.dat --stderr /var/run/ddns/CF_carlzeng_com.err --noproxy '*' --header 'Authorization: Bearer ***PW***' --header 'Content-Type: application/json' --request GET 'https://api.cloudflare.com/client/v4/zones?name=carlzeng.com'
101539 WARN : Could not detect 'zone id' for domain.tld: 'carlzeng.com'
101539 ERROR : No update send to DDNS Provider
101539 : Waiting 3600 seconds (Check Interval)



------


103544 : Update needed - L: '25.34.237.187' <> R: '23.112.249.182'
103544 : parsing script '/usr/lib/ddns/update_cloudflare_com_v4.sh'
103545 : Found Username 'Bearer' using Password as Bearer Authorization Token
103545 : #> /usr/bin/curl -RsS -o /var/run/ddns/CF_carlzeng_com.dat --stderr /var/run/ddns/CF_carlzeng_com.err --noproxy '*' --header 'Authorization: Bearer ***PW***' --header 'Content-Type: application/json' --request GET 'https://api.cloudflare.com/client/v4/zones?name=carlzeng.com'
103545 WARN : CloudFlare reported an error:
103545 : {"success":false,"errors":[{"code":6003,"message":"Invalid request headers","error_chain":[{"code":6111,"message":"Invalid format for Authorization header"}]}],"messages":[],"result":null}
103545 ERROR : IP update not accepted by DDNS Provider
103545 : Waiting 3600 seconds (Check Interval)


  1. 在Cloudflare的API令牌中, 重新新建新的 令牌, 编辑权限(所有域) https://dash.cloudflare.com/profile/api-tokens
  2. 使用更新的token 配置OpenWrt的DDNS

image-20241113104540241

MAC使用这些命令也无法刷新DNS 返回正确的地址

1
sudo dscacheutil -flushcache;  sudo killall -HUP mDNSResponder

切换WIFI到中国移动, 在ping 就能看到新的IP地址了; 重新切换回来, 新的IP地址也正确了

Cloudflare DNS API

用户 API 令牌
编辑区域 DNS API 令牌已成功创建
复制此令牌以访问 Cloudflare API。为安全起见,将不再显示此令牌。了解更多
7u0Y_5-t_TTn1biQDfdtHgohbE3l@@@@@@。一下为Cloudflare给出的例子:

curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
 -H "Authorization: Bearer 7u0Y_5-t_TTn1biQDfd@@@@@@" \
 -H "Content-Type:application/json" 

DNS TOKEN: 7u0Y_5-t_TTn1biQDfdtHg@@@@@@

10:36am 回归源头错误:
code”:6103,”message”:”Invalid format for X-Auth-Key header

比对了Openwrt中的源文件:
‘/usr/lib/ddns/update_cloudflare_com_v4.sh’
https://github.com/msva/openwrt-packages/blob/master/net/ddns-scripts/files/update_cloudflare_com_v4.sh
发现我Openwrt中的.sh文件已经是最新版,看来还是配置出问题了。

检查.sh源文件,发现的解决问题的办法:
用户名需要使用: Bearer
密码使用:API Token,编辑区域 DNS API 令牌已成功创建

carlzeng.com
10:52am works great in log.
both ddns setup works

优化:查询主机名 最好是填写DDNS挂的解析域名,这样用于判断DDNS是否需要callAPI来更新IP最新的ADSL IP地址。
修改以后,需要点击“重新加载”来更新界面中的“已注册的IP地址“。发现这个LIST设计得很人性化,直观:上次更新,下次更新,查询主机名,已注册的IP地址,运行中的进程PID
优化脚本运行周期:
每小时检查自己DDNS域名的特定记录,检查IP地址和DDNS域名是否一致。
每天强制推送更新,即便IP没有变动

Artalk头像

替换

FROM
https://www.gravatar.com/avatar/

TO

https://dn-qiniu-avatar.qbox.me/avatar/ #https://cdn.lete114.top/img/avatar.png # 头像CDN地址

artalk的头像配置
参考:Hexo-添加Artalk评论教程

优化配置文件CDN

20231215 Frontend resources CDN, you can set this to your preferred CDN

切换:从 cdn.bootcdn.net 到 cdn.staticfile.org;

更新hexo 的_config.yml 如下

1
2
jsUrl: https://cdn.staticfile.org/artalk/2.6.4/Artalk.min.js
cssUrl: https://cdn.staticfile.org/artalk/2.6.4/Artalk.min.css

Email 邮件通知功能

配置的SMTP,一直无法正常发送邮件;不清楚原因是什么?证书?日志呢?如何忽略验证?

1
Artalk (v2.6.4/8867eb2)     

https://github.com/ArtalkJS/Artalk/issues/748

决定需要升级artalk到目前最新版!

1
2
3
docker-compose pull
docker-compose up --remove-orphans
docker image prune

这两条命令就升级到当前最新版本:Artalk (v2.8.3/8af7136)

错误:请求响应 404

Artalk Error Error: 请求响应 404,无法获取评论列表数据
点击重新获取 | 打开控制台

image-20240328164913925

解决办法:

1
404 (未找到) 服务器找不到请求的网页。

反复检查,测试。docker绝对启动都正常了,

严重怀疑是hexo版本滞后导致的请求页面错误?

1
2
3
4
5
6
7
NexT.utils.loadComments(CONFIG.artalk.el)
.then(() => NexT.utils.getScript(CONFIG.artalk.jsUrl, {
condition: window.Artalk
}))
.then(() => {
Artalk.init(CONFIG.artalk);
});

问题变成 :hexo怎么升级?

第二天复盘,server端的artalk是重装的最新版(保留原始数据),应该问题不大,那么就是如何integrate集成hexo的问题了;无非是node端的安装,hexo相关的配置 和 JS client,一一检查过去:

尝试更新hexo的artalk插件:

1
2
3
npm install hexo-next-artalk

# 提示up to date,说明插件已是最新版

无意间注意到_config.yml中引入的artalk是有版本的(是旧的版本)

1
2
3
jsUrl: https://cdnjs.cloudflare.com/ajax/libs/artalk/2.6.4/Artalk.min.js
#https://cdn.staticfile.org/artalk/2.6.4/Artalk.min.js
cssUrl: https://cdnjs.cloudflare.com/ajax/libs/artalk/2.6.4/Artalk.min.css

我必须把它升级到我目前docker-compose pull出来的最新版v2.8.3

果然修改了hexo的配置文件_config.yml中的关于JS和CSS的引用后,成功解除

个性化需求沟通 扫客服加V加群: