iT邦幫忙

2026 iThome 鐵人賽

DAY 30
0
佛心分享-SideProject30

為你自己蓋一座會複利的知識庫——WikiBrain系列 第 30 篇

Day 30 - 回頭看從 gist 到上線收費

  • 分享至 

  • xImage
  •  

前言

三十天前這是 Karpathy 的一則 gist。現在是一個上線收費、原始碼公開的產品,網域在 wikibrain.app。前面二十九篇把中間那段路寫完了。最後一天不開新功能,把整條路收起來,留下幾條重來還會照做的決定。

架構與章節對照:由上到下分成誰來驅動、進得來嗎、誰在動手、唯一能寫 SQL 的地方、存在哪裡、讓它活著六層,每一格標出對應的 Day

這一篇由上往下走一遍,每一段只停一次。

前面二十九篇走了哪幾段

開頭那幾篇把 gist 變成可跑的東西。六條準則拆成三層與三個操作,再寫成程式與 agent 迴圈。後來才真的丟來源進去,看概念頁自己長出來。那時候還沒有登入,也還沒有錢,但複利那條線已經看得見:差別在第二份來源進來的時候,有沒有東西可以回去改。

接著是讓它跟別人共用而不互踩。MCP 與工具描述把規則交出去,樂觀鎖擋人跟 agent 同時寫入的衝突,wiki 連結存成邊,前端用 Vite、圖譜與 i18n 把知識庫變成每天打得開的介面。匯入網頁之後,SSRF 與間接提示詞注入逼出同一條界線:能畫邊界的就擋連線目的地,畫不出來的就限制能力,自動執行寫不進 schema/。

再往後是身分、接線與營運。better-auth 與加密存放的 API key、Claude.ai 的 OAuth、Docker 與 Railway、Cloudflare 與 Resend、備份與還原演練、無頭渲染的公平池、本機假端點測模型來回。開源選 AGPL,分享與匯出讓人帶得走;保留期與刪帳號回答資料該不該消失。最後才是生意:沒有公司的前提下選 Paddle,再把固定成本與抽成算成打平人數。

篇序不是一開始就定好的。有些題目是被問題推出來的:壓測之前我以為序列化就夠安全,開源之前我以為營運資料可以跟程式碼住一起。寫進連載的,多半是已經踩過一次的坑。

寫得多的那一層,錯了最不容易發現

圖上最厚的一格是 agent 迴圈:迴圈本身、實際跑一次、擋注入、加密 API key。使用者每天真正在看的前端只有三篇。

這個比例是被難度推出來的。前端做錯了看得見,改一次就好;agent 那一層做錯了不會報錯,它只是安靜地產出比較差的頁面,你要三個月後回頭看知識庫的時候才發現。寫得多,是因為那一層最容易寫錯,而且最不容易當場發現。

第四層那條紀律救了三次

圖上第四層只有一個框:資料存取只有一個入口,src/notes.ts。加工作區隔離時,每一句 SQL 都要多一個 workspace_id。加方案閘門時,寫入前要先檢查額度。統一錯誤訊息時,每一則都要帶中英雙語。三件事都只改同一個檔案。

如果那時候路由各自寫 SQL,每一件都是一次全庫搜尋。重來的話,這一條還是會在第一週就定下來。

安全要擋在連線的那一刻

圖上①②層與③層之間那條線,學費交得最多。第一版的 SSRF 防護檢查使用者貼進來的網址,十進位 IP、八進位 IP、0.0.0.0、DNS 重綁定、轉址,每一種都繞得過,我被抓到兩次。正確的位置是連線的那一刻檢查即將連去的目的地。

間接提示詞注入是同一條線的另一面。那裡沒有內網對外網這種明確邊界,一句話是不是指令取決於讀它的是誰,所以改成限制能力:自動執行根本寫不進 schema/,外部網域的圖片在瀏覽器那一層就載不起來。能畫出邊界的就擋邊界,畫不出來的就限制能力。

序列化只是把記憶體問題換成延遲問題

無頭瀏覽器很吃記憶體,所以我下意識把它排成一條佇列,一次只跑一頁,以為保守就是安全。壓測的數字說不是。一個人丟五十個網址進來,其他人的匯入要等將近兩分鐘,而那兩分鐘裡記憶體用量幾乎不動。延遲在多人系統裡會傳染,記憶體不會。換成有上限的公平池之後,鄰居的等待從 26.8 秒掉到 4.3 秒。我優化了一個看得見的指標,延遲卻堆在一個當時沒有量的指標上。

公開與私有的界線要在寫第一行之前決定

這是唯一一個重來一定會改流程的決定。開源的時候才發現,服務商的帳號信箱與價格被編在一支原始碼裡。那是營運資料,不是程式。清掉它要回頭改 git 歷史,把一個檔案拆成程式與資料兩半。清檔案本身幾步就做完。難的是那時候整個 repo 的結構已經假設了反正都是我自己的。界線畫得晚,就得回頭拆已經長在一起的東西。

圖上畫不出來的幾件事

協定裡有標準答案的部分用別人寫好的:better-auth、Paddle、MCP SDK 都是;產品邏輯才自己寫。圖上每一格看起來份量差不多,實際上有些格子我只寫了四十行設定。

接上外部服務在圖上是一行字,實際上是整個系列裡最耗時的一段。DNS 生效、寄件網域驗證、OAuth 同意畫面審核、金流帳號開通,每一項都要等,而且等的時候不能做別的。

我請人用全新帳號從註冊開始跑,抓到的三個阻礙全部是我自己測永遠不會碰到的,因為我會下意識走自己設計的路。

生意那一段也不在架構圖上。沒有公司能不能收全球的卡、抽成之後幾個付費使用者才打平,決定的是這條路走不走得下去。固定成本大約六美元、月繳實收大約五美元,打平只要兩個選擇月繳的人;那個數字比我預期的低,是因為訂閱裡沒有模型費。

一點心得

這是 vibe coding 的 side project,以 LLM Wiki 當成題目,試著做一次完整的開發與上線流程。從 gist 的六條準則,一路走到收費、開源與商業模式的試算。

服務在 wikibrain.app,程式碼在 GitHub,AGPL-3.0,docker compose up 就跑得起來。前面每一篇講的程式碼都能在那裡翻到完整的上下文,包括我寫錯又改掉的那些,git 歷史都還在。謝謝讀到這裡的你。


上一篇
Day 29 - 做固定成本與 Paddle 抽成的成本試算
系列文
為你自己蓋一座會複利的知識庫——WikiBrain 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言