logo
0
0
WeChat Login

CNB 云原生开发 SSH 保活脚本

代码最初来源于: https://www.vmss.cn/posts/2025083001/ " 零成本搭建“半永久”Minecraft服务器:一次对云开发平台规则…

curl -o keep_alive.sh https://cnb.cool/kfc50/cnb-webide-keep-alive-shell-script/-/git/raw/main/keep_alive.sh && chmod 777 ./keep_alive.sh && ./keep_alive.sh --token YOUR_TOKEN

原理说明

本脚本通过 CNB 官方 API (api.cnb.cool) 获取用户正在运行的云原生开发环境,然后直接获取它的 SSH 连接命令,也就是在 https://cnb.cool/u/你的cnb用户名/workspaces 中显示的正在打开的云原生开发:

CNB 工作空间页面

如图所示,我们取其中的 SSH 命令,如:

ssh cnb-h16-1jn6q484l-001.41130ed1-78b2-40a0-8474-ad8ed15365e1-f68@cnb.space

并定时每 10 秒钟执行一次,保持 SSH 连接活跃,防止云原生开发环境因闲置被自动关闭。

工作流程

1. 调用 CNB API 获取工作空间列表
   GET https://api.cnb.cool/workspace/list?page=1&pageSize=20&slug=用户名/仓库名&status=running&branch=分支名

   (branch 参数可选,不传则返回所有分支的运行中工作空间)

2. 提取工作空间的 sn (流水线编号)

3. 调用 CNB API 获取工作空间详情
   GET https://api.cnb.cool/用户名/仓库名/-/workspace/detail/{sn}

4. 提取 SSH 连接命令

5. 每 10 秒执行一次 SSH 连接,保持环境活跃

使用方法

在 CNB 云原生开发环境中运行

在 CNB 云原生开发环境中,脚本会自动通过 CNB_REPO_SLUGCNB_BRANCH 环境变量获取仓库名和分支,无需手动指定 --repo

# 下载脚本
curl -o keep_alive.sh https://cnb.cool/kfc50/cnb-webide-keep-alive-shell-script/-/git/raw/main/keep_alive.sh

# 赋予执行权限
chmod 777 ./keep_alive.sh

# 后台运行(替换 YOUR_TOKEN 为你的 CNB API 令牌)
nohup ./keep_alive.sh --token YOUR_TOKEN &

在本地服务器或电脑运行(自动检测)

在本地电脑运行时,脚本会自动检测是否处于 CNB 云原生开发环境。如果检测不到 CNB_REPO_SLUG 环境变量,则判定用户环境为本地电脑命令行,此时脚本会通过用户级 token 调用 API 获取所有运行中的工作空间,取最近的一个,这样用户在本地电脑也能自动找到正在运行的云原生开发环境,无需手动填写 组织名/仓库名:

# 自动检测最近运行的工作空间,无需指定 --repo
nohup ./keep_alive.sh --token YOUR_TOKEN &

这样做的好处是:用户不在云原生开发网页 VSCode 时候,不能通过环境变量 CNB_REPO_SLUG 去自动获取其自身的环境,但是可以这样通过用户级 token 获取,就不用手动填写 组织名/仓库名了。因为多数情况用户只在一个云原生开发环境中闷头开发代码,所以这里只取最新的;如果用户需要,仍然可以手动指定 组织名/仓库名。

手动指定仓库运行

# 手动指定 --repo 参数
nohup ./keep_alive.sh --token YOUR_TOKEN --repo username/repo &

指定分支运行

# 如果不指定 --branch,脚本会自动检测当前 git 分支
nohup ./keep_alive.sh --token YOUR_TOKEN --repo username/repo --branch dev &

参数说明

参数必需说明
--token YOUR_TOKENCNB API 访问令牌,在 CNB 令牌页面 中创建
--repo username/repo仓库名,不提供则自动检测(优先 CNB_REPO_SLUG 环境变量,其次 API 自动检测,最后 git remote
--branch branch_name分支名,不提供则自动检测(优先 CNB_BRANCH 环境变量,其次 git branch

如何获取 CNB API Token

  1. 访问 cnb.cool/profile/token
  2. 创建新令牌,选择 读写凭据

获取访问令牌

  1. 复制令牌用于 --token 参数

仓库/分支自动检测逻辑

脚本会按以下优先级自动检测分支和仓库名,确保不管启动什么分支都能正确使用:

仓库名检测优先级

  1. --repo 命令行参数(最高优先级)
  2. CNB_REPO_SLUG 环境变量(CNB 云原生开发环境自带,如 kfc50/cnb-webide-keep-alive-shell-script
  3. git remote -v 解析
  4. API 自动检测:调用 GET /workspace/list?status=running 获取用户最近运行的工作空间(本地环境使用)

分支检测优先级

  1. --branch 命令行参数(最高优先级)
  2. CNB_BRANCH 环境变量(CNB 云原生开发环境自带)
  3. git branch --show-current(当前 git 分支)
  4. git rev-parse --abbrev-ref HEAD(备用检测)
  5. API 自动检测的分支(本地环境通过 API 获取最近工作空间时带回的分支信息)
  6. 如果都没检测到,则不传 branch 参数,API 返回所有分支的运行中工作空间
  7. 如果指定分支查不到工作空间,自动回退到查询所有分支

本地环境自动检测说明

当脚本检测不到 CNB_REPO_SLUG 环境变量时,判定用户环境为本地电脑命令行。此时会调用 https://api.cnb.cool/workspace/list?status=running API(无需 slug 参数),通过用户级 token 获取该用户所有正在运行的工作空间列表,取其中最新的一条记录,获取其 slug(用户名/仓库名)和 branch(分支名),然后用这些信息去调用工作空间详情 API 获取 SSH 命令。

这样做的好处是:

  • 用户不在云原生开发网页 VSCode 时,无法通过环境变量自动获取自身环境信息
  • 但通过用户级 token 调用 API,可以自动找到正在运行的工作空间
  • 无需手动填写 组织名/仓库名
  • 多数情况用户只在一个云原生开发环境中开发代码,所以只取最新的即可
  • 如需指定其他仓库,仍可通过 --repo 参数手动指定

完整代码

见仓库中的 keep_alive.sh 文件,或查看上方最新提交记录。

About

No description, topics, or website provided.
Language
HTML57.5%
Python29.9%
Shell10.6%
JavaScript2%