侧边栏壁纸
博主头像
琉璃红梅 博主等级

琉璃世界,白雪红梅。

  • 累计撰写 44 篇文章
  • 累计创建 90 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Docker系列-Waline的搭建与使用

雪穗
2023-12-17 / 0 评论 / 0 点赞 / 102 阅读 / 0 字
温馨提示:
若部分素材不小心影响到您的利益,请联系我删除。

1.Waline简介

Waline是一款简洁、安全的评论系统。它具有以下特点:

  1. 自由评论:支持完整的Markdown语法,包括表情、数学公式、HTML嵌入等。

  2. 轻量:客户端大小仅为53kb(gzip)。

  3. 强大的安全性:具备内容校验、防灌水和保护敏感数据等功能。

  4. 登录支持:除了允许匿名评论外,还支持账号注册,保持身份。

  5. 文章反应:可以快速表达对文章的态度。

  6. 浏览量统计:通过不到1kb的代码可靠统计文章的浏览量。

  7. 完全免费部署:可以免费部署在Vercel上。

  8. 易于部署:支持多种部署方式和存储服务。

Waline的官网:https://waline.js.org/

主要是我使用的joe3.0博客支持了Waline评论,因为Halo默认的评论不支持Markdown语法,并且白天/黑夜模式切换时存在样式问题。

2.Waline的安装

安装前提:

1.已经安装好docker和docker compose,请参看我的博文 docker系列-docker与docker compose安装

2.已经安装好数据库连接软件或工具(可选)

3.备好服务器(Vercel或其它不需要服务器的部署方式,请参考官网)

安装建议:

1.将所有docker项目放在统一目录 /root/data/docker_data/ 下,方面后期管理与维护

2.添加SWAP虚拟内存,请参看我的博文 添加 SWAP 虚拟内存

3.安装好MYSQL数据库与数据库连接软件或工具

2.1 创建安装目录

mkdir -p /root/data/docker_data/waline

2.2 创建docker-compose.yaml文件并上传至服务器

上传docker-compose.yaml文件到waline目录下,docker-compose.yaml文件内容如下:

2.2.1 直接用root登录MYSQL数据库(本文采用的方式)
version: '3.8'
services:
  web:
    image: 'lizheming/waline'
    restart: always
    ports:
      - '8360:8360'     # 端口映射,左边为服务器对外开放端口(可以修改),右边为docker内部端口(不能修改)
    volumes:
      - ${PWD}/data:/app/data    #地址映射
    environment:
      MYSQL_DB: 'waline'                    # MYSQL数据库的名称
      MYSQL_USER: 'root'                    # 以root连接MYSQL数据库
      MYSQL_PASSWORD: 'password1***'        # MYSQL的root密码
      MYSQL_HOST: 'db'
      MYSQL_PORT: '3306'
      AUTHOR_EMAIL: 'email@163.com'        # 你的邮箱
      SITE_NAME: '琉璃红梅'                 # waline站点的名称
      SENDER_NAME: '雪穗'                   # 评论时的昵称
      SITE_URL: 'https://www.sqwfly.top'  # 点击昵称后的跳转链接
      SMTP_SERVICE: '163'                  # 可以查询支持的服务商,也可以用qq等邮箱
      SMTP_USER: 'email@163.com'           # 提供SMTP服务的邮箱,用于邮箱注册时的验证,需要登录邮箱开启SMTP服务
      SMTP_PASS: 'password2***'            # 提供SMTP服务的邮箱的授权码,这里是授权密码而非邮箱密码
      SMTP_SECURE: 'true'
      LEVELS: '0,10,20,50,100,200'
      DISABLE_USERAGENT: 'true'            # 是否开启浏览器标识
      DISABLE_REGION: 'false'              #是否隐藏评论者的归属地
      IPQPS: '30'                          #ip发言频率

  db:
    image: 'mysql:5.7'
    restart: always
    ports:
      - '3308:3306'                        # 端口映射,左边为服务器对外开放端口(可以修改),右边为docker内部端口(不能修改)
    volumes:
      - ${PWD}/mysql/conf:/etc/mysql/conf.d 
      - ${PWD}/mysql/logs:/var/log/mysql 
      - ${PWD}/mysql/data:/var/lib/mysql 
    environment:
      TZ: 'Asia/Shanghai'  #时区是使用了世界标准时间(UTC)。因为在中国使用,所以需要把时区改成东八区的。
      MYSQL_ROOT_PASSWORD: 'password1***'  # MYSQL的root密码
      MYSQL_DATABASE: 'waline'             # MYSQL数据库的名称
