Hexo_Waline切换服务端
前言
昨天发现自己独立部署的 Waline 存在问题
虽然评论加载速度很快,评论也速度也很快,但用户无法登录
问题在于这个登录的小窗口
登录不上去,查看了控制台,存在跨域问题
这个小窗口上的 URL 虽然是 https
,但表单提交请求的后端是 http
个人没能力修改这部分的代码(强行设置 https
)
只能切换外国的服务端,将其部署到 netlify
来解决
目前评论加载速度、回复速度都下降了,但功能使用都没有什么问题了
总的来说,没有备案国内部署一些服务还是寸步难行
下面记录下实现的过程,记录了一些需要注意的事项
希望能帮助他人绕些坑
参考资料
- Netlify 部署 | Waline :本教程在此基础上完善
步骤
以下步骤有部分截图、文案,来源于 Waline 官方文档
个人由于总结需要,懒得再复现截图,这里声明下
分为以下几个步骤
- 建立站点:建立用于存放云函数的站点
- 数据库配置(用于拿取凭证,配置环境变量,进行数据请求)
- 环境变量配置(配置必要参数)
- 再部署:修改后需要更新下
建立站点
拉取仓库
Github
仓库先拉取(fork
) Waline
的仓库代码
可以点击这里:fork
名字建议保持原样不动,修改个人不确定是否有影响
部署站点
登录 :Netlify 控制台
选择 Add new site - Import an exist project
添加网站。
选择刚才 Fork
的仓库,直接创建(环境变量跟官方有点区别,后面再弄)
之后 Netlify 会基于该仓库创建我们的 Netlify 网站。
数据库配置
如果采用 leancloud
,必须采用国际版,否则后面部署完毕会遇到无法访问的问题
错误提示: TypeError - serverURL option is required for apps from CN region
无法访问中国区链接(没备案)
迁移
如果不用迁移的,忽略这部分
由于个人独立部署,数据库是 sqlite
,所以要迁移到 leancloud
中
将之前存储评论信息的表导出下
编码采用 utf-8
,导出成 csv
文件,保留第一行的名字(字段)后面转换要用
写个 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
文件
进入 leancloud
,找到导入导出
选择导出的文件,类名字修改 Comment
,导入即可
迁移还是会存在一点问题,需要手动调整,结尾会讲
凭证
进到应用的设置,拿到凭证
可以看我之前写的这篇:文章,找到配置数据库部分
取得 AppKey
、App id
、以及 MasterKey
,后续要使用到
环境变量配置
部署成功后,进入该站点,点击上面的 setting
进入设置界面
点击侧边的 Environment variables
环境变量,点击 add a variable
添加环境变量
将上述 leancloud
数据库拿到的凭证添加进去(必填项)
LEAN_ID
LEAN_KEY
LEAN_MASTER_KEY
其余变量可以根据个人需要选择添加,可参考这个文档:Waline 环境变量配置
我目前使用:
不要在 Netlify
这里添加邮件的模板变量
就是下面这 4 个不要在这里添加
MAIL_SUBJECT
MAIL_TEMPLATE
MAIL_SUBJECT_ADMIN
MAIL_TEMPLATE_ADMIN
另外以下也无法配置, Netlify
不允许设置
SITE_NAME
SITE_URL
上述环境变量如果强行配置,就会遇到这个问题:The function "COMMENT" is larger than the 50MB limit. Please consider reducing it.
这里个人踩坑了,之前别人也有踩过,详见:# netlify 添加环境变量后部署报错
前面执行没有问题,但构建那一步铁定会报错上面提到的错误信息
去你 fork
官方仓库的那个仓库,直接在代码中添加环境变量
打开functions
打开 comment.js
进行编辑
点击编辑,将我上面说的无法编辑的,添加在这里即可
采用 process.env.环境变量名=值
的写法
修改完记得保存
再部署
编辑完环境变量后,需要重新部署才生效
选择 Trigger deploy
- Deploy site
对网站进行重新部署才能使环境变量生效。
部署成功后,我点击顶部的 Functions
导航栏切换到云函数列表
其中 comment
则是我们部署好的 Waline 服务。点击它进入该云函数的详情页。
在详情页中,Endpoint
列出来的地址即为我们的 Waline 服务的部署地址。
可以点击进行测试,之后在客户端配置就行了
后话
其他部分相对来说来时比较简单的,迁移比较麻烦
虽然写了脚本提高了效率,但其实还不够完美
使用脚本转换后,导入 leancloud
,评论的楼层会乱掉
如下,原本回复应该在对应楼层的下面
原因:pid
字段和 rid
字段没有转换过去
因为这两个字段在 sqlite
中是记录对应评论的 id
信息
而在 leancloud
,是记录对应评论的 objectId
信息
两者记录的字段不一样
所以脚本转换过程,将其移除了
row_dict.pop('pid', None)
row_dict.pop('rid', None)
这一步暂时只能手动,自己调整楼层
不过数量多的话,想想真是爆炸的工作量
幸好个人评论暂时不多
rid
的值是顶楼对应的 id
(找到最顶上的楼层的评论那条的id
)pid
对应的是回复那一条信息(找到回复信息的那条的id
)
因为 leancloud
的 objectId
是导入后才生成的
脚本这一步暂时没有想到太好的办法解决
或者先用 API
生成对应数量的空数据,再把数据导入进去,好像也是不错的主意
不过想到可能要花费几个小时来写这个想想还是算了,毕竟迁移完了
就这样吧~