0%

Serv00应用保活部署实践fuclaude

起因

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

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

@saika示例作为参考,实践部署始皇的fuclaude

实践

面板Port reservation点击Add port 添加要使用的fuclaude端口,这里我使用的是
30277
接着按照下表 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登入,并进入刚刚你新建的域名目录下的 public_nodejs 路径下创建

update_to_github.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
64
65
66
67
68
69
70
71
72
#!/bin/sh

# 设置变量
REPO="wozulong/fuclaude"
DOWNLOAD_DIR="./fuclaude_update"
TARGET_DIR="./fuclaude"
ZIP_PASSWORD="linux.do"
PORT="30277" # 请替换为你的实际端口
PASSWORD="pwd" # 请替换为你的实际密码

# 获取最新版本的下载链接
LATEST_RELEASE=$(curl -s "https://api.github.com/repos/$REPO/releases/latest")
DOWNLOAD_URL=$(echo "$LATEST_RELEASE" | jq -r '.assets[] | select(.name | contains("freebsd-amd64")) | .browser_download_url')

# 检查是否获取到下载链接
if [ -z "$DOWNLOAD_URL" ]; then
echo "无法获取下载链接,请检查仓库和资产名称。"
exit 1
fi

# 创建下载目录
mkdir -p "$DOWNLOAD_DIR"

# 下载最新版本
curl --max-time 600 -L -o "$DOWNLOAD_DIR/fuclaude.zip" "$DOWNLOAD_URL"

# 检查下载是否成功
if [ $? -ne 0 ]; then
echo "下载失败,请检查网络连接或下载链接。"
exit 1
fi

# 解压下载的文件
unzip -P "$ZIP_PASSWORD" -o "$DOWNLOAD_DIR/fuclaude.zip" -d "$DOWNLOAD_DIR"

# 检查解压是否成功
if [ $? -ne 0 ]; then
echo "解压失败,请检查压缩包密码。"
exit 1
fi

# 检查解压后的文件夹名称
EXTRACTED_DIR=$(find "$DOWNLOAD_DIR" -mindepth 1 -maxdepth 1 -type d)

# 检查解压后的文件夹是否存在
if [ ! -d "$EXTRACTED_DIR" ]; then
echo "解压后的文件夹不存在,请检查压缩包内容。"
exit 1
fi

# 替换目标目录中的文件
cp -r "$EXTRACTED_DIR"/* "$TARGET_DIR"

# 检查复制是否成功
if [ $? -ne 0 ]; then
echo "复制文件失败,请检查目标目录路径和权限。"
exit 1
fi

# 编辑 config.json 文件
sed -i '' 's/"bind": "127.0.0.1:8181"/"bind": "0.0.0.0:'"$PORT"'"/; s/"signup_enabled": *false/"signup_enabled": true/; s/"show_session_key": *false/"show_session_key": true/; s/"site_password": *"[^"]*"/"site_password": "'"$PASSWORD"'"/' "$TARGET_DIR/config.json"

# 检查编辑是否成功
if [ $? -ne 0 ]; then
echo "编辑 config.json 文件失败,请检查文件路径和权限。"
exit 1
fi

# 清理临时文件
rm -rf "$DOWNLOAD_DIR"

echo "更新成功!"

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

执行脚本下载最新fuclaude./update_to_github.sh

到这里fuclaude已经下载完成

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

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
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:30277', //改成 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 fuclaude", function (err, stdout, stderr) { //改成进程名,如:alist
if (stdout.includes("./fuclaude")) { //改成进程实际运行命令,如:alist server
console.log("web 正在运行");
} else {
exec(
"cd ./fuclaude && ./fuclaude", // 改成启动脚本或者启动命令,如: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": "fuclaude",
"version": "1.0.0",
"description": "A simple fuclaude 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/public_nodejs/
├──fuclaude
├──app.js
├──package.json
└──update_to_github.sh

执行npm22 install

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

其他的应用也是一样可以只需要更换此处命令即可
"cd ./fuclaude && ./fuclaude"

感谢

@cself的fuclaude 部署教程
@saika的进程保活教程