2.2.2 使用非root登录MYSQL数据库
version: '3.8'
services:
  web:
    image: 'lizheming/waline'
    restart: always
    ports:
      - '8360:8360'     # 端口映射,左边为服务器对外开放端口(可以修改),右边为docker内部端口(不能修改)
    volumes:
      - ${PWD}/data:/app/data              #地址映射
    environment:
      MYSQL_DB: 'waline'                   # MYSQL数据库的名称
      MYSQL_USER: 'sqwfly'                 # 使用哪个用户名连接MYSQL数据库,也可以用root,与下方db中设置保持一致
      MYSQL_PASSWORD: 'password1***'       # 用户名为MYSQL_USER的登录密码,如果是root就填写root密码,与下方db中设置保持一致
      MYSQL_HOST: 'db'                     # MySQL服务的地址,默认为127.0.0.1
      MYSQL_PORT: '3306'                   # MYSQL服务的端口
      AUTHOR_EMAIL: 'email@163.com'        # 你的邮箱
      SITE_NAME: '琉璃红梅'                 # waline站点的名称
      SENDER_NAME: '雪穗'                   # 评论时的昵称
      SITE_URL: 'https://www.sqwfly.top'  # 点击昵称后的跳转链接
      SMTP_SERVICE: '163'                  # 可以查询支持的服务商,也可以用qq等邮箱
      SMTP_USER: 'email@163.com'           # 提供SMTP服务的邮箱,用于邮箱注册时的验证,需要登录邮箱开启SMTP服务
      SMTP_PASS: 'password2***'            # 提供SMTP服务的邮箱的授权码,这里是授权密码而非邮箱密码
      SMTP_SECURE: 'true'
      LEVELS: '0,10,20,50,100,200'
      DISABLE_USERAGENT: 'true'            # 是否开启浏览器标识
      DISABLE_REGION: 'false'              #是否隐藏评论者的归属地
      IPQPS: '30'                          #ip发言频率

  db:
    image: 'mysql:5.7'
    restart: always
    ports:
      - '3308:3306'                        # 端口映射,左边为服务器对外开放端口(可以修改),右边为docker内部端口(不能修改)
    volumes:
      - ${PWD}/mysql/conf:/etc/mysql/conf.d 
      - ${PWD}/mysql/logs:/var/log/mysql 
      - ${PWD}/mysql/data:/var/lib/mysql 
    environment:
      TZ: 'Asia/Shanghai'  #时区是使用了世界标准时间(UTC)。因为在中国使用,所以需要把时区改成东八区的。
      MYSQL_ROOT_PASSWORD: 'password3***'  # MYSQL的root密码
      MYSQL_DATABASE: 'waline'             # MYSQL数据库的名称
      MYSQL_USER: 'sqwfly'                 # 增加用户名为sqwfly的MYSQL用户
      MYSQL_PASSWORD: 'password1***'       # 设置用户名为sqwfly的登录密码

2.3 开启邮箱的SMTP服务

POP3 (Post Office Protocol - Version 3)协议用于支持使用电子邮件客户端获取并删除在服务器上的电子邮件。

IMAP (Internet Message Access Protocol)协议用于支持使用电子邮件客户端交互式存取服务器上的邮件。

SMTP (Simple Mail Transfer Protocol)协议用于支持使用电子邮件客户端发送电子邮件。

授权码是邮箱用于登录第三方客户端/服务的专用密码,适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务。

建议使用QQ邮箱,因为163邮箱的授权码有授权期限,期限为180天,到期需要重新申请

163邮箱服务器地址 QQ邮箱服务器地址 端口号(使用SSL)
SMTP服务器 smtp.163.com smtp.qq.com 465或587
POP3服务器 pop.163.com pop.qq.com 995
IMAP服务器 imap.163.com imap.qq.com 993
2.3.1 163网易邮箱开启SMTP服务

1.登录网易网页版邮箱

2.进入设置–>点击 POP3/SMTP/IMAP

3.有两个开启服务,分别为:IMAP/SMTP服务和POP3/SMTP服务开启任意一个就可以使用SMTP服务了,也可以都开启,开启时需要发送短信进行验证,之后点击新增授权密码

