AI导读: 本文介绍了如何在Serv00服务器上使用pm2进行进程保活,解决了因重启、杀进程等操作导致进程意外停止的问题。通过参考@saika发布的进程保活解决方案,用户可以顺利部署LLM Red Team的glm-free-api项目。教程包括项目地址、所需工具安装、端口配置、SSH登录创建更新脚本等步骤,最后通过pm2启动并保持应用的运行状态。此外,还提到该教程仅供学习和娱乐使用,严禁商用。
起因 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' , 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 ) { if (stdout.includes ('glm2api' )) { console .log ("web 正在运行" ); } else { exec ( "pm2 start /home/LOGIN/domains/DOMAIN/ecosystem.config.js" , 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.js
和package.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 的进程保活教程