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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: "3"

networks:
waline_net:
name: "mysql_waline_net"
external: false

services:
db_mysql:
container_name: mysqldb
image: mysql:8.4
restart: always
environment:
TZ: "Asia/Shanghai"
MYSQL_ROOT_PASSWORD: "root_password" # 数据库root密码
MYSQL_USER: "waline" # 数据库用户
MYSQL_PASSWORD: "waline_password" # 数据库用户密码
MYSQL_DATABASE: "waline_db" # 数据库名
ports:
- 3306:3306
networks:
- waline_net
volumes:
- ./mysql:/var/lib/mysql
command:
# 适用于8.0-8.4(不高于8.4)版本的MySQL
# --default-authentication-plugin=mysql_native_password

# MySQL8.4版本不再使用default-authentication-plugin参数,使用这个参数会导致启动失败
# 需要设置参数mysql-native-password=ON参数加载mysql-native-password插件
--mysql-native-password=ON
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
创建MySQL容器
创建MySQL容器

此处设置了网络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
2
3
4
5
6
7
8
9
10
11
12
13
// 已存在waline用户时,修改waline用户的认证方式
ALTER USER 'waline'@'localhost' IDENTIFIED WITH mysql_native_password BY 'waline_password';
// 或者 ('waline'@'%' 表示从远程连接的waline用户,'%'不包括'localhost'
ALTER USER 'waline'@'%' IDENTIFIED WITH mysql_native_password BY 'waline_password';

// 如果创建容器时不创建用户(在docker-compose文件中不设置`MYSQL_USER`和`MYSQL_PASSWORD`)
// 后续创建用户时指定认证方式
CREATE USER 'waline'@'%' IDENTIFIED WITH mysql_native_password BY 'waline_password';
GRANT ALL PRIVILEGES ON waline_db.* TO 'waline';
flush privileges;

// 查看修改结果
SELECT User,Host,plugin FROM mysql.user;

如未加载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自动处理。

mysql目录自动创建
mysql目录自动创建

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

复制waline.sql文件
复制waline.sql文件

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

在容器内部找到waline.sql
在容器内部找到waline.sql

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

登录mysql
登录mysql

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

查看所有数据库
查看所有数据库

指定操作的数据库,导入waline.sql文件内容。

1
2
use waline_db;
source /var/lib/mysql/waline.sql;
导入waline.sql文件
导入waline.sql文件

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

查看所有表
查看所有表
查看wl_Comment数据表
查看wl_Comment数据表
查看wl_User数据表
查看wl_User数据表

使用exit命令退出sql命令行,再次输入exit退出Docker环境,至此数据库的初始化已经完成。

1.1.3 初始化数据库(方法二)

如果担心在命令行中操作数据库会出现错误,还可以借助数据库管理软件操作。这里使用开源的DBeaver远程连接服务器上的数据库进行初始化。

DBeaver配置连接
DBeaver配置连接

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

DBeaver配置驱动属性
DBeaver配置驱动属性

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

DBeaver连接成功
DBeaver连接成功

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

运行SQL脚本
运行SQL脚本
SQL脚本运行成功
SQL脚本运行成功
已成功创建数据表
已成功创建数据表

使用此方法初始化成功后,如后续没有直接操作数据库的需求,建议在服务器防火墙中关闭对应端口的访问权限以增加安全性。

2 Waline Docker部署

2.1 使用docker-compose部署Waline

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
26
27
28
29
30
31
32
33
34
35
36
version: "3"

networks:
waline_net:
name: "mysql_waline_net"
external: true