4.接着通过微信扫码发送短信进行身份验证,发送成功就会显示授权码了,此授权码仅显示一次,记得保存之后再关闭,当然也可以申请多个授权码。

2.3.2 QQ邮箱开启SMTP服务

1.登录QQ网页版邮箱

2.进入账号与安全页面

3.点击安全设置–>来到 POP3/IMAP/SMTP/Exchange/CardDAV 服务,首次进入是点击开启服务,开启时需要发送短信进行验证,发送成功就会显示授权密码了,此密码仅显示一次,记得保存之后再关闭,之后也可以多次申请,点击生成授权码上面的 授权码管理 即可进入管理界面,用于删除授权码。

2.4 Waline的部署

查看8306与3308端口有没有被占用

lsof -i:8360
lsof -i:3308

没有占用,进入waline目录下进行部署即可,若被占用可以更换为其它未被占用的端口,之后执行如下命令进行部署:

cd /root/data/docker_data/waline

docker compose up -d

部署成功之后访问 http://ip:8360,出现如下页面,如果访问失败,请去服务器的运营商后台检查 8360 端口是否开放

之后使用数据库连接软件,连接并创建数据库表用于存储用户和评论信息,使用官方提供的 waline.sql 文件里的建表语句即可,在waline库下创建三张表 wl_Commentwl_Counterwl_Users,创建成功之后就可以使用了,并且其他用户评论时会给你的邮箱发布提醒。

接下来是具体演示,如果本地主机没有安装MYSQL数据库,请直接参看2.4.3小节即可。

2.4.1 使用java IDEA创建数据库表

需要提前安装MYSQL数据库

先进行数据库的连接

执行waline.sql中的建表语句,内容如下

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
SET NAMES utf8mb4;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


# Dump of table wl_Comment
# ------------------------------------------------------------

