c6bd0d7899
Production bug(本地 miniflare 未抓到、真端點才爆):部署後 drainer 對同帳號
arcrun-code/arcrun-kbdb/kbdb-graph-plugin 做 fetch("https://*.leo21c.workers.dev")
→ CF 1042(同帳號 worker 互打限制),被 error handler 包成 "not valid JSON"。
修法=比照 cypher-executor(wrangler.toml [[services]] 綁零件):
- wrangler.toml 加 [[services]] SVC_CODE→arcrun-code / SVC_KBDB→arcrun-kbdb /
SVC_GRAPH→kbdb-graph-plugin;移除 CODE_WORKER_URL/KBDB_URL/GRAPH_URL vars。
- index.ts:所有 code/kbdb/graph 呼叫改 env.SVC_X.fetch()(svc() 輔助);Gitea
(git.uncle6.me,非 CF)維持 plain fetch。
驗收(強制對部署後真端點、禁 miniflare):POST /drain?batch=2 回真 JSON、notes 3 卡
冪等全 skip、無 1042;游標前進+回捲;加測試卡→真端點 /webhook 只寫該 delta(entry
create 進 live KBDB)→三模式 curl 命中(含 Arcrun#11 修後語意 owner+type 過濾生效)→
測試卡清除。deploy version 95562b3e。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HJiLCRUU2o3aSpPEzVCt2o
74 lines
3.9 KiB
Markdown
74 lines
3.9 KiB
Markdown
# arcrun-km-wiki-drainer —— km_wiki_ingest_drain 的無人值守 runtime
|
||
|
||
`workflow.yaml` 是宣告式 spec;**本 Worker 是它可真部署、有游標/觸發的執行體**。
|
||
復用已 live 的零件與服務,**不改 cypher-executor**:
|
||
|
||
```
|
||
Gitea 抓卡 md → arcrun-code 零件(sandbox inline JS 解析)→ /entries 冪等 upsert(embed:true)
|
||
→ graph /triplets/ingest(server 側 per-source 冪等)
|
||
```
|
||
|
||
- Live:`https://arcrun-km-wiki-drainer.leo21c.workers.dev`
|
||
- 解析 JS=`src/usercode.ts`(由 `workflow.yaml` 的 `parse_card.code` 抽出,單一真相源 `lib/card-to-envelope.mjs`)。
|
||
|
||
## 兩觸發模式(共用同一 `processCard` 核心)
|
||
|
||
| 模式 | 觸發 | 行為 |
|
||
|---|---|---|
|
||
| **Phase 0 cron drain** | cron tick(見「開自走」)| `drainBatch(BATCH_SIZE)`:Gitea tree 列卡 → 游標之後取一小批 → 逐卡 `processCard` → 進游標(到底**回捲**重掃)。壓 CF subrequest 下、撐得住 5,083 檔(每 tick 小批)。 |
|
||
| **穩態 webhook** | Gitea push webhook → `POST /webhook` | 只處理本次 commit 動到的 `system-dev/wiki/cards/**.md`(delta),不重掃全庫。**Gitea→Cloudflare,非 GitHub Actions(不觸 D20)**。 |
|
||
|
||
**冪等**:未改卡的 entry(`page_name`+`content_hash`)與 triplet(`source.uri`+`content_hash`)皆 skip;只有新/改卡真寫。游標存 KBDB 一個 `ingest_cursor` entry(走 API、零建表)。
|
||
|
||
## HTTP 路由
|
||
|
||
| 方法 | 路徑 | 用途 |
|
||
|---|---|---|
|
||
| GET | `/` | 健康 |
|
||
| GET | `/cursor` | 看游標狀態 |
|
||
| POST | `/drain?batch=N` | 手動觸發一批 drain(= 一個 cron tick;驗收/補跑用) |
|
||
| POST | `/webhook` | Gitea push webhook 入口(delta) |
|
||
| POST | `/cursor/reset` | 游標歸零(重新全 drain) |
|
||
|
||
## ⚠️ 非-auto(預設)
|
||
|
||
`wrangler.toml` 的 `[triggers] crons` **預設註解掉**——不自走排程、不無人值守亂寫。
|
||
drain 以 `POST /drain` 手動觸發(與 cron `scheduled` handler 同核心)。
|
||
要開自走 Phase 0 backfill:leo 過閘後取消 `wrangler.toml` 那兩行註解再 deploy。
|
||
|
||
## 部署(wrangler 直推 leo21c,禁 acr update)
|
||
|
||
```bash
|
||
cd registry/examples/km-wiki-ingest/drainer
|
||
npm install
|
||
npx wrangler deploy
|
||
# ★ 必須:設 Gitea 讀取權(Leo/notes 為 private repo)——此步需 leo 在互動模式跑(secret 寫入)
|
||
printf '%s' "$GITEA_TOKEN" | npx wrangler secret put GITEA_TOKEN
|
||
# 選填:webhook 簽章驗證
|
||
# printf '%s' "$WEBHOOK_SECRET" | npx wrangler secret put GITEA_WEBHOOK_SECRET
|
||
```
|
||
|
||
## Gitea webhook 設定(穩態 delta)
|
||
|
||
`Leo/notes` → Settings → Webhooks → Add Webhook → Gitea:
|
||
- Target URL:`https://arcrun-km-wiki-drainer.leo21c.workers.dev/webhook`
|
||
- HTTP Method:POST,Content-Type:`application/json`
|
||
- Trigger:Push events(可只限 `main`)
|
||
- Secret:若設,同步 `GITEA_WEBHOOK_SECRET` secret(本 Worker 驗 `X-Gitea-Signature` HMAC-SHA256)
|
||
- Gitea 的 ping event → Worker 回 `{ok:true,pong:true}`(測連通)
|
||
|
||
## config
|
||
|
||
- **vars**:`REPO=Leo/notes REF=main OWNER=leo CARDS_ROOT=system-dev/wiki/cards GRAPH_KEY=leo BATCH_SIZE=2`
|
||
- **Service Bindings(`[[services]]`)**:`SVC_CODE→arcrun-code`、`SVC_KBDB→arcrun-kbdb`、`SVC_GRAPH→kbdb-graph-plugin`。
|
||
⚠️ 同帳號 worker-to-worker **必須走 Service Binding**(`env.SVC_X.fetch()`)——直接 `fetch("https://arcrun-*.leo21c.workers.dev")`
|
||
會撞 **CF 1042**(同帳號 worker 互打限制)。Gitea(`git.uncle6.me`,非 CF)才用 plain `fetch`。
|
||
註:`wrangler dev` 本地 miniflare **不強制** 1042,故本地測會假綠 → 一律對部署後真端點驗收。
|
||
|
||
## 規模備註(5,083 檔)
|
||
|
||
- 列卡走 Gitea `git/trees?recursive=true`(一次全樹);若 `truncated`,回應標記 `truncated:true`,
|
||
屆時換 tree 分頁列法(現況 notes 卡數小、不截斷)。
|
||
- 每 tick 只 `BATCH_SIZE` 張,游標續傳;到底回捲 → 全庫變更靠冪等於下一輪捕捉;
|
||
即時變更走 webhook。
|