services:
waline:
container_name: waline
image: lizheming/waline:latest
restart: always
networks:
- waline_net
ports:
- 8360:8360
volumes:
- ${PWD}/data:/app/data
environment:
TZ: "Asia/Shanghai"
MYSQL_HOST: db_mysql # 使用MySQL容器的services
MYSQL_PORT: "3306" # MySQL容器内部端口
MYSQL_DB: "waline_db" # MySQL数据库名
MYSQL_USER: "waline" # MySQL用户名
MYSQL_PASSWORD: "waline_password" # MySQL密码
SITE_NAME: "DEMO_BLOG" # 网站名,会在消息推送中显示
SITE_URL: "https://blog.demo.com" # 网站URL
AUTHOR_EMAIL: "" # 博主邮箱,用来区分发布的评论是否是博主
LOGIN: "" # 登录后才能评论(force)
IPQPS: 30 # 基于IP的评论发布频率限制,单位为秒
DISABLE_REGION: "true" # 是否隐藏评论者的归属地
DISABLE_USERAGENT: "false" # 是否隐藏评论者的UA
SECURE_DOMAINS: "" # 安全域名配置, 逗号分隔多条
COMMENT_AUDIT: "yes" # 评论发布审核开关
PUSH_PLUS_KEY: "keykeykey" # pushplus用户token
PUSH_PLUS_CHANNEL: "wechat" # pushplus发送渠道

Waline的配置文件中除了服务器等基础配置外,额外使用PushPlus做消息推送,如需使用其他推送服务,对应官网环境变量配置消息通知修改即可。使用命令docker compose up -d创建并运行容器,容器运行后可以查看waline_net的网关IP用于Nginx反向代理。

查看docker0 IP
查看docker0 IP
查看waline_net网关IP
查看waline_net网关IP

2.2 使用Nginx反向代理到自定义域名

注意Nginx运行在Docker容器中时,反向代理的proxy_pass不能使用127.0.0.1localhost,可以使用公网IP,docker0网桥的IP,或者指定的子网的网关IP。上述配置中,在Nginx中可以使用公网IP,docker0 IP:172.17.0.1或者waline_net子网网关IP:192.168.16.1。

Nginx 反向代理配置如下:

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
26
27
28
29
30
31
32
33
34
server
{
listen 443 ssl http2;
server_name waline.demo.com;

# SSL设置
# 证书及私钥
ssl_certificate fullchain.cer;
ssl_certificate_key demo.com.key;
# 缓存超时时间
ssl_session_timeout 5m;
# 加密套件的类型
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# 可用的TLS协议的类型
ssl_protocols TLSv1.2 TLSv1.3;
# 优先使用服务器端加密套件
ssl_prefer_server_ciphers on;
# 启用HTTP严格传输安全HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

# proxy to 8360
location / {
# nginx部署在docker中时,反代宿主机或其他容器中的服务时不能使用127.0.0.1
proxy_pass https://172.17.0.1:8360;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
add_header Cache-Control no-cache;
expires 12h;
}
}

部署结束后可以登录Waline管理页面创建管理员账号,后续步骤与其他部署方法相同。

2.2.1 Nginx配置补丁-禁止用户访问Waline的demo页面

上述配置全部成功后,访问反向代理的自定义域名waline.demo.com时,会显示Waline的demo页面,如在部署后不想再显示此页面,不允许其他用户直接访问这个页面可以在Nginx配置中稍作修改,屏蔽掉对自定义域名的直接访问。

具体修改为,将原来的location的匹配规则由/修改为~* ^/.+;新增一个精确匹配根路径的规则= /,直接返回403

1
2
3
4
5
6
7
8
9
# 原反代配置
location ~* ^/.+ {
proxy_pass http://172.17.0.1:8360;
# ...原反代配置...
}
# 屏蔽根路径访问
location = / {
return 403;
}

对根路径的屏蔽可以用"= /"精确匹配,也可以用"/"利用匹配规则优先级进行配置

设置完成后,重启Nginx或重新加载配置即可实现在不影响评论正常功能的情况下,屏蔽对demo页面的访问。


本站由 @gsh1209 使用 Stellar 主题创建
Copyright © 2023 - BG3LNT.XYZ
Favicon图标来自 @ChenCJ
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处
正在计算运行时间...

蒙ICP备2022000455号-2