拓冰建站拓冰建站
首页 / 资讯中心 / 正文

WSL2与云服务器部署Hermes Agent实战:从环境搭建到调试

先交代一下背景。如果你最近在折腾本地大模型、自动化工作流或者想把 Agent 类服务从笔记本迁到服务器上跑那你大概率听过 Hermes Agent 这个名字。它本质上是一个能承载工具调用、多轮任务编排、模型调度的运行时框架底层可以对接 OpenAI 兼容接口、本地 Ollama、vLLM 等推理后端适合做个人知识库助手、定时任务代理、API 聚合节点这类场景。之前写过环境部署篇的第一部分把原理和架构讲清楚了这篇直接进实战把手上的 WSL2 本地环境和一台云服务器从头到尾部署一遍包含服务启动、状态校验、环境调试算是把「自己从零搭一套」这条路完整走通。这篇内容适合三种人一是想在 Windows 上开发、但不想装双系统或完整虚拟机的同学二是有一台云服务器、但不知道怎么把 Agent 服务正式跑起来的新手三是看过官方 README 但被各种依赖报错劝退的实操党。我会把每一步的命令、配置、为什么这么做的逻辑都写出来踩过的坑也会单独列一节。1. 部署思路与方案选择1.1 为什么本地选 WSL2 而不是双系统或虚拟机我平时主力机是 Windows 11最早部署 Hermes Agent 时犹豫过要不要直接装 Ubuntu 双系统。后来实测下来WSL2 在开发调试阶段是最省事的方案原因有三个。第一WSL2 不是传统的虚拟机模拟它是基于虚拟化平台的轻量级运行时Linux 内核直接跑在 Windows 的 Hyper-V 虚拟化层上和 Windows 之间的文件互访、网络转发都是原生的。这意味着你可以在 VS Code 里直接连 WSL 目录写代码也可以在 Windows 浏览器里访问 WSL 里起的服务完全不用管什么端口映射和 IP 配置开发体验接近原生 Linux。第二Hermes Agent 这类项目依赖很多 Python 包、系统库比如pydantic、httpx、fastapi在 Windows 原生环境里跑容易因为编译器和动态链接库问题翻车。但在 WSL2 里Python 生态的兼容性问题少一大半pip install 基本都是一次过。第三WSL2 删了重装成本极低。我第一遍部署时把系统搞得很乱wsl --unregister之后一分钟就是一个干净的 Ubuntu这在物理机上根本不敢想。所以开发调试阶段用 WSL2生产上线用云服务器这是我自己固定的组合拳。1.2 云服务器在整套方案里的定位本地 WSL2 适合开发和验证流程但 Agent 服务如果要在群里被调用、或者通过 API 对外提供能力你就得有一台 7x24 小时在线的机器。云服务器在这里的角色是常驻运行端。选云服务器时有几个参数需要提前想明白别盲目上高配。Hermes Agent 空载的时候内存占用只有 300 到 500MB但一旦加载了大模型推理进程内存开销会飙到 8GB 以上。所以跑轻量任务用 2 核 4G 就够准备接本地大模型至少得上 4 核 16G否则 SWAP 一开服务响应速度会难看得没法用。带宽方面如果只是跑 API 调用和不知道多少次回调5Mbps 够用如果要传模型文件、下载依赖建议临时用按量付费把带宽拉满部署完再降回去。我第一次买服务器时图便宜选了 1Mbps结果拉一个 2GB 的依赖包等了一个小时后来学聪明了先临时升带宽再部署效率翻了好几倍。磁盘这块系统盘 40GB 是底线。Hermes Agent 本体很小但 Python 虚拟环境、模型缓存、日志文件会慢慢把空间吃光我建议直接上 60GB 以上免得用半年就得清一次盘。注意不同云厂商的云服务器名字不一样有的叫 ECS有的叫 CVM也有的叫轻量应用服务器本质都一样选最便宜的活动机型即可。部署流程基本通用区别只在控制台的按钮位置。1.3 一键部署脚本解决的问题和仍然要手动做的事一键部署这四个字很容易让人误解以为点一下脚本就全部搞定。真实情况是脚本解决的是 90% 的重复劳动剩下 10% 的环境差异必须自己处理。Hermes Agent 社区常见的一键部署脚本主要做的事情包括更新系统包、安装 Python 环境、创建虚拟目录、拉取项目代码、安装 pip 依赖、生成默认配置文件。这些步骤如果手动操作至少要二三十条命令而且还容易因为网络、镜像源、系统版本差异报错。脚本把整条链路编排好出错时也能定位到具体环节。但脚本不会替你做的事情也很明确不会替你配置模型 API Key不会替你判断底层 CUDA 环境是否可用更不会自动调整系统防火墙放行端口。这些属于环境调试范畴恰恰是本章后半部分重点讲的。2. WSL2 本地环境搭建2.1 从零启用 WSL2 的完整步骤如果你电脑上还没装过 WSL第一步是打开管理员权限的 PowerShell执行wsl --install这条命令会自动开启 Windows 虚拟化功能、下载 WSL2 内核、安装默认的 Ubuntu 发行版。装完重启一次系统会让你设置 Linux 用户名和密码。这一步国内网络有时候会卡在下载内核上如果等了很久没反应可以直接去微软官方文档找 WSL2 Linux 内核更新包手动下载安装后再执行wsl --install。装完确认一下版本wsl --status wsl -l -v正常情况会看到 Ubuntu 对应的 VERSION 是 2。如果显示 VERSION 是 1说明当前还是 WSL1需要执行wsl --set-version Ubuntu 2升级过程要一两分钟这个命令在部分旧版本 Windows 上会失败建议先把系统更新补丁打齐再试。进入 Ubuntu 环境后先做一遍常规更新sudo apt update sudo apt upgrade -y然后把 Python 环境装上。Hermes Agent 目前要求 Python 3.10 以上Ubuntu 22.04 默认自带的 Python 3.10 可以直接用Ubuntu 24.04 自带的 3.12 也没问题。sudo apt install -y python3-pip python3-venv git curl这里有一个小细节Ubuntu 上直接用 pip 装包经常会碰到externally-managed-environment报错这是新版系统的 PEP 668 限制。解决办法统一用虚拟环境不要往系统 Python 里塞包后面部署的时候我会全程带着 venv 走。2.2 让 WSL2 稳定跑服务的关键配置WSL2 有一个让人很头疼的特点默认情况下当你关闭所有终端窗口后WSL2 虚拟机过一段时间就自动关机了。这会导致你在 WSL 里启动的 Agent 服务跟着一起停止。解决办法是在 Windows 用户目录下创建一个.wslconfig文件写入[wsl2] memory12GB processors6 swap4GB保存后执行wsl --shutdown重启 WSL 生效。这里memory按你电脑实际内存的一半到三分之二设置就行别贪多不然 Windows 自身内存吃紧时会卡到没法用。想阻止 WSL2 自动休眠还有一个办法就是用screen或tmux保持会话。我习惯在 WSL 里装一个 tmux把 Hermes Agent 的启动命令放在 tmux 会话里跑这样即使不小心关了终端窗口服务也还在后台继续运行。sudo apt install -y tmux tmux new -s hermes # 在会话内启动服务如果要让 WSL2 里的服务能被局域网其他设备访问默认配置还不够。WSL2 的 NAT 模式不会自动把端口暴露出去需要 Windows 侧做一次端口转发。这个我放在调试章节详细写。2.3 本地大模型推理环境的注意点如果你打算在本地 WSL2 里跑 Ollama 或 vLLM 来给 Hermes Agent 提供推理能力需要先确认两件事物理机上有没有 NVIDIA 显卡以及 WSL2 里能不能正常调用 CUDA。WSL2 对 CUDA 的支持已经比较成熟Windows 侧安装好 NVIDIA 驱动后WSL2 里直接就能用nvidia-smi看到显卡信息不需要在 Linux 侧单独装驱动。但 PyTorch 和相关的 CUDA 工具链还是要在 Linux 侧装一遍比如pip install torch --index-url https://download.pytorch.org/whl/cu124如果nvidia-smi在 WSL2 里执行时报错或者看不到 GPU先回 Windows 检查显卡驱动版本WSL 里的 CUDA 支持需要驱动版本在 470 以上。没有独显也没关系Hermes Agent 完全可以走 CPU 推理或纯 API 模式。如果你的场景只是写写工具调用、跑跑流程编排本地 CPU 跑小模型完全够用不需要在 GPU 上死磕。3. Hermes Agent 安装与一键部署实操3.1 项目拉取与虚拟环境创建先把代码从仓库拉下来。为了保持目录整洁我习惯把项目都放在~/apps下mkdir -p ~/apps cd ~/apps git clone https://github.com/YourRepo/hermes-agent.git cd hermes-agent提示这里用到的仓库地址请以官方文档为准。社区里有一些第三方封装版本功能有增减不建议新手一上来就用等理解了核心目录结构再换不迟。接下来创建虚拟环境python3 -m venv venv source venv/bin/activate激活后命令行前缀会变成(venv)这一步后续所有 pip 安装都要保持激活状态否则包会装到系统 Python 里版本冲突时排查起来非常难受。安装项目依赖pip install --upgrade pip pip install -r requirements.txt国内网络下pip 下载大文件比如torch、transformers很慢建议先换国内镜像源pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple实测换源之后依赖安装速度能提升五倍以上。但要注意直接把全局源改成清华对大部分场景没问题个别包可能镜像同步不及时遇到安装失败时先试单个pip install 包名 -i https://pypi.org/simple。3.2 一键部署脚本的常见形态与核心逻辑现在很多项目会把部署逻辑封装成一个deploy.sh或setup.py。Hermes Agent 社区版本常见的脚本结构大致是#!/bin/bash set -e echo 检查 Python 版本... python3 --version echo 创建虚拟环境... python3 -m venv venv source venv/bin/activate echo 安装依赖... pip install -r requirements.txt echo 复制默认配置... if [ ! -f .env ]; then cp .env.example .env fi echo 部署完成请编辑 .env 文件配置模型参数这个脚本的逻辑很直白就是先检查前置条件再搭建环境最后生成配置。实际项目里可能还会加上 Docker 检测、端口占用检查、模型目录初始化等步骤骨架都一样。使用脚本部署chmod x deploy.sh ./deploy.sh执行过程中如果报错脚本内部如果有set -e遇到第一个错误就会终止。这时候不要急着改脚本先看错误信息定位是哪一步失败了。最常见的三个报错来源是网络超时、Python 版本不匹配、pip 依赖包解析冲突排查思路放在第五部分统一讲。3.3 手动安装的核心命令参照如果你更喜欢完全掌控每一步可以不走脚本手动安装的核心流程如下# 1. 系统依赖 sudo apt install -y build-essential libssl-dev libffi-dev # 2. Python 虚拟环境 cd ~/apps/hermes-agent python3 -m venv venv source venv/bin/activate # 3. 核心 Python 依赖 pip install -r requirements-base.txt # 4. 开发调试可选依赖 pip install -r requirements-dev.txt # 5. 初始化配置 cp .env.example .env手动方式的最大好处是每一步都能控制出问题方便定位。缺点是比较啰嗦而且你很容易漏装某个系统库。所以我给的建议是第一次部署用脚本跑通全流程跑通之后删掉重来手动执行一遍加深理解。这样既快速拿到可用环境又能搞清楚脚本背后到底干了些啥。4. 云服务器部署全流程4.1 服务器选型与系统初始化云服务器的选择在第一章已经给了参考这里直接说部署时的实操细节。拿到服务器后第一件事是登录控制台重置 root 密码确认安全组规则。安全组是云服务商的第一道防火墙很多服务启动了但外部访问不了的问题都是安全组没放行端口。Hermes Agent 默认监听 8080 端口做 API 服务所以安全组需要放行 TCP 8080 入方向规则。如果是 SSH 登录建议把默认端口从 22 改掉。虽然改端口治标不治本但能过滤掉绝大多数扫描脚本。登录服务器ssh root服务器IP登录后创建一个普通用户不要直接用 root 跑服务adduser hermes usermod -aG sudo hermes su - hermes用普通用户跑服务的好处是即使服务被攻破或者误操作删库也不会直接威胁到系统根目录。这个习惯在云服务器上尤其重要本地开发机倒是可以随意一些。系统初始化sudo apt update sudo apt upgrade -y sudo apt install -y curl git python3-pip python3-venv ufw sudo ufw allow 8080/tcp sudo ufw enableufw是 Ubuntu 的防火墙管理工具这里只放行了 8080 端口。如果之后还要跑别的服务记得把对应端口也加进去不然防火墙会把流量拦掉。4.2 服务器端一键部署的步骤差异云服务器和 WSL2 本地环境的部署步骤基本一致区别主要体现在内存和磁盘规划上。首先如果服务器内存小于 2GB建议先加一个 swap 分区避免 pip 编译依赖时内存不足直接 OOMsudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile然后按同样的流程拉代码、建虚拟环境、装依赖cd ~/apps git clone https://github.com/YourRepo/hermes-agent.git cd hermes-agent python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt服务器上最好不要用国内镜像源吗实测下来国内云服务器用清华大学 PyPI 镜像速度非常快但是在海外服务器上用国内镜像反而变慢。先跑一次pip install如果速度还行就别换源如果卡住了再按需修改。4.3 使用 systemd 管理服务常驻运行本地开发时你用 tmux 挂着服务没问题但云服务器上更专业的做法是用 systemd 把 Hermes Agent 注册成系统服务实现开机自启、崩溃自动重启、日志统一管理。创建一个 service 文件sudo nano /etc/systemd/system/hermes-agent.service写入[Unit] DescriptionHermes Agent Service Afternetwork.target [Service] Userhermes WorkingDirectory/home/hermes/apps/hermes-agent ExecStart/home/hermes/apps/hermes-agent/venv/bin/python -m hermes_agent.server Restartalways RestartSec5 EnvironmentFile/home/hermes/apps/hermes-agent/.env [Install] WantedBymulti-user.target保存后执行sudo systemctl daemon-reload sudo systemctl enable hermes-agent sudo systemctl start hermes-agent注意ExecStart里的启动命令要根据项目实际入口调整有的版本是python -m hermes_agent.main有的是直接跑某个server.py。查一下项目 README 或者pyproject.toml里的 scripts 配置段就能找到正确的模块名。用 systemd 管理的好处不用多说一条命令就能看状态、看日志sudo systemctl status hermes-agent sudo journalctl -u hermes-agent -f这套组合拳在云服务器上非常稳妥重启机器之后服务自动拉起完全不用人工干预。不过要注意EnvironmentFile指向的.env文件权限里面如果写了 API Key建议chmod 600限制访问。5. 服务启动、状态校验与环境调试5.1 服务启动的三种方式与适用场景Hermes Agent 的启动方式取决于你的部署场景我常碰到的是这三种。开发调试时用前台模式日志直接打在当前终端source venv/bin/activate python -m hermes_agent.server --host 0.0.0.0 --port 8080WSL2 或没有 systemd 的环境里用 tmux 后台驻留tmux new -s hermes python -m hermes_agent.server --host 0.0.0.0 --port 8080 # CtrlB 然后按 D 脱离会话云服务器生产环境用 systemd按 4.3 小节配置即可。启动命令里的--host 0.0.0.0一定要带上。如果默认绑定的是127.0.0.1那么只有本机能访问外部请求根本到达不了服务。这个参数是我每次排查为什么访问不了时要检查的第一项比防火墙更常出问题。5.2 如何确认服务真的起来了很多新手以为终端没报错就等于服务正常。实际上入口是否可用需要从三个层面分别验证。第一层是进程层面ps aux | grep hermes本地部署时如果看到python -m hermes_agent.server那行说明进程存在。但如果一秒后进程就消失大概率是启动后报错退出需要看日志。第二层是端口层面ss -tlnp | grep 8080输出里应该有一行LISTEN状态IP 地址为0.0.0.0:8080。这里如果显示127.0.0.1:8080说明服务虽然起来了但只绑定了本机回环地址外部无法访问。第三层是接口层面发一个测试请求看响应curl -X POST http://127.0.0.1:8080/health \ -H Content-Type: application/json \ -d {}返回{status:ok}这类 JSON 就说明服务本身没问题。接着用服务器公网 IP 测试curl -X POST http://服务器公网IP:8080/health \ -H Content-Type: application/json \ -d {}这一步如果通了说明安全组、防火墙、监听地址三层都没问题。如果本地通而公网不通排查顺序是先看安全组有没有放行 8080再看系统防火墙 ufw最后看服务监听地址。5.3 .env 配置调试与模型接入Hermes Agent 运行时的核心配置都集中在.env文件里。常见字段大概包括# 模型接入 LLM_PROVIDERopenai_compatible LLM_BASE_URLhttp://127.0.0.1:11434/v1 LLM_API_KEYollama LLM_MODELqwen2.5:7b # 服务监听 HOST0.0.0.0 PORT8080 # 日志级别 LOG_LEVELinfo # 工具调用相关 TOOL_TIMEOUT30字段的含义不复杂但有几个坑值得注意。第一LLM_BASE_URL不能随便填。如果你在 WSL2 里跑 Ollama 作为推理后端Ollama 默认监听在127.0.0.1:11434Hermes Agent 也在同一台机器的 WSL2 环境里这个地址没问题。但如果你把 Hermes Agent 放在云服务器上、Ollama 放在本地那LLM_BASE_URL就不能写127.0.0.1了要写本地机器的局域网 IP还得让 Ollama 监听非回环地址并确认防火墙放行。第二LLM_API_KEY即使本地 Ollama 不校验 Key也不能留空。很多推理后端的客户端 SDK 在 Key 为空时会直接报错随便填一个占位符就行比如ollama。第三改完.env后必须重启服务才生效。systemd 环境下执行sudo systemctl restart hermes-agenttmux 环境下要把会话里的进程 CtrlC 终止后重新启动。有些配置项有热加载机制但保险起见还是重启一次不要在这个问题上浪费排查时间。5.4 环境调试中的日志分析与性能排查服务跑起来但表现不正常时日志是最重要的线索。Hermes Agent 的日志默认输出到 stdoutsystemd 模式下可以用journalctl -u hermes-agent -f实时追踪WSL2 前台模式直接看终端滚动输出。日常调试时我重点关注四类日志信息启动阶段出现Application startup complete说明框架初始化完成依赖全部加载成功调用阶段HTTP Request: POST /v1/chat/completions 200 OK说明一次模型调用结束状态码正常错误阶段Connection refused、Timeout、Authentication failed分别对应网络不通、后端超时、Key 无效工具执行阶段Tool xxx executed后跟返回结果用来确认工具调用是否正确如果日志里模型调用每次要等很久才返回先检查网络链路。本地 Ollama 模型未加载到内存时需要冷启动第一次调用可能要十几秒之后就会快很多云服务器上如果使用公网 API每次请求的往返延迟会增加 100ms 到 200ms这是物理限制没法完全消除。内存和 CPU 排查htop free -h看到内存占用持续 90% 以上、且 Swap 用量不断上升基本可以判定服务内存不足。轻量方案是调小模型并发数在配置里找MAX_CONCURRENT或WORKER_COUNT之类的参数如果业务量确实大直接升级服务器配置更省心。6. 常见问题与排查技巧实录6.1 端口映射与访问失败的排查路径WSL2 里访问服务失败90% 是端口转发或防火墙的问题。我踩过各类场景整理成一张速查表现象可能原因解决方案Windows 浏览器访问 localhost:8080 失败WSL2 服务未绑定 0.0.0.0启动时加--host 0.0.0.0局域网设备访问 WSL2 服务失败WSL2 NAT 网络未做端口转发用 netsh 命令配置端口代理公网访问云服务器失败安全组未放行端口云控制台放行 TCP 端口公网访问云服务器失败ufw 防火墙拦截执行ufw allow 端口云服务器本机 curl 通、外部不通服务只绑定了回环地址检查 HOST 配置是否为 0.0.0.0WSL2 局域网端口转发的方法在管理员 PowerShell 里执行netsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddress127.0.0.1这里connectaddress填 WSL2 的 IP。WSL2 的 IP 每次重启会变你可以通过hostname -I查看。想要固定 IP在.wslconfig里加networkingModemirrored可以让 WSL2 共享 Windows 的网络这在新版 Windows 上体验好很多。提示Windows 防火墙会拦截 8080 端口的入站请求如果执行 netsh 后还是不通再手动加一条入站规则放行 TCP 8080。6.2 pip 依赖安装失败的典型场景与对策依赖安装失败在部署环节出现频率最高报错五花八门但根因基本集中在三类。第一类是网络超时。解决方案参考前面章节换国内镜像源或者对单个超时包重试pip install --timeout 60 --retries 5 包名第二类是 Python 版本不符。Hermes Agent 某些版本依赖pydantic2.x 或fastapi最新版Python 3.8 可能直接编译报错。对策是强制使用支持的 Python 版本云服务器上可以用apt install python3.10或python3.12后通过update-alternatives切换默认版本。第三类是缺少系统编译库。比如某些包需要libxml2-dev、libcurl4-openssl-dev。报错信息里会明确写着缺少哪个头文件按提示安装对应xxx-dev包即可sudo apt install -y libxml2-dev libcurl4-openssl-dev如果一条报错信息里夹杂着大量编译输出先搜索error:而不是warning:警告信息一般不影响安装。6.3 模型调用报错的处理思路服务起来了但调用 Agent 对话时返回报错这种情况通常和模型接入配置相关。一个常见问题Connection error: HTTP 404。意思是请求地址不对多半是LLM_BASE_URL路径拼接错误。OpenAI 兼容接口的路径通常是http://host:port/v1如果你填成http://host:port框架在拼接具体接口路径时可能多出个/v1/chat/completions或少了一段很容易 404。最佳实践是打开浏览器访问一下LLM_BASE_URL/models能正常返回模型列表说明路径正确。另一个常见报错Authentication failed: 401。即使本地 Ollama 不需要 Key有些兼容层也会做 Key 校验给LLM_API_KEY填一个非空字符串即可。如果是接 OpenAI 或第三方平台检查 Key 有没有复制完整别带前后空格。还有一个容易被忽视的问题模型名称不匹配。你配置的LLM_MODEL必须是推理后端中真实存在的模型名。Ollama 中执行ollama list能看到可用的模型列表填一个不存在的名字调用时会直接报模型找不到。另外模型别名和后端实际名称可能不一致建议先用ollama pull 模型名确认能正常拉取再写进配置。6.4 我的排查流程与避坑心得踩的坑多了之后我总结出一套自己的排查流程遇到任何异常都照着走一遍。第一步看进程ps aux | grep hermes确认服务在不在。不在说明启动失败了去查日志在就进下一步。第二步看端口ss -tlnp | grep 8080确认监听地址对不对。第三步看日志journalctl -u hermes-agent -f或前台终端输出确认有没有报错堆栈。第四步看依赖确认.env里的模型配置项是否能被正常解析。第五步看网络从服务所在机器上 curl 本机接口再逐步扩展到公网访问。这套流程帮我省掉了至少一半的无效排查时间。很多人一有问题就直接问这是怎么回事但大多数时候日志里已经写明了原因只是没人去看。关于 WSL2 我还有一个私人技巧如果每次进入 Ubuntu 后python3版本不对或者环境变量乱了在~/.bashrc里把虚拟环境的激活写成一行别名alias onenvsource ~/apps/hermes-agent/venv/bin/activate以后每次进入系统直接敲onenv就能进入项目环境不用每次都手打那一长串路径。我个人在实际操作中最大的体会是环境部署这件事最重要的是把每一步操作背后的原因想清楚而不是背命令。命令是死的但每次碰到的问题都可能有细微差别。你在 WSL2 和云服务器上各完整部署过一次之后再遇到任何 Agent 框架的部署都会觉得原理是相通的区别只在于依赖名和启动命令不同而已。最后再分享一个小技巧部署完成后把整条操作链路整理成自己的部署文档别只依赖官方 README。因为你遇到的问题和官方文档中的标准情况一定有差异这个差异才是你真正的经验积累。拿 Hermes Agent 这套部署流程来说换个环境、换台机器跑一遍你就会发现自己能讲给别人听的东西比照着教程敲命令时多得多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门