Hexo_Waline切换服务端


Tags: #软件  #Hexo 
Created: 
Updated:

前言

昨天发现自己独立部署的 Waline 存在问题
虽然评论加载速度很快,评论也速度也很快,但用户无法登录
问题在于这个登录的小窗口
Pasted image 20230424125612

登录不上去,查看了控制台,存在跨域问题
这个小窗口上的 URL 虽然是 https,但表单提交请求的后端是 http
个人没能力修改这部分的代码(强行设置 https
只能切换外国的服务端,将其部署到 netlify 来解决

目前评论加载速度、回复速度都下降了,但功能使用都没有什么问题了
总的来说,没有备案国内部署一些服务还是寸步难行

下面记录下实现的过程,记录了一些需要注意的事项
希望能帮助他人绕些坑

参考资料

步骤

以下步骤有部分截图、文案,来源于 Waline 官方文档
个人由于总结需要,懒得再复现截图,这里声明下

分为以下几个步骤

  1. 建立站点:建立用于存放云函数的站点
  2. 数据库配置(用于拿取凭证,配置环境变量,进行数据请求)
  3. 环境变量配置(配置必要参数)
  4. 再部署:修改后需要更新下

建立站点

拉取仓库

Github 仓库先拉取(forkWaline 的仓库代码
可以点击这里:fork

Pasted image 20230424130515
名字建议保持原样不动,修改个人不确定是否有影响

部署站点

登录 :Netlify 控制台

选择 Add new site - Import an exist project 添加网站。
Pasted image 20230424130746
Pasted image 20230424130800

选择刚才 Fork 的仓库,直接创建(环境变量跟官方有点区别,后面再弄)
之后 Netlify 会基于该仓库创建我们的 Netlify 网站。

数据库配置

如果采用 leancloud必须采用国际版,否则后面部署完毕会遇到无法访问的问题
错误提示: TypeError - serverURL option is required for apps from CN region
无法访问中国区链接(没备案)
Snipaste_2023-04-24_01-05-35

迁移

如果不用迁移的,忽略这部分

由于个人独立部署,数据库是 sqlite,所以要迁移到 leancloud
将之前存储评论信息的表导出下
Pasted image 20230424133009
Pasted image 20230424133158
编码采用 utf-8,导出成 csv 文件,保留第一行的名字(字段)后面转换要用
Pasted image 20230424133258

写个 Python 脚本转换成 json
这个说下,SQLiteStudio 虽然也可以转换成 json,但转换后数据结构不符合预期
所以这里需要自己转换下
代码如下,将其中的 example.csv 换成你导出的文件名即可

import csv
import json
from datetime import datetime


# 打开csv文件并读取
with open('example.csv', 'r', encoding='utf-8') as file:
    # 读取csv文件内容到一个列表中
    reader = csv.reader(file)
    rows = [row for row in reader]

# 将第一行作为属性名
keys = rows[0]

# 生成一个列表,存储每一行的数据
result = []
for row in rows[1:]:
    # 将每一行转为字典,用属性名作为键,值为对应列的值
    row_dict = {keys[i]: row[i] for i in range(len(keys))}
    # 移除不需要的属性
    row_dict.pop('id', None)
    row_dict.pop('sticky', None)
    row_dict.pop('pid', None)
    row_dict.pop('rid', None)
    row_dict.pop('user_id', None)
    # 添加ACL属性
    row_dict['ACL'] = {"*": {"read": True, "write": True}}
    # 转换insertedAt属性
    inserted_at = row_dict['insertedAt']
    if inserted_at:
        # 将时间字符串转换为datetime对象
        dt = datetime.strptime(inserted_at, '%Y-%m-%d %H:%M:%S')
        # 将datetime对象转换为ISO 8601格式
        iso_str = dt.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
        # 将转换后的字符串更新到字典中
        row_dict['insertedAt'] = {"__type": "Date", "iso": iso_str}
    # 转换createdAt属性
    created_at = row_dict['createdAt']
    if created_at:
        # 将时间字符串转换为datetime对象
        dt = datetime.strptime(created_at, '%Y-%m-%d %H:%M:%S')
        # 将datetime对象转换为ISO 8601格式
        iso_str = dt.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
        # 将转换后的字符串更新到字典中
        row_dict['createdAt'] = iso_str
    # 转换updatedAt属性
    updated_at = row_dict['updatedAt']
    if updated_at:
        # 将时间字符串转换为datetime对象
        dt = datetime.strptime(updated_at, '%Y-%m-%d %H:%M:%S')
        # 将datetime对象转换为ISO 8601格式
        iso_str = dt.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
        # 将转换后的字符串更新到字典中
        row_dict['updatedAt'] = iso_str
    result.append(row_dict)

# 将字典列表转为json格式
json_data = json.dumps(result, indent=4)



with open('output.json', 'w', encoding='utf-8') as f:
    f.write(json_data)

转换后得到 json 文件
Pasted image 20230424134104

进入 leancloud,找到导入导出
Pasted image 20230424134203
选择导出的文件,类名字修改 Comment,导入即可
Pasted image 20230424134243

迁移还是会存在一点问题,需要手动调整,结尾会讲

凭证

进到应用的设置,拿到凭证

可以看我之前写的这篇:文章,找到配置数据库部分
取得 AppKey 、App id 、以及 MasterKey ,后续要使用到

环境变量配置

部署成功后,进入该站点,点击上面的 setting 进入设置界面
Pasted image 20230424131302
点击侧边的 Environment variables 环境变量,点击 add a variable 添加环境变量
Pasted image 20230424131343

将上述 leancloud 数据库拿到的凭证添加进去(必填项)

LEAN_ID
LEAN_KEY
LEAN_MASTER_KEY

其余变量可以根据个人需要选择添加,可参考这个文档:Waline 环境变量配置

我目前使用:
Pasted image 20230424131745

不要在 Netlify 这里添加邮件的模板变量
就是下面这 4 个不要在这里添加

  1. MAIL_SUBJECT
  2. MAIL_TEMPLATE
  3. MAIL_SUBJECT_ADMIN
  4. MAIL_TEMPLATE_ADMIN

另外以下也无法配置, Netlify 不允许设置
Snipaste_2023-04-24_01-28-50

  1. SITE_NAME
  2. SITE_URL

上述环境变量如果强行配置,就会遇到这个问题:The function "COMMENT" is larger than the 50MB limit. Please consider reducing it.
这里个人踩坑了,之前别人也有踩过,详见:# netlify 添加环境变量后部署报错
前面执行没有问题,但构建那一步铁定会报错上面提到的错误信息

去你 fork 官方仓库的那个仓库,直接在代码中添加环境变量
打开functions
Pasted image 20230424132429
打开 comment.js 进行编辑
Pasted image 20230424132504

点击编辑,将我上面说的无法编辑的,添加在这里即可
采用 process.env.环境变量名=值 的写法
Pasted image 20230424132557

修改完记得保存

再部署

编辑完环境变量后,需要重新部署才生效
选择 Trigger deploy - Deploy site 对网站进行重新部署才能使环境变量生效。
Pasted image 20230424134735

部署成功后,我点击顶部的 Functions 导航栏切换到云函数列表
其中 comment 则是我们部署好的 Waline 服务。点击它进入该云函数的详情页。
Pasted image 20230424134820

在详情页中,Endpoint 列出来的地址即为我们的 Waline 服务的部署地址。
可以点击进行测试,之后在客户端配置就行了

后话

其他部分相对来说来时比较简单的,迁移比较麻烦
虽然写了脚本提高了效率,但其实还不够完美

使用脚本转换后,导入 leancloud ,评论的楼层会乱掉
如下,原本回复应该在对应楼层的下面
Snipaste_2023-04-24_01-37-19

原因:
pid 字段和 rid 字段没有转换过去
因为这两个字段在 sqlite 中是记录对应评论的 id 信息
Pasted image 20230424135505
Pasted image 20230424135500

而在 leancloud,是记录对应评论的 objectId 信息
Pasted image 20230424135759
Pasted image 20230424135812

两者记录的字段不一样
所以脚本转换过程,将其移除了

row_dict.pop('pid', None)
row_dict.pop('rid', None)

这一步暂时只能手动,自己调整楼层

不过数量多的话,想想真是爆炸的工作量
幸好个人评论暂时不多

rid 的值是顶楼对应的 id(找到最顶上的楼层的评论那条的id
pid 对应的是回复那一条信息(找到回复信息的那条的id

因为 leancloudobjectId 是导入后才生成的
脚本这一步暂时没有想到太好的办法解决
或者先用 API 生成对应数量的空数据,再把数据导入进去,好像也是不错的主意
不过想到可能要花费几个小时来写这个想想还是算了,毕竟迁移完了

就这样吧~