器源碼部署DeepSeek Harness Web全流程指南)
1. 項(xiàng)目緣起與整體思路拆解1.1 為什么要在 Linux 服務(wù)器上源碼部署 DeepSeek Harness Web把 DeepSeek Harness Web 跑在 Linux 服務(wù)器上最直接的動(dòng)機(jī)就是擺脫本地環(huán)境的束縛。我最早是在自己的筆記本上跑這套東西模型加載慢、內(nèi)存吃緊、一關(guān)機(jī)服務(wù)就斷團(tuán)隊(duì)里其他人想用還得把機(jī)器搬過(guò)去。后來(lái)?yè)Q成在 Linux 服務(wù)器上源碼部署才算真正把這件事做成了“服務(wù)”而不是“玩具”。DeepSeek Harness Web 本質(zhì)上是一個(gè)面向大模型交互的 Web 前端加后端調(diào)度層它負(fù)責(zé)把用戶的請(qǐng)求轉(zhuǎn)發(fā)給底層模型、管理會(huì)話上下文、處理流式輸出再通過(guò)瀏覽器呈現(xiàn)出來(lái)。源碼部署意味著你不是拉一個(gè)現(xiàn)成鏡像跑起來(lái)就完事而是從代碼倉(cāng)庫(kù)克隆、裝依賴、配環(huán)境、編譯、啟動(dòng)、托管每一步都自己掌控。這樣做的好處很實(shí)在版本可控、參數(shù)可調(diào)、出問(wèn)題能定位到具體代碼行而不是對(duì)著一個(gè)黑盒容器干瞪眼。適合讀這篇內(nèi)容的人我大致分三類。第一類是有一定 Linux 基礎(chǔ)但沒(méi)做過(guò)完整 Web 服務(wù)部署的開(kāi)發(fā)者想拿一個(gè)真實(shí)項(xiàng)目練手第二類是手里有服務(wù)器資源、想把 AI 能力私有化的團(tuán)隊(duì)技術(shù)負(fù)責(zé)人第三類是運(yùn)維方向的同學(xué)想搞清楚一個(gè) Python Web 服務(wù)從源碼到 systemd 托管的完整鏈路。不管你屬于哪一類只要跟著走一遍這套流程可以復(fù)用到絕大多數(shù)同類 Web 服務(wù)上。1.2 整體部署鏈路的設(shè)計(jì)考量我把整個(gè)部署拆成六個(gè)階段環(huán)境準(zhǔn)備、源碼獲取、依賴安裝、配置調(diào)優(yōu)、服務(wù)啟動(dòng)、遠(yuǎn)程訪問(wèn)。這個(gè)順序不是隨便排的每一步都為下一步鋪路跳步一定會(huì)出問(wèn)題。環(huán)境準(zhǔn)備階段要解決的是“地基”問(wèn)題。Linux 發(fā)行版的選擇、Python 版本、系統(tǒng)級(jí)依賴庫(kù)這些如果一開(kāi)始沒(méi)弄對(duì)后面裝依賴時(shí)會(huì)報(bào)一堆莫名其妙的錯(cuò)。我見(jiàn)過(guò)太多人上來(lái)就git clone結(jié)果卡在pip install的編譯錯(cuò)誤上回頭才發(fā)現(xiàn)是缺了python3-dev或者gcc。源碼獲取階段看似簡(jiǎn)單但分支選擇、版本鎖定有講究。直接拉 main 分支跑生產(chǎn)是個(gè)壞習(xí)慣因?yàn)樯嫌坞S時(shí)可能推入不兼容的改動(dòng)。我的做法是鎖定一個(gè)經(jīng)過(guò)驗(yàn)證的 tag 或 commit這樣即使上游更新了你的服務(wù)也不會(huì)因?yàn)橐淮蝕it pull就崩掉。依賴安裝是最容易踩坑的環(huán)節(jié)。Python 項(xiàng)目的依賴分兩類純 Python 包和需要編譯的包。前者pip直接搞定后者依賴系統(tǒng)級(jí)的編譯工具鏈和開(kāi)發(fā)頭文件。用虛擬環(huán)境隔離是必須的否則系統(tǒng) Python 環(huán)境被污染后面想清理都難。配置調(diào)優(yōu)決定了服務(wù)能不能穩(wěn)定跑。端口、監(jiān)聽(tīng)地址、模型路徑、并發(fā)數(shù)、日志級(jí)別這些參數(shù)要根據(jù)服務(wù)器的實(shí)際配置來(lái)定。一臺(tái) 2 核 4G 的機(jī)器和一臺(tái) 16 核 64G 的機(jī)器配置思路完全不同。服務(wù)啟動(dòng)和遠(yuǎn)程訪問(wèn)是最后一公里。用nohup或screen跑服務(wù)是臨時(shí)方案真正要長(zhǎng)期穩(wěn)定運(yùn)行必須交給systemd托管。遠(yuǎn)程訪問(wèn)則涉及監(jiān)聽(tīng)地址、防火墻、反向代理幾個(gè)層面任何一個(gè)沒(méi)配對(duì)都會(huì)出現(xiàn)“本地能訪問(wèn)、遠(yuǎn)程連不上”的經(jīng)典問(wèn)題。提示整個(gè)鏈路的核心原則是“每一步都可驗(yàn)證”。裝完依賴先驗(yàn)證 Python 能不能 import配完服務(wù)先本地 curl 一下確認(rèn)無(wú)誤再往下走。不要一口氣全配完再調(diào)試那樣出問(wèn)題你根本不知道是哪一步的鍋。2. 環(huán)境準(zhǔn)備與系統(tǒng)級(jí)依賴配置2.1 Linux 發(fā)行版與基礎(chǔ)環(huán)境選擇發(fā)行版這塊我推薦Ubuntu 22.04 LTS 或 Debian 12。原因很實(shí)際軟件源里的 Python 版本夠新、systemd 成熟穩(wěn)定、社區(qū)文檔豐富遇到問(wèn)題搜一下基本都有答案。國(guó)產(chǎn) Linux 發(fā)行版現(xiàn)在也做得不錯(cuò)如果你所在的環(huán)境有國(guó)產(chǎn)化要求主流發(fā)行版同樣能跑通這套流程包管理命令換成對(duì)應(yīng)的即可。服務(wù)器配置方面純跑 Web 調(diào)度層的話2 核 4G 起步。但如果模型也部署在同一臺(tái)機(jī)器上那內(nèi)存就是大頭7B 級(jí)別的模型量化后大概需要 6 到 8G 顯存或內(nèi)存得按模型規(guī)模往上加。磁盤至少留 50G因?yàn)槟P臀募?、依賴包、日志加起?lái)很占空間。系統(tǒng)裝好后第一件事是更新軟件源并升級(jí)已有包sudo apt update sudo apt upgrade -y然后裝一批基礎(chǔ)工具這些在后面各個(gè)環(huán)節(jié)都會(huì)用到sudo apt install -y git curl wget vim build-essential python3-dev python3-pip python3-venv這里逐個(gè)說(shuō)下為什么需要它們。build-essential提供了gcc、make等編譯工具很多 Python 包在安裝時(shí)要現(xiàn)場(chǎng)編譯 C 擴(kuò)展python3-dev提供 Python 頭文件沒(méi)有它編譯擴(kuò)展會(huì)報(bào)Python.h: No such file or directorypython3-venv用來(lái)創(chuàng)建虛擬環(huán)境。這幾個(gè)是重災(zāi)區(qū)缺一個(gè)都會(huì)在裝依賴時(shí)卡住。2.2 Python 版本管理與虛擬環(huán)境隔離DeepSeek Harness Web 一般要求Python 3.10 及以上。先確認(rèn)系統(tǒng)自帶的版本python3 --version如果版本低于 3.10有兩個(gè)選擇一是用deadsnakes源裝新版 Python二是用pyenv管理多版本。我傾向于后者因?yàn)閜yenv不污染系統(tǒng)環(huán)境切換版本也方便。裝pyenv的流程curl https://pyenv.run | bash然后把下面幾行加到~/.bashrc末尾export PYENV_ROOT$HOME/.pyenv export PATH$PYENV_ROOT/bin:$PATH eval $(pyenv init -)重新加載配置后裝目標(biāo)版本source ~/.bashrc pyenv install 3.11.9虛擬環(huán)境是隔離依賴的關(guān)鍵。我習(xí)慣在項(xiàng)目目錄下創(chuàng)建cd /opt/deepseek-harness-web python3 -m venv venv source venv/bin/activate激活后命令行前面會(huì)出現(xiàn)(venv)標(biāo)識(shí)之后所有pip install都裝在這個(gè)環(huán)境里不會(huì)影響系統(tǒng) Python。這一步看著簡(jiǎn)單但它是后面所有依賴管理的基礎(chǔ)千萬(wàn)別圖省事跳過(guò)。注意虛擬環(huán)境不要建在/tmp或家目錄下隨意位置建議放在項(xiàng)目根目錄或/opt下固定路徑。因?yàn)?systemd 服務(wù)配置里要寫死虛擬環(huán)境的 Python 路徑路徑變了服務(wù)就起不來(lái)。2.3 系統(tǒng)級(jí)依賴與常見(jiàn)缺失庫(kù)排查除了編譯工具鏈還有一些運(yùn)行時(shí)的系統(tǒng)庫(kù)容易漏。比如處理圖像、音視頻的包會(huì)依賴libgl1、libglib2.0-0涉及 SSL 的會(huì)依賴libssl-dev處理壓縮包的會(huì)用到libbz2-dev、liblzma-dev。一次性裝齊省得后面反復(fù)折騰sudo apt install -y libgl1 libglib2.0-0 libssl-dev libbz2-dev liblzma-dev libffi-dev libsqlite3-dev zlib1g-dev我踩過(guò)的一個(gè)典型坑是pip install某個(gè)包時(shí)報(bào)error: command gcc failed翻上去看真正的錯(cuò)誤是fatal error: ffi.h: No such file or directory這就是缺libffi-dev。所以看 pip 報(bào)錯(cuò)要往上翻最后一行往往只是“編譯失敗”這個(gè)結(jié)果真正的原因在中間。還有一個(gè)高頻問(wèn)題是pip版本太老導(dǎo)致裝包失敗。先升級(jí)pip install --upgrade pip setuptools wheelwheel很重要有它才能優(yōu)先用預(yù)編譯的二進(jìn)制包避免大量現(xiàn)場(chǎng)編譯裝依賴速度能快好幾倍。3. 源碼獲取與依賴安裝實(shí)操3.1 克隆源碼與版本鎖定策略拿到源碼倉(cāng)庫(kù)地址后先克隆下來(lái)cd /opt sudo git clone https://github.com/your-org/deepseek-harness-web.git sudo chown -R $USER:$USER /opt/deepseek-harness-webchown這步別省否則后面在項(xiàng)目目錄里操作會(huì)因?yàn)闄?quán)限問(wèn)題各種報(bào)錯(cuò)??寺⊥赀M(jìn)目錄看下有哪些分支和 tagcd /opt/deepseek-harness-web git tag -l git branch -a我的習(xí)慣是鎖定一個(gè) release tag而不是跟著 main 分支跑git checkout v1.2.0為什么這么做因?yàn)?main 分支是開(kāi)發(fā)中的代碼可能今天能跑明天就崩。tag 是發(fā)布節(jié)點(diǎn)相對(duì)穩(wěn)定。如果你確實(shí)需要某個(gè)還沒(méi)發(fā)布的功能那就鎖定到具體的 commit hash效果一樣。鎖定版本后把當(dāng)前 commit 記下來(lái)方便以后回溯git rev-parse HEAD3.2 依賴清單解析與安裝順序Python 項(xiàng)目的依賴清單通常是requirements.txt或pyproject.toml。先看一眼里面有什么cat requirements.txt依賴安裝有個(gè)順序技巧先裝那些需要編譯的重包再裝純 Python 的輕包。因?yàn)橹匕幾g時(shí)間長(zhǎng)如果放在后面前面裝了一堆輕包結(jié)果重包編譯失敗前面的都白裝了。不過(guò)實(shí)際操作中pip會(huì)自己處理依賴順序我們更該關(guān)注的是分批安裝便于定位問(wèn)題。我的做法是先裝核心框架類依賴比如 Web 框架、異步庫(kù)pip install fastapi uvicorn再裝模型相關(guān)的pip install torch transformers最后裝剩下的pip install -r requirements.txt這樣如果某一步失敗你能立刻知道是哪一類依賴出的問(wèn)題。如果直接一把梭pip install -r requirements.txt報(bào)錯(cuò)信息淹沒(méi)在一堆輸出里排查起來(lái)很痛苦。安裝過(guò)程中如果遇到某個(gè)包編譯特別慢可以加-v看詳細(xì)日志或者用國(guó)內(nèi)鏡像源加速下載pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple提示鏡像源只加速下載不解決編譯問(wèn)題。如果卡在編譯階段還是得回到系統(tǒng)依賴那一步檢查。3.3 依賴安裝后的驗(yàn)證方法裝完依賴別急著啟動(dòng)服務(wù)先做幾項(xiàng)驗(yàn)證。第一確認(rèn)關(guān)鍵包能正常導(dǎo)入python -c import fastapi, uvicorn, torch; print(ok)第二確認(rèn)版本符合要求pip list | grep -E fastapi|torch|transformers第三如果項(xiàng)目有測(cè)試用例跑一下冒煙測(cè)試python -m pytest tests/ -x -q-x表示遇到第一個(gè)失敗就停-q是精簡(jiǎn)輸出。這一步能提前發(fā)現(xiàn)很多環(huán)境問(wèn)題比服務(wù)起來(lái)后再報(bào)錯(cuò)要好定位得多。我遇到過(guò)一次torch裝成了 CPU 版本但項(xiàng)目需要 GPU 版本結(jié)果服務(wù)能啟動(dòng)但推理極慢。后來(lái)用python -c import torch; print(torch.cuda.is_available())一查就發(fā)現(xiàn)了。所以驗(yàn)證要驗(yàn)證到點(diǎn)子上不能只看“裝成功了”。4. 服務(wù)配置與 systemd 托管4.1 配置文件詳解與參數(shù)調(diào)優(yōu)DeepSeek Harness Web 的配置一般放在config.yaml或.env文件里。核心參數(shù)我列一下常見(jiàn)的幾類參數(shù)類別典型參數(shù)說(shuō)明建議值網(wǎng)絡(luò)host監(jiān)聽(tīng)地址0.0.0.0需遠(yuǎn)程訪問(wèn)網(wǎng)絡(luò)port監(jiān)聽(tīng)端口8000 或自定義模型model_path模型文件路徑絕對(duì)路徑模型device推理設(shè)備cuda 或 cpu性能workers工作進(jìn)程數(shù)CPU 核數(shù)的一半日志log_level日志級(jí)別infohost設(shè)成0.0.0.0是遠(yuǎn)程訪問(wèn)的前提。如果設(shè)成127.0.0.1那只有本機(jī)能訪問(wèn)遠(yuǎn)程怎么連都連不上。這個(gè)坑我見(jiàn)過(guò)太多次很多人配完發(fā)現(xiàn)遠(yuǎn)程打不開(kāi)查了半天防火墻最后發(fā)現(xiàn)是監(jiān)聽(tīng)地址的問(wèn)題。workers的數(shù)量不是越多越好。Web 服務(wù)本身是 IO 密集型的但模型推理是 CPU/GPU 密集型的。如果模型和 Web 在同一臺(tái)機(jī)器workers設(shè)太多會(huì)互相搶資源。我的經(jīng)驗(yàn)是CPU 核數(shù)的一半比如 8 核就設(shè) 4。4.2 編寫 systemd 服務(wù)單元文件用nohup跑服務(wù)的問(wèn)題是終端一關(guān)服務(wù)就斷服務(wù)器重啟后服務(wù)不會(huì)自動(dòng)起來(lái)日志管理也混亂。systemd 能一次性解決這些問(wèn)題。創(chuàng)建服務(wù)文件sudo vim /etc/systemd/system/deepseek-harness.service內(nèi)容如下[Unit] DescriptionDeepSeek Harness Web Service Afternetwork.target [Service] Typesimple Useryour-user WorkingDirectory/opt/deepseek-harness-web EnvironmentPATH/opt/deepseek-harness-web/venv/bin ExecStart/opt/deepseek-harness-web/venv/bin/python -m uvicorn main:app --host 0.0.0.0 --port 8000 Restartalways RestartSec5 StandardOutputappend:/var/log/deepseek-harness.log StandardErrorappend:/var/log/deepseek-harness.err [Install] WantedBymulti-user.target逐段解釋下。Afternetwork.target保證網(wǎng)絡(luò)就緒后再啟動(dòng)服務(wù)。User指定運(yùn)行用戶不要用 root這是安全底線。WorkingDirectory是工作目錄服務(wù)里的相對(duì)路徑都基于它。Environment把虛擬環(huán)境的 bin 目錄加進(jìn) PATH這樣ExecStart里可以直接用python。ExecStart是最關(guān)鍵的一行。這里用-m uvicorn的方式啟動(dòng)比直接跑腳本更規(guī)范。main:app表示main.py里的app對(duì)象具體名字按項(xiàng)目實(shí)際來(lái)。Restartalways讓服務(wù)崩潰后自動(dòng)重啟RestartSec5是重啟間隔。這兩個(gè)參數(shù)是服務(wù)穩(wěn)定性的保障沒(méi)有它們服務(wù)半夜掛了你就只能等第二天用戶投訴才知道。4.3 服務(wù)啟停與狀態(tài)管理寫完服務(wù)文件后先重載 systemd 配置sudo systemctl daemon-reload然后啟動(dòng)服務(wù)sudo systemctl start deepseek-harness查看狀態(tài)sudo systemctl status deepseek-harness如果狀態(tài)是active (running)說(shuō)明起來(lái)了。如果是failed用journalctl看日志sudo journalctl -u deepseek-harness -n 50 --no-pager-n 50看最近 50 行--no-pager不分頁(yè)直接輸出。日志里通常能直接看到報(bào)錯(cuò)原因比如模塊找不到、端口被占用、配置文件格式錯(cuò)誤。設(shè)置開(kāi)機(jī)自啟sudo systemctl enable deepseek-harness這樣服務(wù)器重啟后服務(wù)會(huì)自動(dòng)起來(lái)不用手動(dòng)干預(yù)。注意每次修改了服務(wù)文件或項(xiàng)目代碼都要daemon-reload加restart。只改代碼不重啟服務(wù)跑的還是舊代碼這個(gè)坑我踩過(guò)不止一次。5. 遠(yuǎn)程訪問(wèn)配置與網(wǎng)絡(luò)排查5.1 監(jiān)聽(tīng)地址、防火墻與端口放行遠(yuǎn)程訪問(wèn)要打通三層服務(wù)監(jiān)聽(tīng)、系統(tǒng)防火墻、網(wǎng)絡(luò)鏈路。任何一層沒(méi)通遠(yuǎn)程都連不上。第一層服務(wù)監(jiān)聽(tīng)地址必須是0.0.0.0前面配置里已經(jīng)說(shuō)了。驗(yàn)證方法ss -tlnp | grep 8000輸出里如果顯示0.0.0.0:8000就對(duì)了如果是127.0.0.1:8000就說(shuō)明配置沒(méi)生效。第二層系統(tǒng)防火墻。Ubuntu 默認(rèn)用ufwsudo ufw status sudo ufw allow 8000/tcp如果用的是firewalldCentOS 系命令是sudo firewall-cmd --permanent --add-port8000/tcp sudo firewall-cmd --reload第三層如果是云服務(wù)器還要在云平臺(tái)的安全組里放行對(duì)應(yīng)端口。這一層最容易被忽略因?yàn)樗谙到y(tǒng)之外本地怎么查都查不出問(wèn)題。我遇到過(guò)有人折騰一下午最后發(fā)現(xiàn)是云控制臺(tái)安全組沒(méi)開(kāi)。5.2 反向代理與域名訪問(wèn)配置直接用 IP 加端口訪問(wèn)能用但不優(yōu)雅而且沒(méi)法上 HTTPS。用 Nginx 做反向代理是標(biāo)準(zhǔn)做法。先裝 Nginxsudo apt install -y nginx創(chuàng)建站點(diǎn)配置sudo vim /etc/nginx/sites-available/deepseek-harness內(nèi)容server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 300s; proxy_buffering off; } }proxy_read_timeout 300s很關(guān)鍵。大模型推理響應(yīng)慢默認(rèn) 60 秒超時(shí)會(huì)導(dǎo)致長(zhǎng)回答被截?cái)唷roxy_buffering off是為了支持流式輸出否則前端要等全部生成完才顯示體驗(yàn)很差。啟用站點(diǎn)sudo ln -s /etc/nginx/sites-available/deepseek-harness /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginxnginx -t是配置語(yǔ)法檢查一定要跑配置寫錯(cuò)了 reload 會(huì)失敗。5.3 遠(yuǎn)程訪問(wèn)不通的排查思路遠(yuǎn)程連不上按這個(gè)順序排查基本能覆蓋 90% 的情況排查層級(jí)檢查命令常見(jiàn)問(wèn)題服務(wù)層systemctl status服務(wù)沒(méi)起來(lái)監(jiān)聽(tīng)層ss -tlnp監(jiān)聽(tīng)地址是 127.0.0.1本機(jī)層curl localhost:8000服務(wù)本身報(bào)錯(cuò)防火墻層ufw status端口沒(méi)放行網(wǎng)絡(luò)層telnet ip port安全組或路由問(wèn)題代理層nginx -t反代配置錯(cuò)誤排查的核心邏輯是從內(nèi)到外。先在服務(wù)器上curl localhost:8000如果這都不通那問(wèn)題在服務(wù)本身跟遠(yuǎn)程無(wú)關(guān)。如果本機(jī)通、遠(yuǎn)程不通再往防火墻和網(wǎng)絡(luò)層查。這個(gè)順序能幫你快速縮小范圍避免盲目猜測(cè)。6. 常見(jiàn)問(wèn)題與實(shí)操避坑經(jīng)驗(yàn)6.1 依賴與運(yùn)行環(huán)境類問(wèn)題速查這類問(wèn)題占了新手遇到問(wèn)題的一大半我整理成表格方便對(duì)照?qǐng)?bào)錯(cuò)信息根本原因解決方法Python.h: No such file缺 python3-devapt install python3-devffi.h: No such file缺 libffi-devapt install libffi-devNo module named xxx虛擬環(huán)境沒(méi)激活source venv/bin/activateCUDA out of memory顯存不足減小 batch 或換 CPUAddress already in use端口被占用lsof -i:8000查進(jìn)程Permission denied文件權(quán)限問(wèn)題chown改屬主Address already in use這個(gè)特別常見(jiàn)。有時(shí)候服務(wù)沒(méi)停干凈端口還占著新服務(wù)就起不來(lái)。查占用進(jìn)程sudo lsof -i:8000找到 PID 后kill掉或者直接systemctl restart讓 systemd 處理。6.2 服務(wù)穩(wěn)定性與日志分析技巧服務(wù)跑起來(lái)不代表就穩(wěn)了。我關(guān)注幾個(gè)指標(biāo)內(nèi)存占用是否持續(xù)增長(zhǎng)、日志里有沒(méi)有反復(fù)出現(xiàn)的錯(cuò)誤、重啟頻率。內(nèi)存泄漏是 Python 服務(wù)的常見(jiàn)問(wèn)題。用這個(gè)命令持續(xù)觀察watch -n 5 ps aux | grep uvicorn | grep -v grep如果 RES 列的內(nèi)存一直漲不回落那大概率有泄漏需要排查代碼里的緩存或連接池。日志分析我習(xí)慣用journalctl配合過(guò)濾sudo journalctl -u deepseek-harness --since 1 hour ago | grep -i error--since限定時(shí)間范圍grep -i error過(guò)濾錯(cuò)誤。這樣能快速定位最近一小時(shí)內(nèi)的異常。提示日志文件要定期清理否則磁盤會(huì)被撐滿??梢耘?logrotate或者用 systemd 的 journal 大小限制。磁盤滿了服務(wù)會(huì)直接崩而且崩得莫名其妙。6.3 我踩過(guò)的幾個(gè)真實(shí)坑第一個(gè)坑是虛擬環(huán)境路徑寫錯(cuò)。有次我把項(xiàng)目從/home/user挪到/opt忘了改 systemd 里的ExecStart路徑服務(wù)一直起不來(lái)日志報(bào)No such file or directory。后來(lái)才反應(yīng)過(guò)來(lái)是路徑問(wèn)題。所以移動(dòng)項(xiàng)目目錄后一定要同步更新服務(wù)文件。第二個(gè)坑是模型路徑用了相對(duì)路徑。服務(wù)手動(dòng)跑的時(shí)候工作目錄是項(xiàng)目根目錄相對(duì)路徑能找到模型但 systemd 啟動(dòng)時(shí)工作目錄可能不一樣就找不到了。解決辦法是配置里一律用絕對(duì)路徑省心。第三個(gè)坑是沒(méi)設(shè)開(kāi)機(jī)自啟。有次服務(wù)器維護(hù)重啟我以為服務(wù)會(huì)自動(dòng)起來(lái)結(jié)果第二天發(fā)現(xiàn)服務(wù)沒(méi)跑用戶全連不上。從那以后我養(yǎng)成了習(xí)慣部署完第一件事就是systemctl enable。第四個(gè)坑是反向代理超時(shí)太短。默認(rèn) 60 秒遇到長(zhǎng)回答直接被截?cái)嗲岸孙@示一半就停了。改成 300 秒后正常。這個(gè)問(wèn)題的隱蔽性在于短回答完全正常只有長(zhǎng)回答才暴露很容易被忽略。6.4 性能調(diào)優(yōu)與資源監(jiān)控建議服務(wù)穩(wěn)定后可以做一些調(diào)優(yōu)。CPU 方面workers數(shù)量按核數(shù)調(diào)整內(nèi)存方面關(guān)注模型加載后的常駐內(nèi)存留足余量磁盤方面日志和模型文件分開(kāi)存放避免互相影響。監(jiān)控我推薦用簡(jiǎn)單的方案起步比如htop看實(shí)時(shí)資源df -h看磁盤free -h看內(nèi)存。等規(guī)模大了再上 Prometheus 加 Grafana 那套。不要一上來(lái)就搞復(fù)雜監(jiān)控先把服務(wù)跑穩(wěn)再說(shuō)。一個(gè)實(shí)用的小技巧是給服務(wù)加個(gè)健康檢查接口然后用定時(shí)任務(wù)定期 curl 一下不通就發(fā)告警。這樣能在用戶發(fā)現(xiàn)之前就知道服務(wù)掛了。curl -f http://localhost:8000/health || echo service down-f參數(shù)讓 curl 在 HTTP 錯(cuò)誤碼時(shí)返回非零退出碼配合||就能做簡(jiǎn)單的健康判斷。這套流程我從第一次部署到現(xiàn)在前后迭代了七八次每次踩坑都記下來(lái)慢慢就形成了一套相對(duì)固定的操作路徑。源碼部署的好處就在于每個(gè)環(huán)節(jié)你都清楚出了問(wèn)題能自己修而不是等別人更新鏡像。這套方法不只適用于 DeepSeek Harness Web換成其他 Python Web 服務(wù)流程基本一致改改配置和啟動(dòng)命令就能復(fù)用。