├── _worker.js
├── container
└── nodejs
│ ├── package.json
│ ├── index.js
│ └── start.sh
├── saph.sh
├── SAP.md
├── sap.sh
├── .github
└── workflows
│ ├── mainh.yml
│ └── main.yml
├── sapsbxh.sh
├── sapsbx.sh
├── README.md
├── index.html
└── LICENSE
/_worker.js:
--------------------------------------------------------------------------------
1 | export default {
2 | async fetch(request, env) {
3 | const url = new URL(request.url)
4 | url.protocol = 'https:'
5 | url.hostname = '域名'
6 | return fetch(new Request(url, request))
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/container/nodejs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nodejs-argosbx",
3 | "version": "1.0.0",
4 | "description": "node",
5 | "main": "index.js",
6 | "author": "ygkkk",
7 | "license": "MIT",
8 | "private": false,
9 | "scripts": {
10 | "start": "node index.js",
11 | "dev": "node index.js"
12 | },
13 | "engines": {
14 | "node": ">=14"
15 | },
16 | "dependencies": {
17 | "ws": "^8.0.0"
18 | }
19 | }
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/container/nodejs/index.js:
--------------------------------------------------------------------------------
1 | const os = require('os');
2 | const http = require('http');
3 | const fs = require('fs');
4 | const net = require('net');
5 | const { exec, execSync } = require('child_process');
6 | function ensureModule(name) {
7 | try {
8 | require.resolve(name);
9 | } catch (e) {
10 | console.log(`Module '${name}' not found. Installing...`);
11 | execSync(`npm install ${name}`, { stdio: 'inherit' });
12 | }
13 | }
14 | const { WebSocket, createWebSocketStream } = require('ws');
15 | const subtxt = `${process.env.HOME}/agsbx/jh.txt`;
16 | const NAME = process.env.NAME || os.hostname();
17 | const PORT = process.env.PORT || 3000;
18 | const uuid = process.env.uuid || '79411d85-b0dc-4cd2-b46c-01789a18c650';
19 | const DOMAIN = process.env.DOMAIN || 'YOUR.DOMAIN';
20 | const vlessInfo = `vless://${uuid}@${DOMAIN}:443?encryption=none&security=tls&sni=${DOMAIN}&fp=chrome&type=ws&host=${DOMAIN}&path=%2F#Vl-ws-tls-${NAME}`;
21 | console.log(`vless-ws-tls节点分享: ${vlessInfo}`);
22 |
23 | fs.chmod("start.sh", 0o777, (err) => {
24 | if (err) {
25 | console.error(`start.sh empowerment failed: ${err}`);
26 | return;
27 | }
28 | console.log(`start.sh empowerment successful`);
29 | const child = exec('bash start.sh');
30 | child.stdout.on('data', (data) => console.log(data));
31 | child.stderr.on('data', (data) => console.error(data));
32 | child.on('close', (code) => {
33 | console.log(`child process exited with code ${code}`);
34 | console.clear();
35 | console.log(`App is running`);
36 | });
37 | });
38 |
39 | const server = http.createServer((req, res) => {
40 | if (req.url === '/') {
41 | res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
42 | res.end('🟢恭喜!Argosbx小钢炮脚本-nodejs版部署成功!\n\n查看节点信息路径:/你的uuid');
43 | return;
44 | }
45 |
46 | if (req.url === `/${uuid}`) {
47 | res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
48 | if (fs.existsSync(subtxt)) {
49 | fs.readFile(subtxt, 'utf8', (err, data) => {
50 | if (err) {
51 | console.error(err);
52 | res.end(`${vlessInfo}`);
53 | } else {
54 | res.end(`${vlessInfo}\n${data}`);
55 | }
56 | });
57 | } else {
58 | res.end(`${vlessInfo}`);
59 | }
60 | return;
61 | }
62 |
63 | res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
64 | res.end('404 Not Found');
65 | });
66 |
67 | server.listen(PORT, () => {
68 | console.log(`Server is running on port ${PORT}`);
69 | });
70 |
71 | const wss = new (require('ws').Server)({ server });
72 | const uuidkey = uuid.replace(/-/g, "");
73 | wss.on('connection', ws => {
74 | ws.once('message', msg => {
75 | const [VERSION] = msg;
76 | const id = msg.slice(1, 17);
77 | if (!id.every((v, i) => v == parseInt(uuidkey.substr(i * 2, 2), 16))) return;
78 | let i = msg.slice(17, 18).readUInt8() + 19;
79 | const port = msg.slice(i, i += 2).readUInt16BE(0);
80 | const ATYP = msg.slice(i, i += 1).readUInt8();
81 | const host = ATYP == 1 ? msg.slice(i, i += 4).join('.') :
82 | (ATYP == 2 ? new TextDecoder().decode(msg.slice(i + 1, i += 1 + msg.slice(i, i + 1).readUInt8())) :
83 | (ATYP == 3 ? msg.slice(i, i += 16)
84 | .reduce((s, b, i, a) => (i % 2 ? s.concat(a.slice(i - 1, i + 1)) : s), [])
85 | .map(b => b.readUInt16BE(0).toString(16)).join(':') : ''));
86 | ws.send(new Uint8Array([VERSION, 0]));
87 | const duplex = createWebSocketStream(ws);
88 | net.connect({ host, port }, function () {
89 | this.write(msg.slice(i));
90 | duplex.on('error', () => { }).pipe(this).on('error', () => { }).pipe(duplex);
91 | }).on('error', () => { });
92 | }).on('error', () => { });
93 | });
94 |
--------------------------------------------------------------------------------
/saph.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | export LANG=en_US.UTF-8
3 | if ! command -v apk >/dev/null 2>&1 && ! command -v apt >/dev/null 2>&1; then
4 | echo "脚本仅支持Alpine、Debian、Ubuntu系统" && exit
5 | fi
6 | [[ $EUID -ne 0 ]] && echo "请以root模式运行脚本" && exit
7 | sapsbxinstall(){
8 | URL="https://raw.githubusercontent.com/yonggekkk/argosbx/main/sapsbxh.sh"
9 | DEST="$HOME/sapsbxh.sh"
10 | command -v curl > /dev/null 2>&1 && curl -sSL $URL -o $DEST || wget -q $URL -O $DEST
11 | if [ -s "$HOME/sapsbxh.sh" ]; then
12 | chmod +x $HOME/sapsbxh.sh
13 |
14 | echo
15 | while true; do
16 | read -p "必填!请输入SAP邮箱账号(每个账号邮箱空一格): " input
17 | if [ -z "$input" ]; then
18 | echo "输入不能为空,请重新输入!"
19 | else
20 | break
21 | fi
22 | done
23 | quoted=$(printf '%s ' $input)
24 | sed -i "50s/^.*$/CF_USERNAMES=\"${quoted% }\"/" $HOME/sapsbxh.sh
25 |
26 | echo
27 | while true; do
28 | read -p "必填!请输入SAP密码(每个账号对应密码空一格): " input
29 | if [ -z "$input" ]; then
30 | echo "输入不能为空,请重新输入!"
31 | else
32 | break
33 | fi
34 | done
35 | quoted=$(printf '%s ' $input)
36 | sed -i "53s/^.*$/CF_PASSWORDS=\"${quoted% }\"/" $HOME/sapsbxh.sh
37 |
38 | echo
39 | while true; do
40 | read -p "必填!请输入SAP地区(详见地区变量对照表,每个账号对应地区空一格): " input
41 | if [ -z "$input" ]; then
42 | echo "输入不能为空,请重新输入!"
43 | else
44 | break
45 | fi
46 | done
47 | quoted=$(printf '%s ' $input)
48 | sed -i "56s/^.*$/REGIONS=\"${quoted% }\"/" $HOME/sapsbxh.sh
49 |
50 | echo
51 | while true; do
52 | read -p "必填!请输入UUID(每个账号对应UUID空一格): " input
53 | if [ -z "$input" ]; then
54 | echo "输入不能为空,请重新输入!"
55 | else
56 | break
57 | fi
58 | done
59 | quoted=$(printf '%s ' $input)
60 | sed -i "59s/^.*$/UUIDS=\"${quoted% }\"/" $HOME/sapsbxh.sh
61 |
62 | echo
63 | read -p "选填!请输入8:10-9:00点的保活时间间隔(单位:分钟,回车默认5分钟间隔): " input
64 | if [ -z "$input" ]; then
65 | sed -i "62s/^.*$/crontime=5/" $HOME/sapsbxh.sh
66 | else
67 | sed -i "62s/^.*$/crontime=$input/" $HOME/sapsbxh.sh
68 | fi
69 | echo "脚本安装设置完毕"
70 | echo "每天上午8:10-9:00之间脚本自动运行保活,可以再次进入脚本选择2测试执行一次" && sleep 3
71 | command -v curl > /dev/null 2>&1 && bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/saph.sh) || bash <(wget -qO- https://raw.githubusercontent.com/yonggekkk/argosbx/main/saph.sh)
72 | else
73 | echo "下载文件失败,请检查当前服务器是否支持curl或wget,网络是否支持github"
74 | fi
75 | }
76 | unins(){
77 | echo "请稍等……"
78 | apt-get remove --purge -y cf8-cli >/dev/null 2>&1
79 | rm -rf /usr/local/bin/cf8 "$HOME"/{sapsbxh.sh,sap.log,saph.sh}
80 | crontab -l 2>/dev/null > /tmp/crontab.tmp
81 | sed -i '/sapsbx/d' /tmp/crontab.tmp >/dev/null 2>&1
82 | crontab /tmp/crontab.tmp
83 | rm /tmp/crontab.tmp
84 | echo "卸载完成"
85 | }
86 | goagain(){
87 | if [ -s "$HOME/sapsbxh.sh" ]; then
88 | bash $HOME/sapsbxh.sh
89 | else
90 | echo "未安装脚本,请卸载重装"
91 | fi
92 | }
93 | showlog(){
94 | if [ -s "$HOME/sap.log" ] && [ -s "$HOME/sapsbxh.sh" ]; then
95 | cat $HOME/sap.log
96 | else
97 | echo "无自动执行日志,请明天上午9点后再来看"
98 | fi
99 | }
100 |
101 | echo "*****************************************************"
102 | echo "*****************************************************"
103 | echo "甬哥Github项目 :github.com/yonggekkk"
104 | echo "甬哥Blogger博客 :ygkkk.blogspot.com"
105 | echo "甬哥YouTube频道 :www.youtube.com/@ygkkk"
106 | echo "Argosbx小钢炮脚本-SAP多账户自动保活脚本【VPS】"
107 | echo "版本:V25.10.19"
108 | echo "*****************************************************"
109 | echo "*****************************************************"
110 | cf_line=$(sed -n '50p' "$HOME/sapsbxh.sh" 2>/dev/null)
111 | cf_value=$(echo "$cf_line" | sed -E 's/CF_USERNAMES="(.*)"/\1/' | xargs 2>/dev/null)
112 | [ -z "$cf_value" ] && echo "当前未设置SAP变量,选择1添加变量" || { echo "当前已设置过SAP变量,详情如下显示,可选择2执行一次"; sed -n '47,64p' "$HOME/sapsbxh.sh" 2>/dev/null; }
113 | echo "*****************************************************"
114 | echo " 1. 安装脚本并添加/重置变量"
115 | echo " 2. 手动测试执行一次"
116 | echo " 3. 查看最近一次自动执行日志"
117 | echo " 4. 卸载脚本"
118 | echo " 0. 退出"
119 | read -p "请输入数字【0-4】:" Input
120 | case "$Input" in
121 | 1 ) sapsbxinstall;;
122 | 2 ) goagain;;
123 | 3 ) showlog;;
124 | 4 ) unins;;
125 | * ) exit
126 | esac
127 |
--------------------------------------------------------------------------------
/SAP.md:
--------------------------------------------------------------------------------
1 | Argosbx在SAP平台部署代理节点,基于[eooce](https://github.com/eooce/Auto-deploy-sap-and-keepalive)相关功能现实,可用vless-ws-tls(cdn)、vmess-ws-argo-cdn、vmess-ws-tls-argo-cdn
2 |
3 | Vless-ws-tls为默认安装,Argo固定或临时隧道为可选,也可使用[workers/pages反代方式](https://github.com/yonggekkk/argosbx/blob/main/_worker.js)启用Vless-ws-tls的CDN替代Argo的CDN
4 |
5 | SAP个人注册地址:https://www.sap.com/products/technology-platform/trial.html
6 |
7 | -----------------------------------------
8 |
9 | #### 注意:目前以下三种方式自动部署,方式二与三带保活!!!
10 |
11 | * 方式一:[Github方式](https://github.com/yonggekkk/argosbx/blob/main/.github/workflows/main.yml),请自建私库设置运行。安装启动同时进行,无定时保活
12 |
13 | * 方式二:Docker方式,镜像地址:```ygkkk/sapsbx```,可在clawcloud爪云等docker平台上运行。安装启动同时进行,自带8:10-9:00每5分钟的定时保活
14 |
15 | * 方式三:VPS服务器方式。安装启动同时进行,支持自定义8:10-9:00定时保活时间段间隔
16 |
17 | VPS服务器方式脚本地址:(再次进入快捷方式```bash sap.sh```):
18 |
19 | ```curl -sSL https://raw.githubusercontent.com/yonggekkk/argosbx/main/sap.sh -o sap.sh && chmod +x sap.sh && bash sap.sh```
20 |
21 | 或者
22 |
23 | ```wget -q https://raw.githubusercontent.com/yonggekkk/argosbx/main/sap.sh -O sap.sh && chmod +x sap.sh && bash sap.sh```
24 |
25 | -----------------------------------------
26 |
27 | #### 注意:以下三种方式仅支持保活!仅```CF_USERNAMES ``` ```CF_PASSWORDS``` ```REGIONS``` ```UUIDS```四个变量可用且为必填
28 |
29 | * 方式一:[Github方式](https://github.com/yonggekkk/argosbx/blob/main/.github/workflows/mainh.yml),请自建私库设置运行。仅适用手动保活
30 |
31 | * 方式二:Docker方式,镜像地址:```ygkkk/sapsbxh```,可在clawcloud爪云等docker平台上运行。仅保活,自带8:10-9:00每5分钟的定时保活
32 |
33 | * 方式三:VPS服务器方式。仅保活,支持自定义8:10-9:00定时保活时间段间隔
34 |
35 | VPS服务器方式脚本地址:(再次进入快捷方式```bash saph.sh```):
36 |
37 | ```curl -sSL https://raw.githubusercontent.com/yonggekkk/argosbx/main/saph.sh -o saph.sh && chmod +x saph.sh && bash saph.sh```
38 |
39 | 或者
40 |
41 | ```wget -q https://raw.githubusercontent.com/yonggekkk/argosbx/main/saph.sh -O saph.sh && chmod +x saph.sh && bash saph.sh```
42 |
43 | -----------------------------------------
44 |
45 | * 变量设置说明:每个变量的多个账号需按顺序依次对应填写,多个之间空一格,多个中如有个别留空则填```no```代替
46 |
47 | | 变量名称 | 变量值 | 是否必填 | 变量作用 |
48 | | :----- | :-------- | :-------- | :--- |
49 | | CF_USERNAMES | 单个或多个SAP账号邮箱 | 必填 | 登录账号 |
50 | | CF_PASSWORDS | 单个或多个SAP密码 | 必填 | 登录密码 |
51 | | REGIONS | 单个或多个地区变量代码 | 必填 | 登录实例地区 |
52 | | UUIDS | 单个或多个UUID | 必填 | 代理协议UUID |
53 | | APP_NAMES | 单个或多个应用程序app名称 | 可选,留空填```no```,则为地区码+邮箱 | 应用程序app名称 |
54 | | VMPTS | 单个或多个argo固定/临时隧道端口| 可选,留空填```no```,则关闭argo隧道 | 启用argo固定/临时隧道时必填 |
55 | | AGNS | 单个或多个argo固定隧道域名 | 可选,留空填```no```,则启用临时隧道 | 使用argo固定域名时必填 |
56 | | AGKS | 单个或多个argo固定隧道token | 可选,留空填```no```,则启用临时隧道 | 使用argo固定域名时必填 |
57 | | DELAPP | 单个或多个应用程序名app | 优先独立执行 | 删除指定应用程序app,github或docker执行后务必还原留空状态 |
58 |
59 |
60 | ---------------------------------------
61 |
62 | 视频教程:[🔥SAP搭建免费节点一条龙教程:多平台多账号搭建+保活一次搞定,支持Argo/workers/pags多种CDN方式](https://youtu.be/NRYZNKWoLj8)
63 |
64 | -----------------------------------------
65 |
66 | 试用90天账户专区:
67 |
68 | | IP服务商 | 地区 | 国家城市 | REGIONS地区变量代码(大写) |
69 | | :----- | :-------- | :-------- | :--- |
70 | | Azure微软 | 亚洲 | 新加坡 | SG |
71 | | AWS亚马逊 | 北美 | 美国 | US |
72 |
73 |
74 | 企业账户专区:
75 |
76 | | IP服务商 | 地区 | 国家城市 | REGIONS地区变量代码(大写) |
77 | | :----- | :-------- | :---------- | :------ |
78 | | AWS亚马逊 | 亚洲 | 澳大利亚-悉尼 | AU-A |
79 | | AWS亚马逊 | 亚洲 | 日本-东京 | JP-A |
80 | | AWS亚马逊 | 亚洲 | 新加坡 | SG-A |
81 | | AWS亚马逊 | 亚洲 | 韩国-首尔 | KR-A |
82 | | AWS亚马逊 | 北美 | 加拿大-蒙特利尔 | CA-A |
83 | | AWS亚马逊 | 北美 | 美国-弗吉尼亚 | US-V-A |
84 | | AWS亚马逊 | 北美 | 美国-俄勒冈 | US-O-A |
85 | | AWS亚马逊 | 南美 | 巴西-圣保罗 | BR-A |
86 | | AWS亚马逊 | 欧洲 | 德国-法兰克福 | DE-A |
87 | | Google谷歌 | 亚洲 | 澳大利亚-悉尼 | AU-G |
88 | | Google谷歌 | 亚洲 | 日本-大阪 | JP-O-G |
89 | | Google谷歌 | 亚洲 | 日本-东京 | JP-T-G |
90 | | Google谷歌 | 亚洲 | 印度-孟买 | IN-G |
91 | | Google谷歌 | 亚洲 | 以色列-特拉维夫 | IL-G |
92 | | Google谷歌 | 亚洲 | 沙特-达曼 | SA-G |
93 | | Google谷歌 | 北美 | 美国-爱荷华 | US-G |
94 | | Google谷歌 | 南美 | 巴西-圣保罗 | BR-G |
95 | | Google谷歌 | 欧洲 | 德国-法兰克福 | DE-G |
96 | | Azure微软 | 亚洲 | 澳大利亚-悉尼 | AU-M |
97 | | Azure微软 | 亚洲 | 日本-东京 | JP-M |
98 | | Azure微软 | 亚洲 | 新加坡 | SG-M |
99 | | Azure微软 | 北美 | 加拿大-多伦多 | CA-M |
100 | | Azure微软 | 北美 | 美国-弗吉尼亚 | US-V-M |
101 | | Azure微软 | 北美 | 美国-华盛顿 | US-W-M |
102 | | Azure微软 | 南美 | 巴西-圣保罗 | BR-M |
103 | | Azure微软 | 欧洲 | 荷兰-阿姆斯特丹 | NL-M |
104 | | SAP | 亚洲 | 阿联酋-迪拜 | AE-N |
105 | | SAP | 亚洲 | 沙特-利雅得 | SA-N |
106 |
--------------------------------------------------------------------------------
/sap.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | export LANG=en_US.UTF-8
3 | if ! command -v apk >/dev/null 2>&1 && ! command -v apt >/dev/null 2>&1; then
4 | echo "脚本仅支持Alpine、Debian、Ubuntu系统" && exit
5 | fi
6 | [[ $EUID -ne 0 ]] && echo "请以root模式运行脚本" && exit
7 | sapsbxinstall(){
8 | URL="https://raw.githubusercontent.com/yonggekkk/argosbx/main/sapsbx.sh"
9 | DEST="$HOME/sapsbx.sh"
10 | command -v curl > /dev/null 2>&1 && curl -sSL $URL -o $DEST || wget -q $URL -O $DEST
11 | if [ -s "$HOME/sapsbx.sh" ]; then
12 | chmod +x $HOME/sapsbx.sh
13 |
14 | echo
15 | while true; do
16 | read -p "必填!请输入SAP邮箱账号(每个账号邮箱空一格): " input
17 | if [ -z "$input" ]; then
18 | echo "输入不能为空,请重新输入!"
19 | else
20 | break
21 | fi
22 | done
23 | quoted=$(printf '%s ' $input)
24 | sed -i "50s/^.*$/CF_USERNAMES=\"${quoted% }\"/" $HOME/sapsbx.sh
25 |
26 | echo
27 | while true; do
28 | read -p "必填!请输入SAP密码(每个账号对应密码空一格): " input
29 | if [ -z "$input" ]; then
30 | echo "输入不能为空,请重新输入!"
31 | else
32 | break
33 | fi
34 | done
35 | quoted=$(printf '%s ' $input)
36 | sed -i "53s/^.*$/CF_PASSWORDS=\"${quoted% }\"/" $HOME/sapsbx.sh
37 |
38 | echo
39 | while true; do
40 | read -p "必填!请输入SAP地区(详见地区变量对照表,每个账号对应地区空一格): " input
41 | if [ -z "$input" ]; then
42 | echo "输入不能为空,请重新输入!"
43 | else
44 | break
45 | fi
46 | done
47 | quoted=$(printf '%s ' $input)
48 | sed -i "56s/^.*$/REGIONS=\"${quoted% }\"/" $HOME/sapsbx.sh
49 |
50 | echo
51 | while true; do
52 | read -p "必填!请输入UUID(每个账号对应UUID空一格): " input
53 | if [ -z "$input" ]; then
54 | echo "输入不能为空,请重新输入!"
55 | else
56 | break
57 | fi
58 | done
59 | quoted=$(printf '%s ' $input)
60 | sed -i "59s/^.*$/UUIDS=\"${quoted% }\"/" $HOME/sapsbx.sh
61 |
62 | echo
63 | echo "每个账号对应SAP应用程序名称APP空一格,回车则每个实例都自动生成,多个账号中有个别账号自动生成填no"
64 | read -p "选填!请输入SAP应用程序名称APP: " input
65 | if [ -z "$input" ]; then
66 | sed -i "62s/^.*$/APP_NAMES=\"\"/" $HOME/sapsbx.sh
67 | else
68 | quoted=$(printf '%s ' $input)
69 | sed -i "62s/^.*$/APP_NAMES=\"${quoted% }\"/" $HOME/sapsbx.sh
70 | fi
71 |
72 | echo
73 | echo "每个账号对应Argo隧道端口空一格,回车则每个实例都不启用Argo,多个账号中有个别账号不启用填no"
74 | read -p "选填!当使用Argo固定/临时隧道时,此端口变量必填: " input
75 | if [ -z "$input" ]; then
76 | sed -i "65s/^.*$/VMPTS=\"\"/" $HOME/sapsbx.sh
77 | sed -i "68s/^.*$/AGNS=\"\"/" $HOME/sapsbx.sh
78 | sed -i "71s/^.*$/AGKS=\"\"/" $HOME/sapsbx.sh
79 | else
80 | quoted=$(printf '%s ' $input)
81 | sed -i "65s/^.*$/VMPTS=\"${quoted% }\"/" $HOME/sapsbx.sh
82 |
83 | echo
84 | echo "每个账号对应Argo固定隧道域名空一格,回车则每个实例都启用Argo临时隧道,多个账号中有个别账号不启用填no"
85 | read -p "选填!Argo固定隧道域名: " input
86 | if [ -z "$input" ]; then
87 | sed -i "68s/^.*$/AGNS=\"\"/" $HOME/sapsbx.sh
88 | sed -i "71s/^.*$/AGKS=\"\"/" $HOME/sapsbx.sh
89 | else
90 | quoted=$(printf '%s ' $input)
91 | sed -i "68s/^.*$/AGNS=\"${quoted% }\"/" $HOME/sapsbx.sh
92 |
93 | while true; do
94 | echo
95 | echo "每个账号对应Argo固定隧道token空一格,个别账号不启用填no"
96 | read -p "选填!Argo固定隧道token: " input
97 | if [ -z "$input" ]; then
98 | echo "输入不能为空,请重新输入!"
99 | else
100 | break
101 | fi
102 | done
103 | quoted=$(printf '%s ' $input)
104 | sed -i "71s/^.*$/AGKS=\"${quoted% }\"/" $HOME/sapsbx.sh
105 | fi
106 | fi
107 | echo
108 | read -p "选填!请输入8:10-9:00点的保活时间间隔(单位:分钟,回车默认5分钟间隔): " input
109 | if [ -z "$input" ]; then
110 | sed -i "74s/^.*$/crontime=5/" $HOME/sapsbx.sh
111 | else
112 | sed -i "74s/^.*$/crontime=$input/" $HOME/sapsbx.sh
113 | fi
114 | echo "脚本安装设置完毕"
115 | echo "每天上午8:10-9:00之间脚本自动运行保活,可以再次进入脚本选择2测试执行一次" && sleep 3
116 | command -v curl > /dev/null 2>&1 && bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/sap.sh) || bash <(wget -qO- https://raw.githubusercontent.com/yonggekkk/argosbx/main/sap.sh)
117 | else
118 | echo "下载文件失败,请检查当前服务器是否支持curl或wget,网络是否支持github"
119 | fi
120 | }
121 | unins(){
122 | echo "请稍等……"
123 | apt-get remove --purge -y cf8-cli >/dev/null 2>&1
124 | rm -rf /usr/local/bin/cf8 "$HOME"/{sapsbx.sh,sap.log,sap.sh}
125 | crontab -l 2>/dev/null > /tmp/crontab.tmp
126 | sed -i '/sapsbx/d' /tmp/crontab.tmp >/dev/null 2>&1
127 | crontab /tmp/crontab.tmp
128 | rm /tmp/crontab.tmp
129 | echo "卸载完成"
130 | }
131 | goagain(){
132 | if [ -s "$HOME/sapsbx.sh" ]; then
133 | bash $HOME/sapsbx.sh
134 | else
135 | echo "未安装脚本,请卸载重装"
136 | fi
137 | }
138 | showlog(){
139 | if [ -s "$HOME/sap.log" ] && [ -s "$HOME/sapsbx.sh" ]; then
140 | cat $HOME/sap.log
141 | else
142 | echo "无自动执行日志,请明天上午9点后再来看"
143 | fi
144 | }
145 | delapp(){
146 | if [ -n "$cf_value" ]; then
147 | while true; do
148 | echo
149 | read -p "删除账户内的APP名称,多个APP空一格: " input
150 | if [ -z "$input" ]; then
151 | echo "输入不能为空,请重新输入!"
152 | else
153 | break
154 | fi
155 | done
156 | quoted=$(printf '%s ' $input)
157 | sed -i "79s/^.*$/DELAPP=\"${quoted% }\"/" $HOME/sapsbx.sh
158 | bash $HOME/sapsbx.sh
159 | sed -i "79s/^.*$/DELAPP=\"\"/" $HOME/sapsbx.sh
160 | else
161 | echo "未安装脚本,请卸载重装"
162 | fi
163 | }
164 | echo "*****************************************************"
165 | echo "*****************************************************"
166 | echo "甬哥Github项目 :github.com/yonggekkk"
167 | echo "甬哥Blogger博客 :ygkkk.blogspot.com"
168 | echo "甬哥YouTube频道 :www.youtube.com/@ygkkk"
169 | echo "Argosbx小钢炮脚本-SAP多账户自动部署并保活脚本【VPS】"
170 | echo "版本:V25.10.5"
171 | echo "*****************************************************"
172 | echo "*****************************************************"
173 | cf_line=$(sed -n '50p' "$HOME/sapsbx.sh" 2>/dev/null)
174 | cf_value=$(echo "$cf_line" | sed -E 's/CF_USERNAMES="(.*)"/\1/' | xargs 2>/dev/null)
175 | [ -z "$cf_value" ] && echo "当前未设置SAP变量,选择1添加变量" || { echo "当前已设置过SAP变量,详情如下显示,可选择2执行一次"; sed -n '47,76p' "$HOME/sapsbx.sh" 2>/dev/null; }
176 | echo "*****************************************************"
177 | echo " 1. 安装脚本并添加/重置变量"
178 | echo " 2. 手动测试执行一次"
179 | echo " 3. 查看最近一次自动执行日志"
180 | echo " 4. 删除已创建的应用程序名称APP"
181 | echo " 5. 卸载脚本"
182 | echo " 0. 退出"
183 | read -p "请输入数字【0-5】:" Input
184 | case "$Input" in
185 | 1 ) sapsbxinstall;;
186 | 2 ) goagain;;
187 | 3 ) showlog;;
188 | 4 ) delapp;;
189 | 5 ) unins;;
190 | * ) exit
191 | esac
192 |
--------------------------------------------------------------------------------
/.github/workflows/mainh.yml:
--------------------------------------------------------------------------------
1 | name: SAP多账户仅保活
2 | # 请设为私库!!!
3 | on:
4 | workflow_dispatch:
5 |
6 | concurrency:
7 | group: keepalive
8 | cancel-in-progress: true
9 |
10 | jobs:
11 | deploy-app:
12 | runs-on: ubuntu-latest
13 | env:
14 | # 必填!每个账号邮箱空一格
15 | CF_USERNAMES: ""
16 |
17 | # 必填!每个账号对应密码空一格
18 | CF_PASSWORDS: ""
19 |
20 | # 必填!每个账号对应地区空一格
21 | REGIONS: ""
22 |
23 | # 必填!每个账号对应UUID空一格
24 | UUIDS: ""
25 |
26 | steps:
27 | - name: Checkout code
28 | uses: actions/checkout@v4
29 |
30 | - name: Install Cloud Foundry CLI
31 | run: |
32 | wget -q https://github.com/cloudfoundry/cli/releases/download/v8.16.0/cf8-cli_8.16.0_linux_x86-64.tgz
33 | tar -xzf cf8-cli_8.16.0_linux_x86-64.tgz
34 | sudo mv cf8 /usr/local/bin/cf8
35 | sudo ln -sf /usr/local/bin/cf8 /usr/local/bin/cf
36 | sudo chmod +x /usr/local/bin/cf8
37 |
38 | - name: deployment
39 | run: |
40 | read -ra CF_USERNAMES <<< "$CF_USERNAMES"
41 | read -ra CF_PASSWORDS <<< "$CF_PASSWORDS"
42 | read -ra REGIONS <<< "$REGIONS"
43 | read -ra UUIDS <<< "$UUIDS"
44 | echo "*****************************************************"
45 | echo "*****************************************************"
46 | echo "甬哥Github项目 :github.com/yonggekkk"
47 | echo "甬哥Blogger博客 :ygkkk.blogspot.com"
48 | echo "甬哥YouTube频道 :www.youtube.com/@ygkkk"
49 | echo "Argosbx小钢炮脚本-SAP多账户保活脚本【Github】"
50 | echo "版本:V25.10.19"
51 | echo "*****************************************************"
52 | echo "*****************************************************"
53 | pushout(){
54 | if echo "$push_out" | grep -iq "insufficient"; then
55 | echo "🔴第 $((i+1)) 个实例部署:$apps 失败了,SAP资源被人抢光了,明早8:15-9:00再来吧,再见!!"
56 | return 1
57 | elif echo "$push_out" | grep -q "mapped"; then
58 | echo "🔴第 $((i+1)) 个实例部署:$apps 失败了,请更换应用程序APP名称:$apps,再运行一次"
59 | return 1
60 | elif echo "$push_out" | grep -q "FAILED"; then
61 | echo "🔴第 $((i+1)) 个实例部署:$apps 失败了,SAP繁忙中!请自查参数设置是否有误,后台实例是否超配额"
62 | return 1
63 | else
64 | echo "$apps 完成"
65 | return 0
66 | fi
67 | }
68 | result(){
69 | ROUTE=$(cf app "$apps" | grep "routes:" | awk '{print $2}')
70 | url="https://$ROUTE/$UUID"
71 | if curl -s "$url" | grep -iq "requested"; then
72 | echo "🔴 $apps SAP创建失败,SAP资源被人抢光了,明早8:10-9:00再来吧,再见!!"
73 | return 1
74 | else
75 | echo "🚀第 $((i+1)) 个实例部署成功"
76 | echo "🟢实例名称: $apps"
77 | echo "🟢服务器地区: $REGION"
78 | echo "🌐点击打开代理节点的链接网址🔗: https://$ROUTE/$UUID"
79 | echo
80 | return 0
81 | fi
82 | }
83 | for i in "${!CF_USERNAMES[@]}"; do
84 | set +e
85 | CF_EMAIL="${CF_USERNAMES[$i]}"
86 | CF_PASSWORD="${CF_PASSWORDS[$i]}"
87 | REGION="${REGIONS[$i]}"
88 | UUID="${UUIDS[$i]}"
89 | case "$REGION" in
90 | SG) CF_API="https://api.cf.ap21.hana.ondemand.com" ;;
91 | US) CF_API="https://api.cf.us10-001.hana.ondemand.com" ;;
92 | AU-A) CF_API="https://api.cf.ap10.hana.ondemand.com" ;;
93 | BR-A) CF_API="https://api.cf.br10.hana.ondemand.com" ;;
94 | KR-A) CF_API="https://api.cf.ap12.hana.ondemand.com" ;;
95 | CA-A) CF_API="https://api.cf.ca10.hana.ondemand.com" ;;
96 | US-V-A) CF_API="https://api.cf.us10-001.hana.ondemand.com" ;;
97 | US-O-A) CF_API="https://api.cf.us11.hana.ondemand.com" ;;
98 | DE-A) CF_API="https://api.cf.eu10-005.hana.ondemand.com" ;;
99 | JP-A) CF_API="https://api.cf.jp10.hana.ondemand.com" ;;
100 | SG-A) CF_API="https://api.cf.ap11.hana.ondemand.com" ;;
101 | AU-G) CF_API="https://api.cf.ap30.hana.ondemand.com" ;;
102 | BR-G) CF_API="https://api.cf.br30.hana.ondemand.com" ;;
103 | US-G) CF_API="https://api.cf.us30.hana.ondemand.com" ;;
104 | DE-G) CF_API="https://api.cf.eu30.hana.ondemand.com" ;;
105 | JP-O-G) CF_API="https://api.cf.jp30.hana.ondemand.com" ;;
106 | JP-T-G) CF_API="https://api.cf.jp31.hana.ondemand.com" ;;
107 | IL-G) CF_API="https://api.cf.il30.hana.ondemand.com" ;;
108 | IN-G) CF_API="https://api.cf.in30.hana.ondemand.com" ;;
109 | SA-G) CF_API="https://api.cf.sa31.hana.ondemand.com" ;;
110 | AU-M) CF_API="https://api.cf.ap20.hana.ondemand.com" ;;
111 | BR-M) CF_API="https://api.cf.br20.hana.ondemand.com" ;;
112 | CA-M) CF_API="https://api.cf.ca20.hana.ondemand.com" ;;
113 | US-V-M) CF_API="https://api.cf.us21.hana.ondemand.com" ;;
114 | US-W-M) CF_API="https://api.cf.us20.hana.ondemand.com" ;;
115 | NL-M) CF_API="https://api.cf.eu20-001.hana.ondemand.com" ;;
116 | JP-M) CF_API="https://api.cf.jp20.hana.ondemand.com" ;;
117 | SG-M) CF_API="https://api.cf.ap21.hana.ondemand.com" ;;
118 | AE-N) CF_API="https://api.cf.neo-ae1.hana.ondemand.com" ;;
119 | SA-N) CF_API="https://api.cf.neo-sa1.hana.ondemand.com" ;;
120 | *) echo "未知区域: $REGION"; continue ;;
121 | esac
122 | echo "=============================================="
123 | echo "=========第 $((i+1)) 个实例开始启动============"
124 | echo "=============================================="
125 | cf login -a "$CF_API" -u "$CF_EMAIL" -p "$CF_PASSWORD"
126 | ORG=$(cf orgs | sed -n '4p')
127 | SPACE=$(cf spaces | sed -n '4p')
128 | cf target -o "$ORG" -s "$SPACE"
129 | echo "🔐 登录 SAP Cloud Foundry"
130 | apps=$(cf apps | awk 'NR>3 {print $1}' | grep -v '^$')
131 | ROUTE=$(cf app "$apps" | grep "routes:" | awk '{print $2}')
132 | if [ -n "$ROUTE" ]; then
133 | url="https://$ROUTE/$UUID"
134 | if curl -s "$url" | grep -iq "vless"; then
135 | echo "✅ $apps 正在运行中,跳过执行。"
136 | result
137 | continue
138 | else
139 | echo "🟡$apps 已部署,但未启动,现重启……"
140 | push_out="$(timeout 180 cf restart "$apps" 2>&1)"
141 | pushout
142 | if [ $? -ne 0 ]; then
143 | continue
144 | fi
145 | result
146 | continue
147 | fi
148 | else
149 | echo "🔴$apps 部署未成功,请自查参数设置是否有误,空间是否被删除"
150 | fi
151 | done
152 |
--------------------------------------------------------------------------------
/sapsbxh.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | export LANG=en_US.UTF-8
3 | if ! command -v cf8 >/dev/null 2>&1; then
4 | if command -v apk >/dev/null 2>&1; then
5 | apk add --no-cache curl tar bash
6 | curl -L "https://github.com/cloudfoundry/cli/releases/download/v8.16.0/cf8-cli_8.16.0_linux_x86-64.tgz" | tar -xz -C /usr/local/bin
7 | chmod +x /usr/local/bin/cf8
8 | elif command -v apt >/dev/null 2>&1; then
9 | apt-get update && apt-get install -y wget gnupg
10 | wget -qO- https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | sudo gpg --yes --dearmor -o /usr/share/keyrings/cloudfoundry-cli-archive-keyring.gpg
11 | echo "deb [signed-by=/usr/share/keyrings/cloudfoundry-cli-archive-keyring.gpg] https://packages.cloudfoundry.org/debian stable main" | sudo tee /etc/apt/sources.list.d/cloudfoundry-cli.list > /dev/null
12 | apt-get update && apt-get install -y cf8-cli
13 | else
14 | echo "脚本仅支持Alpine、Debian、Ubuntu系统"
15 | exit 1
16 | fi
17 | fi
18 |
19 | if command -v apt >/dev/null 2>&1; then
20 | if ! dpkg -l tzdata >/dev/null 2>&1; then
21 | apt-get update -y >/dev/null 2>&1 && apt-get install -y tzdata >/dev/null 2>&1
22 | ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime >/dev/null 2>&1
23 | fi
24 | elif command -v apk >/dev/null 2>&1; then
25 | if ! apk info | grep tzdata >/dev/null 2>&1; then
26 | apk add --no-cache tzdata >/dev/null 2>&1
27 | cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime >/dev/null 2>&1
28 | echo "Asia/Shanghai" > /etc/timezone >/dev/null 2>&1
29 | fi
30 | fi
31 |
32 | if ! command -v crond >/dev/null 2>&1; then
33 | if command -v apk >/dev/null 2>&1; then
34 | apk add --no-cache cronie >/dev/null 2>&1
35 | rc-update add crond >/dev/null 2>&1 && rc-service crond start >/dev/null 2>&1
36 | fi
37 | elif ! command -v cron >/dev/null 2>&1; then
38 | if command -v apt >/dev/null 2>&1; then
39 | apt-get update -y >/dev/null 2>&1 && apt-get install -y cron >/dev/null 2>&1
40 | fi
41 | fi
42 |
43 | echo "*************************************"
44 | echo "中国时间 $(date): SAP开始执行任务"
45 | echo "运行cat $HOME/sap.log查看最近一次定时执行日志"
46 | echo "*************************************"
47 | # 设置区=====================================================================
48 |
49 | # 必填!每个账号邮箱空一格
50 | CF_USERNAMES=""
51 |
52 | # 必填!每个账号对应密码空一格
53 | CF_PASSWORDS=""
54 |
55 | # 必填!每个账号对应地区空一格
56 | REGIONS=""
57 |
58 | # 必填!每个账号对应UUID空一格
59 | UUIDS=""
60 |
61 | # 8-9点保活时间间隔,单位:分钟
62 | crontime=5
63 |
64 | # 设置区=====================================================================
65 |
66 | echo "*****************************************************"
67 | echo "*****************************************************"
68 | echo "甬哥Github项目 :github.com/yonggekkk"
69 | echo "甬哥Blogger博客 :ygkkk.blogspot.com"
70 | echo "甬哥YouTube频道 :www.youtube.com/@ygkkk"
71 | echo "Argosbx小钢炮脚本-SAP多账户自动保活脚本【VPS】"
72 | echo "版本:V25.10.19"
73 | echo "*****************************************************"
74 | echo "*****************************************************"
75 | read -ra CF_USERNAMES <<< "$CF_USERNAMES"
76 | read -ra CF_PASSWORDS <<< "$CF_PASSWORDS"
77 | read -ra REGIONS <<< "$REGIONS"
78 | read -ra UUIDS <<< "$UUIDS"
79 | jbpath=$(readlink -f "$0")
80 | crontab -l 2>/dev/null > /tmp/crontab.tmp
81 | sed -i "\|$jbpath|d" /tmp/crontab.tmp
82 | echo "10-59/${crontime} 8 * * * /bin/bash $jbpath > $HOME/sap.log 2>&1" >> /tmp/crontab.tmp
83 | crontab /tmp/crontab.tmp
84 | rm /tmp/crontab.tmp
85 | pushout(){
86 | if echo "$push_out" | grep -iq "insufficient"; then
87 | echo "🔴第 $((i+1)) 个实例部署:$apps 失败了,SAP资源被人抢光了,明早8:15-9:00再来吧,再见!!"
88 | return 1
89 | elif echo "$push_out" | grep -q "mapped"; then
90 | echo "🔴第 $((i+1)) 个实例部署:$apps 失败了,请更换应用程序APP名称:$apps,再运行一次"
91 | return 1
92 | elif echo "$push_out" | grep -q "FAILED"; then
93 | echo "🔴第 $((i+1)) 个实例部署:$apps 失败了,SAP繁忙中!请自查参数设置是否有误,后台实例是否超配额"
94 | return 1
95 | else
96 | echo "$apps 完成"
97 | return 0
98 | fi
99 | }
100 | result(){
101 | ROUTE=$(cf app "$apps" | grep "routes:" | awk '{print $2}')
102 | url="https://$ROUTE/$UUID"
103 | if curl -s "$url" | grep -iq "requested"; then
104 | echo "🔴 $apps SAP创建失败,SAP资源被人抢光了,明早8:10-9:00再来吧,再见!!"
105 | return 1
106 | else
107 | echo "🚀第 $((i+1)) 个实例部署成功"
108 | echo "🟢实例名称: $apps"
109 | echo "🟢服务器地区: $REGION"
110 | echo "🌐点击打开代理节点的链接网址🔗: https://$ROUTE/$UUID"
111 | echo
112 | return 0
113 | fi
114 | }
115 | for i in "${!CF_USERNAMES[@]}"; do
116 | set +e
117 | CF_EMAIL="${CF_USERNAMES[$i]}"
118 | CF_PASSWORD="${CF_PASSWORDS[$i]}"
119 | REGION="${REGIONS[$i]}"
120 | UUID="${UUIDS[$i]}"
121 | case "$REGION" in
122 | SG) CF_API="https://api.cf.ap21.hana.ondemand.com" ;;
123 | US) CF_API="https://api.cf.us10-001.hana.ondemand.com" ;;
124 | AU-A) CF_API="https://api.cf.ap10.hana.ondemand.com" ;;
125 | BR-A) CF_API="https://api.cf.br10.hana.ondemand.com" ;;
126 | KR-A) CF_API="https://api.cf.ap12.hana.ondemand.com" ;;
127 | CA-A) CF_API="https://api.cf.ca10.hana.ondemand.com" ;;
128 | US-V-A) CF_API="https://api.cf.us10-001.hana.ondemand.com" ;;
129 | US-O-A) CF_API="https://api.cf.us11.hana.ondemand.com" ;;
130 | DE-A) CF_API="https://api.cf.eu10-005.hana.ondemand.com" ;;
131 | JP-A) CF_API="https://api.cf.jp10.hana.ondemand.com" ;;
132 | SG-A) CF_API="https://api.cf.ap11.hana.ondemand.com" ;;
133 | AU-G) CF_API="https://api.cf.ap30.hana.ondemand.com" ;;
134 | BR-G) CF_API="https://api.cf.br30.hana.ondemand.com" ;;
135 | US-G) CF_API="https://api.cf.us30.hana.ondemand.com" ;;
136 | DE-G) CF_API="https://api.cf.eu30.hana.ondemand.com" ;;
137 | JP-O-G) CF_API="https://api.cf.jp30.hana.ondemand.com" ;;
138 | JP-T-G) CF_API="https://api.cf.jp31.hana.ondemand.com" ;;
139 | IL-G) CF_API="https://api.cf.il30.hana.ondemand.com" ;;
140 | IN-G) CF_API="https://api.cf.in30.hana.ondemand.com" ;;
141 | SA-G) CF_API="https://api.cf.sa31.hana.ondemand.com" ;;
142 | AU-M) CF_API="https://api.cf.ap20.hana.ondemand.com" ;;
143 | BR-M) CF_API="https://api.cf.br20.hana.ondemand.com" ;;
144 | CA-M) CF_API="https://api.cf.ca20.hana.ondemand.com" ;;
145 | US-V-M) CF_API="https://api.cf.us21.hana.ondemand.com" ;;
146 | US-W-M) CF_API="https://api.cf.us20.hana.ondemand.com" ;;
147 | NL-M) CF_API="https://api.cf.eu20-001.hana.ondemand.com" ;;
148 | JP-M) CF_API="https://api.cf.jp20.hana.ondemand.com" ;;
149 | SG-M) CF_API="https://api.cf.ap21.hana.ondemand.com" ;;
150 | AE-N) CF_API="https://api.cf.neo-ae1.hana.ondemand.com" ;;
151 | SA-N) CF_API="https://api.cf.neo-sa1.hana.ondemand.com" ;;
152 | *) echo "未知区域: $REGION"; continue ;;
153 | esac
154 | echo "=============================================="
155 | echo "=========第 $((i+1)) 个实例开始启动============"
156 | echo "=============================================="
157 | cf login -a "$CF_API" -u "$CF_EMAIL" -p "$CF_PASSWORD"
158 | ORG=$(cf orgs | sed -n '4p')
159 | SPACE=$(cf spaces | sed -n '4p')
160 | cf target -o "$ORG" -s "$SPACE"
161 | echo "🔐 登录 SAP Cloud Foundry"
162 | apps=$(cf apps | awk 'NR>3 {print $1}' | grep -v '^$')
163 | ROUTE=$(cf app "$apps" | grep "routes:" | awk '{print $2}')
164 | if [ -n "$ROUTE" ]; then
165 | url="https://$ROUTE/$UUID"
166 | if curl -s "$url" | grep -iq "vless"; then
167 | echo "✅ $apps 正在运行中,跳过执行。"
168 | result
169 | continue
170 | else
171 | echo "🟡$apps 已部署,但未启动,现重启……"
172 | push_out="$(timeout 180 cf restart "$apps" 2>&1)"
173 | pushout
174 | if [ $? -ne 0 ]; then
175 | continue
176 | fi
177 | result
178 | continue
179 | fi
180 | else
181 | echo "🔴$apps 部署未成功,请自查参数设置是否有误,空间是否被删除"
182 | fi
183 | done
184 |
--------------------------------------------------------------------------------
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | name: SAP多账户自动部署
2 | # 请设为私库!!!
3 | on:
4 | workflow_dispatch:
5 |
6 | concurrency:
7 | group: keepalive
8 | cancel-in-progress: true
9 |
10 | jobs:
11 | deploy-app:
12 | runs-on: ubuntu-latest
13 | env:
14 | # 必填!每个账号邮箱空一格
15 | CF_USERNAMES: ""
16 |
17 | # 必填!每个账号对应密码空一格
18 | CF_PASSWORDS: ""
19 |
20 | # 必填!每个账号对应地区空一格
21 | REGIONS: ""
22 |
23 | # 必填!每个账号对应UUID空一格
24 | UUIDS: ""
25 |
26 | # 选填!每个账号对应名称空一格,不填则每个实例自动生成,多个账号中有个别账号自动生成填no
27 | APP_NAMES: ""
28 |
29 | # 选填!Argo固定/临时隧道端口,每个账号对应端口空一格,不填则每个实例不启用argo,多个账号中有个别账号不启用填no
30 | VMPTS: ""
31 |
32 | # 选填!Argo固定隧道域名,每个账号对应域名空一格,不填则每个实例启用argo临时隧道,多个账号中有个别账号不启用填no
33 | AGNS: ""
34 |
35 | # 选填!Argo固定隧道token,每个账号对应token空一格,不填则每个实例启用argo临时隧道,多个账号中有个别账号不启用填no
36 | AGKS: ""
37 |
38 | # 优先独立执行!删除账户内的APP名称,多个APP空一格,执行后务必还原留空状态:DELAPP: ""
39 | DELAPP: ""
40 |
41 | steps:
42 | - name: Checkout code
43 | uses: actions/checkout@v4
44 |
45 | - name: Install Cloud Foundry CLI
46 | run: |
47 | wget -q https://github.com/cloudfoundry/cli/releases/download/v8.16.0/cf8-cli_8.16.0_linux_x86-64.tgz
48 | tar -xzf cf8-cli_8.16.0_linux_x86-64.tgz
49 | sudo mv cf8 /usr/local/bin/cf8
50 | sudo ln -sf /usr/local/bin/cf8 /usr/local/bin/cf
51 | sudo chmod +x /usr/local/bin/cf8
52 |
53 | - name: deployment
54 | run: |
55 | read -ra CF_USERNAMES <<< "$CF_USERNAMES"
56 | read -ra CF_PASSWORDS <<< "$CF_PASSWORDS"
57 | read -ra REGIONS <<< "$REGIONS"
58 | read -ra UUIDS <<< "$UUIDS"
59 | read -ra APP_NAMES <<< "$APP_NAMES"
60 | read -ra VMPTS <<< "$VMPTS"
61 | read -ra AGNS <<< "$AGNS"
62 | read -ra AGKS <<< "$AGKS"
63 | echo "*****************************************************"
64 | echo "*****************************************************"
65 | echo "甬哥Github项目 :github.com/yonggekkk"
66 | echo "甬哥Blogger博客 :ygkkk.blogspot.com"
67 | echo "甬哥YouTube频道 :www.youtube.com/@ygkkk"
68 | echo "Argosbx小钢炮脚本-SAP多账户自动部署并保活脚本【Github】"
69 | echo "版本:V25.10.5"
70 | echo "*****************************************************"
71 | echo "*****************************************************"
72 | pushout(){
73 | if echo "$push_out" | grep -iq "insufficient"; then
74 | echo "🔴第 $((i+1)) 个实例部署:${APP_NAME} 失败了,SAP资源被人抢光了,明早8:10-9:00再来吧,再见!!"
75 | return 1
76 | elif echo "$push_out" | grep -q "mapped"; then
77 | echo "🔴第 $((i+1)) 个实例部署:${APP_NAME} 失败了,请更换应用程序APP名称:${APP_NAME},再运行一次"
78 | return 1
79 | elif echo "$push_out" | grep -q "FAILED"; then
80 | echo "🔴第 $((i+1)) 个实例部署:${APP_NAME} 失败了,SAP繁忙中!请自查参数设置是否有误,空间是否被删除"
81 | return 1
82 | else
83 | echo "${APP_NAME} 完成"
84 | return 0
85 | fi
86 | }
87 | sapcfevn(){
88 | cf set-env "$APP_NAME" uuid "$UUID"
89 | if [ -n "$VMPT" ]; then
90 | cf set-env "$APP_NAME" agn "$AGN"
91 | cf set-env "$APP_NAME" agk "$AGK"
92 | cf set-env "$APP_NAME" vmpt "$VMPT"
93 | cf set-env "$APP_NAME" argo "y"
94 | fi
95 | ROUTE=$(cf app "$APP_NAME" | grep "routes:" | awk '{print $2}')
96 | cf set-env "$APP_NAME" DOMAIN "$ROUTE"
97 | }
98 | result(){
99 | ROUTE=$(cf app "$APP_NAME" | grep "routes:" | awk '{print $2}')
100 | url="https://$ROUTE/$UUID"
101 | if curl -s "$url" | grep -iq "requested"; then
102 | echo "🔴 ${APP_NAME} SAP创建失败,SAP资源被人抢光了,明早8:10-9:00再来吧,再见!!"
103 | return 1
104 | else
105 | echo "🚀第 $((i+1)) 个实例部署成功"
106 | echo "🟢实例名称: $APP_NAME"
107 | echo "🟢服务器地区: $REGION"
108 | echo "🌐点击打开代理节点的链接网址🔗: https://$ROUTE/$UUID"
109 | echo
110 | return 0
111 | fi
112 | }
113 | for i in "${!CF_USERNAMES[@]}"; do
114 | set +e
115 | CF_EMAIL="${CF_USERNAMES[$i]}"
116 | CF_PASSWORD="${CF_PASSWORDS[$i]}"
117 | REGION="${REGIONS[$i]}"
118 | UUID="${UUIDS[$i]}"
119 | APP_NAME="${APP_NAMES[$i]}"
120 | VMPT="${VMPTS[$i]}"
121 | AGN="${AGNS[$i]}"
122 | AGK="${AGKS[$i]}"
123 | [ "$APP_NAME" = "no" ] && APP_NAME=""
124 | [ "$VMPT" = "no" ] && VMPT=""
125 | [ "$AGN" = "no" ] && AGN=""
126 | [ "$AGK" = "no" ] && AGK=""
127 | case "$REGION" in
128 | SG) CF_API="https://api.cf.ap21.hana.ondemand.com"; serv="sg" ;;
129 | US) CF_API="https://api.cf.us10-001.hana.ondemand.com"; serv="us" ;;
130 | AU-A) CF_API="https://api.cf.ap10.hana.ondemand.com"; serv="au-a" ;;
131 | BR-A) CF_API="https://api.cf.br10.hana.ondemand.com"; serv="br-a" ;;
132 | KR-A) CF_API="https://api.cf.ap12.hana.ondemand.com"; serv="us-a" ;;
133 | CA-A) CF_API="https://api.cf.ca10.hana.ondemand.com"; serv="us-a" ;;
134 | US-V-A) CF_API="https://api.cf.us10-001.hana.ondemand.com"; serv="us-v-a" ;;
135 | US-O-A) CF_API="https://api.cf.us11.hana.ondemand.com"; serv="us-o-a" ;;
136 | DE-A) CF_API="https://api.cf.eu10-005.hana.ondemand.com"; serv="de-a" ;;
137 | JP-A) CF_API="https://api.cf.jp10.hana.ondemand.com"; serv="jp-a" ;;
138 | SG-A) CF_API="https://api.cf.ap11.hana.ondemand.com"; serv="sg-a" ;;
139 | AU-G) CF_API="https://api.cf.ap30.hana.ondemand.com"; serv="au-g" ;;
140 | BR-G) CF_API="https://api.cf.br30.hana.ondemand.com"; serv="br-g" ;;
141 | US-G) CF_API="https://api.cf.us30.hana.ondemand.com"; serv="us-g" ;;
142 | DE-G) CF_API="https://api.cf.eu30.hana.ondemand.com"; serv="de-g" ;;
143 | JP-O-G) CF_API="https://api.cf.jp30.hana.ondemand.com"; serv="jp-o-g" ;;
144 | JP-T-G) CF_API="https://api.cf.jp31.hana.ondemand.com"; serv="jp-t-g" ;;
145 | IL-G) CF_API="https://api.cf.il30.hana.ondemand.com"; serv="il-g" ;;
146 | IN-G) CF_API="https://api.cf.in30.hana.ondemand.com"; serv="in-g" ;;
147 | SA-G) CF_API="https://api.cf.sa31.hana.ondemand.com"; serv="sa-g" ;;
148 | AU-M) CF_API="https://api.cf.ap20.hana.ondemand.com"; serv="au-m" ;;
149 | BR-M) CF_API="https://api.cf.br20.hana.ondemand.com"; serv="br-m" ;;
150 | CA-M) CF_API="https://api.cf.ca20.hana.ondemand.com"; serv="ca-m" ;;
151 | US-V-M) CF_API="https://api.cf.us21.hana.ondemand.com"; serv="us-v-m" ;;
152 | US-W-M) CF_API="https://api.cf.us20.hana.ondemand.com"; serv="us-w-m" ;;
153 | NL-M) CF_API="https://api.cf.eu20-001.hana.ondemand.com"; serv="nl-m" ;;
154 | JP-M) CF_API="https://api.cf.jp20.hana.ondemand.com"; serv="jp-m" ;;
155 | SG-M) CF_API="https://api.cf.ap21.hana.ondemand.com"; serv="sg-m" ;;
156 | AE-N) CF_API="https://api.cf.neo-ae1.hana.ondemand.com"; serv="ae-n" ;;
157 | SA-N) CF_API="https://api.cf.neo-sa1.hana.ondemand.com"; serv="sa-n" ;;
158 | *) echo "未知区域: $REGION"; continue ;;
159 | esac
160 | if [ -z "$APP_NAME" ]; then
161 | APP_NAME="sap-$serv-${CF_EMAIL//[^a-zA-Z0-9_-]/-}"
162 | else
163 | APP_NAME="${APP_NAME//[^a-zA-Z0-9_-]/-}"
164 | fi
165 | echo "=============================================="
166 | echo "=========第 $((i+1)) 个实例开始启动============"
167 | echo "=============================================="
168 | cf login -a "$CF_API" -u "$CF_EMAIL" -p "$CF_PASSWORD"
169 | ORG=$(cf orgs | sed -n '4p')
170 | SPACE=$(cf spaces | sed -n '4p')
171 | cf target -o "$ORG" -s "$SPACE"
172 | echo "🔐 登录 SAP Cloud Foundry"
173 | if [ -n "$DELAPP" ]; then
174 | for app in $DELAPP; do
175 | cf delete "$app" -r -f
176 | done
177 | else
178 | ROUTE=$(cf app "$APP_NAME" | grep "routes:" | awk '{print $2}')
179 | if [ -n "$ROUTE" ]; then
180 | url="https://$ROUTE/$UUID"
181 | if curl -s "$url" | grep -iq "vless"; then
182 | echo "✅ ${APP_NAME} SAP正在运行中,跳过执行。"
183 | result
184 | continue
185 | else
186 | echo "🟡${APP_NAME} 已部署,但未启动,现重启……"
187 | sapcfevn
188 | push_out="$(timeout 180 cf restart "$APP_NAME" 2>&1)"
189 | echo $push_out
190 | pushout
191 | if [ $? -ne 0 ]; then
192 | continue
193 | fi
194 | result
195 | continue
196 | fi
197 | else
198 | echo "🟡${APP_NAME} 未部署,开始部署……"
199 | push_out="$(timeout 180 cf push "$APP_NAME" --docker-image ygkkk/argosbx -m 512M --health-check-type port 2>&1)"
200 | echo $push_out
201 | pushout
202 | if [ $? -ne 0 ]; then
203 | continue
204 | fi
205 | sapcfevn
206 | cf restage "$APP_NAME"
207 | cf app "$APP_NAME"
208 | result
209 | fi
210 | fi
211 | done
212 |
--------------------------------------------------------------------------------
/sapsbx.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | export LANG=en_US.UTF-8
3 | if ! command -v cf8 >/dev/null 2>&1; then
4 | if command -v apk >/dev/null 2>&1; then
5 | apk add --no-cache curl tar bash
6 | curl -L "https://github.com/cloudfoundry/cli/releases/download/v8.16.0/cf8-cli_8.16.0_linux_x86-64.tgz" | tar -xz -C /usr/local/bin
7 | chmod +x /usr/local/bin/cf8
8 | elif command -v apt >/dev/null 2>&1; then
9 | apt-get update && apt-get install -y wget gnupg
10 | wget -qO- https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | sudo gpg --yes --dearmor -o /usr/share/keyrings/cloudfoundry-cli-archive-keyring.gpg
11 | echo "deb [signed-by=/usr/share/keyrings/cloudfoundry-cli-archive-keyring.gpg] https://packages.cloudfoundry.org/debian stable main" | sudo tee /etc/apt/sources.list.d/cloudfoundry-cli.list > /dev/null
12 | apt-get update && apt-get install -y cf8-cli
13 | else
14 | echo "脚本仅支持Alpine、Debian、Ubuntu系统"
15 | exit 1
16 | fi
17 | fi
18 |
19 | if command -v apt >/dev/null 2>&1; then
20 | if ! dpkg -l tzdata >/dev/null 2>&1; then
21 | apt-get update -y >/dev/null 2>&1 && apt-get install -y tzdata >/dev/null 2>&1
22 | ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime >/dev/null 2>&1
23 | fi
24 | elif command -v apk >/dev/null 2>&1; then
25 | if ! apk info | grep tzdata >/dev/null 2>&1; then
26 | apk add --no-cache tzdata >/dev/null 2>&1
27 | cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime >/dev/null 2>&1
28 | echo "Asia/Shanghai" > /etc/timezone >/dev/null 2>&1
29 | fi
30 | fi
31 |
32 | if ! command -v crond >/dev/null 2>&1; then
33 | if command -v apk >/dev/null 2>&1; then
34 | apk add --no-cache cronie >/dev/null 2>&1
35 | rc-update add crond >/dev/null 2>&1 && rc-service crond start >/dev/null 2>&1
36 | fi
37 | elif ! command -v cron >/dev/null 2>&1; then
38 | if command -v apt >/dev/null 2>&1; then
39 | apt-get update -y >/dev/null 2>&1 && apt-get install -y cron >/dev/null 2>&1
40 | fi
41 | fi
42 |
43 | echo "*************************************"
44 | echo "中国时间 $(date): SAP开始执行任务"
45 | echo "运行cat $HOME/sap.log查看最近一次定时执行日志"
46 | echo "*************************************"
47 | # 设置区=====================================================================
48 |
49 | # 必填!每个账号邮箱空一格
50 | CF_USERNAMES=""
51 |
52 | # 必填!每个账号对应密码空一格
53 | CF_PASSWORDS=""
54 |
55 | # 必填!每个账号对应地区空一格
56 | REGIONS=""
57 |
58 | # 必填!每个账号对应UUID空一格
59 | UUIDS=""
60 |
61 | # 选填!每个账号对应的应用程序名称APP空一格,不填则每个实例都自动生成,多个账号中有个别账号自动生成填no
62 | APP_NAMES=""
63 |
64 | # 选填!当使用Argo固定/临时隧道时,此端口变量必填,每个账号对应端口空一格,不填则每个实例都不启用argo,多个账号中有个别账号不启用填no
65 | VMPTS=""
66 |
67 | # 选填!Argo固定隧道域名,每个账号对应域名空一格,不填则每个实例都启用argo临时隧道,多个账号中有个别账号不启用填no
68 | AGNS=""
69 |
70 | # 选填!Argo固定隧道token,每个账号对应token空一格,不填则每个实例都启用argo临时隧道,多个账号中有个别账号不启用填no
71 | AGKS=""
72 |
73 | # 8-9点保活时间间隔,单位:分钟
74 | crontime=5
75 |
76 | # 设置区=====================================================================
77 |
78 | # 优先独立执行!删除账户内的APP名称,多个APP空一格,执行后务必还原留空状态:DELAPP=""
79 | DELAPP=""
80 |
81 | echo "*****************************************************"
82 | echo "*****************************************************"
83 | echo "甬哥Github项目 :github.com/yonggekkk"
84 | echo "甬哥Blogger博客 :ygkkk.blogspot.com"
85 | echo "甬哥YouTube频道 :www.youtube.com/@ygkkk"
86 | echo "Argosbx小钢炮脚本-SAP多账户自动部署并保活脚本【VPS】"
87 | echo "版本:V25.10.5"
88 | echo "*****************************************************"
89 | echo "*****************************************************"
90 | read -ra CF_USERNAMES <<< "$CF_USERNAMES"
91 | read -ra CF_PASSWORDS <<< "$CF_PASSWORDS"
92 | read -ra REGIONS <<< "$REGIONS"
93 | read -ra UUIDS <<< "$UUIDS"
94 | read -ra APP_NAMES <<< "$APP_NAMES"
95 | read -ra VMPTS <<< "$VMPTS"
96 | read -ra AGNS <<< "$AGNS"
97 | read -ra AGKS <<< "$AGKS"
98 | jbpath=$(readlink -f "$0")
99 | crontab -l 2>/dev/null > /tmp/crontab.tmp
100 | sed -i "\|$jbpath|d" /tmp/crontab.tmp
101 | echo "10-59/${crontime} 8 * * * /bin/bash $jbpath > $HOME/sap.log 2>&1" >> /tmp/crontab.tmp
102 | crontab /tmp/crontab.tmp
103 | rm /tmp/crontab.tmp
104 | pushout() {
105 | if echo "$push_out" | grep -iq "insufficient"; then
106 | echo "🔴第 $((i+1)) 个实例部署:${APP_NAME} 失败了,SAP资源被人抢光了,明早8:10-9:00再来吧,再见!!"
107 | return 1
108 | elif echo "$push_out" | grep -q "mapped"; then
109 | echo "🔴第 $((i+1)) 个实例部署:${APP_NAME} 失败了,请更换应用程序APP名称:${APP_NAME},再运行一次"
110 | return 1
111 | elif echo "$push_out" | grep -q "FAILED"; then
112 | echo "🔴第 $((i+1)) 个实例部署:${APP_NAME} 失败了,SAP繁忙中!请自查参数设置是否有误,空间是否被删除"
113 | return 1
114 | else
115 | echo "${APP_NAME} 完成"
116 | return 0
117 | fi
118 | }
119 | sapcfevn() {
120 | cf set-env "$APP_NAME" uuid "$UUID"
121 | if [ -n "$VMPT" ]; then
122 | cf set-env "$APP_NAME" agn "$AGN"
123 | cf set-env "$APP_NAME" agk "$AGK"
124 | cf set-env "$APP_NAME" vmpt "$VMPT"
125 | cf set-env "$APP_NAME" argo "y"
126 | fi
127 | ROUTE=$(cf app "$APP_NAME" | grep "routes:" | awk '{print $2}')
128 | cf set-env "$APP_NAME" DOMAIN "$ROUTE"
129 | }
130 | result() {
131 | ROUTE=$(cf app "$APP_NAME" | grep "routes:" | awk '{print $2}')
132 | url="https://$ROUTE/$UUID"
133 | if curl -s "$url" | grep -iq "requested"; then
134 | echo "🔴 ${APP_NAME} SAP创建失败,SAP资源被人抢光了,明早8:10-9:00再来吧,再见!!"
135 | return 1
136 | else
137 | echo "🚀第 $((i+1)) 个实例部署成功"
138 | echo "🟢实例名称: $APP_NAME"
139 | echo "🟢服务器地区: $REGION"
140 | echo "🌐点击打开代理节点的链接网址🔗: https://$ROUTE/$UUID"
141 | echo
142 | return 0
143 | fi
144 | }
145 | for i in "${!CF_USERNAMES[@]}"; do
146 | set +e
147 | CF_EMAIL="${CF_USERNAMES[$i]}"
148 | CF_PASSWORD="${CF_PASSWORDS[$i]}"
149 | REGION="${REGIONS[$i]}"
150 | UUID="${UUIDS[$i]}"
151 | APP_NAME="${APP_NAMES[$i]}"
152 | VMPT="${VMPTS[$i]}"
153 | AGN="${AGNS[$i]}"
154 | AGK="${AGKS[$i]}"
155 | [ "$APP_NAME" = "no" ] && APP_NAME=""
156 | [ "$VMPT" = "no" ] && VMPT=""
157 | [ "$AGN" = "no" ] && AGN=""
158 | [ "$AGK" = "no" ] && AGK=""
159 | case "$REGION" in
160 | SG) CF_API="https://api.cf.ap21.hana.ondemand.com"; serv="sg" ;;
161 | US) CF_API="https://api.cf.us10-001.hana.ondemand.com"; serv="us" ;;
162 | AU-A) CF_API="https://api.cf.ap10.hana.ondemand.com"; serv="au-a" ;;
163 | BR-A) CF_API="https://api.cf.br10.hana.ondemand.com"; serv="br-a" ;;
164 | KR-A) CF_API="https://api.cf.ap12.hana.ondemand.com"; serv="us-a" ;;
165 | CA-A) CF_API="https://api.cf.ca10.hana.ondemand.com"; serv="us-a" ;;
166 | US-V-A) CF_API="https://api.cf.us10-001.hana.ondemand.com"; serv="us-v-a" ;;
167 | US-O-A) CF_API="https://api.cf.us11.hana.ondemand.com"; serv="us-o-a" ;;
168 | DE-A) CF_API="https://api.cf.eu10-005.hana.ondemand.com"; serv="de-a" ;;
169 | JP-A) CF_API="https://api.cf.jp10.hana.ondemand.com"; serv="jp-a" ;;
170 | SG-A) CF_API="https://api.cf.ap11.hana.ondemand.com"; serv="sg-a" ;;
171 | AU-G) CF_API="https://api.cf.ap30.hana.ondemand.com"; serv="au-g" ;;
172 | BR-G) CF_API="https://api.cf.br30.hana.ondemand.com"; serv="br-g" ;;
173 | US-G) CF_API="https://api.cf.us30.hana.ondemand.com"; serv="us-g" ;;
174 | DE-G) CF_API="https://api.cf.eu30.hana.ondemand.com"; serv="de-g" ;;
175 | JP-O-G) CF_API="https://api.cf.jp30.hana.ondemand.com"; serv="jp-o-g" ;;
176 | JP-T-G) CF_API="https://api.cf.jp31.hana.ondemand.com"; serv="jp-t-g" ;;
177 | IL-G) CF_API="https://api.cf.il30.hana.ondemand.com"; serv="il-g" ;;
178 | IN-G) CF_API="https://api.cf.in30.hana.ondemand.com"; serv="in-g" ;;
179 | SA-G) CF_API="https://api.cf.sa31.hana.ondemand.com"; serv="sa-g" ;;
180 | AU-M) CF_API="https://api.cf.ap20.hana.ondemand.com"; serv="au-m" ;;
181 | BR-M) CF_API="https://api.cf.br20.hana.ondemand.com"; serv="br-m" ;;
182 | CA-M) CF_API="https://api.cf.ca20.hana.ondemand.com"; serv="ca-m" ;;
183 | US-V-M) CF_API="https://api.cf.us21.hana.ondemand.com"; serv="us-v-m" ;;
184 | US-W-M) CF_API="https://api.cf.us20.hana.ondemand.com"; serv="us-w-m" ;;
185 | NL-M) CF_API="https://api.cf.eu20-001.hana.ondemand.com"; serv="nl-m" ;;
186 | JP-M) CF_API="https://api.cf.jp20.hana.ondemand.com"; serv="jp-m" ;;
187 | SG-M) CF_API="https://api.cf.ap21.hana.ondemand.com"; serv="sg-m" ;;
188 | AE-N) CF_API="https://api.cf.neo-ae1.hana.ondemand.com"; serv="ae-n" ;;
189 | SA-N) CF_API="https://api.cf.neo-sa1.hana.ondemand.com"; serv="sa-n" ;;
190 | *) echo "未知区域: $REGION"; continue ;;
191 | esac
192 | if [ -z "$APP_NAME" ]; then
193 | APP_NAME="sap-$serv-${CF_EMAIL//[^a-zA-Z0-9_-]/-}"
194 | else
195 | APP_NAME="${APP_NAME//[^a-zA-Z0-9_-]/-}"
196 | fi
197 | echo "=============================================="
198 | echo "=========第 $((i+1)) 个实例开始启动============"
199 | echo "=============================================="
200 | cf login -a "$CF_API" -u "$CF_EMAIL" -p "$CF_PASSWORD"
201 | ORG=$(cf orgs | sed -n '4p')
202 | SPACE=$(cf spaces | sed -n '4p')
203 | cf target -o "$ORG" -s "$SPACE"
204 | echo "🔐 登录 SAP Cloud Foundry"
205 | if [ -n "$DELAPP" ]; then
206 | for app in $DELAPP; do
207 | cf delete "$app" -r -f
208 | done
209 | else
210 | ROUTE=$(cf app "$APP_NAME" | grep "routes:" | awk '{print $2}')
211 | if [ -n "$ROUTE" ]; then
212 | url="https://$ROUTE/$UUID"
213 | if curl -s "$url" | grep -iq "vless"; then
214 | echo "✅ ${APP_NAME} SAP正在运行中,跳过执行。"
215 | result
216 | continue
217 | else
218 | echo "🟡${APP_NAME} 已部署,但未启动,现重启……"
219 | sapcfevn
220 | push_out="$(cf restart "$APP_NAME" 2>&1)"
221 | echo "$push_out"
222 | pushout
223 | if [ $? -ne 0 ]; then
224 | continue
225 | fi
226 | result
227 | continue
228 | fi
229 | else
230 | echo "🟡${APP_NAME} 未部署,开始部署……"
231 | push_out="$(cf push "$APP_NAME" --docker-image ygkkk/argosbx -m 512M --health-check-type port 2>&1)"
232 | echo "$push_out"
233 | pushout
234 | if [ $? -ne 0 ]; then
235 | continue
236 | fi
237 | sapcfevn
238 | cf restage "$APP_NAME"
239 | cf app "$APP_NAME"
240 | result
241 | fi
242 | fi
243 | done
244 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Argosbx一键无交互小钢炮脚本💣:极简 + 轻量 + 快速
2 |
3 | ---------------------------------------
4 |
5 |
6 |
7 |
8 | ### 【Argosbx当前版本:V25.11.20】
9 |
10 | ---------------------------------------
11 |
12 | #### 1、基于Sing-box + Xray + Cloudflared-Argo 三内核自动分配
13 |
14 | #### 2、支持Linux类主流VPS系统(建议最新版系统),SSH脚本支持非root环境运行,几乎无需依赖,无脑一次回车搞定
15 |
16 | #### 3、支持各种容器系统,Docker镜像部署,公开镜像库:```ygkkk/argosbx```
17 |
18 | #### 4、根据Sing-box与Xray不同内核,可选15种WARP出站组合,更换落地IP为WARP的IP,解锁流媒体
19 |
20 | #### 5、所有代理协议都无需域名(除了argo固定隧道、IP端口CDN),支持单个或多个代理协议任意组合并快速重置更换
21 | 【 已支持:AnyTLS、Any-reality、Vless-xhttp-reality-vison-enc、Vless-tcp-reality-vision、Vless-xhttp-vison-enc、Vless-ws-vision-enc、Shadowsocks-2022、Vmess-ws、Socks5、Hysteria2、Tuic、Argo临时/固定隧道支持Vless-ws-vision-enc或Vmess-ws 】
22 |
23 | #### 6、建议配合SSH一键脚本命令生成器网页使用:https://yonggekkk.github.io/argosbx/
24 |
25 | #### 7、如需要多样的功能,推荐使用VPS专用四合一脚本[Sing-box-yg](https://github.com/yonggekkk/sing-box-yg)
26 |
27 | #### 8、Argosbx客户端推荐:
28 |
29 | 安卓手机客户端:[Nekobox-starifly版(全协议支持)](https://github.com/starifly/NekoBoxForAndroid/releases)、[V2rayNG官方版](https://github.com/2dust/v2rayNG/releases)
30 |
31 | 电脑win客户端:[V2rayN官方版(全协议支持)](https://github.com/2dust/v2rayN/releases)
32 |
33 | 苹果IOS客户端:OneXray、Streisand
34 |
35 | ----------------------------------------------------------
36 |
37 | ## 一、自定义变量参数说明:
38 |
39 | | 变量意义 | 变量名称| 在变量值""之间填写| 删除变量 | 在变量值""之间留空 | 变量要求及说明 |
40 | | :--- | :--- | :--- | :--- | :--- | :--- |
41 | | 1、启用vless-tcp-reality-v | vlpt | 端口指定 | 关闭vless-tcp-reality-v | 端口随机 | 必选之一 【xray内核:TCP】 |
42 | | 2、启用vless-xhttp-reality-enc | xhpt | 端口指定 | 关闭vless-xhttp-reality-enc | 端口随机 | 必选之一 【xray内核:TCP】 |
43 | | 3、启用vless-xhttp-enc | vxpt | 端口指定 | 关闭vless-xhttp-enc | 端口随机 | 必选之一 【xray内核:TCP】 |
44 | | 4、启用vless-ws-enc | vwpt | 端口指定 | 关闭vless-ws-enc | 端口随机 | 必选之一 【xray内核:TCP】 |
45 | | 5、启用shadowsocks-2022 | sspt | 端口指定 | 关闭shadowsocks-2022 | 端口随机 | 必选之一 【singbox内核:TCP】 |
46 | | 6、启用anytls | anpt | 端口指定 | 关闭anytls | 端口随机 | 必选之一 【singbox内核:TCP】 |
47 | | 7、启用any-reality | arpt | 端口指定 | 关闭any-reality | 端口随机 | 必选之一 【singbox内核:TCP】 |
48 | | 8、启用vmess-ws | vmpt | 端口指定 | 关闭vmess-ws | 端口随机 | 必选之一 【xray/singbox内核:TCP】 |
49 | | 9、启用socks5 | sopt | 端口指定 | 关闭socks5 | 端口随机 | 必选之一 【xray/singbox内核:TCP】 |
50 | | 10、启用hysteria2 | hypt | 端口指定 | 关闭hy2 | 端口随机 | 必选之一 【singbox内核:UDP】 |
51 | | 11、启用tuic | tupt | 端口指定 | 关闭tuic | 端口随机 | 必选之一 【singbox内核:UDP】 |
52 | | 12、warp开关 | warp | 详见下方15种warp出站模式图 | 关闭warp | singbox与xray内核协议都启用warp全局V4+V6 | 可选,详见下方15种warp出站模式图 |
53 | | 13、argo开关 | argo | 填写vwpt或者vmpt | 关闭argo隧道 | 关闭argo隧道 | 可选,填写vmpt或vwpt时,vmess-ws或vless-ws变量vmpt或vwpt必须启用,且固定隧道必须填写vmpt或vwpt端口 |
54 | | 14、argo固定隧道域名 | agn | 托管在CF上的域名 | 使用临时隧道 | 使用临时隧道 | 可选,argo填写vmpt或vwpt时才可激活固定隧道|
55 | | 15、argo固定隧道token | agk | CF获取的ey开头的token | 使用临时隧道 | 使用临时隧道 | 可选,argo填写vmpt或vwpt时才可激活固定隧道 |
56 | | 16、uuid密码 | uuid | 符合uuid规定格式 | 随机生成 | 随机生成 | 可选 |
57 | | 17、reality域名(仅支持reality类协议) | reym | 符合reality域名规定 | apple官网 | apple官网 | 可选,使用CF类域名时:服务器ip:节点端口的组合,可作为ProxyIP/客户端地址反代IP(建议高位端口或纯IPV6下使用,以防被扫泄露)|
58 | | 18、vmess-ws、vless-xhttp/ws-enc在客户端的host地址 | cdnym | CF解析IP的域名 | vmess-ws、vless-xhttp/ws-enc为直连 | vmess-ws、vless-xhttp/ws-enc为直连 | 可选,使用80系CDN或者回源CDN时可设置,否则客户端host地址需手动更改为CF解析IP的域名|
59 | | 19、切换ipv4或ipv6配置 | ippz | 填写4或者6 | 自动识别IP配置 | 自动识别IP配置 | 可选,4表示IPV4配置输出,6表示IPV6配置输出 |
60 | | 20、添加所有节点名称前缀 | name | 任意字符 | 默认协议名前缀 | 默认协议名前缀 | 可选 |
61 | | 21、当前系统开放所有端口 | oap | 填写y | 禁止开放所有端口 | 禁止开放所有端口 | 可选,开启运行一次即可,后续删除变量,没必要每次运行 |
62 | | 22、【仅容器类docker】监听端口,网页查询 | PORT | 端口指定 | 3000 | 3000 | 可选 |
63 | | 23、【仅容器类docker】启用vless-ws-tls | DOMAIN | 服务器域名 | 关闭vless-ws-tls | 关闭vless-ws-tls | 可选,vless-ws-tls可独立存在,uuid变量必须启用 |
64 |
65 | ------------------------------------------------------------------
66 |
67 | * #### 如下图:一键SSH命令生成器:[点击视频教程](https://youtu.be/4u6W4c-t3oU)
68 |
69 |
70 |
71 | ------------------------------------------------------------------
72 |
73 | * #### 如下图:Clawcloud爪云4套价格+7组协议的组合任你选:[点击视频教程](https://youtu.be/xOQV_E1-C84)
74 |
75 |
76 |
77 | ------------------------------------------------------------------
78 |
79 | * #### 如下图:从此抛弃第三方独立的WARP脚本,xray+singbox双内核集成15种WARP出站组合:[点击视频教程](https://youtu.be/iywjT8fIka4)
80 |
81 |
82 |
83 | ----------------------------------------------------------
84 |
85 | ## 二、SSH一键变量脚本模版说明:
86 |
87 | ### 脚本以 ```变量名称="变量值"的单个或多个组合 + 主脚本``` 的形式运行
88 |
89 | * 默认主脚本curl:```bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)```
90 |
91 | * 如报错curl not found 可换用主脚本wget:```bash <(wget -qO- https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)```
92 |
93 | * 必选其一的协议端口变量:```vwpt=""```、```vmpt=""```、```vmpt="" argo="vmpt"```、```vwpt="" argo="vwpt"```、```vlpt=""```、```xhpt=""```、```anpt=""```、```arpt=""```、```hypt=""```、```tupt=""```、```sspt=""```、```vxpt=""```、```sopt=""```
94 |
95 | * 可选的功能类变量:```warp=""```、```uuid=""```、```reym=""```、```cdnym=""```、```argo=""```、```agn=""```、```agk=""```、```ippz=""```、```name=""```、```oap=""```
96 |
97 | 请参考```一、自定义变量参数说明```中变量的作用说明,变量值填写在```" "```之间,变量之间空一格,不用的变量可以删除
98 |
99 | -------------------------------------------------------------
100 |
101 | * ### 模版1:多个任意协议组合运行
102 | ```
103 | sspt="" vlpt="" vmpt="" vwpt="" hypt="" tupt="" xhpt="" vxpt="" anpt="" arpt="" sopt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
104 | ```
105 |
106 | * ### 模版2:主流TCP或UDP单个协议运行
107 |
108 | Vless-Tcp-Reality-vision协议节点
109 | ```
110 | vlpt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
111 | ```
112 |
113 | Vless-Xhttp-Reality-vision-enc协议节点 (默认开启ENC加密)
114 | ```
115 | xhpt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
116 | ```
117 |
118 | Vless-Xhttp-vision-enc协议节点 (默认开启ENC加密,IDX-Google-VPS容器支持)
119 | ```
120 | vxpt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
121 | ```
122 |
123 | Vless-ws-vision-enc协议节点 (默认开启ENC加密)
124 | ```
125 | vwpt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
126 | ```
127 |
128 | Shadowsocks-2022协议节点
129 | ```
130 | sspt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
131 | ```
132 |
133 | AnyTLS协议节点
134 | ```
135 | anpt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
136 | ```
137 |
138 | Any-Reality协议节点
139 | ```
140 | arpt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
141 | ```
142 |
143 | Vmess-ws协议节点
144 | ```
145 | vmpt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
146 | ```
147 |
148 | Socks5协议节点 (配合其他应用内置代理使用,勿做节点直接使用)
149 | ```
150 | sopt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
151 | ```
152 |
153 | Hysteria2协议节点
154 | ```
155 | hypt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
156 | ```
157 |
158 | Tuic协议节点
159 | ```
160 | tupt="" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
161 | ```
162 |
163 | * ### 模版3:开启CDN优选的节点运行
164 |
165 | Argo临时/固定隧道运行优选节点,类似无公网的IDX-Google-VPS容器推荐使用此脚本,快速一键内网穿透获取节点
166 |
167 | Vmess-ws-argo临时隧道CDN优选节点
168 | ```
169 | vmpt="" argo="vmpt" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
170 | ```
171 |
172 | Vless-ws-vision-enc-argo临时隧道CDN优选节点
173 | ```
174 | vwpt="" argo="vwpt" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
175 | ```
176 |
177 | Vmess-ws-argo-argo固定隧道CDN优选节点,必须填写端口(vmpt)、域名(agn)、token(agk)
178 | ```
179 | vmpt="CF设置的URL端口" argo="vmpt" agn="解析的CF域名" agk="CF获取的token" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
180 | ```
181 |
182 | Vless-ws-vision-enc-argo固定隧道CDN优选节点,必须填写端口(vmpt)、域名(agn)、token(agk)
183 | ```
184 | vwpt="CF设置的URL端口" argo="vwpt" agn="解析的CF域名" agk="CF获取的token" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
185 | ```
186 |
187 | Vmess-ws的80系端口、回源端口的CDN优选节点
188 | ```
189 | vmpt="80系端口、指定回源端口" cdnym="CF解析IP的域名" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
190 | ```
191 |
192 | Vless-Xhttp-vision-enc的80系端口、回源端口的CDN优选节点
193 | ```
194 | vxpt="80系端口、指定回源端口" cdnym="CF解析IP的域名" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
195 | ```
196 |
197 | Vless-ws-vision-enc的80系端口、回源端口的CDN优选节点
198 | ```
199 | vwpt="80系端口、指定回源端口" cdnym="CF解析IP的域名" bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/argosbx/main/argosbx.sh)
200 | ```
201 |
202 | * #### 如下图:节点IP、端口被封依旧可用!套CDN优选5大方案三步视频教程:
203 |
204 | [视频1:80系+回源cdn](https://youtu.be/RnUT1CNbCr8)
205 |
206 | [视频2:Argo临时/固定隧道区别与设置](https://youtu.be/K35NhrNiLK8)
207 |
208 | [视频3:黑科技80端口CDN](https://youtu.be/X8BFVyeiY9g)
209 |
210 |
211 |
212 | ---------------------------------------------------------
213 |
214 | ## 三、多功能SSH快捷方式命令组
215 |
216 | #### 说明:首次安装成功后需重连SSH,```agsbx 命令```的快捷方式才可生效;如未生效,请使用```主脚本 命令```的快捷方式
217 |
218 | 1、查看Argo的固定域名、固定隧道的token、临时域名、当前已安装的节点信息命令:```agsbx list``` 或者 ```主脚本 list```
219 |
220 | 2、更换、增加、删除变量组命令:```自定义各种协议变量组 agsbx rep``` 或者 ```自定义各种协议变量组 主脚本 rep```
221 |
222 | 3、更新脚本命令:```原已安装的自定义各种协议变量组 主脚本 rep```
223 |
224 | 4、更新Xray或Singbox内核命令:agsbx upx或ups 【或者】 主脚本 upx或ups
225 |
226 | 5、重启脚本命令:```agsbx res``` 或者 ```主脚本 res```
227 |
228 | 6、卸载脚本命令:```agsbx del``` 或者 ```主脚本 del```
229 |
230 | 7、临时切换IPV4/IPV6节点配置 (双栈VPS专享):
231 |
232 | 显示IPV4节点配置:```ippz=4 agsbx list```或者```ippz=4 主脚本 list```
233 |
234 | 显示IPV6节点配置:```ippz=6 agsbx list```或者```ippz=6 主脚本 list```
235 |
236 | ----------------------------------------------------------
237 |
238 | #### 相关教程可参考[甬哥博客](https://ygkkk.blogspot.com/2025/08/argosb.html),视频教程如下:
239 |
240 | 更新中……
241 |
242 | [ArgoSBX小钢炮脚本更新说明:新增VLESS ENC抗量子加密;80端口也能开启TLS加密?无需域名也能CDN优选?](https://youtu.be/X8BFVyeiY9g)
243 |
244 | [Argo隧道代理节点终极教程:VPS+容器搭建最强CDN节点 | 无视端口IP被封 | Argo临时/固定隧道区别 | CDN优选IP加速](https://youtu.be/K35NhrNiLK8)
245 |
246 | [ArgoSBX一键无交互小钢炮脚本💣(四):一键SSH命令生成器发布,只要点几下,各大代理协议任你选](https://youtu.be/4u6W4c-t3oU)
247 |
248 | [ArgoSB一键无交互小钢炮脚本💣(三):内置15种WARP出站组合,轻松替代独立的WARP脚本](https://youtu.be/iywjT8fIka4)
249 |
250 | [ArgoSB一键无交互小钢炮脚本💣(二):代理节点的IP、端口被封依旧可用!ArgoSB脚本套CDN优选4大方案教程](https://youtu.be/RnUT1CNbCr8)
251 |
252 | [ArgoSB一键无交互小钢炮脚本💣(一):VPS/nat VPS在主协议下的应用;仅按一次回车,多协议自由搭配](https://youtu.be/CiXmttY7mhw)
253 |
254 | [Clawcloud爪云、IDX Google VPS的福音:解决服务器IP访问困扰!Argosb脚本新增WARP出站功能,轻松更换落地IP为Cloudflare WARP IP](https://youtu.be/HO_XLBmIYJw)
255 |
256 | [Claw.cloud免费VPS搭建代理最终教程(五):ArgoSB脚本docker镜像更新支持AnyTLS、Xhttp-Reality](https://youtu.be/-mhZIhHRyno)
257 |
258 | [Claw.cloud免费VPS搭建代理最终教程(四):最低仅1美分,4套价格+7组协议的套餐组合任你选;查看节点、重启升级、更换IP、更改配置的操作说明](https://youtu.be/xOQV_E1-C84)
259 |
260 | [SAP搭建免费节点一条龙教程:多平台多账号搭建+保活一次搞定,支持Argo/workers/pags多种CDN方式](https://youtu.be/NRYZNKWoLj8)
261 |
262 | ----------------------------------------------------------
263 |
264 | ### 交流平台:[甬哥博客地址](https://ygkkk.blogspot.com)、[甬哥YouTube频道](https://www.youtube.com/@ygkkk)、[甬哥TG电报群组](https://t.me/+jZHc6-A-1QQ5ZGVl)、[甬哥TG电报频道](https://t.me/+DkC9ZZUgEFQzMTZl)
265 |
266 | ----------------------------------------------------------
267 | ### 感谢支持!微信打赏甬哥侃侃侃ygkkk
268 | 
269 |
270 | ----------------------------------------------------------
271 | ### 感谢你右上角的star🌟
272 | [](https://starchart.cc/yonggekkk/ArgoSB)
273 |
274 | ----------------------------------------------------------
275 | ### 声明:所有代码来源于Github社区与ChatGPT的整合
276 |
277 | ### Thanks to [zmto/vtexs](https://console.zmto.com/?affid=1558) for the sponsorship support
278 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
388 | 甬哥Github项目:
389 | github.com/yonggekkk
390 | 甬哥Blogger博客:
391 | ygkkk.blogspot.com
392 | 甬哥YouTube频道:
393 | www.youtube.com/@ygkkk
394 |
相关细节说明,请参考ArgoSBX小钢炮脚本项目💣:github.com/yonggekkk/argosbx
518 | 1、ArgoSBX一键SSH命令生成器发布,只要点几下,各大代理协议任你选:点击视频教程 519 | 2、ArgoSBX内置15种WARP出站组合,轻松替代独立的WARP脚本:点击视频教程 520 | 3、代理节点的IP、端口被封依旧可用!ArgoSBX脚本套CDN优选4大方案:点击视频教程 521 | 4、VPS+容器搭建最强CDN节点;独家解读Argo临时/固定隧道区别:点击视频教程 522 | 5、ArgoSBX更新:VLESS抗量子加密;80端口开启TLS,无需域名CDN:点击视频教程 523 | 安卓手机客户端推荐:Nekobox-starifly版 (全协议支持)、V2rayNG官方版