0 更新记录
- 2024-03-26: 初始版本
- 2024-04-21: 更新禁止用户访问 Waline 的 demo 页面的 Nginx 配置
- 2024-05-10: 更新 MySQL8.4 版本删除 default-authentication-plugin 参数后的 MySQL docker-compose 配置
- 2024-08-20: 更新 MySQL 的 docker-compose 配置,添加
TZ
环境变量修复评论时间显示异常的问题 - 2024-08-20: 更新 MySQL 修改用户身份认证插件的两种方法
- 2024-08-30: 更新 MySQL 修改用户身份认证插件部分内容
Waline 推荐使用 LeanCloud 和 Vercel 部署,但是 Vercel 受限于网络原因访问并不稳定,刷新评论时间较长,还可能会失败。使用 Docker 独立部署方式将 Waline 部署在博客服务器上可以有效地改善加载速度。部署 Waline 首先要准备数据库,这里使用 MySQL 数据库,同样运行在 Docker 中方便管理。
在初次创建 MySQL 数据库时,需要导入 waline.sql 创建初始的表结构,应当按照先后顺序分别创建 MySQL 容器和 Waline 容器。
如果想使用一个 docker-compose.yml 来管理两个容器,可以提前启动一个临时的数据库容器初始化表结构,然后删除这个临时容器,在 docker-compose.yml 中依次以相同配置启动 MySQL 容器和 Waline 容器,通过设置 depends_on 来规定启动顺序,但是 MySQL 初始化时间可能较长,可能会出现错误,参考 (No connections until MySQL init completes),还可以使用 wait-for-it.sh 工具来让 Waline 容器等待 MySQL 容器(通过检查端口是否可用)就绪。
1 MySQL 数据库 Docker 部署
1.1 使用 docker-compose 部署 MySQL 数据库
1.1.1 创建 MySQL 容器
1 | version: "3" |

此处设置了网络 waline_net,并设置external: false
,如果不指定name
,在容器启动时将会创建一个名为 mysql_waline_net 的网络,该名称默认由 docker-compose 文件所在目录名 (docker-compose project name) 和设置的网络 waline_net 组成,指定了name
则会按照该设置命名创建的网络。
这里指定名字的目的是在创建 waline 容器时使用相同名字的网络完成容器间互连。如果不设置name
,即使指定相同的网络 waline_net,由于 waline 容器的 docker-compose 文件与 MySQL 的 docker-compose 文件上级目录名不同,自动生成的网络名也不相同,如果 waline 的设置external: false
,则会创建另一个网络 (waline_waline_net);如果 waline 的设置external: true
,则会提示找不到声明的网络。
此方式创建的网络即使在容器删除后也不会自动删除,确认在没有其他容器使用时可以手动删除
查看所有网络docker network ls
查看网络详细信息docker network inspect <NET_NAME>
,输出的Containers
字段表示正在使用该网络的容器
删除网络docker network rm <NET_NAME>
在最后通过--mysql-native-password=ON
(参考链接)参数加载 mysql-native-password 插件,MySQL8.0 以上的版本默认使用 caching_sha2_password 身份验证插件,但 Waline 客户端并不支持新的插件,需要修改为 native 插件。(2024.08.30 更新:--mysql-native-password=ON
似乎并不是完全替代--default-authentication-plugin
,--mysql-native-password=ON
只是加载了插件,让插件变得可用,没有修改默认的插件,还需要使用 SQL 命令来修改用户的默认认证插件。)
插件的可用状态(ACTIVE/DISABLED)可以使用命令
SHOW PLUGINS;
查看。
启动后进入容器,使用 root 用户登录 MySQL,运行以下命令修改 waline 用户的认证插件。
1 | // 已存在waline用户时,修改waline用户的认证方式 |
如未加载 mysql-native-password 插件,
SHOW PLUGINS;
命令查看状态为 DISABLED。执行ALERT USER …
命令时会遇到ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded
错误。如果在第一次启动容器时没有设置
--mysql-native-password=ON
,可以修改 docker compose 文件后重启容器即可完成加载。
接下来需要使用官方提供的waline.sql 文件初始化数据库,可以选择使用命令操作 (方法一),也可以选择使用数据库管理软件操作 (方法二)。
1.1.2 初始化数据库 (方法一)
下载 waline.sql,保存到 docker-compose 文件所在的目录
使用命令docker compose up -d
创建并运行容器,容器运行后,挂载到容器内部的本地目录./mysql
会自动创建,相关的目录权限也会由 docker 自动处理。

