dd86fef9a6
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>
128 lines
7.4 KiB
Bash
Executable File
128 lines
7.4 KiB
Bash
Executable File
#!/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
|
||
|
||
# ── 雲端需要哪些變數(只有名字。要加就加在這裡)──────────────────
|
||
#
|
||
# 範圍=**youlin(stage)與 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 token;bootstrap 與 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 = 出貨三站真正部署到的帳號(installer/docsSite/mailRelay,stage 與 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 實例的 namespace(X-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 裡。"
|