Files
ISEP/scripts/make-cloud-env.sh
T
Leo dd86fef9a6 定版 v0.21.0(出貨線的實例座標雲端也拿得到)
inkstone/Arcrun#195 已併入兩個 main(Arcrun 828fe1f/arcrun-rag 93dc247):
出貨座標拆成「網址隨 repo 走、namespace 走環境變數」。那把 namespace 原本
只住在 ~/.arcrun/config.yaml 的 api_key——家目錄,不隨 clone 走 ⇒ 雲端拿不到。

總管實跑(乾淨環境 env -i、HOME 指空目錄、無任何 .env):
  resolveInstanceCoordinates({instance:'youlin'})
    base ← instances.json(隨 repo)|namespace ← 環境變數 ARCRUN_NS_YOULIN
  用那組座標 GET /webhooks/named → HTTP 200,9 支工作流

清單 9 把 → 10 把。實數確認:NEEDED 10 行、test 11/11 通過、B7/B8/B9 全綠。

🔴 這一筆是總管自己做的(平常該派工):派出去的工人在 API 層 SSL 錯誤掛掉,
且已超過收工線,改動是清單加一行 + 兩處把數同步,總管有完整驗證能力。
已依規約 touch /tmp/.solo-ok-<session_id> 留痕。

票:inkstone/ISEP#115(→ comment 5610)

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

128 lines
7.4 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 走
# ── Arcrun 出貨線的實例座標(inkstone/Arcrun#195 起)──
# 網址隨 repo 走(Arcrun 的 shared/instance-coordinates/instances.json),
# 只有 namespace 是機敏 ⇒ 走環境變數。原本只住在 ~/.arcrun/config.yaml 的 api_key
# 那個檔在家目錄、不隨 clone 走 ⇒ 雲端永遠拿不到。
ARCRUN_NS_YOULIN # youlin 實例的 namespaceX-Arcrun-API-Key
)
#
# 🔴 這份清單的邊界——加一把之前先問「這把打得到哪個實例」,不是「這把方便嗎」
#
# 可以進來的:**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 裡。"