【教程】CodeRed Cloud 免费套餐 SSH 登录方案:SFTP 上传 + Cloudflare Argo 隧道 + ttyd 网页终端
平台免费套餐禁用了 SSH shell,但可以曲线救国:SFTP 传代码 → 部署 Node.js 应用 → cloudflared Argo 出站隧道 + ttyd,把网页版终端挂到 Cloudflare 域名上,浏览器即开即用,全程不需要 root。
太长不看
SFTP 连接 :`code.codered.cloud:22`,用户 `code`,密码去 Dashboard 重置(临时密码)
上传位置:`/www/`,共 5 个文件(`cr-run.sh` / `package.json` / `index.js` / `index.html` / `application.properties`)
平台不会自动 `npm install` :必须在 `cr-run.sh` 里显式写
只有 3000 端口公网可达(Nginx 反代),其余端口被 Azure NSG 丢弃 → 用 cloudflared 出站隧道把 ttyd(`localhost:8001`)暴露出去
只有 `/www` 和 `/log` 可写,`$HOME`(`/home/code`)不可写;文件系统是临时的,重新 Deploy 会重建环境
0. 背景:为什么要这么折腾
CodeRed Cloud 是 Node.js / Django / WordPress 托管平台(轻量版 Heroku/Vercel),站点通过 SFTP 上传代码 + Dashboard 面板部署,支持 Node 22/24,预装 PM2。
免费套餐的硬限制:
限制 |
说明 |
|---|
无 root/sudo |
装不了系统软件、改不了系统配置 |
SSH 禁用 |
提示 “Upgrade your plan to enable SSH access”,只有 SFTP(端口 22,用户 `code`) |
仅暴露端口 3000 |
Nginx 只反代 3000,其他端口在 Azure NSG 层直接丢弃 |
临时文件系统 |
每次 Deploy 重建环境,`/www` 之外的修改不保留 |
可写目录仅 `/www` 和 `/log` |
`$HOME`(`/home/code`)不可写 |
资源配额 |
RAM ~384 MiB,CPU ~512 MHz(可 burst 3.5 GHz),1 worker |
思路很简单:SSH 被禁,那就自己造一个网页终端 —— Node 应用启动时下载 `ttyd`(Web Shell)和 `cloudflared`(Argo 隧道)两个二进制,ttyd 监听本地端口,cloudflared 建立出站隧道把它挂到 CF 域名,浏览器访问即获得一个可用的服务器 shell。
1. SFTP 登录
1.1 获取临时密码
1. 登录 CodeRed Dashboard:`https://code.codered.cloud`
2. 找到你的站点 → System Access (SFTP & SSH) 区块
3. 点 Reset System Password → 生成临时密码
^-^ 密码是临时的:每次 Deploy Production 重新部署后密码都会变,需要重新 Reset 一次。
1.2 连接参数
字段 |
值 |
|---|
主机 |
`code.codered.cloud` |
端口 |
22 |
用户名 |
`code` |
协议 |
SFTP(不是 SSH!) |
密码 |
Dashboard → Reset System Password 生成的临时密码 |
1.3 文件传输
传输工具和方式自行选择(FileZilla、WinSCP、命令行 `sftp` 等均可),具体操作步骤可咨询 AI 助手或查阅所用工具的文档,这里不再展开。核心就两点:
- 连接参数见上表:主机 `code.codered.cloud`、端口 22、用户 `code`、临时密码
- 所有文件都要传到 `/www/` 目录下
## 2. 上传什么:5 个文件,全部进 `/www/`
文件 |
作用 |
|---|
`cr-run.sh` |
平台入口脚本:`npm install` + `exec node index.js`(CodeRed 必需) |
`package.json` |
依赖声明:仅 `express` + `axios` |
`index.js` |
主程序:Express 状态页 + 运行时下载并拉起 ttyd / cloudflared |
`index.html` |
Vue3 状态页,展示 ttyd / 隧道 URL 等状态 |
`application.properties` |
配置:功能开关、端口、登录凭证、隧道 token |
`cr-run.sh` 内容(关键):
#!/bin/sh
npm install --production --no-audit --no-fund 2>&1
exec node index.js
^-^ CodeRed 不会自动 `npm install` 平台只执行 `cr-run.sh`,不装依赖。第一次部署报 `Cannot find module ‘express’` 就是漏了这一步。
`package.json`:
{
"name": "codered-ttyd",
"version": "1.0.0",
"description": "CodeRed Cloud web terminal via ttyd + Cloudflare Argo",
"main": "index.js",
"scripts": { "start": "node index.js" },
"dependencies": {
"axios": "latest",
"express": "latest"
}
}
`application.properties` 关键配置项:
LITE_MODE=true
ENABLE_TTYD=true
# ttyd 登录凭证,格式: 端口:用户名:密码
ttyd-credential=8001:用户名:密码
# Argo 固定隧道凭证,注意http、端口8001
ttyd-argo-auth=
代码文件必须传到 `/www/` 根目录,平台入口 `cr-run.sh` 在那里,放别处不生效。
## 3. 部署:让代码跑起来
SFTP 传完文件后,去 Dashboard → Deployment 标签页:
操作 |
行为 |
适用场景 |
|---|
Restart |
只重启 Node.js 运行时,不重装依赖 |
小改动,快 |
Deploy Production |
重新构建 + `npm install` + 重启(约 30s 停机) |
改依赖 / 首次部署 |
^-^ CodeRed 不会自动重载代码,传完文件必须手动点 Deploy 或 Restart。
4. CF 转发 + ttyd:网页终端是怎么跑起来的
4.1 原理
用户浏览器 ──HTTPS──► Cloudflare Edge ──Argo 出站隧道──► cloudflared(容器内) ──► ttyd(localhost:8001)
为什么必须用 Argo 出站隧道:CodeRed 只有 3000 端口被 Nginx 反代到公网,其他端口在 Azure NSG 层直接丢弃 —— 入站连接根本进不来。而 cloudflared 建立的是出站 WebSocket 连接到 Cloudflare Edge,不碰 Azure 入站防火墙,所以完全不受限。
4.2 ttyd:网页终端本体
ttyd 是个 Web Shell 程序,浏览器打开即是终端。本项目由 `index.js` 在运行时从 GitHub Releases 下载二进制到 `/www/.npm/`(随机文件名防特征检测),`chmod 775` 后直接执行:
nohup /www/.npm/<随机名> -p 8001 -W -c '用户名:密码' bash >/www/.npm/<随机名>.log 2>&1 &
关键参数:
- `-p 8001`:监听端口(与隧道 Ingress 目标一致)
- `-W`:必须加,否则终端只能看不能输入
- `-c ‘user:pass’`:登录认证
4.3 访问
浏览器打开 `https://.cfargotunnel.com` → 输入 ttyd 用户名密码 → 就是一个完整的服务器 shell。
5. 注意事项(划重点)
1. ttyd 必须加 `-W`:否则网页终端只能看不能输。
2. 改代码流程:SFTP 上传 → Restart(小改)或 Deploy Production(改依赖),平台不会自动热重载。
本文为技术学习交流用途,请遵守所在地区法律法规及平台服务条款。有问题欢迎评论区交流。