此时可以将 waline.sql 文件复制到./mysql
中,这个 sql 文件需要在容器内运行来初始化数据表。复制时需要使用sudo
,因为 docker 创建的目录本地普通用户没有写入权限。

使用命令docker exec -it <容器名称> bash
进入 Docker 容器内的 bash,查看 waline.sql 文件已经能在容器内/var/lib/mysql/waline.sql
找到。

使用设置的用户名 waline 和对应的密码登录 mysql 命令行mysql -u waline -p
。

使用命令show databases;
查看数据库,需要注意 SQL 命令应当以";"结尾。

指定操作的数据库,导入 waline.sql 文件内容。
1 | use waline_db; |

使用命令show tables;
查看所有的数据表,使用desc <表名>
或show columns from <表名>
来查看初始化的结果。



使用exit
命令退出 sql 命令行,再次输入exit
退出 Docker 环境,至此数据库的初始化已经完成。
1.1.3 初始化数据库 (方法二)
如果担心在命令行中操作数据库会出现错误,还可以借助数据库管理软件操作。这里使用开源的 DBeaver 远程连接服务器上的数据库进行初始化。

连接前应当注意将远程服务器防火墙中对应 MySQL 容器映射到主机的端口 (本文中是 3306) 打开。使用的 MySQL 版本为 8.0 时,还需要设置驱动属性里的allowPublicKeyRetrieval
为TRUE
。

连接成功后打开 SQL 编辑器,将 waline.sql 文件内容 (使用文本编辑器打开) 全部复制到输入框。

点击运行脚本,运行结束后无报错信息即可,展开数据库中的表
选项,可以看到初始化成功的结果。



使用此方法初始化成功后,如后续没有直接操作数据库的需求,建议在服务器防火墙中关闭对应端口的访问权限以增加安全性。
2 Waline Docker 部署
2.1 使用 docker-compose 部署 Waline
1 | version: "3" |
Waline 的配置文件中除了服务器等基础配置外,额外使用 PushPlus 做消息推送,如需使用其他推送服务,对应官网环境变量配置和消息通知修改即可。使用命令docker compose up -d
创建并运行容器,容器运行后可以查看waline_net
的网关 IP 用于 Nginx 反向代理。


2.2 使用 Nginx 反向代理到自定义域名
注意 Nginx 运行在 Docker 容器中时,反向代理的
proxy_pass
不能使用127.0.0.1
或localhost
,可以使用公网 IP,docker0
网桥的 IP,或者指定的子网的网关 IP。上述配置中,在 Nginx 中可以使用公网 IP,docker0 IP:172.17.0.1 或者 waline_net 子网网关 IP:192.168.16.1。
Nginx 反向代理配置如下:
1 | server |
部署结束后可以登录 Waline 管理页面创建管理员账号,后续步骤与其他部署方法相同。
2.2.1 Nginx 配置补丁 - 禁止用户访问 Waline 的 demo 页面
上述配置全部成功后,访问反向代理的自定义域名waline.demo.com
时,会显示 Waline 的 demo 页面,如在部署后不想再显示此页面,不允许其他用户直接访问这个页面可以在 Nginx 配置中稍作修改,屏蔽掉对自定义域名的直接访问。
具体修改为,将原来的location
的匹配规则由/
修改为~* ^/.+
;新增一个精确匹配根路径的规则= /
,直接返回403
。
1 | # 原反代配置 |
对根路径的屏蔽可以用
"= /"
精确匹配,也可以用"/"
利用匹配规则优先级进行配置
设置完成后,重启 Nginx 或重新加载配置即可实现在不影响评论正常功能的情况下,屏蔽对 demo 页面的访问。