本文原标题《从Vercel逃到Railway》,由于近日使用Docker部署waline成功,所以改为《从Vercel逃到Railway,再到Docker自建waline》
需要着重要说明的一点是,与TzCHZ 逃离WordPress.com的经历与教训:自主建站的重要性 不同,从基于LeanCloud和Vercel的waline转移数据并不产生任何费用😝

前情提要

LeanCloud国际版 宣布不为中国大陆用户提供服务之后,我其实一直在想转移评论系统,只不过限于当时的情况,我不得不将计划向后推迟,开学之后,又沉溺于玩乐无法自拔;当然,大家不要学我,我是个反面教材

Vercel 现在在中国大陆无法访问,所以会选择转移到 Railway ;waline 转移评论还是很简单的,去原来的 waline 后台导出 json 文件后再导入新的 waline 即可,唯一让我不太满意的就是在 Railway 无法使用自己的 MySQL 数据库

之前选择 Railway 纯粹是因为自建 waline 没有成功,既然现在在服务器上用 Docker 部署成功了,之前的 Railway 就沦为了备胎(请为没用几天Railway默哀一秒);不过对于没有服务器的博主来讲,Railway 依然不失为一种选择

独立部署waline

关于独立部署,官方文档中写的很少,比较适合有一定前端经验的人运行,像我这种刚学会C、Python的大学生就很难部署成功, MySQL 设置就是我在折腾独立部署时的产物,这篇文章本来是想记录一下独立部署waline的,结果因为我没部署成功,所以文章标题变成了《从Vercel逃到Railway》,不过我也会记录自己失败的尝试;现在用 Docker 部署成功了,我也要记录自己成功的经验🤪

MySQL在服务器上的设置

我使用的是 MySQL 数据库,其他数据库的设置仅供参考

导入 waline.sql 之前,要先确认你的 MySQL 版本不低于 5.6 ,因为 MySQL 5.5 不支持两个 timestamp 字段同时为 CURRENT_TIMESTAMP ,导入文件时会报错;新建用户之后要去授予用户数据库的访问权,不然也会报错,尽量不要用 root 用户

账户 中,有两个 user 的权限,独立部署仅修改 localhost 的权限会更加安全,但如果数据库与评论系统不在同一个服务器,就需要授权从任何 IP 登陆的 user 账户都有读写 blog-waline 数据库的权限
image.png

只需要给 user 需要访问的数据库权限即可
image.png

Docker部署

尝试 Docker 部署的先决条件:

  1. 确保自己的服务器中已经安装 Docker
  2. 已经按照上一节配置好数据库或使用其他服务商提供的数据库

查看 Docker 版本(验证是否安装了 Docker ):

docker -v

image.png标准输出

之前没有尝试 Docker 部署,是因为官方文档给出的示例使用的是 LeanCloud 数据库,而我并不想继续使用 LeanCloud 数据库,因此一直没有尝试 Docker 部署,最近在看 Docker 文档的时候突然想到既然变量直接写在命令里,那么把数据库改成自己的 MySQL 数据库是不是也可以?

官方给出的 Docker 部署命令如下:

1
2
3
4
5
6
docker run -d \
-e LEAN_ID=xxx \
-e LEAN_KEY=xxx \
-e LEAN_SERVER=https://xxx.com \
-p 8360:8360 \
lizheming/waline

只需参考官方文档中多数据库服务支持一节,稍加修改其中的变量,就可以在 Docker 中使用自己的数据库了;比如我使用的数据库是 MySQL ,那么 Docker 部署命令就应当是如下格式:

1
2
3
4
5
6
docker run -d \
-e MYSQL_DB=xxx \
-e MYSQL_USER=xxx \
-e MYSQL_PASSWORD=xxx \
-p 8360:8360 \
lizheming/waline

同理,官方文档中写明的其他数据库也可以按照类似格式修改;邮件通知需要另行添加变量,参考官方文档邮件通知一节

把修改好的命令丢到服务器中直接运行,等一会儿就好了;如果不介意网址中带端口,那么设置一下防火墙,放开8360端口就能访问你的 waline ,如果想直接使用域名,可以去设置一下反向代理

参考文章:

  1. 使用Docker部署waline
  2. Waline评论服务docker自部署手册 + 无需备案域名配置

docker-compose部署

直接使用 Docker 部署,在添加其他变量(如:邮件通知相关变量)时可能会发生连接不到数据库的情况,所以我认为有必要采取 docker-compose 部署,它的部署也很简单,数据库使用的是官方示例 SQLite ;要想使用 MySQL数据库,还需进一步设置变量,此处不给予演示

如果你和我一样,使用 SQLite数据库,那么仅需简单几步就能部署 waline ;
首先在网站目录下新建docker-compose.yml文件,然后找个好地方下载官方给的waline.sqlite文件,在配置文件中填入变量,连接SSH,在网站目录下,运行

docker compose up

其余就和 Docker 部署是一样的,可以直接跳到配置反向代理一段。

以下是我自己的docker-compose.yml文件内容:

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
# docker-compose.yml
version: '3'

