# 利用 serv00 为 waline 加入异步邮件推送

事情的起因是因为有人在我网站评论了但我没看到,一直过了很久才发现回复,于是就想为我的 waline 加入一个邮件推送,及时提醒评论区的动态,以及提醒评论者评论的回复。

# waline 自带推送的缺点

waline 自带的邮件推送会使评论这个过程变得很慢,甚至直接失败。后面在大佬文章里知道 Waline 是在评论时直接进行发送邮件的,同步进行发信便会导致评论耗时较长,很影响用户体验,有时评论需要耗时几秒甚至超时。
幸好这个大佬也做出了解决方案,使用异步发信的方式,利用 Waline 可以设置一个 Webhook 地址,开发了这个项目

# 利用 serv00 部署项目

秉承着能白嫖绝不付费的理念,我选择了利用 serv00 来实现这个项目。总体分为三步 ①设置域名邮箱(可选,如果你选择用大厂 smtp 服务此过程可以省略)②项目本体的运行和保活 ③设置 waline 的 webhook 地址并重新部署

# 设置域名邮箱(可选)

这里其实任意一个 smtp 服务都可以,例如 163 邮箱。如果想要使用域名邮箱也可以选择其它的提供商,这里选择的是 lark,也可以选择使用 serv00 提供的免费的域名邮箱,这里给一个大佬的配置教程
记录下你的 SMTP 服务器地址,账号和密码备用

# 项目本体的运行和保活

# 放行端口

根据 serv00 邮件中给的地址进入面板,放行两个 tcp 端口,记录下两个端口

记为端口 1 和端口 2

# Add a New Website

在侧边栏中选择 WWW websites 然后选择 Add New Website

KeyValue
Domain你晚点要用的webhook的域名 (也可以把原有的 USERNAME.serv00.net 删掉后重新添加,)
Website TypeNode.js
Node.js binaryNode.js v22.9.0
EnvironmentProduction

添加完新站点后,继续点击上方的 Manage SSL certificates ,接着在出口 IP 的右侧点击 Manage ,再点击 Add certificate :

TypeDomain
Generate Let’s Encrypted certificate与刚刚添加的站点域名保持一致(如果是原有的 USERNAME.serv00.net ,可以省略此步)

但是注意,由于 serv00 可能已经处于被墙的状态,这里建议使用托管在 cf 上的域名,后续我们可以开启 cf 小黄云拯救被墙

建议此处即开启 cf 小黄云

# SSH 操作

根据邮件给的信息,ssh 登入执行

devil binexec on && killall -u $(whoami)

接着断开 SSH 并重新连接,输入以下命令:

#更新go环境
# 创建安装目录
mkdir -p ~/local/soft && cd ~/local/soft
# 下载编译好的 go1.22 的程序包
wget https://dl.google.com/go/go1.22.0.freebsd-amd64.tar.gz
# 解压
tar -xzvf go1.22.0.freebsd-amd64.tar.gz
# 删除压缩文件
rm go1.22.0.freebsd-amd64.tar.gz
# 修改 .profile 文件
echo 'export PATH=~/local/soft/go/bin:$PATH' >> ~/.profile
# 使 .profile 的修改生效
source ~/.profile
# 检查 go 版本
go version

下面开始安装 waline_mailer,这里选择刚刚新建的网站为安装目录 **~/domains/ 刚刚填入的域名 /public_nodejs**
切换至安装目录后开始执行

git clone https://github.com/soxft/waline-async-mail && cd waline-async-mail
go get github.com/go-playground/locales
go build -o waline_mailer main.go
cp config.example.yaml config.yaml
chmod +x waline_mailer

下面修改 config.yaml 为你的配置文件,主要修改的有监听端口(端口 1)网站名称,redis 端口(端口 2),主人邮箱,推送方式和 smtp 配置

修改完成后执行
nohup redis-server --port 端口2 >/dev/null 2>&1 & cd /home/USERNAME/domains/域名/waline-async-mail && ./waline_mailer &
如果成功启动了,那么我们就可以关闭程序了,然后进行保活操作

# 保活

进入 ~/domains/域名/public_nodejs
删除该目录下的 public 文件夹,并在 public_nodejs 文件夹内放置文件 app.js
app.js 的内容如下:

const express = require("express");
const app = express();
const port = 3000;
var exec = require("child_process").exec;
const { createProxyMiddleware } = require("http-proxy-middleware");
const path = require('path');
const fs = require('fs');
const currentDir = __dirname;
process.chdir(currentDir);
app.use('/', createProxyMiddleware({
  target: 'http://127.0.0.1:PORT', // 改成端口 1
  changeOrigin: true,  
  ws: true, 
  onError: (err, req, res) => {
    res.writeHead(500, {
      'Content-Type': 'text/plain',
    });
    res.end('Please wait for a while and try to refresh the page.');
  },
}));
function keep_web_alive() {
    exec("pgrep -laf waline_mailer", function (err, stdout, stderr) { // 改成进程名,如:alist
      if (stdout.includes("./waline_mailer")) {  // 改成进程实际运行命令,如:alist server
        console.log("web 正在运行");
      } else {
        exec(
          "nohup redis-server --port 端口2 >/dev/null 2>&1 & cd /home/USERNAME/domains/域名/waline-async-mail && nohup ./waline_mailer >/dev/null 2>&1 &", // 这里注意修改为自己的实际信息
          function (err, stdout, stderr) {
            if (err) {
              console.log("保活-调起web-命令行执行错误:" + err);
            } else {
              console.log("保活-调起web-命令行执行成功!");
            }
          }
        );
      }
    });
  }
  setInterval(keep_web_alive, 10 * 1000);
app.listen(port, () => console.log(`Example app listening on port ${port}!`));

注意修改文件中所执行的启动命令,
访问域名,刷新几次,看到网站跳转至该项目的 github 仓库后即为启动成功,我们只需要监控这个域名即可实现对该程序的保活
可以使用以下公共服务对网页进行监控:

1 cron-job.org

2 UptimeRobot

同时,你也可以选择自建 Uptime-Kuma 等服务进行监控。

最后加入一个定时对自己 ssh 连接的命令,防止因为超过三个月未连接而被官方封号

指令为 sshpass -p '密码' ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -tt 用户名@地址 "exit"

# 启用 webhook 并重新部署

在 vercel 的 waline 项目中添加环境变量 webhook,值为你设置的 webhook 的 url
然后重新部署项目完成!

# 至此,部署已经完成

感谢 soxft saika 大佬的异步邮件推送方案和 serv00 保活方案,接下来体验一个不卡评论的邮件推送!