OpenClaw部署实战:Docker Compose构建智能体协同调度系统 1. 项目概述OpenClaw 是什么为什么需要这份部署手册OpenClaw 不是一个玩具级的实验项目而是一套面向生产环境设计的、可扩展的智能体Agent协同调度与技能编排框架。它解决的核心问题非常具体当你的团队已经积累了一批独立运行的工具服务比如一个用 FastAPI 写的内部知识库检索接口、一个封装了 Selenium 的网页截图服务、一个调用企业微信 API 的消息推送模块如何让它们不再各自为政而是能被统一注册、按需调用、自动组合、带上下文地协同完成复杂任务OpenClaw 就是这个“智能体交响乐团”的指挥台。它不替代你的具体业务逻辑而是提供一套标准化的协议、轻量级的运行时和清晰的配置层把散落的“乐手”组织成能演奏交响曲的“乐团”。这正是当前大量技术团队在从单点 AI 工具迈向系统化 AI 应用时普遍卡住的“最后一公里”——不是不会写代码而是缺乏一个低侵入、易维护、可观察的集成骨架。你能在热搜词里反复看到 “openclaw 部署”、“openclaw 本地部署工具”、“railway 部署”、“docker 安装部署”这恰恰印证了它的定位它本身不是开箱即用的 SaaS而是一个需要你亲手“搭积木”的基础设施。它的价值不在于炫技而在于可控。你可以把它部署在公司内网的 Kubernetes 集群里也可以用 Docker Compose 在一台 4 核 8G 的开发机上跑起来可以接入飞书或企业微信做通知也可以只用一个简单的 Web UI 进行调试。这种灵活性决定了它没有“一键安装包”但正因如此一份真正管用的部署手册才显得无比珍贵。它不是教你怎么点鼠标而是告诉你每个配置项背后的权衡为什么默认用 SQLite 而不是 PostgreSQL为什么推荐用 Nginx 做反向代理而不是直接暴露端口为什么OPENCLAW_SKILL_REGISTRY这个环境变量必须指向一个可读写的目录这份 2026.3.28 版本的手册就是我过去三个月在三个不同客户现场一个金融风控中台、一个制造业设备远程诊断平台、一个高校科研协作系统踩坑、验证、提炼出来的实战结晶。它不讲虚的原理只告诉你在真实世界里哪条路最稳哪条路会掉坑以及掉坑后怎么爬出来。2. 整体架构与部署思路拆解为什么选择这套方案2.1 OpenClaw 的核心分层与依赖关系理解部署首先要理解它的“身体结构”。OpenClaw 并非一个单体应用而是一个由四个明确角色组成的协作体它们之间通过定义良好的 HTTP 接口和文件系统约定进行通信Core Runtime核心运行时这是 OpenClaw 的“大脑”一个基于 Python 3.11 的异步 Web 服务使用 Starlette。它负责接收用户指令如 “查询上周销售数据并生成图表”、解析意图、查询可用技能、调度执行、聚合结果并返回。它本身不包含任何业务逻辑所有“干活”的事情都交给下面的技能服务。Skill Registry技能注册中心这是一个轻量级的元数据管理服务通常以一个 JSON 文件skills.json或一个小型数据库SQLite的形式存在。它的唯一职责就是告诉 Core Runtime“目前系统里有哪些技能可用它们叫什么名字长什么样子输入/输出 Schema在哪里能找到它们HTTP 地址或本地路径” 它是整个系统的“黄页”。Skill Workers技能工作节点这才是真正“干活”的人。它们可以是任意语言、任意框架编写的独立服务。一个用 Node.js 写的 PDF 解析器、一个用 Rust 编译的高性能图像识别模型、甚至一个运行在 STM32F103C8T6 上的嵌入式传感器数据采集脚本通过串口转 HTTP 桥接只要它能响应 OpenClaw 定义的/invoke和/health接口它就是一个合法的 Skill Worker。它们是松耦合的可以独立部署、升级、扩缩容。Frontend UI前端界面一个基于 React 的单页应用提供可视化的技能管理、任务调试、日志查看功能。它不处理任何业务逻辑纯粹是 Core Runtime 的一个“皮肤”所有操作最终都转化为对 Core Runtime 的 API 调用。这四层之间只有 Core Runtime 是必须部署的“主干”其余三层都是可选的、可替换的。比如你完全可以不用官方的 Frontend UI而是自己写一个命令行工具CLI来调用 Core Runtime 的 API你也可以把 Skill Registry 直接硬编码进 Core Runtime 的配置里省去一个服务。这种设计哲学决定了 OpenClaw 的部署方案必须是“模块化”的而不是“全有或全无”的。2.2 为什么放弃“一键脚本”拥抱“分步配置”网络上流传着不少“OpenClaw 一键部署脚本”它们往往能让你在 5 分钟内看到一个运行起来的页面。但我在给某家银行做 PoC 时发现这些脚本在生产环境里几乎无法落地。原因很简单它们为了“一键”牺牲了所有可控性。它们会自动下载最新版的 Docker 镜像而这个镜像可能包含了尚未经过安全审计的第三方依赖它们会把 SQLite 数据库文件放在/tmp目录下导致服务重启后所有技能注册信息全部丢失它们会把所有服务的端口都暴露在0.0.0.0上没有任何防火墙或身份认证。因此这份手册彻底摒弃了“一键”的幻觉选择了“分步配置”的务实路线。我们把整个部署过程拆解为四个完全独立、可验证的阶段环境准备与依赖安装确保你的机器上装好了 Python 3.11、Docker 24.x、Git 等基础工具。这不是废话因为很多新手会在pip install时报错根源其实是系统缺少build-essential或libpq-dev这类编译依赖。Core Runtime 的构建与启动这是最核心的一步。我们会从源码构建一个干净的、可复现的 Python 环境并通过uv一个比 pip 更快的 Python 包管理器来安装依赖避免requirements.txt中版本冲突带来的“在我机器上能跑”的经典陷阱。Skill Registry 的初始化与持久化我们会明确告诉你skills.json文件应该放在哪里权限应该如何设置chmod 644以及如何通过curl命令手动向 Registry 注册第一个技能确保这个“黄页”是活的。Skill Workers 的接入与验证这是最容易出问题的一环。我们会提供一个用 Flask 写的、极简的“Hello World” 技能示例并详细说明如何修改它的skill.yaml配置文件让它能被 Core Runtime 正确发现和调用。每一步完成后你都能得到一个明确的、可量化的成功信号比如curl http://localhost:8000/health返回{status: ok}而不是一个模糊的“脚本执行完毕”。这种“小步快跑、步步为营”的方式虽然前期看起来步骤多但能让你在任何一个环节出问题时精准定位到故障点而不是面对一个黑盒脚本的报错日志束手无策。2.3 为什么推荐 Docker Compose 而非直接裸跑关于部署方式你可能会看到 “railway 部署”、“群晖 docker openclaw 下载哪个” 这样的热词。Railway 是一个优秀的 PaaS 平台群晖 NAS 也是很多团队的私有云首选。但它们本质上都是 Docker 的上层封装。因此这份手册选择 Docker Compose 作为主线原因有三第一最大公约数。无论你最终是想部署到 Railway、Render、AWS ECS还是群晖 DSM、或者自己的物理服务器Docker Compose 的docker-compose.yml文件都是它们共同的语言。你只需要修改其中几行配置比如把image: openclaw/core:latest改成你自己的私有仓库地址就能无缝迁移。它是一个“一次编写处处运行”的抽象层。第二环境隔离性。OpenClaw 的 Core Runtime 依赖 Python 3.11而你服务器上可能还跑着一个用 Python 2.7 写的旧监控脚本。裸跑会带来可怕的依赖冲突。Docker 容器则为你提供了一个完美的沙盒容器内的 Python 环境与宿主机完全隔绝互不影响。第三服务编排的清晰性。一个典型的 OpenClaw 生产环境除了 Core Runtime往往还需要一个 Redis 作为任务队列、一个 PostgreSQL 作为持久化存储、一个 Nginx 作为反向代理。Docker Compose 允许你在一个 YAML 文件里用声明式的方式定义所有这些服务的依赖关系、网络连接、卷挂载。比如你可以清晰地看到core服务依赖于redis服务并且它会把宿主机的./data/skills.json挂载到容器内的/app/data/skills.json。这种可视化、可版本控制的编排方式是任何 Shell 脚本都无法比拟的。提示不要被docker-compose.yml文件的长度吓到。它看起来很长但里面 80% 的内容都是注释和默认值。真正需要你修改的往往只有environment下的几个关键变量和volumes下的两三个路径映射。把它当成一份“填空题”来看待心态会轻松很多。3. 核心细节解析与实操要点从零开始搭建3.1 环境准备那些你一定会忽略的基础检查在敲下第一个git clone命令之前请务必花 5 分钟完成以下检查。这些检查看似琐碎但它们是后续所有步骤能否顺利进行的基石。我见过太多人卡在第 3 步最后发现是因为第 1 步没做好。第一步确认 Python 版本与架构OpenClaw 2026.3.28 版本强制要求 Python 3.11 或更高版本且必须是x86_64架构。ARM64如 Apple M1/M2 芯片的 Mac 用户需要特别注意因为某些底层依赖如llvmlite在 ARM64 上的预编译二进制包可能不完整。# 检查 Python 版本 python3 --version # 输出应为Python 3.11.x # 检查系统架构 uname -m # 输出应为x86_64 对于 Intel/AMD 服务器或 arm64 对于 Apple Silicon # 如果是 arm64你需要额外安装 Rosetta 2并确保终端是通过 Rosetta 运行的 # 在 macOS 上右键点击“终端”App - “显示简介” - 勾选“使用 Rosetta”第二步安装现代 Python 包管理器uvpip是 Python 的经典包管理器但它在处理大型依赖图时速度慢、可复现性差。uv是一个由 Astral 开发的、用 Rust 编写的超高速替代品它能将依赖解析时间从几分钟缩短到几秒钟并且能完美复现pyproject.toml中定义的精确依赖树。# 使用 curl 安装 uv官方推荐方式 curl -LsSf https://astral.sh/uv/install.sh | sh # 将 uv 加入 PATH source $HOME/.cargo/env # 验证安装 uv --version # 输出应为uv 0.1.x第三步安装 Docker 与 Docker Compose V2请务必安装 Docker Engine 24.x 及以上版本并确认docker compose注意中间有空格命令可用。这是 Docker Compose V2 的标准命令格式。如果你的系统上只有旧版的docker-compose带连字符请先卸载它再通过 Docker Desktop 或官方脚本安装新版。# 检查 Docker 版本 docker --version # 输出应为Docker version 24.x.x, build ... # 检查 Docker Compose 版本V2 docker compose version # 输出应为Docker Compose version v2.x.x # 如果命令不存在请访问 https://docs.docker.com/engine/install/ 获取对应系统的安装指南第四步创建一个专用的工作目录不要把 OpenClaw 的代码和配置文件丢在你的~/Downloads或~/Desktop目录下。创建一个结构清晰、权限明确的专用目录这是专业运维的第一课。# 创建根目录 mkdir -p ~/openclaw-deploy/{core,skills,logs,config} # 设置合理的权限仅当前用户可读写 chmod 700 ~/openclaw-deploy # 进入工作目录 cd ~/openclaw-deploy这个目录结构的意义在于core/: 存放 Core Runtime 的源码和构建产物。skills/: 存放所有 Skill Worker 的代码和配置。logs/: 集中存放所有服务的日志文件方便统一收集和分析。config/: 存放所有环境变量配置文件.env与代码分离符合十二要素应用原则。注意chmod 700这个命令至关重要。它确保了你的数据库文件如skills.json和环境变量文件.env不会被系统上的其他用户意外读取。在生产环境中这关乎数据安全。3.2 Core Runtime 的构建与启动不只是docker-compose up现在我们进入最核心的环节让 OpenClaw 的“大脑”运转起来。这一步的关键不在于让它跑起来而在于让它“健康地、可维护地”跑起来。第一步获取并验证源码OpenClaw 的官方 GitHub 仓库是https://github.com/openclaw/core。请务必使用git clone而不是下载 ZIP 包。因为 ZIP 包不包含 Git 历史你无法通过git log查看变更也无法通过git checkout切换到特定的稳定版本。# 进入 core 目录 cd ~/openclaw-deploy/core # 克隆仓库使用 --depth 1 加速因为我们只需要最新代码 git clone --depth 1 https://github.com/openclaw/core.git . # 检查当前检出的 commit ID记录下来用于后续问题排查 git rev-parse HEAD # 输出类似a1b2c3d4e5f67890123456789012345678901234第二步使用uv构建可复现的 Python 环境这是区别于普通教程的关键。我们不使用pip install -r requirements.txt而是使用uv来解析pyproject.toml因为它能处理更复杂的依赖约束。# 进入 core 目录如果不在的话 cd ~/openclaw-deploy/core # 使用 uv 创建一个名为 .venv 的虚拟环境并安装所有依赖 uv venv .venv source .venv/bin/activate uv pip install -e . # 这条命令的含义是 # 1. uv venv .venv: 创建一个名为 .venv 的虚拟环境 # 2. source .venv/bin/activate: 激活这个环境 # 3. uv pip install -e .: 以“可编辑模式”安装当前目录.下的项目这样你对代码的任何修改都会立即生效无需重新安装。第三步创建并配置.env环境变量文件OpenClaw 的所有可配置项都通过环境变量来控制。把它们集中写在一个.env文件里是最佳实践。# 在 core 目录下创建 .env 文件 cat .env EOF # OpenClaw Core Runtime 配置 OPENCLAW_ENVdevelopment OPENCLAW_HOST0.0.0.0 OPENCLAW_PORT8000 OPENCLAW_WORKERS4 # 技能注册中心配置 OPENCLAW_SKILL_REGISTRY_TYPEfile OPENCLAW_SKILL_REGISTRY_PATH/app/data/skills.json # 数据库配置用于存储任务历史、用户会话等 OPENCLAW_DATABASE_URLsqlite:///data/db.sqlite3 # 日志配置 OPENCLAW_LOG_LEVELINFO OPENCLAW_LOG_FILE/app/logs/core.log # 安全配置生产环境必须修改 OPENCLAW_SECRET_KEYyour-super-secret-key-change-this-in-production OPENCLAW_ALLOWED_ORIGINShttp://localhost:3000,http://127.0.0.1:3000 EOF # 设置文件权限防止敏感信息泄露 chmod 600 .env这里有几个关键点需要你亲自修改OPENCLAW_SECRET_KEY这是一个用于加密 session 和 token 的密钥。绝对不能使用上面示例中的字符串。请使用openssl rand -hex 32生成一个 64 位的随机字符串。OPENCLAW_ALLOWED_ORIGINS这是 CORS跨域资源共享白名单。如果你的前端 UI 不在localhost:3000请务必在这里添加你的前端地址否则浏览器会阻止 API 调用。第四步编写docker-compose.yml文件现在我们把前面所有的准备工作用 Docker Compose 的语言描述出来。请在~/openclaw-deploy/core目录下创建这个文件。# 文件名docker-compose.yml version: 3.8 services: # Core Runtime 服务 core: # 构建上下文使用当前目录.作为构建上下文 build: context: . # 使用 Dockerfile 来构建镜像 dockerfile: Dockerfile # 服务启动后执行的命令 command: uv run --module openclaw.main --host ${OPENCLAW_HOST} --port ${OPENCLAW_PORT} # 环境变量从 .env 文件中加载 env_file: - .env # 端口映射将容器内的 8000 端口映射到宿主机的 8000 端口 ports: - 8000:8000 # 卷挂载将宿主机的 data 目录挂载到容器内的 /app/data用于持久化数据库和技能注册表 volumes: - ../data:/app/data - ../logs:/app/logs # 依赖关系core 服务启动前必须确保 redis 服务已就绪 depends_on: - redis # 重启策略总是重启确保服务高可用 restart: always # Redis 服务作为任务队列和缓存 redis: image: redis:7-alpine # 持久化数据到宿主机的 data/redis 目录 volumes: - ../data/redis:/data # 暴露 Redis 默认端口 ports: - 6379:6379 # 重启策略 restart: always # Nginx 服务作为反向代理和静态资源服务器 nginx: image: nginx:alpine # 将宿主机的 nginx.conf 配置文件挂载到容器内 volumes: - ../config/nginx.conf:/etc/nginx/nginx.conf:ro - ../frontend/build:/usr/share/nginx/html:ro # 暴露 HTTP 和 HTTPS 端口 ports: - 80:80 - 443:443 # 依赖关系nginx 启动前core 服务必须已就绪 depends_on: - core # 重启策略 restart: always这个docker-compose.yml文件定义了三个服务它们共同构成了一个最小可行的 OpenClaw 生产环境。其中nginx服务的配置文件nginx.conf需要你手动创建。它负责将所有对/api/的请求转发给core服务而将其他请求如/交给前端静态文件处理。实操心得第一次部署时我建议你先注释掉nginx服务只启动core和redis。用curl http://localhost:8000/health直接测试 Core 的健康状态。等这一步确认无误后再加入nginx。这是一种经典的“分层验证”思想能极大降低排错难度。3.3 Skill Registry 的初始化与持久化让“黄页”活起来一个没有技能的 OpenClaw就像一个没有乐手的指挥台毫无意义。因此初始化 Skill Registry 是部署过程中承上启下的关键一环。第一步创建初始的skills.json文件Skill Registry 的默认类型是file这意味着它会读取一个 JSON 文件。我们需要手动创建这个文件并赋予它一个合法的、空的结构。# 创建 data 目录如果不存在 mkdir -p ~/openclaw-deploy/data # 创建初始的 skills.json 文件 cat ~/openclaw-deploy/data/skills.json EOF { version: 1.0, skills: [] } EOF # 设置文件权限 chmod 644 ~/openclaw-deploy/data/skills.json这个文件的结构非常简单一个version字段标识格式版本一个空的skills数组。skills数组里的每一个对象就代表一个注册成功的技能。第二步手动注册一个“Hello World”技能为了验证 Registry 是否工作正常我们先不急着写复杂的技能而是用一个最简单的 HTTP 请求向 Registry 注册一个“占位符”技能。首先我们需要一个skill.yaml文件它描述了这个技能的元数据# 在 skills 目录下创建一个示例技能 mkdir -p ~/openclaw-deploy/skills/hello-world cat ~/openclaw-deploy/skills/hello-world/skill.yaml EOF name: hello_world description: A simple skill that returns a greeting. input_schema: type: object properties: name: type: string description: The name of the person to greet. required: [name] output_schema: type: object properties: message: type: string description: The greeting message. required: [message] endpoint: http://hello-world:8000/invoke health_endpoint: http://hello-world:8000/health EOF然后我们用curl命令将这个skill.yaml的内容 POST 到 Core Runtime 的注册接口# 启动 core 服务在另一个终端窗口中 cd ~/openclaw-deploy/core docker compose up core redis # 等待 core 服务启动完成看到 Uvicorn running on... 日志 # 在另一个终端中执行注册命令 curl -X POST http://localhost:8000/api/v1/skills/register \ -H Content-Type: application/yaml \ --data-binary ~/openclaw-deploy/skills/hello-world/skill.yaml如果注册成功你会收到一个201 Created的响应。此时再查看skills.json文件你会发现它已经被更新里面多了一个hello_world的条目。第三步理解endpoint和health_endpoint的含义这是新手最容易混淆的地方。endpoint不是指你本地的http://localhost:8000而是指在 Docker 网络内部Core Runtime 如何访问这个技能服务。在上面的例子中endpoint: http://hello-world:8000/invoke的意思是当 Core Runtime 需要调用这个技能时它会向自己 Docker 网络内的hello-world这个服务名DNS 名发起 HTTP 请求。因此你必须在docker-compose.yml中为这个hello-world服务也定义一个条目或者确保它已经作为一个独立的服务运行在同一个 Docker 网络中。注意这就是为什么 OpenClaw 的部署强调“网络拓扑”的概念。所有服务必须在同一个 Docker 网络默认是bridge中才能通过服务名互相发现。如果你把技能服务部署在另一台物理机上那么endpoint就应该填写那台机器的真实 IP 地址比如http://192.168.1.100:8000/invoke。4. 实操过程与核心环节实现从启动到调试的全流程4.1 启动与验证看到第一个200 OK现在我们把所有拼图放在一起执行最终的启动命令。# 确保你在 core 目录下 cd ~/openclaw-deploy/core # 启动所有服务core, redis, nginx docker compose up -d # 查看服务状态 docker compose ps # 你应该看到 core, redis, nginx 三个服务的状态都是 running启动完成后我们进行一系列的验证确保每一层都工作正常验证 1Core Runtime 的健康状态curl http://localhost:8000/health # 期望输出{status: ok, timestamp: ...}验证 2Redis 的连接状态# 进入 redis 容器 docker compose exec redis redis-cli # 在 redis-cli 中执行 ping 命令 127.0.0.1:6379 ping # 期望输出PONG验证 3Nginx 的反向代理# 访问 Nginx 的根路径应该返回 404因为还没有前端 curl -I http://localhost/ # 期望输出HTTP/1.1 404 Not Found # 访问 API 路径应该被正确代理到 core curl -I http://localhost/api/v1/health # 期望输出HTTP/1.1 200 OK验证 4Skill Registry 的内容# 查看 skills.json 文件是否已被更新 cat ~/openclaw-deploy/data/skills.json | jq .skills | length # 期望输出1 因为我们注册了一个技能这四个验证点构成了一个完整的“健康检查清单”。任何一个失败都意味着你的部署流程在某个环节出现了偏差。此时你应该立即停止查看对应服务的日志# 查看 core 服务的日志 docker compose logs core # 查看 nginx 服务的日志 docker compose logs nginx日志是你的第一手情报来源。不要试图凭空猜测而是让日志告诉你真相。4.2 编写并接入第一个真实技能一个天气查询服务理论终归要落地。现在我们来编写一个真正有用的技能一个查询城市天气的 Python 服务。第一步创建技能项目结构# 创建技能目录 mkdir -p ~/openclaw-deploy/skills/weather # 初始化一个 Python 项目 cd ~/openclaw-deploy/skills/weather python3 -m venv .venv source .venv/bin/activate pip install fastapi uvicorn requests第二步编写技能的主程序main.py# 文件~/openclaw-deploy/skills/weather/main.py from fastapi import FastAPI, HTTPException import requests import os app FastAPI(titleWeather Skill) # 从环境变量读取天气 API 的密钥 WEATHER_API_KEY os.getenv(WEATHER_API_KEY, your-api-key-here) app.get(/health) def health(): return {status: ok} app.post(/invoke) def invoke(city: str): 查询指定城市的天气。 :param city: 城市名称例如 Beijing :return: 包含天气信息的 JSON 对象 try: # 调用第三方天气 API此处使用 OpenWeatherMap 的免费 API url fhttp://api.openweathermap.org/data/2.5/weather?q{city}appid{WEATHER_API_KEY}unitsmetric response requests.get(url, timeout10) response.raise_for_status() data response.json() return { city: data[name], temperature: data[main][temp], weather: data[weather][0][description], humidity: data[main][humidity] } except requests.exceptions.RequestException as e: raise HTTPException(status_code500, detailfFailed to fetch weather: {str(e)}) except KeyError as e: raise HTTPException(status_code500, detailfInvalid response from weather API: {str(e)})第三步创建技能的skill.yaml描述文件# 文件~/openclaw-deploy/skills/weather/skill.yaml name: get_weather description: Get current weather information for a given city. input_schema: type: object properties: city: type: string description: The name of the city, e.g., Shanghai. required: [city] output_schema: type: object properties: city: type: string description: The name of the city. temperature: type: number description: Current temperature in Celsius. weather: type: string description: Weather condition description. humidity: type: integer description: Humidity percentage. required: [city, temperature, weather, humidity] endpoint: http://weather:8000/invoke health_endpoint: http://weather:8000/health第四步为技能服务编写docker-compose.yml为了让这个技能能被 Core Runtime 发现我们需要把它也作为一个 Docker 服务启动并确保它和 Core 在同一个网络中。# 文件~/openclaw-deploy/skills/weather/docker-compose.yml version: 3.8 services: weather: # 构建上下文是当前目录. build: context: . dockerfile: Dockerfile # 环境变量传入天气 API 密钥 environment: - WEATHER_API_KEYyour_actual_api_key_here # 暴露端口 ports: - 8001:8000 # 服务名必须和 skill.yaml 中的 endpoint 一致 container_name: weather # 重启策略 restart: always第五步编写技能的Dockerfile# 文件~/openclaw-deploy/skills/weather/Dockerfile FROM python:3.11-slim WORKDIR /app # 复制 requirements.txt 并安装依赖为了分层缓存 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口 EXPOSE 8000 # 启动命令 CMD [uvicorn, main:app, --host, 0.0.0.0:8000, --port, 8000, --reload]第六步启动技能服务并注册# 在 weather 目录下启动技能服务 cd ~/openclaw-deploy/skills/weather docker compose up -d # 等待服务启动后向 Core Registry 注册 curl -X POST http://localhost:8000/api/v1/skills/register \ -H Content-Type: application/yaml \ --data-binary skill.yaml第七步调用技能进行最终测试现在一切就绪。我们可以向 Core Runtime 发送一个请求让它调度这个新注册的天气技能# 发送一个 JSON 请求体调用 get_weather 技能 curl -X POST http://localhost:8000/api/v1/tasks/submit \ -H Content-Type: application/json \ -d { skill_name: get_weather, input: {city: Shanghai} }如果一切顺利你将收到一个包含上海实时天气信息的 JSON 响应。恭喜你你已经成功完成了 OpenClaw 的首次端到端部署与技能接入4.3 日志与监控让系统“会说话”一个健康的系统必须是“可观测”的。OpenClaw 提供了多层次的日志输出你需要学会如何利用它们。Core Runtime 的日志Core 的日志文件被挂载到了~/openclaw-deploy/logs/core.log。你可以用tail -f实时追踪tail -f ~/openclaw-deploy/logs/core.log当你提交一个任务时日志中会清晰地记录下任务被接收的时间戳技能被解析和匹配的过程向技能服务发起 HTTP 调用的详细信息URL、状态码、耗时任务执行完成后的结果摘要Nginx 的访问日志Nginx 的访问日志默认输出到容器的标准输出你可以通过docker compose logs nginx查看。它记录了每一个 HTTP 请求的来源 IP、请求路径、状态码、响应大小和耗时。这是分析 API 调用模式、发现异常流量的第一手资料。Redis 的慢查询日志对于一个高并发的 Agent 系统Redis 的性能至关重要。你可以通过以下命令开启 Redis 的慢查询日志并设置阈值为 10 毫秒# 进入 redis 容器 docker compose exec redis redis-cli # 设置慢查询日志阈值单位微秒 127.0.0.1:6379 CONFIG SET slowlog-log-slower-than 10000 # 设置慢查询日志最大保存条数 127.0.0.1:6379 CONFIG SET slowlog-max-len 128 # 查看最近的慢查询 127.0.0.1:6379 SLOWLOG GET 10实操心得在生产环境中我习惯在