Files
ISEP/scripts/make-cloud-env.sh
T
Leo cb310e9c72 出貨那三站的帳號也進清單:uncle6(inkstone/ISEP#115 → comment 5577)
出貨的 installer/docsSite/mailRelay 三站,stage 與 prod 全部部署到 uncle6
(ship.targets.json 六處 accountId 去重後只有 58309bb90fd93ad6d0fe0aae99170e9d),
而本機是靠家目錄的 ~/.wrangler OAuth 登入態出貨——那個檔不隨 repo clone 走,
所以雲端會在部署當下才斷。UNCLE6_CF_API_KEY 這條路本來就存在且 active,只是沒進清單。

- NEEDED 加 UNCLE6_CF_API_KEY(住在 products/arcrun-rag/.env)。清單 8 → 9 把。
- 清單開頭那段「範圍」跟著改,否則說明與清單本身打架;
  並把「這把有沒有 Workers Scripts:Edit 沒驗」這個未知寫在旁邊,
  下一個讀清單的人不必重新發現它。
- docs/TESTING.md A26:把「清單現在是 8 把」改成 9 把,狀態表補 5577。

只加這一把。stage bundle repo 寫入權與 ARCRUN_SHIP_BASE/ARCRUN_SHIP_NS 沒碰
(comment 5577 明寫那是 leo 的裁決,不在範圍)。
值全程沒有進版控、沒有進對話(只印名字與長度)。版本號待總管定。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 12:35:40 +08:00

122 lines
7.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 管什麼: 產生「可以直接貼進 claude.ai Cloud environment」的兩塊內容,值由本腳本自己去 .env 拉。
# 為什麼: leo 2026-08-20「這些值你都有,你可以只寫名字然後 build 一個檔案給我」——
# 之前的做法是叫他自己拼湊,或叫他把設定貼給 AI 看,兩種都錯(一個沒效率,一個讓值經過對話)。
# 誤觸時怎麼關: 這支不擋任何東西。不想產生就別跑;產物在版控外,刪掉即可。
#
# 用法:bash scripts/make-cloud-env.sh
# 產物:~/.claude/cloud-env/<日期>.txt(權限 600**不在任何 repo 裡**
# 本腳本只寫「變數名字」,值在執行當下才從既有 .env 讀出來寫進產物 —— 值不進版控、不進對話。
set -euo pipefail
# ── 雲端需要哪些變數(只有名字。要加就加在這裡)──────────────────
#
# 範圍=**youlinstage)與 geek6688(測試 prod & 出貨機)兩台全給**,
# **外加 uncle6**——出貨的三個站實際部署到的是那個帳號。
# leo 2026-09-01:「youlin 和 geek6688 都全給,因為這兩個都是讓 CC 操作
# 一個 stage 一個 test prod**不給所有的就是受阻**。」
# uncle6 是同一句話的延伸(inkstone/ISEP#115 → comment `5577`):
# `products/arcrun-rag/installer/ship.targets.json` 六處 accountId 去重後只有一個值
# `58309bb90fd93ad6d0fe0aae99170e9d`,而本機出貨靠的是家目錄裡的 OAuth 登入態
# `~/.wrangler/config/default.toml`)——**那個檔不隨 repo clone 走,雲端永遠拿不到**。
# ⚠️ 這把「是 uncle6 的、而且 active」是驗過的;「它有沒有 Workers Scripts:Edit
# =真的部署得動」**沒驗**(驗它必須寫入,那是紅線)。缺這格會在部署當下才知道。
NEEDED=(
# ── 機器帳號 ──
GITEA_TOKEN_CLAUDE_CODE # claude-code 的 Gitea tokenbootstrap 與 plugin 安裝都靠它
# ── youlin AI 的 stage(沒指定帳號時的預設,agent-memory.md §2)──
CLOUDFLARE_API_TOKEN_YOULIN_CC_USE # D37 起這把就是設計給 CC 用的
CLOUDFLARE_ACCOUNT_ID_YOULIN # 上面那把的配對 account id(帳號 id 不是機密)
YOULIN_MCP_OWNER_SECRETS # youlin 那台 MCP 的 owner secret
STAGE_USERNAME_YOULIN # ⚠️ 密碼類,見下面那條限制
STAGE_PASSWORD_YOULIN # ⚠️ 密碼類,見下面那條限制
# ── geek6688 測試 prod 出貨機 ──
CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE # 出貨線寫入用
CLOUDFLARE_ACCOUNT_ID_GEEK6688 # 上面那把的配對 account id
# ── uncle6 = 出貨三站真正部署到的帳號(installerdocsSitemailRelaystage 與 prod 都是)──
UNCLE6_CF_API_KEY # 住在 products/arcrun-rag/.env;本機是靠 ~/.wrangler 的 OAuth 登入態出貨,那個檔不隨 clone 走
)
#
# 🔴 這份清單的邊界——加一把之前先問「這把打得到哪個實例」,不是「這把方便嗎」
#
# 可以進來的:**youlin 與 geek6688** 這兩台的全部,加上機器帳號自己的 token。
# 🔴 不准進來的:
# ① `CLOUDFLARE_API_TOKEN_leo21c`——leo 2026-09-01 只點名那兩台;
# leo21c 是現役正式環境,`inkstone/InkStoneCo#14` → comment `3890` 已分進 B 段不放。
# ② `polaris/mira/.env` 裡的任何東西——那整份都是 leo21c 現役正式環境。
# 其中 `CLOUDFLARE_API_TOKEN` / `CLOUDFLARE_ACCOUNT_ID` 這兩個**沒有名字**的最危險:
# 所有 CF 工具都把它們當預設 ⇒ 雲端一個沒指定帳號的指令就會打到正式環境。
# 2026-08-14 那輪審查把它列為「本輪最危險的發現」。
# 🔎 這一條不必靠人記得:`scripts/test-make-cloud-env.sh` 的 B8 會去看
# **每一把的值是從哪個檔案拿到的**,出自 `polaris/mira/.env` 就紅。
#
# 🔴 密碼類(`STAGE_PASSWORD_YOULIN` 等)進清單是為了讓**人**拿得到。
# `credentials-map.md`「密碼類憑證的用法限制」(2026-08-17 立)照舊有效:
# **AI 不得把密碼打進登入欄位**,這是 surface 層硬規則,leo 交代了也不解除。
# 機器要驗登入後的畫面走那節寫的兩條:帶 token/cookie 打 API,或接 leo 已登入的分頁。
#
# 📌 兩台的 account id 都有具名變數了(`…_YOULIN` 是 2026-09-01 才補進頂層 `.env` 的,
# inkstone/ISEP#115 → comment `5542`;帳號 id 不是機密,wiki 的帳號表本來就公開記著)。
# **所以永遠不需要去用那個沒有名字的 `CLOUDFLARE_ACCOUNT_ID`**——那是 leo21c。
# ── 去哪裡找值(credentials-map.md 記的六個 .env)────────────────
BASE="${INKSTONE_ROOT:-$HOME/Documents/tech_projects/InkStoneCo}"
ENV_FILES=(
"$BASE/.env"
"$BASE/matrix/arcrun/.env"
"$BASE/products/arcrun-rag/.env"
"$BASE/polaris/mira/.env"
"$BASE/matrix/kbdb-graph-plugin/.env"
"$BASE/arcrun_harness/.env"
)
lookup() { # $1=變數名 → 印出值(找不到就空)
local name="$1" f v
for f in "${ENV_FILES[@]}"; do
[ -f "$f" ] || continue
v=$(grep -E "^[[:space:]]*(export[[:space:]]+)?${name}=" "$f" 2>/dev/null | tail -1 \
| sed -E "s/^[[:space:]]*(export[[:space:]]+)?${name}=//" \
| sed -E 's/^"(.*)"$/\1/; s/^'"'"'(.*)'"'"'$/\1/')
[ -n "$v" ] && { printf '%s' "$v"; return 0; }
done
return 1
}
# 預設丟 ~/.claude/cloud-env(權限 700)。要放別的地方= OUT_DIR=~/Desktop bash scripts/make-cloud-env.sh
OUT_DIR="${OUT_DIR:-$HOME/.claude/cloud-env}"
mkdir -p "$OUT_DIR"
# 只在「這個目錄是我們自己造的預設位置」時才收緊權限——
# OUT_DIR 可被覆寫,不該對使用者指定的既有目錄(例如 ~/Desktop)動權限。
[ "$OUT_DIR" = "$HOME/.claude/cloud-env" ] && chmod 700 "$OUT_DIR"
OUT="$OUT_DIR/$(date +%Y%m%d-%H%M%S).txt"
SETUP="$(cd "$(dirname "$0")/.." && pwd)/docs/cloud-setup-script.sh"
[ -f "$SETUP" ] || { echo "🔴 找不到 $SETUP" >&2; exit 1; }
MISSING=()
{
echo "claude.ai → Cloud environments → 你的環境。下面兩塊各自貼進對應欄位。"
echo "產生時間:$(date '+%Y-%m-%d %H:%M')"
echo
echo "════════ ① Environment variables(一行一個,名字與值分開填)════════"
for n in "${NEEDED[@]}"; do
if v=$(lookup "$n"); then
echo "$n=$v"
else
echo "$n=<🔴 這台機器的 .env 裡找不到,要 leo 提供>"
MISSING+=("$n")
fi
done
echo
echo "════════ ② Setup script(整段貼,一字不改)════════"
cat "$SETUP"
} > "$OUT"
chmod 600 "$OUT"
echo "✅ 產生完成:$OUT"
echo " 變數 ${#NEEDED[@]} 個|找不到值的 ${#MISSING[@]}${MISSING[*]:-}"
echo " 🔴 這個檔含金鑰真身:貼完就刪(rm '$OUT'),它刻意不在任何 repo 裡。"