0%

Serv00应用保活部署实践glm-free-api

起因

Serv00的服务器白嫖还是挺舒服,跟着大佬们的教程部署了很多东西,使用pm2给应用保活,但是重启和杀进程外加清定时任务,导致进程还是时不时的死掉

这时候大佬@saika发布了进程保活最终解决方案,解决了这个痛点

@saika示例作为参考,实践部署LLM Red Team的glm-free-api

本人学艺不精,直接使用nodejs启动不了项目,命令带不进去端口,只用使用pm2来启动

免责声明

本教程仅供学习和娱乐交流使用,请于24小时内自行清除相关存档,严禁商用,由此产生的一切法律后果自行承担 。

实践

项目地址
https://github.com/LLM-Red-Team/glm-free-api

注意serv00需要安装pm2

面板Port reservation点击Add port 添加要使用的glm-free-api端口,这里我使用的是
56863

接着按照下表 Add a New Website:

Key alue
Domain 自定义域名
Website Type Node.js
Node.js binary Node.js v22.4.1
Environment Production
DNS support True

接着SSH登入,并进入domains目录下创建更新脚本

update_script.sh脚本

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/bash

# 检查是否提供了 API_NAME 参数
if [ -z "$1" ]; then
echo "使用方法: $0 [API_NAME]"
echo "例如: $0 glm-free-api"
exit 1
fi

# 从命令行参数获取 API_NAME
API_NAME="$1"

# 生成保存目录名称,将 -free- 替换为 2
SAVE_DIR=$(echo "$API_NAME" | sed 's/-free-/2/')

# 定义安装目录
INSTALL_DIR=~/domains/$SAVE_DIR

# 获取最新的版本号
VERSION=$(curl -s "https://api.github.com/repos/LLM-Red-Team/$API_NAME/releases/latest" | jq -r '.tag_name')

# 检查是否成功获取版本号
if [ -z "$VERSION" ] || [ "$VERSION" == "null" ]; then
echo "无法获取最新版本号,退出脚本。"
exit 1
fi

echo "最新版本号为:$VERSION"

# 删除旧版本
if [ -d "$INSTALL_DIR" ]; then
rm -rf "$INSTALL_DIR"
echo "已删除旧版本:$INSTALL_DIR"
else
echo "未找到旧版本,跳过删除步骤。"
fi

# 下载并解压新版
cd ~/domains
wget https://github.com/LLM-Red-Team/$API_NAME/archive/refs/tags/$VERSION.tar.gz
tar -zxvf $VERSION.tar.gz
mv $API_NAME-$VERSION/ $SAVE_DIR

# 进入新版本目录
cd $SAVE_DIR

# 备份 package.json
cp package.json package.json.bak

# 更新 package.json 中的 sharp 依赖
if grep -q '"sharp"' package.json; then
jq '.resolutions["sharp"] = {"platform": "linuxmusl"}' package.json.bak > package.json.tmp && mv package.json.tmp package.json
echo "已将 sharp 依赖更新为 'platform: linuxmusl'"
fi

# 更新其他配置
jq '.resolutions["rollup"] = "npm:@rollup/wasm-node" | .overrides["rollup"] = "npm:@rollup/wasm-node"' package.json > package.json.tmp && mv package.json.tmp package.json

# 安装依赖并构建
npm i
npm run build

echo "$API_NAME 更新完成,版本:$VERSION,保存在目录:$INSTALL_DIR"

赋予执行权限chmod +x update_script.sh

执行脚本下载最新fuclaude./update_script.sh glm-free-api

到这里glm-free-api已经下载完成,并且完成了编译

然后再进入刚刚你新建的域名目录下创建
ecosystem.config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14

module.exports = {
apps: [
{
name: "glm2api",
script: "./dist/index.js",
cwd: "/home/LOGIN/domains/glm2api",
env: {
SERVER_PORT: 56863
}
}
]
};

下一步根据进程保活最终解决方案来编写具体内容

app.js

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
37
38
39
40
41
42
43
44
45
46
47

const express = require("express");
const app = express();
const port = 3002;
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:56863', //改成 Web 应用实际运行端口
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 'glm'`, function (err, stdout, stderr) { //改成进程名,如:alist
if (stdout.includes('glm2api')) { //改成进程实际运行命令,如:alist server
console.log("web 正在运行");
} else {
exec(
"pm2 start /home/LOGIN/domains/DOMAIN/ecosystem.config.js", // 改成启动脚本或者启动命令,如:chmod +x start.sh && ./start.sh 或者 ./alist server
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}!`));

package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"name": "glm2api",
"version": "1.0.0",
"description": "A simple glm2api server",
"author": "hl128k",
"main": "app.js",
"license": "MIT",
"private": false,
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.19.2",
"http-proxy-middleware": "^3.0.0"
},
"engines": {
"node": "22"
},
"keywords": [
"node"
]
}

app.jspackage.json放入域名目录的public_nodejs下,目录结构应是如下:

1
2
3
4
5
/home/LOGIN/domains/
├──DOMAIN
├──glm2api
├──0.0.x.tar.gz
└──update_script.sh
1
2
3
4
/home/LOGIN/domains/DOMAIN/
├──logs
├──public_nodejs
└──ecosystem.config.js
1
2
3
/home/LOGIN/domains/DOMAIN/public_nodejs/
├──app.js
└──package.json

public_nodejs目录下执行npm22 install

执行完成访问网页即可唤醒应用。监控网页即可对应用进行保活

其他的应用也是一样可以只需要更换此处命令即可
"pm2 start /home/LOGIN/domains/DOMAIN/ecosystem.config.js"

感谢

LLM Red Team的项目可以实践
@saika的进程保活教程