Skip to content

Latest commit

 

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

furcdn-cli

FurCDN 官方命令列工具。支援兩種鑑權方式,各自服務不同的端點群,CLI 內部依指令 自動決定要用哪一種,不需要使用者自己選:

  • Session 登入furcdn login,OAuth device flow):/api/domains/api/user/** 等 一般帳號的 dashboard 功能,對應 furcdn domain / furcdn account推薦的日常 登入方式——密碼只在瀏覽器輸入,終端機/shell history 完全看不到密碼。
  • API Keyfurcdn config set-key):/api/v1/**furcdn domains / furcdn ssl), 保留給舊版 v1 相容端點或第三方整合腳本使用。

管理後台(admin)操作不在這支 CLI 的範圍內,即使你的帳號是 admin 也一樣—— 這是刻意的設計決策,不是還沒做完。管理後台請直接用瀏覽器登入 dashboard。 詳見下方「為什麼沒有 admin 指令」。

安裝

git clone https://github.com/FurCDN/furcdn-cli.git
cd furcdn-cli
npm install
npm run build
npm link   # 全域安裝 `furcdn` 指令;不想全域安裝可用 node dist/index.js 代替

快速開始

  1. 到 FurCDN dashboard 的「API」頁面建立一把 API key(格式 fck_...)。

  2. 設定 CLI:

    furcdn config set-key fck_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  3. 驗證設定:

    $ furcdn config show
    API base : https://cdn.taipei
    API key  : fck_xxxx…(已設定)
    設定檔   : /home/you/.config/furcdn/config.json

登入(OAuth device flow)

furcdn domain / furcdn account 這兩組指令需要先登入。CLI 不會向你要密碼—— 帳密只在瀏覽器裡輸入,走的是 OAuth 2.0 Device Authorization Grant 風格的流程:

$ furcdn login
請在瀏覽器開啟以下網址完成授權:
  https://cdn.taipei/oauth/device?user_code=ABCD-1234

或前往 https://cdn.taipei/oauth/device 手動輸入代碼:ABCD-1234

等待授權中...
...
已登入:alice(alice@example.com)

$ furcdn whoami
帳號:alice(alice@example.com)
角色:user

$ furcdn logout
已登出。

流程:furcdn login 先呼叫 /api/oauth/device/code 拿到 user_code,接著會嘗試 自動開啟瀏覽器(偵測不到 GUI 或桌面環境時靜默 fallback,網址一樣印在終端機上, 用 --no-browser 可以直接跳過嘗試);瀏覽器裡登入並核准後,CLI 依伺服器指定的 interval 輪詢 /api/oauth/device/token,拿到 token 就存進 ~/.config/furcdn/session.json(權限 0600,比照 SSH key / gh auth login 的做法)。 也可以用 FURCDN_SESSION_TOKEN 環境變數覆蓋。核准逾時(10 分鐘沒人操作)或在瀏覽器 按拒絕,CLI 會印出清楚的錯誤並中止,重新執行 furcdn login 即可。

furcdn logout 只清本機的 session.json——CLI 拿到的 token 存在本機檔案,不是 瀏覽器 cookie,伺服器端 /api/auth/logout 本質上只是清 HTTP response 的 Set-Cookie header,對「本機檔案」沒有實際作用,所以不必特地打這支 API。

指令

指令很多,這裡先列常用的幾支;完整清單見下方「指令總表」與 furcdn <group> --help

furcdn domains list

$ furcdn domains list
ID  網域                狀態
--  ------------------  ----
1   example.com         啟用
2   old.example.com     停用

--json 取得機器可讀輸出。

furcdn domains purge <id-or-name>

清除該網域在所屬叢集所有節點的 L1+L2 快取(等同 dashboard「立即刷新緩存」)。

$ furcdn domains purge example.com
已對 example.com 發送清除快取:3/3 個節點成功。

有速率限制:同帳號 5 分鐘內最多 10 次,超過會回傳 429 並提示稍後再試。

furcdn ssl upload <id-or-name> --cert <path> --key <path>

上傳自訂 SSL 憑證並啟用(會關閉該網域的自動續簽)。

$ furcdn ssl upload example.com --cert ./fullchain.pem --key ./privkey.pem
已為 example.com 上傳並啟用自訂 SSL 憑證。

furcdn health

檢查目前 API base URL 是否存活(純 liveness,不代表 API 已就緒)。

$ furcdn health
OK: ok

furcdn config set-key <key> / furcdn config set-base-url <url> / furcdn config show

管理本機設定(存於 ~/.config/furcdn/config.json,權限 0600)。

也可以用環境變數覆蓋,優先於設定檔,方便 CI 或一次性使用:

FURCDN_API_KEY=fck_xxx FURCDN_API_BASE=https://staging.example.com furcdn domains list

指令總表

每一列是一個指令群組,執行 furcdn <指令> --help 看該群組下所有子指令與參數。 建立/更新類指令欄位很多時,統一用 --data '<json>'--data @file.json 帶完整 body(欄位名稱已對照後端 route.ts 原始碼核對過),常用欄位另外提供對應 flag。

群組 鑑權 涵蓋內容
furcdn login / logout / whoami session 登入生命週期
furcdn config 本機設定(API key / API base URL)
furcdn health liveness 檢查
furcdn api <method> <path> 自動判斷 逃生艙口:對任何 route 送請求,見下方「涵蓋範圍」
furcdn domains / furcdn ssl API Key v1 精簡版:list / purge / ssl upload
furcdn info Session(plans/origin-ips 無需登入) 叢集、公開方案、回源 IP 白名單、情報庫查詢、內建文檔
furcdn domain Session 完整版網域管理:CRUD、origin(回源/SNI/Host override,主源站+備援)、tls(force-https/http2/ech 一覽與切換)、ssl(request/status/upload/delete)、cache-ruleswaf(含 ip-check)、dns-checklogs
furcdn account Session balance/topup/redeem/discount-previewchange-password/change-email/settings/audit-lognotifyoauthpasskeys(僅管理既有列表)、api-keysplan(usage/history/auto-renew/buy/renew/upgrade)、statsalipay-verifytickets
furcdn mcp 依 tool 而定 見下方 MCP 章節

危險操作(刪除網域/passkey、改密碼等)一律要求 --verify-code(伺服器端的 email 二次驗證,先用 furcdn account send-code 索取)和/或互動確認 (可用 -y/--yes 在腳本中跳過)。

furcdn domain 底下 WAF/快取/回源/TLS 這四類設定各有明確命名的子指令,不需要 自己猜 JSON 欄位名:

設定類別 指令
WAF furcdn domain waf list/create/update/delete/defaults/ip-check
快取規則 furcdn domain cache-rules list/create/update/delete/defaults
回源 / SNI furcdn domain origin list/set/remove
TLS / HTTP furcdn domain tls status/set(force-https、http2、ech)
SSL 憑證 furcdn domain ssl request/status/upload/delete

furcdn domain origin set 預設取代主源站(陣列 index 0),加 --backup 則 附加一個備援;furcdn domain origin remove --index <n> 只能刪備援(index ≥1), 底層都是先讀現有 origins 陣列、本地修改後整批 PUT 回去,跟 dashboard 的 行為一致(OSS secret 等敏感欄位伺服器端會自動用 URL 比對還原,不會被清空)。

作為 MCP Server 使用

furcdn mcp 會以 stdio 啟動一個 MCP server, 把上面四個操作包成 MCP tools。鑑權沿用本機既有設定(furcdn config set-keyFURCDN_API_KEY 環境變數)——MCP tool 的參數裡不需要、也不應該傳 API key。

先確保已經 npm run build(或已 npm link),再把它加進你的 MCP client 設定:

Claude Code:

claude mcp add furcdn -- furcdn mcp
# 或還沒 npm link 過,直接指到編譯產物:
claude mcp add furcdn -- node /path/to/furcdn-cli/dist/index.js mcp

.mcp.json / Claude Desktop 設定:

{
  "mcpServers": {
    "furcdn": {
      "command": "furcdn",
      "args": ["mcp"]
    }
  }
}

提供的 tools:

Tool 名稱 說明 參數 鑑權
furcdn_domains_list 列出帳號下所有網域 API Key
furcdn_domains_purge 刷新指定網域快取 domain(id 或網域名稱) API Key
furcdn_ssl_upload 上傳並啟用自訂 SSL 憑證 domaincert(PEM)、key(PEM) API Key
furcdn_domains_create 建立新網域(完整版) domainclusterIdorigin?originType? Session(需先 furcdn login
furcdn_domains_update 更新網域簡單欄位 domainfields(key/value) Session
furcdn_domains_delete 刪除網域(不可逆) domainverifyCode Session
furcdn_health 檢查 API 存活狀態

MCP server 啟動時會分別檢查本機是否已設定 API key / 已登入 session,缺哪一種 只會影響對應的 tool,不會擋住其他 tool 或啟動流程本身。任何底層 API 錯誤都會 轉成 MCP tool 的 isError 回應(附錯誤訊息),不會讓 server process 中斷。

其餘 furcdn account / furcdn domain 底下的指令目前沒有包成 MCP tool (數量太大,見下方「涵蓋範圍」);需要透過 MCP 呼叫時,可以請 MCP client 改用 具備 shell 執行能力的方式直接呼叫 CLI 本身。MCP tools 裡沒有、也不會有任何 管理後台操作,理由同下方「為什麼沒有 admin 指令」。

作為 Claude Code Skill 使用

skills/furcdn/SKILL.md 是一份純文件型的 Claude Code skill, 教 Claude 怎麼用這支 CLI 完成「列出網域/刷新快取/上傳 SSL」等常見任務, 不含額外程式碼。要在自己的專案啟用,把整個目錄複製或 symlink 進 .claude/skills/furcdn

mkdir -p .claude/skills
ln -s /path/to/furcdn-cli/skills/furcdn .claude/skills/furcdn
# 或直接複製一份:
cp -r /path/to/furcdn-cli/skills/furcdn .claude/skills/furcdn

為什麼沒有 admin 指令

furcdn-cli 刻意不提供任何管理後台(admin)操作,即使你的帳號是 admin 角色也 一樣。原因:

  1. 設計決策,不是缺功能。 管理後台涉及使用者資料、餘額調整、批次刪除等高風險 操作,這類操作應該在瀏覽器裡以完整的 UI 上下文(確認對話框、審計介面、即時 資料)進行,不適合塞進終端機腳本。
  2. 伺服器端也這麼認為,而且是雙重防線。 furcdn login(OAuth device flow)核發 的 token 會被標記 src="cli";後端 requireAdmin() 看到這個標記一律直接拒絕, 不管操作者的帳號角色是不是 admin。就算 CLI 這端出於某種 bug 送出了 admin 請求, 伺服器也會擋下來——CLI 這邊的 furcdn api /api/admin/... 提前擋掉只是給更清楚 的錯誤訊息,不是唯一的防線。
  3. 需要管理後台功能時,請直接用瀏覽器登入 https://cdn.taipei 的 dashboard。

目前涵蓋範圍

app/api/** 底下約 130 支 route(不含 /api/admin/**,理由見上),這支 CLI 的 涵蓋策略:

  • 有專屬子指令、欄位對照過原始碼furcdn domains/furcdn ssl(v1,API Key)、 furcdn infofurcdn domain(完整版 CRUD、origin、tls、cache-rules、waf、 ssl、dns-check、logs)、furcdn account(帳務、安全、通知、oauth、passkeys 列表/刪除、api-keys、plan、stats、alipay 實名認證、tickets)、 furcdn login/logout/whoami
  • 完全沒有專屬指令,但可用 furcdn api <method> <path> --data <json> 呼叫:任何 上面沒覆蓋到的、或未來新增的一般使用者 /api/** route(/api/admin/** 被明確 擋掉,見上)。這支通用指令會依路徑前綴自動判斷該用 API Key 還是 session (可用 --auth 覆蓋),是刻意設計的逃生艙口,不是半途而廢的替代品。

明確跳過、不會有 CLI 指令(原因如下,非遺漏):

  • app/api/auth/github/**:OAuth redirect flow,本質上需要瀏覽器導向,CLI 無法模擬。
  • app/api/pay/payssion/notify:支付平台的 webhook callback,只給 Payssion 打,不是給使用者呼叫的端點。
  • app/api/telegram/webhook:Telegram Bot 的 webhook callback,同上。
  • app/api/acme/[token]:ACME HTTP-01 challenge,CDN 節點對憑證機構用的內部協議。
  • app/api/node/**binary/config/heartbeat/threat-ips/watch):這是 furcdn-node(邊緣節點 agent)自己跟 master 對話的協議,鑑權是節點 token,不是 使用者操作介面。
  • app/api/logo/[variant]:純靜態資源。
  • app/api/analytics/enrich:內部用途(分析數據豐富化管線),不是使用者操作端點。
  • Passkey 註冊 / 用 passkey 登入:WebAuthn 的 attestation/assertion 挑戰需要瀏覽器
    • 平台 authenticator(Touch ID / Windows Hello / 安全金鑰)互動,CLI 環境做不到。 已支援的是「管理既有 passkey」:furcdn account passkeys list/delete

尚未做,但技術上可行、之後可以補(TODO):

  • furcdn mcp 只包了 7 個最常用工具(v1 4 個 + 完整版網域 create/update/delete), furcdn account 底下的指令尚未包成 MCP tool(furcdn admin 不會有,見上)。
  • furcdn api 目前只認 key/session/none 三種鑑權模式,若未來 API 出現第三種 鑑權方式需要另外擴充;/api/admin/** 已在這支指令裡明確擋掉,不受此項影響。

開發

npm run typecheck   # 型別檢查
npm run build       # 編譯到 dist/
npm test            # 跑單元測試(node:test,會先自動 build)

License

MIT

About

FurCDN 官方命令列工具

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages