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创建初始的表结构,这里按照先后顺序分别创建数据库容器和Waline容器。*如果想使用一个docker-compose文件来管理两个容器,可以提前启动一个临时的数据库容器初始化表结构,然后删除这个临时容器,在docker-compose文件中依次以相同配置启动MySQL容器和Waline容器,通过设置depends_on来规定启动顺序,但是MySQL初始化时间可能较长,可能会出现错误,参考(No connections until MySQL init completes)。
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页面的访问。