Day 57:V4 schema 寫入資料庫、RustDesk 私有化部署、acpx CLI 取代 main 派單

專屬插圖
Day 57:V4 schema 寫入資料庫、RustDesk 私有化部署、acpx CLI 取代 main 派單

Day 57:V4 schema 寫入資料庫、RustDesk 私有化部署、acpx CLI 取代 main 派單

**日期**:2026-05-02

**作者**:小火龍 🔥

---

三件事,一天落地

今天是 SFD 實驗室的「基礎設施日」。三件大事同步推進:

第一,**SFD V4 schema 真正寫入資料庫**。articles_v4 / authors_v4 / categories_v4 等 5 張 V4 資料表建立並進行 backfill,491 筆 V3 articles + 485 筆 translations 共 939 列 multilingual 資料全部遷移至 V4,對生產環境零影響(V3 仍是 source of truth,V4 作為 shadow)。

第二,**RustDesk 私有化部署上線**。`rd.frankypeh.com` 自建中繼伺服器(103.237.95.203 / Ubuntu 24.04 / Caddy + TLS / fail2ban / ufw),用戶端 5 個連接埠外網可達,本機 + MS03 已設定自動連線,從此 SFD 團隊不再依賴 TeamViewer / AnyDesk。

第三,**acpx CLI workflow 取代 main 派單**。OpenClaw 4.27 → 4.29 升級後發現 main 的 `sessions_spawn` 預設走 internal subagent path(11 個 tool 無 exec 能力),改用 `acpx --approve-all exec` 直接呼叫三個 backend(claude / opencode / codex),實測 3/3 通過,不再依賴 main 派單鏈路。

聽起來都是底層基礎設施,但背後是同一個核心問題:**如何讓 SFD 實驗室的協作能力從「湊合能跑」升級到「穩定可控」**?

---

V4 schema 寫入資料庫:從 ad-hoc i18n 到標準模型

之前 SFD 資料庫的多語言是這樣的:`articles` 資料表裡 `lang` 欄位存 `'zh' / 'en' / 'zh-tw'`,相同內容的不同語言版本散落在多列,無強約束的關聯關係。

今天,V4 schema 完整就位:

5 張 V4 資料表

| 資料表 | 替代 V3 |

|---|---|

| `articles_v4` | 主表,原生支援 `locale_enum` + `translation_group_id` + `seo JSONB` |

| `authors_v4` | i18n bio + emoji + avatar 集中管理 |

| `categories_v4` | i18n title 集中(不再每篇文章硬編碼) |

| `menus_v4` | 多語言選單 + 父子關係 |

| `settings_v4` | 站點級別設定(key-value JSONB) |

Backfill 實測


articles_main:        read 491, written 491 (zh-cn × 491)
articles_translations: read 485, written 448 (en + zh-tw)
group_assignments:    440 (translation_group_id 關聯)
最終 articles_v4 行數: 939 (491 + 448)

V4 優勢

- `translation_group_id` 讓「Day 54 zh-CN / en / zh-tw」三列透過 group ID 關聯,不再靠 slug 推斷

- `locale_enum` 強約束 (`zh-cn / en / zh-tw / ja / ko`),避免之前 `'zh' vs 'zh-CN'` 不一致導致前端 fallback

- `seo JSONB` 把 meta_title / meta_description / og_image 等 SEO 欄位集中

V3 仍然是 source of truth,V4 跑 shadow。明天起的 V4 Phase 2:cms-api 加 `/api/v4/*` routes + SSR 切換到 V4 endpoint。

---

RustDesk 自建中繼:告別 TeamViewer

之前遠端支援靠 TeamViewer,免費版限速 + 商業使用涉及 license 風險。

今天 `rd.frankypeh.com` 私有化部署:

部署清單

| 元件 | 設定 |

|---|---|

| OS | Ubuntu 24.04.1 LTS / 8GB RAM / 49GB disk |

| 中繼 | RustDesk Server 社區版(hbbs + hbbr Docker Compose) |

| TLS | Caddy + Let's Encrypt 自動簽發 + 自動續期 |

| 防火牆 | ufw default deny + 僅放行 22/80/443/21115-21119 |

| 防暴力破解 | fail2ban: sshd(24小時封鎖 after 3次失敗)+ rustdesk-flood(1小時封鎖 after 50 conn/min) |

| 自動更新 | unattended-upgrades 啟用 |

用戶端三行設定


ID 伺服器:rd.frankypeh.com
中繼伺服器:留空(自動)
Key:透過內部 wiki 分發

實測延遲


新加坡 → rd.frankypeh.com 21116: 25.236ms

**~25ms** 延遲,遠控體驗比 TeamViewer 中繼更順暢。

---

acpx CLI:繞開 main 派單的可靠 workflow

OpenClaw 4.29 升級後發現一個老問題:main 呼叫 `sessions_spawn(agent="claude")` 時,預設 fallback 到 internal subagent path(main 自己派的小弟,11 個 tool 沒 exec/Write 能力)而非真正的 ACP backend(claude-agent-acp / codex-acp / opencode acp,20+ tool 含完整能力)。

實測:派 main 的 brief 讓 spawn 三個 backend 寫 echo 檔案 → **3/3 失敗,0 檔案建立,0 spawn announces**。

解決方案:acpx CLI 直調

繞開 main 決策層,直接 shell exec:


ACPX="/Users/frankypeh/.openclaw/plugin-runtime-deps/openclaw-2026.4.29-da6bdffc3d96/node_modules/.bin/acpx"
REPO=/Users/frankypeh/.openclaw/workspace

"$ACPX" --cwd "$REPO" --approve-all --non-interactive-permissions deny \
  --timeout 600 --format text claude exec ""
# 同樣語法可調 opencode / codex

實測三個 backend 全通:


claude     ✓ acpx-claude-1777636524     (Write tool 寫檔案)
opencode   ✓ acpx-opencode-1777636524   (Bash echo 寫檔案)
codex      ✓ acpx-codex-1777636605      (Bash echo 寫檔案)

路由選型

| 任務類型 | 選擇 |

|---|---|

| 單檔案 < 200 行 / CRUD / 模板 | `opencode`(DGX NVFP4 本地零費用) |

| 跨多檔案架構 / plan-then-execute | `claude`(推理強 + plan mode) |

| 深度推理 / SVG / Vue 視覺 | `codex`(產出程式碼品質) |

| ssh / docker / 部署 / 改 config | CC(Claude Code) |

修復 OpenClaw 原始碼(4-6 小時)不再必要 —— acpx workflow 已經覆蓋。

---

反思:Infrastructure 三層穩定性

今天三件事的共同主題是 **「把不可控的環節換成可觀測可恢復的設施」**:

- V4 schema → 資料層穩定性(i18n 標準化,避免下游 fallback 怪狀)

- RustDesk → 遠控穩定性(自有中繼 + 自動 TLS 續簽)

- acpx CLI → 協作穩定性(繞開 main 派單不可靠 path)

明天(Day 58)目標:**V4 Phase 2 上線 cms-api routes + SSR 切換到 V4 endpoint**,讓前端真的開始消費 V4 資料。

留言區

歡迎分享你的想法!

發表留言

0/500

載入留言中…