部署OpenClaw開(kāi)源智能體完整指南)
最近在本地虛擬機(jī)上折騰了一套 CentOS 7 環(huán)境目標(biāo)只有一個(gè)把 OpenClaw 這個(gè)項(xiàng)目社區(qū)里都直接叫它“龍蝦”完完整整跑起來(lái)。從創(chuàng)建虛擬機(jī)、初始化系統(tǒng)、裝依賴到部署項(xiàng)目、配置開(kāi)機(jī)自啟再到最后排查各種奇奇怪怪的報(bào)錯(cuò)整個(gè)過(guò)程我踩了不少坑也理清了不少之前沒(méi)細(xì)想過(guò)的底層邏輯。如果你也準(zhǔn)備在本地 CentOS 7 虛擬機(jī)上部署 OpenClaw 龍蝦項(xiàng)目或者你只是想在電腦里搭一個(gè)干凈的實(shí)驗(yàn)環(huán)境來(lái)跑開(kāi)源 AI 項(xiàng)目這篇過(guò)程記錄應(yīng)該對(duì)你有參考價(jià)值。先說(shuō)結(jié)論安裝本身不難難的是把 CentOS 7 的老底子跟 OpenClaw 需要的現(xiàn)代運(yùn)行環(huán)境揉在一起。下面按我實(shí)際操作的順序把每一步怎么想、怎么做、為什么這么做都寫(xiě)清楚。1. 為什么非得是 CentOS 7 虛擬機(jī)而不是直接裝宿主機(jī)1.1 先搞清楚 OpenClaw 是個(gè)什么項(xiàng)目OpenClaw 是一個(gè)開(kāi)源的可交互智能體項(xiàng)目社區(qū)里叫它“龍蝦”。它跟傳統(tǒng)的靜態(tài)網(wǎng)站或普通 Web 服務(wù)不太一樣更像是一個(gè)“數(shù)字寵物 可編程智能體”的運(yùn)行容器。你可以通過(guò)瀏覽器去管理它、跟它對(duì)話它也能讀取攝像頭、執(zhí)行簡(jiǎn)單自動(dòng)化任務(wù)數(shù)據(jù)默認(rèn)都留在本地環(huán)境里不依賴某個(gè)封閉的云端平臺(tái)。這類(lèi)項(xiàng)目最大的特點(diǎn)就是運(yùn)行環(huán)境比較挑版本Node、Python、數(shù)據(jù)庫(kù)、編譯工具鏈哪個(gè)版本不對(duì)都能給你臉色看。所以部署前一定要先清楚它是什么否則后面遇到報(bào)錯(cuò)都不知道從哪里查起。1.2 虛擬機(jī)的三個(gè)不可替代的好處有人可能會(huì)問(wèn)我把 OpenClaw 直接裝在自己電腦上不行嗎當(dāng)然可以但如果像我一樣有下面幾個(gè)顧慮虛擬機(jī)反而是更穩(wěn)妥的選擇。第一是環(huán)境隔離。OpenClaw 安裝會(huì)帶上一堆依賴包括 Node.js、Python、數(shù)據(jù)庫(kù)、編譯工具等這些依賴很可能跟你平時(shí)開(kāi)發(fā)用的版本沖突。裝在虛擬機(jī)里本質(zhì)上就是給項(xiàng)目單獨(dú)劃了一個(gè)房間玩壞了也不影響宿主機(jī)。第二是快照回滾。我這次部署過(guò)程中至少改了 5 次系統(tǒng)參數(shù)每次大改動(dòng)前我都會(huì)先拍一個(gè)虛擬機(jī)快照。有一次把依賴環(huán)境搞得一團(tuán)糟一個(gè)快照直接還原五分鐘回到改動(dòng)之前的狀態(tài)。這種容錯(cuò)能力是宿主機(jī)直裝給不了的。第三是模擬服務(wù)器環(huán)境。OpenClaw 這類(lèi)項(xiàng)目最終往往是要跑在獨(dú)立的服務(wù)器上的。虛擬機(jī)里的 CentOS 7 沒(méi)有桌面、沒(méi)有日常辦公軟件網(wǎng)絡(luò)配置、防火墻、systemd、權(quán)限管理這些系統(tǒng)級(jí)操作跟真實(shí)服務(wù)器完全一致。你在本地虛擬機(jī)里練熟了后面放到服務(wù)器上部署就是同一套流程。1.3 這篇記錄對(duì)誰(shuí)最有用如果你是下面這幾類(lèi)人這篇文章可以重點(diǎn)看看想在自己的電腦上通過(guò)虛擬機(jī)部署一個(gè)開(kāi)源 AI 項(xiàng)目但是以前沒(méi)怎么碰過(guò) CentOS對(duì) CentOS 7 比較熟悉但第一次遇到需要較新 Node.js 版本的開(kāi)源項(xiàng)目想學(xué)習(xí)一套通用的“虛擬機(jī) Linux 系統(tǒng)初始化 服務(wù)部署”流程O(píng)penClaw 只是一個(gè)載體。如果你對(duì) Linux 命令行完全不熟這篇記錄里的命令也可以直接復(fù)制執(zhí)行。但建議在部署前先搞清楚每個(gè)命令大概在做什么別一路回車(chē)。2. 建虛擬機(jī)與系統(tǒng)初始化一開(kāi)始就理順后面少返工2.1 虛擬機(jī)的資源怎么給4G 內(nèi)存 2 核足夠磁盤(pán)別給太小我用的虛擬機(jī)管理軟件是常見(jiàn)的開(kāi)源方案具體哪款不重要關(guān)鍵是資源分配的思路。OpenClaw 本身不是一個(gè)很吃資源的重型平臺(tái)但在本地跑起來(lái)還需要承載 Node 進(jìn)程和 Web 管理界面資源給太少會(huì)頻繁卡死。我最終分配的規(guī)格如下配置項(xiàng)我給的大小建議范圍原因CPU2 核2~4 核單機(jī)體驗(yàn) 2 核夠并發(fā)任務(wù)多再給 4 核內(nèi)存4 GB4~8 GB4GB 勉強(qiáng)跑建議再加 2GB Swap系統(tǒng)盤(pán)30 GB30 GB 以上項(xiàng)目依賴 數(shù)據(jù)庫(kù) 日志20GB 會(huì)很緊張網(wǎng)絡(luò)模式NATNAT 或橋接NAT 省事橋接適合局域網(wǎng)訪問(wèn)磁盤(pán)我給到 30GB 而不是默認(rèn)的 20GB這一點(diǎn)在后來(lái)幾乎沒(méi)有后悔過(guò)。因?yàn)?npm 的 node_modules 目錄、系統(tǒng)日志、數(shù)據(jù)庫(kù)文件加在一起占空間非???。如果以后還要擴(kuò)展項(xiàng)目插件磁盤(pán)小了還得擴(kuò)容擴(kuò)容比一開(kāi)始給大一點(diǎn)麻煩得多。2.2 安裝 CentOS 7 時(shí)的關(guān)鍵選擇Minimal 版、分區(qū)和網(wǎng)絡(luò)安裝 CentOS 7 的時(shí)候軟件站建議選擇“最小化安裝”Minimal。帶圖形界面的版本會(huì)裝一堆我們用不到的組件既占磁盤(pán)又增加安全暴露面。我們跑的是服務(wù)型項(xiàng)目命令行足夠。有兩點(diǎn)特別提醒一下一是網(wǎng)絡(luò)配置。安裝過(guò)程中會(huì)問(wèn)你是否啟用網(wǎng)絡(luò)連接。很多人安裝的時(shí)候沒(méi)勾選進(jìn)入系統(tǒng)發(fā)現(xiàn)curl都執(zhí)行不了還要重新配網(wǎng)卡非常繞。建議在安裝向?qū)Ю锞痛蜷_(kāi)網(wǎng)絡(luò)自動(dòng)連接進(jìn)入系統(tǒng)后用ip addr確認(rèn) IP。二是分區(qū)方案。對(duì)于 30GB 的磁盤(pán)直接用“自動(dòng)分區(qū)”即可沒(méi)有必要手動(dòng)拆 /home 和 / 目錄。后期如果系統(tǒng)盤(pán)不夠用再考慮擴(kuò)容或者掛數(shù)據(jù)盤(pán)。沒(méi)必要在分區(qū)上花太多時(shí)間。安裝完成后進(jìn)入系統(tǒng)第一步是確認(rèn)網(wǎng)絡(luò)通不通ip addr ping -c 3 www.baidu.com如果 ping 不通大概率是網(wǎng)卡沒(méi)有自動(dòng)開(kāi)啟需要去/etc/sysconfig/network-scripts/下檢查網(wǎng)卡配置文件里的ONBOOTyes。這一步是新手最容易卡住的地方。2.3 系統(tǒng)初始化里的“老三樣”換源、裝基礎(chǔ)工具、時(shí)區(qū)同步CentOS 7 官方源已經(jīng)進(jìn)入維護(hù)階段默認(rèn)源的下載速度也不穩(wěn)定。我安裝完成后第一個(gè)動(dòng)作就是切換到國(guó)內(nèi)常用的公共軟件源鏡像這一步能節(jié)省后面大量等待時(shí)間。具體做法是把/etc/yum.repos.d/下的源地址替換為鏡像站地址不同鏡像站的路徑略有區(qū)別建議去對(duì)應(yīng)鏡像站主頁(yè)復(fù)制具體配置。換完源之后執(zhí)行yum clean all yum makecache yum update -yyum update會(huì)把系統(tǒng)已有的軟件包升級(jí)到當(dāng)前源里的最新版本這個(gè)過(guò)程可能要幾分鐘耐心等完。然后安裝基礎(chǔ)工具yum install -y vim wget curl tar git unzip這些工具后面每個(gè)都會(huì)用到vim改配置文件curl測(cè)試接口git拉取項(xiàng)目源碼tar和unzip解壓二進(jìn)制包。2.4 SELinux 和防火墻的策略先放行而不是直接關(guān)閉很多教程一上來(lái)就讓你setenforce 0和systemctl stop firewalld我這次沒(méi)有完全照做而是選擇了更保守的策略SELinux 臨時(shí)關(guān)閉防火墻保留只放行需要的端口。為什么這樣做SELinux 和防火墻是系統(tǒng)自帶的防護(hù)機(jī)制直接關(guān)閉確實(shí)省事但如果你后面要把這套流程遷移到服務(wù)器上關(guān)掉防火墻基本等于裸奔。正確做法是先搞清楚項(xiàng)目需要哪些端口然后只放行這些端口。OpenClaw 默認(rèn)跑在 8080 端口所以我提前用系統(tǒng)防火墻放行了firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reloadSELinux 我只用setenforce 0臨時(shí)關(guān)閉了當(dāng)前會(huì)話的強(qiáng)制模式?jīng)]有寫(xiě)死在配置文件里。因?yàn)?CentOS 7 里 SELinux 對(duì)非標(biāo)準(zhǔn)端口的訪問(wèn)限制偶爾會(huì)把服務(wù)搞掛先臨時(shí)關(guān)掉定位問(wèn)題后面穩(wěn)定了再針對(duì)性放開(kāi)而不是一關(guān)了之。2.5 時(shí)區(qū)與時(shí)間同步一個(gè)小細(xì)節(jié)卻會(huì)影響日志排查最后別忘了設(shè)置時(shí)區(qū)timedatectl set-timezone Asia/Shanghai timedatectl status這個(gè)操作很多人忽略。如果時(shí)區(qū)不對(duì)日志里的時(shí)間全是 UTC跟本地時(shí)間差 8 個(gè)小時(shí)。平時(shí)沒(méi)什么感覺(jué)一旦出問(wèn)題要對(duì)著日志排查滿屏的時(shí)間對(duì)不上會(huì)讓你非常難受。3. 依賴安裝里的版本陷阱Node、Python 和數(shù)據(jù)庫(kù)怎么搭配3.1 Node.js 版本CentOS 7 自帶源里幾乎沒(méi)有用 nvm 最省心整個(gè)安裝過(guò)程里Node.js 是最大的一個(gè)坎。CentOS 7 的默認(rèn)軟件源里根本沒(méi)有 Node.js 20即使裝了 EPEL 擴(kuò)展源里面的版本也對(duì) OpenClaw 來(lái)說(shuō)太老了。而 OpenClaw 這類(lèi)項(xiàng)目在運(yùn)行時(shí)會(huì)用到比較新的 JavaScript 語(yǔ)法和 API對(duì) Node.js 的版本要求很明確。直接用系統(tǒng)包管理去裝幾乎必然翻車(chē)。我最后用 nvmNode Version Manager來(lái)管理 Node.js 版本。原因很簡(jiǎn)單nvm 可以安裝多個(gè) Node 版本隨時(shí)切換不影響系統(tǒng)全局環(huán)境。將來(lái)如果 OpenClaw 升級(jí)了要求 Node 版本變更換一個(gè)版本就行不需要重新折騰系統(tǒng)。安裝 nvm 的過(guò)程不復(fù)雜從 nvm 官方倉(cāng)庫(kù)獲取安裝腳本然后執(zhí)行。具體命令里的安裝腳本地址請(qǐng)以官方頁(yè)面為準(zhǔn)不要隨便復(fù)制來(lái)路不明的腳本。裝完之后重新加載 shell 配置source ~/.bashrc然后用 nvm 安裝 Node.js 20 LTS 版本nvm install 20 nvm use 20 node -v npm -v我選 Node 20 而不是更新的版本是為了兼容性和穩(wěn)定性。CentOS 7 的底層運(yùn)行庫(kù)整體偏老新版 Node.js 往往依賴更新的 glibc 版本裝了也可能跑不起來(lái)。關(guān)于這個(gè)問(wèn)題后面“實(shí)測(cè)中遇到的坑”里我會(huì)詳細(xì)說(shuō)。3.2 編譯工具鏈很多失敗其實(shí)卡在這里OpenClaw 的 npm 依賴?yán)锇恍┬枰幾g的原生模塊。當(dāng)時(shí)我沒(méi)有提前安裝編譯工具鏈結(jié)果npm install跑到一半直接報(bào)錯(cuò)錯(cuò)誤信息里全是gyp ERR!一看就是 node-gyp 找不到 C/C 編譯器。解決辦法也很直接安裝一組基礎(chǔ)編譯工具和 Python 環(huán)境yum groupinstall -y Development Tools yum install -y python3groupinstall Development Tools會(huì)一次性裝上gcc、g、make等一大組編譯器工具。python3 也是部分 npm 模塊構(gòu)建流程里需要的。這個(gè)坑其實(shí)可以完全避免。以后裝任何 Node 項(xiàng)目第一步把編譯工具裝好省得后面報(bào)錯(cuò)再回頭補(bǔ)。特別是 CentOS 7 這種老系統(tǒng)缺少這些工具的后果會(huì)在安裝后期集中爆發(fā)。3.3 數(shù)據(jù)庫(kù)選擇先看項(xiàng)目要求單機(jī)場(chǎng)景從輕量方案開(kāi)始OpenClaw 本身支持多種數(shù)據(jù)存儲(chǔ)方式我這次選擇的是輕量級(jí)文件型數(shù)據(jù)庫(kù)而不是傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)。為什么因?yàn)槲以诒镜靥摂M機(jī)上跑單用戶、低并發(fā)用輕量級(jí)數(shù)據(jù)庫(kù)完全夠用配置簡(jiǎn)單不用單獨(dú)部署一個(gè)數(shù)據(jù)庫(kù)服務(wù)進(jìn)程。如果你在服務(wù)器上部署或者打算多人同時(shí)使用那就需要按項(xiàng)目文檔切換到更正式的關(guān)系型數(shù)據(jù)庫(kù)。這一點(diǎn)我建議先看官方文檔里關(guān)于數(shù)據(jù)庫(kù)配置的說(shuō)明再?zèng)Q定怎么選不要憑感覺(jué)。數(shù)據(jù)庫(kù)裝完后如果遇到數(shù)據(jù)庫(kù)文件無(wú)法寫(xiě)入的報(bào)錯(cuò)大部分情況不是配置錯(cuò)了而是運(yùn)行用戶對(duì)數(shù)據(jù)庫(kù)目錄沒(méi)有寫(xiě)權(quán)限。后面排查部分我會(huì)具體講。3.4 裝完后怎么驗(yàn)證依賴環(huán)境依賴裝完之后不要急著拉項(xiàng)目代碼先做一次完整的版本確認(rèn)node -v npm -v python3 --version gcc --version | head -n 1 make --version | head -n 1這四個(gè)輸出都正常說(shuō)明核心依賴已經(jīng)齊了。版本確認(rèn)這一步幫我排除掉了很多后續(xù)可能出現(xiàn)的問(wèn)題。比如我后來(lái)看日志時(shí)發(fā)現(xiàn)有個(gè)報(bào)錯(cuò)跟 Python 版本相關(guān)一查才發(fā)現(xiàn)系統(tǒng)默認(rèn) Python 還是 2.7而我需要用 Python 3 來(lái)執(zhí)行某個(gè)構(gòu)建腳本。提前確認(rèn)這些信息能讓你在排查問(wèn)題時(shí)節(jié)省大量時(shí)間。4. 部署 OpenClaw 主體從拉源碼到第一次看到 Web 界面4.1 獲取源碼固定版本比追最新分支穩(wěn)依賴環(huán)境準(zhǔn)備好之后我進(jìn)入/opt目錄創(chuàng)建了一個(gè)專(zhuān)門(mén)的項(xiàng)目目錄cd /opt git clone OpenClaw官方倉(cāng)庫(kù)地址 openclaw cd openclaw這里有個(gè)建議先切到官方發(fā)布的穩(wěn)定版本標(biāo)簽而不是直接用最新主干分支。主干分支一般更新頻繁可能引入新的問(wèn)題穩(wěn)定版本是經(jīng)過(guò)測(cè)試的裝起來(lái)風(fēng)險(xiǎn)小。git tag git checkout v0.x.x我這么做的原因是吃過(guò)虧。之前用某個(gè)開(kāi)源項(xiàng)目直接拉的最新代碼結(jié)果啟動(dòng)都做不到查了半天發(fā)現(xiàn)是上游依賴還沒(méi)適配新版本。這次先切到穩(wěn)定版后面一切順利多了。4.2 安裝項(xiàng)目依賴npm 鏡像源的選擇與踩坑這一步是等待時(shí)間最長(zhǎng)的階段。npm installOpenClaw 的依賴很多npm 默認(rèn)源在本地網(wǎng)絡(luò)環(huán)境下速度不穩(wěn)定。我選擇臨時(shí)把 npm 源切換到國(guó)內(nèi)公共鏡像源裝完再切回默認(rèn)npm config set registry 國(guó)內(nèi)公共鏡像源地址 npm install npm config set registry https://registry.npmjs.org/這里有一個(gè)很多人會(huì)忽略的問(wèn)題npm install如果中途失敗不要直接重跑同一個(gè)命令因?yàn)闅埩舻?node_modules 可能會(huì)包含半截文件。建議先把失敗的 node_modules 目錄刪掉再重新安裝rm -rf node_modules npm installnpm 源切換不會(huì)影響項(xiàng)目本身但確實(shí)能解決很多因網(wǎng)絡(luò)下載慢導(dǎo)致的超時(shí)問(wèn)題。安裝完成后可以用ls node_modules | wc -l快速看看依賴數(shù)量是否近似官方要求。4.3 配置 .env 環(huán)境變量端口、賬號(hào)、存儲(chǔ)路徑OpenClaw 的配置主要是通過(guò)項(xiàng)目根目錄下的.env文件完成的。安裝目錄里有.env.example之類(lèi)的模板文件復(fù)制一份再改cp .env.example .env vim .env我這次主要改了這幾項(xiàng)PORT8080 DATA_DIR./data LOG_LEVELinfo每一項(xiàng)我簡(jiǎn)單說(shuō)一下為什么這么配PORT我特意選了 8080而不是更常見(jiàn)的 80 或 3000。80 端口需要 root 權(quán)限CentOS 7 上還可能被其他服務(wù)占用3000 是很多開(kāi)發(fā)工具的默認(rèn)端口容易沖突。8080 比較獨(dú)立。DATA_DIR默認(rèn)放在項(xiàng)目目錄里的./data所有運(yùn)行時(shí)數(shù)據(jù)都存在這里。如果你希望數(shù)據(jù)放在單獨(dú)的數(shù)據(jù)盤(pán)可以改成絕對(duì)路徑。LOG_LEVEL我一開(kāi)始設(shè)成debug方便看啟動(dòng)過(guò)程最后又改回info避免日志刷屏。如果是首次安裝可能還需要配置一個(gè)默認(rèn)管理員用戶名和密碼。這個(gè)字段根據(jù)你的版本可能會(huì)不同參照模板注釋填就行。不要用太簡(jiǎn)單的密碼因?yàn)檫@個(gè)服務(wù)會(huì)監(jiān)聽(tīng)在局域網(wǎng)接口上。4.4 第一次啟動(dòng)看日志理解整個(gè)初始化流程配置好后我先用前臺(tái)方式啟動(dòng)服務(wù)目的是直觀地看日志輸出npm run start第一次啟動(dòng)時(shí)你會(huì)看到日志里依次出現(xiàn)初始化流程加載項(xiàng)目配置、連接并初始化數(shù)據(jù)庫(kù)、創(chuàng)建默認(rèn)數(shù)據(jù)表、注冊(cè)內(nèi)置組件、啟動(dòng) HTTP 服務(wù)最后打印出 Web 訪問(wèn)地址。這個(gè)過(guò)程之所以值得完整看完是因?yàn)橐坏┖竺娴牟襟E出現(xiàn)問(wèn)題你至少知道正常狀態(tài)應(yīng)該長(zhǎng)什么樣。很多人在部署時(shí)日志都不看出問(wèn)題直接滿頭霧水。啟動(dòng)日志里出現(xiàn)類(lèi)似http server running on port 8080的信息就說(shuō)明服務(wù)已經(jīng)起來(lái)了。此時(shí)在瀏覽器輸入http://虛擬機(jī)IP:8080就能看到 OpenClaw 的 Web 登錄頁(yè)面。4.5 備選容器化部署方式也值得知道如果你實(shí)在不想折騰 Node 版本和編譯工具鏈OpenClaw 也提供容器化的部署方式。理論上只要裝好容器運(yùn)行環(huán)境然后拉取官方鏡像并啟動(dòng)即可依賴全在鏡像里跟宿主機(jī)環(huán)境隔離省掉了很多版本兼容的工作。但我最后還是選擇了源碼方式部署。原因有兩個(gè)一是 CentOS 7 本身的容器工具鏈同樣依賴較新的系統(tǒng)組件裝起來(lái)也不輕松二是我后續(xù)要直接改項(xiàng)目代碼源碼部署調(diào)試更直接。如果你只是使用而不用改代碼容器化確實(shí)更省心。5. 讓服務(wù)在系統(tǒng)里“住下來(lái)”網(wǎng)絡(luò)、自啟和日志5.1 宿主機(jī)如何訪問(wèn)虛擬機(jī)里的 Web 服務(wù)服務(wù)啟動(dòng)后宿主機(jī)要訪問(wèn)虛擬機(jī)里的頁(yè)面需要先知道虛擬機(jī)的 IP 地址ip addr找到ens33或類(lèi)似網(wǎng)卡上的 IPv4 地址然后在瀏覽器上輸入http://IP:8080。如果你的虛擬機(jī)是 NAT 網(wǎng)絡(luò)模式宿主機(jī)訪問(wèn)沒(méi)有問(wèn)題如果需要局域網(wǎng)里的其他設(shè)備訪問(wèn)就得把虛擬機(jī)改成橋接模式并且確保防火墻放行了 8080 端口。這也是我前面不直接關(guān)閉防火墻的原因。5.2 用 systemd 管理 OpenClaw 進(jìn)程前臺(tái)啟動(dòng)只是臨時(shí)跑的關(guān)閉終端服務(wù)就沒(méi)了。為了讓 OpenClaw 在系統(tǒng)重啟后自動(dòng)運(yùn)行我為它寫(xiě)了一個(gè) systemd 服務(wù)文件這是 CentOS 7 上最標(biāo)準(zhǔn)的“開(kāi)機(jī)自啟 后臺(tái)守護(hù)”方案。在/etc/systemd/system/openclaw.service里寫(xiě)入[Unit] DescriptionOpenClaw Service Afternetwork.target [Service] Typesimple Usercent WorkingDirectory/opt/openclaw EnvironmentFile/opt/openclaw/.env ExecStart/home/cent/.nvm/versions/node/v20.14.0/bin/npm run start Restarton-failure RestartSec5 [Install] WantedBymulti-user.target然后執(zhí)行systemctl daemon-reload systemctl enable openclaw systemctl start openclaw systemctl status openclaw寫(xiě)服務(wù)文件時(shí)有幾個(gè)細(xì)節(jié)User指定運(yùn)行服務(wù)的用戶我用的是普通用戶cent不會(huì)用 root。用 root 跑服務(wù)風(fēng)險(xiǎn)大而且項(xiàng)目?jī)?nèi)的一些安全判斷可能受影響。ExecStart必須是絕對(duì)路徑。因?yàn)?systemd 啟動(dòng)時(shí)不會(huì)加載用戶的.bashrc如果你直接寫(xiě)npm run start它會(huì)提示找不到命令。這里路徑需要替換成which npm實(shí)際輸出的路徑。WorkingDirectory要設(shè)置成項(xiàng)目根目錄否則 .env 和 data 目錄的路徑都會(huì)錯(cuò)亂。5.3 日志管理與簡(jiǎn)單監(jiān)控服務(wù)交給 systemd 之后查看日志變得很方便journalctl -u openclaw -f-f表示持續(xù)跟蹤日志跟tail -f效果類(lèi)似。平時(shí)不需要一直開(kāi)著出問(wèn)題時(shí)再看。journald 默認(rèn)日志會(huì)一直累積CentOS 7 上如果不清理/var 分區(qū)可能會(huì)被日志占滿。我加了一行定期清理配置讓系統(tǒng)只保留近 3 天的日志journalctl --vacuum-time3d可以把這個(gè)命令放進(jìn) weekly 的 cron 任務(wù)里或者直接在/etc/systemd/journald.conf設(shè)置SystemMaxUse200M。5.4 內(nèi)存不夠時(shí)怎么救急Swap 與參數(shù)調(diào)整4GB 內(nèi)存跑起 OpenClaw 后我觀察到一個(gè)現(xiàn)象單純跑服務(wù)沒(méi)問(wèn)題但如果 Web 界面里加載了較重的模型或執(zhí)行較復(fù)雜的任務(wù)內(nèi)存會(huì)迅速飆高甚至觸發(fā)系統(tǒng) OOM。我給虛擬機(jī)加了一個(gè) 2GB 的 Swap 交換文件作為兜底dd if/dev/zero of/swapfile bs1M count2048 chmod 600 /swapfile mkswap /swapfile swapon /swapfile這樣配置的優(yōu)勢(shì)很明顯平時(shí)內(nèi)存夠用Swap 基本不參與遇到短時(shí)間內(nèi)存峰值時(shí)它能把進(jìn)程從“被殺”邊緣拉回來(lái)。缺點(diǎn)我也清楚Swap 本質(zhì)是用磁盤(pán)當(dāng)內(nèi)存性能遠(yuǎn)不如物理內(nèi)存只能救急不能當(dāng)長(zhǎng)期方案。有條件的話內(nèi)存加到 8GB 是更徹底的做法。6. 實(shí)測(cè)中遇到的五類(lèi)報(bào)錯(cuò)與完整排查思路6.1 端口被占用EADDRINUSE第一次啟動(dòng)的時(shí)候服務(wù)報(bào)了EADDRINUSE: address already in use :::8080。這個(gè)報(bào)錯(cuò)很直接就是端口已經(jīng)被別的進(jìn)程占了。我用ss -lntp查了一下發(fā)現(xiàn)確實(shí)有一個(gè)舊服務(wù)的殘留進(jìn)程占用了 8080 端口。解決方式很簡(jiǎn)單要么停掉舊進(jìn)程要么換一個(gè)端口。我最后在 .env 里把端口改成了 8081避免影響其他服務(wù)。這類(lèi)問(wèn)題的高頻來(lái)源是之前調(diào)試的時(shí)候用CtrlC中斷服務(wù)不徹底或者同一個(gè)端口被多個(gè)應(yīng)用復(fù)用。6.2 node-gyp 編譯失敗一堆 gyp ERRnpm install過(guò)程中報(bào)錯(cuò)信息里全是gyp ERR!的堆棧核心原因就是我前面提過(guò)的系統(tǒng)缺少編譯工具鏈。排查過(guò)程是這樣的先看完整的錯(cuò)誤日志發(fā)現(xiàn)卡在某個(gè)原生模塊的安裝步驟上然后根據(jù)提示找到“python”和“make”相關(guān)字樣用which make發(fā)現(xiàn)根本沒(méi)有這個(gè)命令才定位到是編譯工具缺失。修復(fù)方法是執(zhí)行yum groupinstall -y Development Tools然后刪掉 node_modules 重新安裝。這里我特意把“先刪再裝”再?gòu)?qiáng)調(diào)一次直接重跑npm install不一定會(huì)成功殘留的半成品文件會(huì)讓報(bào)錯(cuò)信息變得非?;靵y。6.3 數(shù)據(jù)庫(kù)目錄權(quán)限導(dǎo)致的啟動(dòng)失敗還有一次啟動(dòng)后服務(wù)立刻退出查看日志里面寫(xiě)著打開(kāi)數(shù)據(jù)庫(kù)文件失敗錯(cuò)誤碼類(lèi)似SQLITE_CANTOPEN。這不是配置錯(cuò)了而是運(yùn)行進(jìn)程沒(méi)有寫(xiě)入數(shù)據(jù)庫(kù)文件的權(quán)限。OpenClaw 的運(yùn)行用戶是cent但/opt/openclaw/data目錄的屬主是 root導(dǎo)致進(jìn)程無(wú)法創(chuàng)建或?qū)懭霐?shù)據(jù)文件。修復(fù)命令chown -R cent:cent /opt/openclaw/data這個(gè)問(wèn)題在源碼部署方式下很常見(jiàn)尤其是用 root 執(zhí)行過(guò)npm run start之后數(shù)據(jù)目錄會(huì)變成 root 屬主再用普通用戶啟動(dòng)就會(huì)報(bào)權(quán)限錯(cuò)誤。6.4 glibc 版本太老導(dǎo)致的 SyntaxError這是我這次部署里最典型的“新版軟件 老系統(tǒng)”沖突。我一開(kāi)始想用較新的 Node.js 長(zhǎng)期支持版本結(jié)果執(zhí)行node -v直接報(bào)/usr/lib64/libstdc.so.6: version GLIBCXX_3.4.20 not found。這類(lèi)錯(cuò)誤從字面看是缺少某個(gè)動(dòng)態(tài)庫(kù)符號(hào)實(shí)際原因很明確系統(tǒng)底層標(biāo)準(zhǔn)庫(kù)版本太老支撐不了新版 Node。我沒(méi)法為了一個(gè) Node 版本去重裝整個(gè)系統(tǒng)的底層庫(kù)那風(fēng)險(xiǎn)太大。最終的解決方案是用 nvm 切換到稍微舊一點(diǎn)、但同樣滿足 OpenClaw 要求的 Node 版本并驗(yàn)證項(xiàng)目自帶的啟動(dòng)腳本能正常運(yùn)行。如果你的項(xiàng)目對(duì) Node 版本要求特別高那 CentOS 7 可能真的不合適要么升級(jí)系統(tǒng)要么走容器化部署。6.5 常見(jiàn)問(wèn)題速查表報(bào)錯(cuò)或現(xiàn)象常見(jiàn)原因快速處理EADDRINUSE端口被占用ss -lntp查占用改 .env 端口gyp ERR! / make not found缺少編譯工具鏈y(cè)um groupinstall -y Development Tools數(shù)據(jù)庫(kù)文件打開(kāi)失敗數(shù)據(jù)目錄權(quán)限不足chown -R 運(yùn)行用戶:運(yùn)行用戶 數(shù)據(jù)目錄GLIBCXX_3.4.20 not found系統(tǒng)庫(kù)太老nvm 切換到較低版本 Node或換系統(tǒng)服務(wù)啟動(dòng)立刻退出配置字段填錯(cuò)先看 journalctl 日志再檢查 .env首次登錄頁(yè)面加載慢模型或組件初始化中等待日志輸出就緒信息再刷新最后說(shuō)一點(diǎn)個(gè)人體會(huì)。整個(gè)流程走下來(lái)真正花時(shí)間的不是“安裝 OpenClaw”這件事本身而是處理 CentOS 7 與新版運(yùn)行環(huán)境之間的兼容摩擦。如果你也準(zhǔn)備在類(lèi)似的舊系統(tǒng)上部署新項(xiàng)目我建議你第一次操作前先把項(xiàng)目文檔里的系統(tǒng)要求完整讀一遍再?zèng)Q定用什么系統(tǒng)、裝什么版本而不是像我一樣被報(bào)錯(cuò)推著走。每做完一個(gè)大步驟比如初始化系統(tǒng)、裝好依賴、部署成功都記得拍一個(gè)快照。一個(gè)能隨時(shí)回退的快照比任何操作技巧都讓人安心。