CREATE TABLE `wl_Comment` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `comment` text,
  `insertedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `ip` varchar(100) DEFAULT '',
  `link` varchar(255) DEFAULT NULL,
  `mail` varchar(255) DEFAULT NULL,
  `nick` varchar(255) DEFAULT NULL,
  `pid` int(11) DEFAULT NULL,
  `rid` int(11) DEFAULT NULL,
  `sticky` boolean DEFAULT NULL,
  `status` varchar(50) NOT NULL DEFAULT '',
  `like` int(11) DEFAULT NULL,
  `ua` text,
  `url` varchar(255) DEFAULT NULL,
  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



# Dump of table wl_Counter
# ------------------------------------------------------------

CREATE TABLE `wl_Counter` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `time` int(11) DEFAULT NULL,
  `reaction0` int(11) DEFAULT NULL,
  `reaction1` int(11) DEFAULT NULL,
  `reaction2` int(11) DEFAULT NULL,
  `reaction3` int(11) DEFAULT NULL,
  `reaction4` int(11) DEFAULT NULL,
  `reaction5` int(11) DEFAULT NULL,
  `reaction6` int(11) DEFAULT NULL,
  `reaction7` int(11) DEFAULT NULL,
  `reaction8` int(11) DEFAULT NULL,
  `url` varchar(255) NOT NULL DEFAULT '',
  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



# Dump of table wl_Users
# ------------------------------------------------------------

CREATE TABLE `wl_Users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `display_name` varchar(255) NOT NULL DEFAULT '',
  `email` varchar(255) NOT NULL DEFAULT '',
  `password` varchar(255) NOT NULL DEFAULT '',
  `type` varchar(50) NOT NULL DEFAULT '',
  `label` varchar(255) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `avatar` varchar(255) DEFAULT NULL,
  `github` varchar(255) DEFAULT NULL,
  `twitter` varchar(255) DEFAULT NULL,
  `facebook` varchar(255) DEFAULT NULL,
  `google` varchar(255) DEFAULT NULL,
  `weibo` varchar(255) DEFAULT NULL,
  `qq` varchar(255) DEFAULT NULL,
  `2fa` varchar(32) DEFAULT NULL,
  `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;




/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

创建成功,显示如下

之后就可以正常使用了

2.4.3 在windows上直接使用CMD创建数据库表

需要提前安装MYSQL数据库

用root登录查看用户sqwfly是否创建成功(可以跳过)

mysql -h IP地址 -P 3308 -u root -pMYSQL_ROOT_PASSWORD
mysql> select user from mysql.user;
+---------------+
| user          |
+---------------+
| root          |
| sqwfly        |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
5 rows in set (0.22 sec)
mysql> exit;
By

使用 docker-compose.yaml 中填写的用户名(MYSQL_USER)与密码(MYSQL_PASSWORD)登录

mysql -h IP地址 -P 3308 -u  sqwfly  -pMYSQL_PASSWORD
/*选中waine数据库*/
mysql> use waline;
/*可以看到此时waine数据库下还没有所需的三张表*/
mysql> show tables;
Empty set (0.21 sec)
/*复制waline.sql中的内容,直接复制粘贴到命令行执行即可*/

/*执行完毕可以看到所需的三张表已经成功创建*/
mysql> show tables;
+------------------+
| Tables_in_waline |
+------------------+
| wl_Comment       |
| wl_Counter       |
| wl_Users         |
+------------------+
3 rows in set (0.22 sec)
/*执行完毕退出mysql*/
mysql> exit;
Bye
2.4.2 在服务器上进入docker内部创建数据库表

无需要在服务器上安装MYSQL数据库,容器内部已经存在

# 查看对应'db'服务的容器id(CONTAINER ID)
root@racknerd-589c5d:~/data/docker_data/waline# docker ps;
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS                PORTS                                                  NAMES
66fc9bf53b25   mysql:5.7                             "docker-entrypoint.s…"   18 minutes ago   Up 18 minutes         33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp   waline-db-1

#进入容器内部
root@racknerd-589c5d:~/data/docker_data/waline# docker exec -it 66fc9bf53b25 /bin/bash
# 连接数据库
bash-4.2# mysql -u MYSQL_USER  -pMYSQL_PASSWORD
/*接下来的操作与上面CMD命令下一致*/
/*选中waine数据库*/
mysql> use waline;
/*可以看到此时waine数据库下还没有所需的三张表*/
mysql> show tables;
Empty set (0.21 sec)
/*复制waline.sql中的内容,直接复制粘贴到命令行执行即可*/

/*执行完毕可以看到所需的三张表已经成功创建*/
mysql> show tables;
+------------------+
| Tables_in_waline |
+------------------+
| wl_Comment       |
| wl_Counter       |
| wl_Users         |
+------------------+
3 rows in set (0.22 sec)
/*执行完毕退出mysql*/
mysql> exit;
Bye
# 最终退出mysql容器
bash-4.2# exit

如果出现以下错误,一般是由于数据库表没有创建成功

发送评论错误:
ER_NO_SUCH_TABLE: Table 'waline.wl_Comment' doesn't exist, SQL: SELECT * FROM `wl_Comment` WHERE ( `url` = '/' ) AND ( `mail` = '' ) AND ( `nick` = 'Anonymous' ) AND ( `link` = '' ) AND ( `comment` = '你好' )

登录错误:
{"errno":500,"errmsg":"ER_NO_SUCH_TABLE: Table 'waline.wl_Users' doesn't exist, SQL: SELECT * FROM `wl_Users` WHERE ( `qq` = 'UID_3D81408364606CDC4BAA90A3411B68EC' )"}

3.Waline的基本使用

3.1 Waline的基础设置

点击 Login,首次登录的用户为管理员,当博主(管理员)自己发表评论时会验证 docker-compose.yaml 文件中填写的AUTHOR_EMAIL,如果一致则不会邮箱提醒,之后访问 http://ip:8360/ui 进入后台管理,进行相关设置,例如绑定其它平台账号,设置个人主页地址即点击昵称后的跳转链接,设置专属标签即显示在昵称之后的标签类似于QQ的龙王称号。还可以进行评论以及用户的管理等,请自行探索。

3.2 Waline数据的导入导出

点击导入导出可以导入或者导出评论数据,导出的为json格式数据

4.Waline的升级与更新

# 方式一
cd /root/data/docker_data/waline

docker compose down --rmi all  # 停止容器运行并删除相关镜像

docker compose up -d           # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

# 方式二
cd /root/data/docker_data/waline

docker compose down   # 停止容器运行

docker compose pull   # 重新拉取镜像

docker compose up -d

5.Waline的卸载

cd /root/data/docker_data/waline

docker compose down --rmi all           # 停止容器运行并删除相关镜像

cd ..

rm -rf /root/data/docker_data/waline    # 完全删除

6.参考

🌌Docker部署waline

🌌waline独立部署

0

评论区