services:
waline:
container_name: waline # docker名称,可以改成自己喜欢的
image: lizheming/waline:latest # 镜像,不建议修改
restart: always
ports:
- 127.0.0.1:8360:8360 #映射到本地的8360端口,可以改
volumes:
- ${PWD}/data:/data # SQLite数据库路径,不包含文件,可以改,如我的数据库就放在了/data路径,而不是官方的/app/data路径
environment:
TZ: 'Asia/Shanghai' # 时区,可以改
SQLITE_PATH: '/data' # SQLite数据库路径,不包含文件,可以改,尽量和上面的路径保持统一
JWT_TOKEN: 'xxx' # 用户登录密钥,随机字符串即可
# 以下是邮件通知的变量,参考官方邮件通知一节,可以删改
SMTP_SERVICE: 'QQ' # 邮件SMTP 邮件发送服务提供商
SMTP_USER: '[email protected]' # SMTP 邮件发送服务的用户名,一般为登录邮箱
SMTP_PASS: 'xxx' # SMTP 邮件发送服务的密码,一般为邮箱登录密码,部分邮箱(例如 163)是单独的 SMTP 密码
SMTP_SECURE: 'true' # 是否使用 SSL 连接 SMTP,不使用则填写‘false’
SITE_NAME: '道之远兮' # 站点名称
SITE_URL: 'https://dzyx.uk' # 站点网址,无论是否启用邮件通知,都建议添加该变量
SECURE_DOMAINS: 'dzyx.uk' # 与站点网址保持一致即可,无需https://
AUTHOR_EMAIL: '[email protected]' # 博主邮箱,用来接收通知邮件

删除Docker

倘若安装了类似宝塔面板之类的 Linux 面板,那么操作会简单得多,我在此处就不多加介绍,仅给出命令行删除 Docker 的方法;

首先查看所有 Docker 找到 waline ,记下它的 ID:

docker ps -a

image.png

停止并删除这个 Docker (替换成你自己的id):

docker stop 3ddebe768d29 && docker rm 3ddebe768d29

再次运行,查看是否成功删除:

docker ps -a

删除Docker镜像

查看 Docker镜像 ID:

docker images

image.png

记下你要删除的 Docker镜像 的 ID,运行(替换成你自己的id):

docker rmi 90188c4f6891

再次运行,查看是否成功删除:

docker images

systemd

可以说是我比较喜欢的方案,但是无论如何配置,最终都是以systemd启动失败告终

参考文章:

  1. 在服务器上直接独立部署 Waline,并使用 systemd 启动
  2. Fluid -25- 独立部署基于 MongoDB 的 Waline

直接运行

最后启动main.js的时候总是显示错误,可能是有些文件没有配置成功?

参考文章:

  1. Waline 服务端独立部署解决方案
  2. Waline 服务端一键独立部署解决方案
  3. 宝塔面板独立部署 Waline 评论系统
  4. 独立部署waline评论系统服务端

Railway

Railway 支持 GitHub 账号登陆,不用伤神费脑地去规避注册时的坑了;但是有一点需要注意,如果没有绑定信用卡升级订阅,那么免费的运行时长很快就会结束

按照官方文档上写的部署就好;但官方写的很简洁,因此我会在此处补充一些没写到或者是没讲明白的地方

生成网址

现在在 Railway 上部署好 waline 之后是不会自动生成网址的,需要我们手动生成,官方文档上写的比较旧,Railway 已经更换了新的界面,域名也不会自动生成了

部署好 waline 之后,项目里会有两个模块,在模块 app -> Settings 稍下方的位置就能看见 Domains ,手动生成一个网址就能完成接下来的操作
image.png

评论通知

如果你想收到评论通知,那么就需要添加一些变量;

在 Railway 中,变量位于 app -> Variables ;具体的变量可以参考官方文档邮件通知一节

添加完变量之后,别忘记重新部署一遍,这样新添加的变量才会生效

导入报错

我从原先基于 LeanCloud 和 vercel 的 waline 中导出 json 文件,在基于 Railway 上的 waline 重新导入时发现总是会卡在54/240,并报错,百思不得其解,waline社区成员也没人能理解我的这个错误
image

后来我通过查看 PostgreSQL 的 Logs 发现有一个评论在导入时出现了问题,将该条评论删除后,再次导入正常;
“整数超出范围”

之后我发现在 /links 页面的评论无法正常加载;关于这点,我通过观察能正常在 /links 页面显示的评论发现,评论指向的链接应该是 /links/index.html 而不是 /links ,只好把评论导出来批量改掉再导入回去(真是折腾啊)

结语

写完使用 Docker 部署 waline ,这篇文章就算是落下帷幕了,不得不说,Docker 就是方便,开始采用直接部署的时候一堆报错,无奈之下才去选择的 Railway;
当然,在自己服务器上部署 waline 也有缺点,就是数据可能会丢失,毕竟不知道哪天自己就把服务器折腾崩了,备份是重中之重;然而人生贵在折腾,我从没想过让自己的人生循规蹈矩

23.05.10 更新:最担心的事情还是发生了,放 Blog 的服务器出了些问题,只备份1月28日及之前的数据,之后的数据全军覆没😭;无奈之下重新启用 Railway

23.09.09 更新:Railway 开始收费,无奈下再次回到了原点(Vercel + Leancloud国际版)

预告:接下来可能会把 Blog 上的图片搬到免费的 Backblaze B2 上,不再使用免费的 SM.MS 服务