![]()
€5/月的VPS,4GB內(nèi)存,一個(gè)想從手機(jī)上發(fā)消息就讓AI干活的念頭。聽起來像周末下午就能搞定的小項(xiàng)目?我花了三周。
OpenClaw是個(gè)開源AI代理網(wǎng)關(guān)。接Telegram或網(wǎng)頁聊天,指定模型,你就能擁有一個(gè)能瀏覽網(wǎng)頁、讀文件、跑代碼、回消息的私人AI代理。賣點(diǎn)是控制權(quán):你選模型,你擁有服務(wù)器,想付費(fèi)用商業(yè)模型或白嫖社區(qū)模型都行。
官方流程很順:克隆倉庫、配.env、跑腳本。但代碼跑起來之前,每個(gè)坑都在暗處蹲著。
第一個(gè)坑:消失的 nostr-tools
網(wǎng)關(guān)第一次啟動(dòng)直接崩潰。報(bào)錯(cuò)干凈得像一張罰單:
Error: Cannot find package 'nostr-tools'
翻完倉庫才搞明白:Docker鏡像構(gòu)建時(shí)默認(rèn)跳過nostr擴(kuò)展,除非你顯式聲明。這不是文檔漏寫,是構(gòu)建參數(shù)的設(shè)計(jì)邏輯——但新手誰會想到去翻Dockerfile的ARG指令?
修復(fù):在docker-compose.yml的build段加一行:
build:
args:
OPENCLAW_EXTENSIONS: nostr
然后docker compose build重建鏡像。問題消失,但時(shí)間已經(jīng)溜走兩小時(shí)。
第二個(gè)坑:.env 是擺設(shè)
setup.sh用OPENCLAW_IMAGE變量決定拉哪個(gè)鏡像。我自信滿滿寫在.env里,腳本安靜得像在冬眠——它根本沒讀那個(gè)文件。
真相:腳本不source .env,你得手動(dòng)export進(jìn)shell:
export OPENCLAW_IMAGE=openclaw:local
./scripts/docker/setup.sh
最折磨的是沒有報(bào)錯(cuò)。腳本只是默默用了默認(rèn)鏡像,你盯著日志找問題,像在空房間里找回聲。這個(gè)"靜默失敗"吃掉的時(shí)間,比第一個(gè)坑還多。
兩個(gè)修復(fù)之后,/healthz終于返回{"ok":true}。第一滴血。
第三個(gè)坑:我誤解了瀏覽器控制
想讓代理能上網(wǎng)。OpenClaw支持Chrome DevTools協(xié)議(CDP,瀏覽器遠(yuǎn)程調(diào)試協(xié)議),我在VPS宿主機(jī)裝了Chrome,配置文件里啟用了瀏覽器控制。
代理完全找不到瀏覽器。
問題出在我的認(rèn)知模型。網(wǎng)關(guān)跑在Docker容器里,瀏覽器裝在宿主機(jī)。我以為"同一臺機(jī)器"就是"能互相看見",但Docker的隔離墻比想象中厚。容器里的進(jìn)程看宿主機(jī),像隔著毛玻璃看隔壁房間——輪廓模糊,細(xì)節(jié)全丟。
解決方案有幾種:把Chrome塞進(jìn)鏡像(體積爆炸)、用host網(wǎng)絡(luò)模式(犧牲隔離性)、或者掛載Chrome的可執(zhí)行路徑和調(diào)試端口。我試了第三種,配置繁瑣得像在填稅表,而且每次Chrome更新都要手動(dòng)同步。
這時(shí)候我開始懷疑:Docker對這個(gè)場景,是不是過度設(shè)計(jì)了?
第四個(gè)坑:模型開始幻覺自己的配置
最荒誕的崩潰來了。代理運(yùn)行三天后進(jìn)入死循環(huán):啟動(dòng)、報(bào)錯(cuò)、重啟、再報(bào)錯(cuò)。日志顯示模型在"回憶"一個(gè)從未存在過的配置項(xiàng),并堅(jiān)持要按那個(gè)幻覺執(zhí)行。
具體表現(xiàn):它聲稱某個(gè)工具需要API key,但那個(gè)key的配置項(xiàng)根本不在我的.env里。我查提交歷史、查issue列表、甚至查了模型的訓(xùn)練數(shù)據(jù)截止時(shí)間——沒有。它就是憑空捏造了一個(gè)配置結(jié)構(gòu),然后卡在"找不到該配置"的錯(cuò)誤里。
三天。我重裝了三次,清空了卷,甚至換了模型版本。最后發(fā)現(xiàn):某個(gè)對話歷史被存進(jìn)了持久化存儲,模型在上下文里"學(xué)到"了錯(cuò)誤的自我描述。清除對話緩存,循環(huán)終止。
這個(gè)坑和Docker無關(guān),和代碼質(zhì)量也無關(guān)。它暴露的是AI代理的一個(gè)深層張力:模型有狀態(tài),但狀態(tài)可能腐敗;你想讓它"記住"事情,但它記住的可能是幻覺。
掀桌:遷移到裸機(jī)
四個(gè)坑之后,我做了產(chǎn)品經(jīng)理生涯中做過無數(shù)次的事:砍掉中間層。
裸機(jī)部署意味著失去Docker的便攜性,但換來的是可預(yù)測性。Chrome就在/usr/bin/google-chrome,代理能找到它。環(huán)境變量寫在systemd服務(wù)文件里,腳本不會"忘記"讀取。沒有容器隔離墻,沒有卷掛載的權(quán)限迷宮。
遷移花了半天:裝Node、配PM2、寫systemd單元。之后兩周零崩潰。
成本對比:Docker方案的理論優(yōu)勢是"一次構(gòu)建,到處運(yùn)行",但我的場景是"一臺服務(wù)器,長期運(yùn)行"。便攜性的溢價(jià),在這里沒有買家。
什么場景該用Docker
不是說Docker不行。如果你需要快速分發(fā)、多環(huán)境一致性、或者團(tuán)隊(duì)里有人用Mac有人用Windows,容器仍是最優(yōu)解。但個(gè)人AI代理有幾個(gè)特殊之處:
它要和宿主機(jī)深度集成(瀏覽器、文件系統(tǒng)、可能還有GPU)。隔離性在這里是阻力,不是助力。它的運(yùn)行周期長,狀態(tài)管理復(fù)雜,而Docker的"無狀態(tài)"哲學(xué)和AI代理的"有狀態(tài)"需求天然沖突。
裸機(jī)的代價(jià)是部署文檔變長:你得寫清楚Node版本、系統(tǒng)依賴、Chrome安裝步驟。但這是一次性成本。Docker的代價(jià)是持續(xù)的認(rèn)知負(fù)荷:每次奇怪行為都要懷疑"是不是隔離性問題"。
我現(xiàn)在用的Hetzner機(jī)器還是€5/月,4GB內(nèi)存跑OpenClaw+Chrome+一個(gè)小模型,余量充足。Telegram消息發(fā)出去,代理能在10秒內(nèi)開始執(zhí)行網(wǎng)頁操作。
最后一個(gè)細(xì)節(jié):裸機(jī)部署后,我發(fā)現(xiàn)Chrome的內(nèi)存泄漏比容器里更明顯——因?yàn)闆]有cgroups限制它。解決方法是給代理加了個(gè)定時(shí)重啟的cron任務(wù),每周三凌晨執(zhí)行。不優(yōu)雅,但可觀測、可調(diào)試、可修改。這比一個(gè)黑箱容器更符合"個(gè)人AI代理"的控制承諾。
你現(xiàn)在的AI代理跑在什么上?容器、裸機(jī)、還是某個(gè)你還沒完全理解中間層的托管服務(wù)?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.