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

update_script.txt (1.7 KB)

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

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

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

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


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

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

app.js


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

{
 "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下,目录结构应是如下:

/home/LOGIN/domains/
├──DOMAIN
├──glm2api
├──0.0.x.tar.gz
└──update_script.sh
/home/LOGIN/domains/DOMAIN/
├──logs
├──public_nodejs
└──ecosystem.config.js
/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的进程保活教程

3 个赞

感谢分享 之前一直是放在docker里面的 回去实践下

如果使用其他服务这glm,glm2api两个地方修改要注意,不正确的话会导致死循环无限的增加线程和内存,而且线程占满导致ssh连不上.解决方法是添加一个定时任务执行pkill -u LOGIN

太强了,感谢大佬