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
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