{"id":"5cd8ca64-3330-4d8d-a200-daa7d444e2f1","shortId":"raZT4X","kind":"skill","title":"cliproxy-deploy","tagline":"在 Linux VPS 上部署 CLIProxyAPI（router-for-me/CLIProxyAPI）并暴露 OpenAI 兼容 API。覆盖 Go 环境、源码拉取、最小配置、OAuth 登录（远端 / 本地同步两种路径）、UFW 放行、密钥轮换、健康校验、环境变量落盘。当用户说“部署 cliproxy / 把 codex/claude/gemini 账号暴露成 API / router-for-me 上线 VPS”时触发。","description":"# CLIProxyAPI VPS 部署\n\n把 `https://github.com/router-for-me/CLIProxyAPI` 部署到远程 Linux 服务器，并暴露 OpenAI 兼容接口（`/v1/chat/completions`、`/v1/models`）。适配 Codex / Claude / Gemini / Qwen / iFlow / Antigravity 的 OAuth 订阅账号。\n\n所有“必须 X”条款都附带降级路径；所有“完成”结论必须基于**本会话**命令输出（W-16）。\n\n---\n\n## 0. 前置确认（必问）\n\n必须在动手前确认：\n\n1. **SSH 目标**：`root@HOST`，是否能免密登录\n2. **部署范围**：允许落盘目录（默认 `/root/CLIProxyAPI` + `/root/.cli-proxy-api`）\n3. **服务端口**：默认 `8317`\n4. **访问策略**：\n   - `localhost only`（host=127.0.0.1，走 SSH 隧道）\n   - `公网直连`（需要 UFW 放行 + 必须换随机 key）\n5. **登录路径**：\n   - A. 远端 OAuth（需 SSH 端口转发 + 本机浏览器配合，5 分钟超时窗口）\n   - B. 本地登录后同步 `~/.cli-proxy-api/*.json` 到 VPS（更稳，推荐）\n\n降级路径：若用户不指定，默认使用 `公网直连 + 本地登录同步`，并在启动后立即轮换随机 key。\n\n---\n\n## 1. 远端环境检查（只读）\n\n```bash\nssh -i <KEY> <SSH_TARGET> \"uname -a && . /etc/os-release 2>/dev/null; \\\n  command -v go && go version || echo 'NO_GO'; \\\n  command -v git || echo 'NO_GIT'; \\\n  command -v ufw && ufw status | head -n 20 || echo 'NO_UFW'; \\\n  ss -ltn | grep ':<PORT>' || echo 'PORT_FREE'\"\n```\n\n判定：\n- 没有 Go → 第 2 步安装\n- 端口占用 → 确认是否旧进程，不要盲杀\n- UFW active → 记录当前规则（避免在放行后改动其他端口）\n\n## 2. 安装 Go + Git（Ubuntu/Debian）\n\n```bash\nssh -i <KEY> <SSH_TARGET> \"apt-get update && apt-get install -y golang-go git\"\n```\n\n注意：\n- 项目 `go.mod` 可能要求 Go 1.26+，系统 apt 的 Go 版本偏旧**没关系** —— `go run` 会自动下载 toolchain。\n- 若不希望 GOTOOLCHAIN 自动下载，改装官方 tarball 到 `/usr/local/go`，并 `export PATH=/usr/local/go/bin:$PATH`。\n\n## 3. 克隆仓库\n\n```bash\nssh -i <KEY> <SSH_TARGET> \"rm -rf /root/CLIProxyAPI && \\\n  git clone https://github.com/router-for-me/CLIProxyAPI.git /root/CLIProxyAPI && \\\n  cd /root/CLIProxyAPI && git rev-parse --short HEAD\"\n```\n\n## 4. 最小配置\n\n复制 `config.example.yaml` → `config.yaml`，只调这几项：\n\n```yaml\nhost: \"\"                          # 公网直连；仅 localhost 改 \"127.0.0.1\"\nport: 8317\nauth-dir: \"~/.cli-proxy-api\"\napi-keys:\n  - \"PLACEHOLDER_WILL_ROTATE\"     # 启动前后立即用第 8 步轮换\ndebug: false\nproxy-url: \"\"\n```\n\n远端执行：\n\n```bash\nssh -i <KEY> <SSH_TARGET> \"cd /root/CLIProxyAPI && \\\n  test -f config.yaml || cp config.example.yaml config.yaml\"\n```\n\n## 5. 获取认证凭据（二选一）\n\n### 5A：本地登录 → 同步凭据（推荐）\n\n本机执行（需本机有源码或已编译好的 `cli-proxy-api`）：\n\n```bash\ngo run ./cmd/server -codex-login -config config.yaml\n# 或 -claude-login / -login(Gemini) / -qwen-login / -iflow-login / -antigravity-login\n```\n\n成功后凭据落在 `~/.cli-proxy-api/<provider>-<email>.json`。\n\n同步到 VPS：\n\n```bash\nssh -i <KEY> <SSH_TARGET> 'mkdir -p /root/.cli-proxy-api'\nscp -i <KEY> ~/.cli-proxy-api/<provider>-*.json <SSH_TARGET>:/root/.cli-proxy-api/\nssh -i <KEY> <SSH_TARGET> 'ls -l /root/.cli-proxy-api/'\n```\n\n### 5B：远端 OAuth（无本地可用时的备选）\n\n远端发起：\n\n```bash\nssh -tt -i <KEY> <SSH_TARGET> \\\n  \"cd /root/CLIProxyAPI && /usr/bin/go run ./cmd/server -<provider>-login -no-browser -config config.yaml\"\n```\n\n关键点：\n- **回调端口固定**：Codex=1455，Claude=54545，iFlow=11451，Gemini=8085\n- 本机新终端开隧道（同一端口）：\n  ```bash\n  ssh -i <KEY> -L <CALLBACK_PORT>:127.0.0.1:<CALLBACK_PORT> <SSH_TARGET>\n  ```\n- 本机浏览器打开远端打印的授权 URL，完成授权 → 自动回调到远端\n- 程序有 **5 分钟超时**，开始前先把隧道和浏览器都准备好\n- 若自动回调失败：把浏览器最终跳转到的 `http://localhost:<PORT>/...` 整个 URL 粘回远端交互提示\n\n降级路径：5B 失败两次就切到 5A，不再继续试。\n\n## 6. 启动服务（后台）\n\n```bash\nssh -i <KEY> <SSH_TARGET> \"cd /root/CLIProxyAPI && \\\n  nohup /usr/bin/go run ./cmd/server -config config.yaml \\\n    >/root/CLIProxyAPI/cli-proxy-api.log 2>&1 </dev/null & \\\n  echo \\$! > /root/CLIProxyAPI/cli-proxy-api.pid\"\n```\n\n验证监听与日志：\n\n```bash\nssh -i <KEY> <SSH_TARGET> \"lsof -i:<PORT>; tail -n 40 /root/CLIProxyAPI/cli-proxy-api.log\"\n```\n\n必须看到：`API server started successfully on: :<PORT>` + `N auth files` ≥ 1。\n\n## 7. 放行防火墙（公网直连时）\n\nUFW 默认 `deny incoming`，即使端口监听了，公网依然会 `Empty reply from server`。**这是公网直连失败的最常见根因**。\n\n```bash\nssh -i <KEY> <SSH_TARGET> \"ufw allow <PORT>/tcp && ufw status | grep <PORT>\"\n```\n\n仅 localhost 模式则**跳过**本步，并保持 `host: \"127.0.0.1\"`。\n\n## 8. 轮换访问密钥（强烈建议）\n\n绝不保留 `your-api-key-1` 默认值。生成随机 key：\n\n```bash\npython3 -c \"import secrets; print('cpa_' + secrets.token_urlsafe(24))\"\n```\n\n远端用 Python 原位替换 `api-keys:` 段（避免 sed 多行坑）：\n\n```bash\nssh -i <KEY> <SSH_TARGET> \"python3 - <<'PY'\nfrom pathlib import Path\ncfg = Path('/root/CLIProxyAPI/config.yaml')\nnew_key = '<NEW_KEY>'\nlines = cfg.read_text().splitlines()\nout, in_api = [], False\nfor line in lines:\n    s = line.strip()\n    if s.startswith('api-keys:'):\n        out += ['api-keys:', f'  - \\\"{new_key}\\\"']\n        in_api = True\n        continue\n    if in_api:\n        if line.startswith('  - ') or not s or line.startswith('    '):\n            continue\n        in_api = False\n    out.append(line)\ncfg.write_text('\\n'.join(out) + '\\n')\nPY\"\n```\n\nCLIProxyAPI 支持配置热重载（见 `service.go` 的 file watcher），日志里会出现 `config file changed, reloading`，**不必重启**。若未热重载成功，再手动 `pkill -f 'cmd/server -config'` 并按第 6 步重启。\n\n## 9. 健康校验（必须本会话命令证据）\n\n### 9a. 内网（不受 UFW 影响）\n```bash\nssh -i <KEY> <SSH_TARGET> \"curl -fsS -H 'Authorization: Bearer <NEW_KEY>' \\\n  http://127.0.0.1:<PORT>/v1/models | head -c 400\"\n```\n\n### 9b. 公网直连\n```bash\ncurl -sS -i --max-time 30 http://<HOST>:<PORT>/v1/chat/completions \\\n  -H 'Authorization: Bearer <NEW_KEY>' -H 'Content-Type: application/json' \\\n  --data '{\"model\":\"<MODEL>\",\"messages\":[{\"role\":\"user\",\"content\":\"请只回复 OK\"}],\"stream\":false}'\n```\n\n必须满足：\n- HTTP 200\n- `choices[0].message.content` 含可读字符（非空、非 error）\n\n任一不满足都不得声称“部署完成”。\n\n## 10. 客户端环境变量\n\n追加到 `~/.zshrc`（或 `~/.bashrc`）：\n\n```bash\n# CLIProxyAPI\nexport BASE_URL=\"http://<HOST>:<PORT>/v1\"      # localhost 模式改 http://127.0.0.1:<PORT>/v1\nexport BASE_API_KEY=\"<NEW_KEY>\"\nexport BASE_MODEL=\"<MODEL>\"                    # 如 gpt-5.4 / claude-sonnet-4-5-...\n```\n\n随后：`source ~/.zshrc`。\n\n---\n\n## 排障速查\n\n| 症状 | 最可能根因 | 验证 / 修复 |\n|------|-----------|-----------|\n| 公网 `Empty reply from server`，但远端 `127.0.0.1` 能通 | UFW 默认 deny，未放行端口 | `ufw status` → `ufw allow <PORT>/tcp` |\n| 公网 `Connection refused` | 服务 host 绑 `127.0.0.1`，或进程没起 | 看 `lsof -i:<PORT>` 是否为 `*:<PORT>`，或改 host 后重启 |\n| OAuth `Authentication timed out` | 5 分钟内未完成浏览器授权 + 隧道 | 改走 5A 本地登录同步 |\n| OAuth 卡在 `exchanging for tokens` | 本机到 `auth.openai.com` / `claude.ai` 被代理或拦截 | 清 `proxy-url`，`curl -I https://auth.openai.com/oauth/token` 验证 |\n| 启动日志 `0 auth files` | `auth-dir` 路径错 or 文件权限不足 | 核对 `~/.cli-proxy-api` 实际解析路径与文件属主 |\n| `/v1/models` 401 | key 没用上当前 `config.yaml` 或热重载没生效 | `grep -nA2 '^api-keys:' config.yaml`，必要时重启 |\n| 端口已被占用 | 旧进程未退出 | `lsof -i:<PORT>` → 针对性 kill，不要 `pkill -9 go` |\n\n---\n\n## 不要做的事\n\n- ❌ 保留默认示例 key（`your-api-key-1`）上线\n- ❌ 在没放行 UFW 的前提下宣布“公网可用”\n- ❌ 直接 `pkill -9 go`（会误杀其他 Go 进程）\n- ❌ 用 `sed -i` 改 `api-keys:` 多行段，容易残留旧行\n- ❌ 将完整 key 贴回聊天（除非用户明确要求“直接给我完整值”一次）\n- ❌ 跨会话声称“已部署”——必须重新跑第 9 步拿当次证据\n\n---\n\n## 参考事实（代码锚点，2026-04）\n\n- 启动入口：`cmd/server/main.go:53` `main()`；登录参数 `-login/-codex-login/-claude-login/-qwen-login/-iflow-login/-antigravity-login/-no-browser/-config`\n- 默认认证目录：`config.example.yaml` `auth-dir: \"~/.cli-proxy-api\"`\n- 默认端口：`config.example.yaml` `port: 8317`\n- 回调端口：Codex `sdk/auth/codex.go:27` = 1455；Claude `sdk/auth/claude.go:27` = 54545；iFlow `internal/auth/iflow/iflow_auth.go:42` = 11451；Gemini `internal/auth/gemini/gemini_auth.go:280` = 8085\n- 凭据文件名：`codex-<email>.json` / `claude-<email>.json` / `qwen-<email>.json` / `iflow-<email>-<ts>.json`\n- 热重载：`internal/watcher/*`（修改 `config.yaml` 或 auth-dir 下 JSON 触发）\n- 路由：`internal/api/server.go:321` `setupRoutes()`（`/v1/*` 需 `AuthMiddleware`）","tags":["cliproxy","deploy","claude","arsenal","majiayu000","agent-skills","ai-agents","ai-coding-assistant","automation","claude-code","code-review","developer-tools"],"capabilities":["skill","source-majiayu000","skill-cliproxy-deploy","topic-agent-skills","topic-ai-agents","topic-ai-coding-assistant","topic-automation","topic-claude","topic-claude-code","topic-code-review","topic-developer-tools","topic-devops","topic-productivity","topic-prompt-engineering","topic-python"],"categories":["claude-arsenal"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/majiayu000/claude-arsenal/cliproxy-deploy","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add majiayu000/claude-arsenal","source_repo":"https://github.com/majiayu000/claude-arsenal","install_from":"skills.sh"}},"qualityScore":"0.466","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 33 github stars · SKILL.md body (7,159 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:04:14.203Z","embedding":null,"createdAt":"2026-04-27T07:01:03.797Z","updatedAt":"2026-05-18T19:04:14.203Z","lastSeenAt":"2026-05-18T19:04:14.203Z","tsv":"'-04':861 '-16':81 '-5':712 '-5.4':707 '-9':816,833 '/.bashrc':687 '/.cli-proxy-api':130,287,352,364,793,892 '/.zshrc':685,715 '/cliproxyapi':13 '/cmd/server':330,385,439 '/dev/null':153,445 '/etc/os-release':151 '/oauth/token':780 '/root/.cli-proxy-api':97,361,366,371 '/root/cliproxyapi':96,254,260,262,307,382,435 '/root/cliproxyapi/cli-proxy-api.log':442,457 '/root/cliproxyapi/cli-proxy-api.pid':447 '/root/cliproxyapi/config.yaml':542 '/router-for-me/cliproxyapi':52 '/router-for-me/cliproxyapi.git':259 '/tcp':487,737 '/usr/bin/go':383,437 '/usr/local/go':241 '/usr/local/go/bin':245 '/v1':693,697,938 '/v1/chat/completions':59,651 '/v1/models':60,637,795 '0':82,674,783 '1':86,143,444,467,507,825 '1.26':224 '10':682 '11451':399,909 '127.0.0.1':107,281,408,498,636,696,727,744 '1455':395,901 '2':92,152,189,198,443 '20':175 '200':672 '2026':860 '24':520 '27':900,904 '280':912 '3':98,247 '30':650 '321':936 '4':102,269,711 '40':456 '400':640 '401':796 '42':908 '5':117,126,314,414,757 '53':864 '54545':397,905 '5a':317,426,761 '5b':372,424 '6':428,618 '7':468 '8':295,499 '8085':401,913 '8317':101,283,896 '9':620,856 '9a':623 '9b':641 'activ':195 'allow':486,736 'antigrav':67,349,881 'antigravity-login':348,880 'api':17,38,289,326,459,505,525,551,562,566,572,577,587,700,804,823,843 'api-key':288,524,561,565,803,842 'application/json':659 'apt':207,211,226 'apt-get':206,210 'auth':285,465,784,787,890,929 'auth-dir':284,786,889,928 'auth.openai.com':769,779 'auth.openai.com/oauth/token':778 'authent':754 'authmiddlewar':940 'author':634,653 'b':128 'base':691,699,703 'bash':146,203,249,303,327,356,377,404,431,449,482,511,531,628,643,688 'bearer':635,654 'browser':389,885 'c':513,639 'cd':261,306,381,434 'cfg':540 'cfg.read':546 'cfg.write':591 'chang':608 'choic':673 'claud':63,338,396,709,872,902,917 'claude-login':337,871 'claude-sonnet':708 'claude.ai':770 'cli':324 'cli-proxy-api':323 'cliproxi':2,34 'cliproxy-deploy':1 'cliproxyapi':8,46,598,689 'clone':256 'cmd/server':615 'cmd/server/main.go':863 'codex':62,332,394,869,898,915 'codex-login':331,868 'codex/claude/gemini':36 'command':154,162,168 'config':334,390,440,606,616,886 'config.example.yaml':272,312,888,894 'config.yaml':273,310,313,335,391,441,799,806,926 'connect':739 'content':657,665 'content-typ':656 'continu':574,585 'cp':311 'cpa':517 'curl':631,644,776 'data':660 'debug':297 'deni':473,731 'deploy':3 'dir':286,788,891,930 'echo':159,165,176,182,446 'empti':477,722 'error':679 'exchang':765 'export':243,690,698,702 'f':309,568,614 'fals':298,552,588,669 'file':466,603,607,785 'free':184 'fss':632 'gemini':64,341,400,910 'get':208,212 'git':164,167,201,218,255,263 'github.com':51,258 'github.com/router-for-me/cliproxyapi':50 'github.com/router-for-me/cliproxyapi.git':257 'go':19,156,157,161,187,200,217,223,228,231,328,817,834,836 'go.mod':221 'golang':216 'golang-go':215 'gotoolchain':236 'gpt':706 'grep':181,490,801 'h':633,652,655 'head':173,268,638 'host':90,106,276,497,742,751 'http':671 'iflow':66,346,398,878,906,921 'iflow-login':345,877 'import':514,538 'incom':474 'instal':213 'internal/api/server.go':935 'internal/auth/gemini/gemini_auth.go':911 'internal/auth/iflow/iflow_auth.go':907 'internal/watcher':924 'join':594 'json':131,353,365,916,918,920,922,932 'key':116,142,290,506,510,526,544,563,567,570,701,797,805,820,824,844,848 'kill':813 'l':370,407 'line':545,554,556,590 'line.startswith':579,584 'line.strip':558 'linux':5,54 'localhost':104,279,419,492,694 'login':333,339,340,344,347,350,386,867,870,873,876,879,882 'ls':369 'lsof':452,747,810 'ltn':180 'main':865 'max':648 'max-tim':647 'messag':662 'message.content':675 'mkdir':359 'model':661,704 'n':174,455,464,593,596 'na2':802 'new':543,569 'no-brows':387,883 'nohup':436 'oauth':23,69,121,374,753,763 'ok':667 'openai':15,57 'out.append':589 'p':360 'pars':266 'path':244,246,539,541 'pathlib':537 'pkill':613,815,832 'placehold':291 'port':183,282,895 'print':516 'proxi':300,325,774 'proxy-url':299,773 'py':535,597 'python':522 'python3':512,534 'qwen':65,343,875,919 'qwen-login':342,874 'refus':740 'reload':609 'repli':478,723 'rev':265 'rev-pars':264 'rf':253 'rm':252 'role':663 'root':89 'rotat':293 'router':10,40 'router-for-m':9,39 'run':232,329,384,438 's.startswith':560 'scp':362 'sdk/auth/claude.go':903 'sdk/auth/codex.go':899 'secret':515 'secrets.token':518 'sed':529,839 'server':460,480,725 'service.go':601 'setuprout':937 'short':267 'skill' 'skill-cliproxy-deploy' 'sonnet':710 'sourc':714 'source-majiayu000' 'splitlin':548 'ss':179,645 'ssh':87,109,123,147,204,250,304,357,367,378,405,432,450,483,532,629 'start':461 'status':172,489,734 'stream':668 'success':462 'tail':454 'tarbal':239 'test':308 'text':547,592 'time':649,755 'token':767 'toolchain':234 'topic-agent-skills' 'topic-ai-agents' 'topic-ai-coding-assistant' 'topic-automation' 'topic-claude' 'topic-claude-code' 'topic-code-review' 'topic-developer-tools' 'topic-devops' 'topic-productivity' 'topic-prompt-engineering' 'topic-python' 'true':573 'tt':379 'type':658 'ubuntu/debian':202 'ufw':27,113,170,171,178,194,471,485,488,626,729,733,735,828 'unam':149 'updat':209 'url':301,410,421,692,775 'urlsaf':519 'user':664 'v':155,163,169 'version':158 'vps':6,44,47,133,355 'w':80 'watcher':604 'x':73 'y':214 'yaml':275 'your-api-key':503,821 '一次':852 '上线':43,826 '上部署':7 '下':931 '不再继续试':427 '不受':625 '不必重启':610 '不要':814 '不要做的事':818 '不要盲杀':193 '二选一':316 '仅':278,491 '代码锚点':859 '任一不满足都不得声称':680 '会自动下载':233 '会误杀其他':835 '但远端':726 '保留默认示例':819 '修复':720 '修改':925 '健康校验':30,621 '允许落盘目录':94 '克隆仓库':248 '公网':721,738 '公网依然会':476 '公网可用':830 '公网直连':111,139,277,642 '公网直连时':470 '关键点':392 '兼容':16 '兼容接口':58 '内网':624 '再手动':612 '凭据文件名':914 '分钟内未完成浏览器授权':758 '分钟超时':415 '分钟超时窗口':127 '判定':185 '到':132,240 '前置确认':83 '卡在':764 '即使端口监听了':475 '原位替换':523 '参考事实':858 '只读':145 '只调这几项':274 '可能要求':222 '同一端口':403 '同步凭据':319 '同步到':354 '后台':430 '后重启':752 '含可读字符':676 '启动入口':862 '启动前后立即用第':294 '启动日志':782 '启动服务':429 '命令输出':79 '回调端口':897 '回调端口固定':393 '在':4 '在没放行':827 '复制':271 '多行坑':530 '多行段':845 '失败两次就切到':425 '如':705 '安装':199 '完成':76 '完成授权':411 '实际解析路径与文件属主':794 '客户端环境变量':683 '容易残留旧行':846 '密钥轮换':29 '将完整':847 '已部署':854 '并':242 '并保持':496 '并在启动后立即轮换随机':141 '并按第':617 '并暴露':14,56 '开始前先把隧道和浏览器都准备好':416 '强烈建议':501 '当用户说':32 '影响':627 '必要时重启':807 '必问':84 '必须':72 '必须在动手前确认':85 '必须换随机':115 '必须本会话命令证据':622 '必须满足':670 '必须看到':458 '必须重新跑第':855 '成功后凭据落在':351 '或':336,686,927 '或改':750 '或热重载没生效':800 '或进程没起':745 '所有':71,75 '把':35,49 '把浏览器最终跳转到的':418 '排障速查':716 '推荐':135,320 '支持配置热重载':599 '改':280,841 '改装官方':238 '改走':760 '放行':28,114 '放行防火墙':469 '整个':420 '文件权限不足':791 '无本地可用时的备选':375 '日志里会出现':605 '旧进程未退出':809 '时触发':45 '是否为':749 '是否能免密登录':91 '更稳':134 '最可能根因':718 '最小配置':22,270 '服务':741 '服务器':55 '服务端口':99 '未放行端口':732 '本会话':78 '本地同步两种路径':26 '本地登录':318 '本地登录同步':140,762 '本地登录后同步':129 '本机到':768 '本机执行':321 '本机新终端开隧道':402 '本机浏览器打开远端打印的授权':409 '本机浏览器配合':125 '本步':495 '条款都附带降级路径':74 '核对':792 '模式则':493 '模式改':695 '步安装':190 '步拿当次证据':857 '步轮换':296 '步重启':619 '段':527 '没关系':230 '没有':186 '没用上当前':798 '注意':219 '清':772 '源码拉取':21 '热重载':923 '版本偏旧':229 '环境':20 '环境变量落盘':31 '生成随机':509 '用':838 '症状':717 '登录':24 '登录参数':866 '登录路径':118 '的':68,227,602 '的前提下宣布':829 '目标':88 '直接':831 '直接给我完整值':851 '看':746 '确认是否旧进程':192 '程序有':413 '端口占用':191 '端口已被占用':808 '端口转发':124 '第':188 '粘回远端交互提示':422 '系统':225 '绑':743 '结论必须基于':77 '绝不保留':502 '能通':728 '自动下载':237 '自动回调到远端':412 '若不希望':235 '若未热重载成功':611 '若用户不指定':137 '若自动回调失败':417 '获取认证凭据':315 '被代理或拦截':771 '覆盖':18 '见':600 '触发':933 '订阅账号':70 '记录当前规则':196 '访问策略':103 '请只回复':666 '账号暴露成':37 '贴回聊天':849 '走':108 '跨会话声称':853 '路径错':789 '路由':934 '跳过':494 '轮换访问密钥':500 '这是公网直连失败的最常见根因':481 '进程':837 '远端':25,120,373 '远端发起':376 '远端执行':302 '远端环境检查':144 '远端用':521 '追加到':684 '适配':61 '避免':528 '避免在放行后改动其他端口':197 '部署':33,48 '部署到远程':53 '部署完成':681 '部署范围':93 '针对性':812 '降级路径':136,423 '除非用户明确要求':850 '随后':713 '隧道':110,759 '需':122,939 '需本机有源码或已编译好的':322 '需要':112 '非':678 '非空':677 '项目':220 '验证':719,781 '验证监听与日志':448 '默认':95,100,472,730 '默认使用':138 '默认值':508 '默认端口':893 '默认认证目录':887","prices":[{"id":"b91da031-4e8c-47a1-b26a-2d08630e6cef","listingId":"5cd8ca64-3330-4d8d-a200-daa7d444e2f1","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"majiayu000","category":"claude-arsenal","install_from":"skills.sh"},"createdAt":"2026-04-27T07:01:03.797Z"}],"sources":[{"listingId":"5cd8ca64-3330-4d8d-a200-daa7d444e2f1","source":"github","sourceId":"majiayu000/claude-arsenal/cliproxy-deploy","sourceUrl":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/cliproxy-deploy","isPrimary":false,"firstSeenAt":"2026-04-27T07:01:03.797Z","lastSeenAt":"2026-05-18T19:04:14.203Z"}],"details":{"listingId":"5cd8ca64-3330-4d8d-a200-daa7d444e2f1","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"majiayu000","slug":"cliproxy-deploy","github":{"repo":"majiayu000/claude-arsenal","stars":33,"topics":["agent-skills","ai-agents","ai-coding-assistant","automation","claude","claude-code","code-review","developer-tools","devops","productivity","prompt-engineering","python","software-development","typescript","workflows"],"license":"mit","html_url":"https://github.com/majiayu000/claude-arsenal","pushed_at":"2026-05-15T16:33:53Z","description":"52 production-ready Claude Code skills and 7 specialized agents for software development, DevOps, product workflows, and automation.","skill_md_sha":"d244c218eb337ac1eb2b7a08251bd7e6b7adfb5d","skill_md_path":"skills/cliproxy-deploy/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/cliproxy-deploy"},"layout":"multi","source":"github","category":"claude-arsenal","frontmatter":{"name":"cliproxy-deploy","description":"在 Linux VPS 上部署 CLIProxyAPI（router-for-me/CLIProxyAPI）并暴露 OpenAI 兼容 API。覆盖 Go 环境、源码拉取、最小配置、OAuth 登录（远端 / 本地同步两种路径）、UFW 放行、密钥轮换、健康校验、环境变量落盘。当用户说“部署 cliproxy / 把 codex/claude/gemini 账号暴露成 API / router-for-me 上线 VPS”时触发。"},"skills_sh_url":"https://skills.sh/majiayu000/claude-arsenal/cliproxy-deploy"},"updatedAt":"2026-05-18T19:04:14.203Z"}}