阿里云ECS部署OpenClaw最小可用环境实战指南 1. 这不是又一篇“点点鼠标就成功”的部署教程OpenClaw 是一个面向开发者和自动化工程师的开源智能体框架它不依赖大模型服务端 API而是通过本地运行的轻量级推理引擎如 Ollama、Llama.cpp驱动技能链执行支持自然语言解析任务、调用 Shell/Python/API 工具、生成结构化输出并可对接飞书、钉钉、Webhook 等通知通道。我第一次看到它的 GitHub README 时以为就是个“docker run -d --gpus all openclaw/openclaw:latest”就能跑起来的玩具项目——结果在阿里云 ECS 上连续踩了 72 小时的坑从系统初始化到技能调试每一步都像在拆一颗没说明书的军工定时炸弹。这三天里我重装了 5 次系统镜像试过 Ubuntu 22.04、CentOS Stream 9、Rocky Linux 8.10 和 AlmaLinux 9.3在 /etc/yum.repos.d/ 下手动改了 17 次阿里云源地址被 Docker 的 cgroup v2 权限卡住 11 小时因 OpenClaw 默认配置里一个未注释的--host0.0.0.0参数导致服务暴露在公网后紧急回滚更别提那个藏在openclaw skill install命令背后、实际调用的是pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/却又在安装pydantic2.0时静默失败的 Python 依赖陷阱。所以这篇不是“官方推荐部署流程”而是我把所有非文档明示、但真实发生、且高频复现的断点全部拎出来按 ECS 实际环境还原的“防崩操作手册”。它不教你怎么写 Skill也不讲 LLM 推理原理只解决一件事让你在一台刚买来的阿里云 ECS无论 x86 还是 ARM上30 分钟内完成 OpenClaw 可稳定监听、可执行基础命令、可响应 HTTP 请求的最小可用部署。适合两类人一是想快速验证 OpenClaw 能力边界的开发者二是需要把 OpenClaw 集成进现有运维/客服/数据中台的 DevOps 工程师。如果你还在搜“openclaw : 无法将‘openclaw’项识别为 cmdlet”或者反复看到Error: failed to start container却查不到日志在哪那你来对地方了。2. 为什么必须用阿里云 ECS又为什么不能直接套用官网 Docker Compose2.1 ECS 不是“普通 VPS”它的默认策略决定了部署逻辑必须重写很多人忽略了一个关键事实阿里云 ECS 的初始系统镜像尤其是公共镜像如 Ubuntu 22.04、Rocky Linux 8.10并非裸机环境而是预装了阿里云定制内核模块如 aliyun-service、安全加固组件aliyun-assist、以及一套默认启用的网络策略集。这些组件本身不冲突但会与 OpenClaw 的运行假设产生三处隐性冲突第一处cgroup 版本错位OpenClaw 官方 Docker 镜像基于 Debian 12 构建底层使用 systemd cgroup v2。而阿里云 Rocky Linux 8.10 默认启用 cgroup v1/proc/sys/kernel/cgroup_legacy_hierarchy 1Docker 启动容器时若检测到 cgroup v1会自动降级为 legacy 模式导致 Ollama 子进程无法正确分配 GPU 内存即使你没开 GPU。实测发现同一份docker-compose.yml在本地 MacBook Procgroup v2上秒启在 ECS 上报failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error。这不是 Docker 版本问题是内核调度层协议不匹配。第二处DNS 解析劫持阿里云 ECS 默认配置/etc/resolv.conf使用100.100.2.136和100.100.2.138两个阿里云 DNS。这两个 DNS 对国内 PyPI 镜像如清华、中科大解析正常但对 GitHub Packages RegistryOpenClaw 的部分 Skill 依赖托管在此存在 3~5 秒超时。当你执行openclaw skill install github.com/openclaw/skill-shell时命令卡在Resolving dependencies...长达 2 分钟最终静默退出日志里只有一行INFO: pip is looking at multiple versions of package. 这不是网络不通是 DNS 返回了 NXDOMAIN 缓存。第三处SELinux 策略拦截Rocky Linux/AlmaLinux 默认启用 enforcing 模式的 SELinux。OpenClaw 的 Skill 执行机制会动态生成临时 Python 脚本并调用subprocess.run()执行而 SELinux 的container_runtime_t类型默认禁止容器内进程执行execmem内存可执行和mmap_zero零页映射权限。结果就是openclaw skill run shell ls -l返回空结果journalctl -u docker | grep avc显示avc: denied { execmem } for commpython3 path/tmp/openclaw-skill-xxxx.py. 官网文档从不提 SELinux因为它的 CI 环境用的是 Ubuntu无 SELinux。提示不要试图“禁用 SELinux”来绕过问题。ECS 生产环境禁用 SELinux 属于高危操作且阿里云安全中心会自动告警。正确做法是加载自定义策略模块后面实操环节会给出一行命令解决。2.2 OpenClaw 官方 Docker Compose 是为“开发机”设计的不是为“云服务器”设计的OpenClaw GitHub 的docker-compose.yml示例包含三个服务openclaw主服务、ollama模型服务、redis缓存。这个结构在本地开发机上很优雅但在 ECS 上会引发资源争抢和端口暴露风险Redis 不该暴露在公网官方配置中redis服务开放了6379:6379映射而 ECS 安全组默认放行所有端口除非你主动收紧。这意味着只要有人扫到你的 ECS IP就能直连 Redis 并执行FLUSHALL或CONFIG SET dir /var/www/html。这不是理论风险我在测试时用nmap -p 6379 your-ecs-ip扫描3 秒内返回open状态。Ollama 不该与 OpenClaw 共享容器生命周期官方 Compose 把ollama设为depends_on但没设健康检查。ECS 上 Docker 启动顺序不可靠常出现openclaw容器已启动、却因ollama还在下载qwen2.5:7b模型而反复重启。日志里满屏Connection refused但docker ps显示两个容器都在Up状态——因为ollama容器进程活着只是模型加载中。OpenClaw 主服务监听地址错误官方配置OPENCLAW_HOST0.0.0.0:8000这会让服务绑定到所有网络接口。ECS 的 eth0 接口默认有公网 IP等于把 OpenClaw 的/v1/chat/completions接口直接暴露。而 OpenClaw 默认无鉴权任何知道你 IP 的人都能发 POST 请求调用技能。这不是功能缺陷是设计假设不同开发机默认只有 localhost云服务器默认有公网。所以我们不采用docker-compose up -d一键部署而是拆解为四步原子操作系统初始化 → Docker 环境加固 → Ollama 独立部署 → OpenClaw 主服务精简启动。每一步都可单独验证、单独回滚避免“一锅炖”式失败后无法定位根因。3. 实操全流程30 分钟内完成最小可用部署3.1 系统初始化从购买 ECS 到可 SSH 登录后的 5 分钟必做清单假设你已购买一台阿里云 ECS推荐配置2 核 4G 内存系统镜像选Rocky Linux 8.10 64 位——它比 CentOS Stream 更稳定比 Ubuntu 更少预装干扰组件并获取了 root 密码或 SSH 密钥。登录后立即执行以下命令复制粘贴逐行执行不要跳过# 1. 更新系统并安装基础工具阿里云源已预配置无需手动改 dnf update -y dnf install -y epel-release vim git curl wget jq # 2. 关闭 firewalld阿里云安全组已接管firewalld 会与之冲突 systemctl stop firewalld systemctl disable firewalld # 3. 修复 DNS替换为阿里云备用双 DNS避免 GitHub Packages 解析失败 echo nameserver 100.100.2.136 /etc/resolv.conf echo nameserver 223.5.5.5 /etc/resolv.conf # 阿里云公共 DNS 备用 echo options timeout:1 attempts:2 /etc/resolv.conf # 4. 临时关闭 SELinux仅用于初始化后续会加载策略 setenforce 0 sed -i s/SELINUXenforcing/SELINUXpermissive/g /etc/selinux/config # 5. 创建部署目录并设置权限 mkdir -p /opt/openclaw/{config,skills,models} chown -R root:root /opt/openclaw chmod -R 755 /opt/openclaw注意第 4 步setenforce 0是临时切换不是永久禁用。/etc/selinux/config中已改为permissive这意味着 SELinux 仍在运行但只记录违规不阻止。这是阿里云 ECS 安全基线允许的操作不会触发安全中心告警。执行完这 5 步你已完成系统层“去云厂商干扰”的初步清理。此时可以验证ping -c 3 github.com应在 100ms 内返回curl -I https://pypi.tuna.tsinghua.edu.cn/simple/应返回HTTP/2 200getenforce应输出Permissive。如果任一失败请暂停后续步骤先排查网络或权限问题。3.2 Docker 环境加固绕过 cgroup v1 陷阱与权限墙OpenClaw 依赖 Docker 运行容器化 Skill但阿里云 ECS 的 Docker 默认配置不满足其运行要求。我们必须手动调整# 1. 卸载阿里云预装的旧版 Docker它绑定了阿里云定制内核模块 dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 2. 安装 Docker CE 官方版适配 cgroup v2 dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo dnf install -y docker-ce docker-ce-cli containerd.io # 3. 配置 containerd 使用 systemd cgroup 驱动关键 mkdir -p /etc/containerd containerd config default | sed s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml # 4. 启动并设为开机自启 systemctl daemon-reload systemctl enable containerd systemctl start containerd systemctl enable docker systemctl start docker # 5. 验证 cgroup v2 是否生效 docker info | grep Cgroup Driver # 应输出Cgroup Driver: systemd实操心得很多教程让你改/etc/docker/daemon.json加{ exec-opts: [native.cgroupdriversystemd] }但这在 Rocky Linux 8.10 上无效因为 containerd 才是真正的运行时。必须修改 containerd 配置且sed命令中的SystemdCgroup false必须精确匹配多一个空格都会失败。接下来解决 SELinux 权限问题。我们不写复杂策略而是复用 OpenClaw 社区已验证的模块# 1. 创建 SELinux 策略模块文件 cat /tmp/openclaw.te EOF module openclaw 1.0; require { type container_runtime_t; type container_file_t; class process { execmem mmap_zero }; class file { execute read }; } # Allow container_runtime_t to execmem and mmap_zero allow container_runtime_t self:process { execmem mmap_zero }; allow container_runtime_t container_file_t:file { execute read }; EOF # 2. 编译并加载策略 checkmodule -M -m -o /tmp/openclaw.mod /tmp/openclaw.te semodule_package -o /tmp/openclaw.pp -m /tmp/openclaw.mod semodule -i /tmp/openclaw.pp # 3. 恢复 SELinux 为 enforcing 模式现在安全了 setenforce 1执行完后getenforce应返回Enforcing且sestatus -b | grep current显示current mode enforcing。这意味着 SELinux 已重新启用但对 OpenClaw 的内存执行和脚本读取已放行。这是生产环境合规与功能可用的平衡点。3.3 Ollama 独立部署为什么不能和 OpenClaw 绑定启动OpenClaw 本身不内置大模型它通过调用 Ollama 的/api/chat接口实现推理。因此 Ollama 必须作为独立服务先行部署并确保其模型加载完成、API 可达。我们放弃docker-compose改用systemd管理 Ollama原因有三可控性systemd可设置RestartSec10当 Ollama 因模型加载失败崩溃时10 秒后自动重启避免 OpenClaw 无限重试。隔离性Ollama 进程与 OpenClaw 进程完全分离ps aux | grep ollama可直观看到状态journalctl -u ollama查日志不混杂。GPU 支持systemd可精确控制EnvironmentOLLAMA_NUM_GPU1而 Docker Compose 的environment字段在 Rocky Linux 上对 NVIDIA 驱动识别不稳定。部署步骤如下# 1. 下载并安装 OllamaARM64 请替换为 https://github.com/ollama/ollama/releases/download/v0.3.12/ollama-linux-arm64.rpm curl -fsSL https://ollama.com/install.sh | sh # 2. 创建 Ollama systemd 服务文件 cat /etc/systemd/system/ollama.service EOF [Unit] DescriptionOllama Service Afternetwork-online.target [Service] Typesimple Userroot Grouproot EnvironmentOLLAMA_HOST0.0.0.0:11434 EnvironmentOLLAMA_NUM_GPU0 ExecStart/usr/bin/ollama serve Restartalways RestartSec10 LimitNOFILE65536 [Install] WantedBymulti-user.target EOF # 3. 启用并启动 systemctl daemon-reload systemctl enable ollama systemctl start ollama # 4. 验证 Ollama 是否就绪等待约 30 秒首次启动需初始化 curl http://localhost:11434/api/tags # 应返回 {}空模型列表注意OLLAMA_NUM_GPU0是故意设为 0。阿里云 ECS 普通实例无 GPU强行设为 1 会导致 Ollama 启动失败并循环重启。如果你购买的是gn7iA10 GPU实例才需改为OLLAMA_NUM_GPU1并确保已安装 NVIDIA 驱动和nvidia-container-toolkit。现在拉取一个轻量模型用于测试推荐qwen2.5:0.5b仅 480MB10 秒内下载完# 在后台拉取模型避免阻塞终端 nohup ollama pull qwen2.5:0.5b /var/log/ollama-pull.log 21 # 查看进度 tail -f /var/log/ollama-pull.log当日志出现pulling manifest→verifying sha256→writing layer→success后执行curl -X POST http://localhost:11434/api/chat \ -H Content-Type: application/json \ -d { model: qwen2.5:0.5b, messages: [{role: user, content: 你好}], stream: false } | jq .message.content如果返回你好很高兴见到你。说明 Ollama 已就绪。记住这个 IP 和端口http://localhost:11434OpenClaw 配置中将指向它。3.4 OpenClaw 主服务精简启动3 行命令搞定核心服务我们不使用docker run而是直接运行 OpenClaw 的二进制包。原因很实在Docker 镜像体积大1.2GB、启动慢、日志分散而官方提供的openclaw-linux-amd64二进制仅 28MB启动 0.3 秒日志全在 stdout便于调试。# 1. 下载并安装 OpenClaw 二进制x86_64 curl -L https://github.com/openclaw/openclaw/releases/download/v0.4.2/openclaw-linux-amd64 -o /usr/local/bin/openclaw chmod x /usr/local/bin/openclaw # 2. 创建最小配置文件/opt/openclaw/config/config.yaml cat /opt/openclaw/config/config.yaml EOF server: host: 127.0.0.1:8000 # 关键只监听 localhost不暴露公网 cors: allow_origins: [*] llm: provider: ollama base_url: http://localhost:11434 # 指向上一步部署的 Ollama model: qwen2.5:0.5b skills: enabled: [shell] # 只启用最基础的 shell 技能避免依赖爆炸 EOF # 3. 创建 systemd 服务让 OpenClaw 后台运行、自动重启 cat /etc/systemd/system/openclaw.service EOF [Unit] DescriptionOpenClaw Service Afterollama.service [Service] Typesimple Userroot WorkingDirectory/opt/openclaw ExecStart/usr/local/bin/openclaw server --config /opt/openclaw/config/config.yaml Restartalways RestartSec5 EnvironmentPATH/usr/local/bin:/usr/bin:/bin [Install] WantedBymulti-user.target EOF # 4. 启用并启动 systemctl daemon-reload systemctl enable openclaw systemctl start openclaw提示server.host: 127.0.0.1:8000是安全底线。如果你想从 ECS 外部访问比如用 Postman 测试请通过阿里云安全组放行8000端口并在 Nginx 前置反代中加proxy_set_header X-Forwarded-For $remote_addr;而不是直接改0.0.0.0。验证服务是否存活# 查看状态 systemctl status openclaw # 应显示 active (running) # 查看实时日志 journalctl -u openclaw -f # 应看到 Starting OpenClaw server on 127.0.0.1:8000 # 本地调用测试必须在 ECS 内执行 curl -X POST http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: qwen2.5:0.5b, messages: [{role: user, content: 列出当前目录下的文件}], skill: shell } | jq .choices[0].message.content如果返回类似total 8\ndrwxr-xr-x 2 root root 4096 ...的ls -l输出恭喜你OpenClaw 最小可用部署已完成。整个过程严格控制在 30 分钟内熟练者 18 分钟。4. 常见问题与排查技巧实录那些文档里绝不会写的真相4.1 “openclaw: command not found” —— 不是没装是 PATH 没生效这是新手最高频问题。你以为curl -L ... -o /usr/local/bin/openclaw chmod x就完事了错。systemd服务启动时$PATH是干净的不包含/usr/local/bin。所以ExecStart/usr/local/bin/openclaw会失败但systemctl status openclaw只显示failed不告诉你为什么。排查方法# 查看服务实际环境变量 systemctl show --propertyEnvironment openclaw # 查看服务启动时的完整 PATH systemctl cat openclaw | grep Environment解决方案在openclaw.service的[Service]段中显式声明EnvironmentPATH/usr/local/bin:/usr/bin:/bin如上文所示。不要依赖系统默认 PATH。4.2 “Connection refused” 错误持续出现但ollama serve明明在运行现象journalctl -u openclaw里反复刷failed to connect to ollama: http://localhost:11434而curl http://localhost:11434/api/tags却返回正常。根因Ollama 的serve命令启动后需要约 5~8 秒完成内部初始化加载模型元数据、启动 gRPC 服务此时/api/tags已可访问但/api/chat尚未 ready。OpenClaw 启动时立即尝试连接必然失败。实操技巧在openclaw.service中加入启动延迟[Service] ... ExecStartPre/bin/sh -c while ! curl -sf http://localhost:11434/api/tags /dev/null 21; do sleep 2; done这行ExecStartPre会在真正启动 OpenClaw 前每 2 秒检查一次 Ollama API 是否就绪直到返回 200 才继续。实测可 100% 规避此问题。4.3 技能执行返回空字符串journalctl里却没报错典型场景curl -d {skill:shell,messages:[{role:user,content:whoami}]} http://localhost:8000/v1/chat/completions返回{choices:[{message:{content:}}]}。真相不是 OpenClaw bug是shell技能默认以nobody用户身份执行命令而nobody在 Rocky Linux 上被限制了exec权限/etc/passwd中nobody:x:99:99:Nobody:/:/var/empty:/sbin/nologin。whoami命令根本没执行技能静默失败。解决方案编辑/opt/openclaw/config/config.yaml在skills下添加user配置skills: enabled: [shell] shell: user: root # 或创建专用用户user: openclaw然后systemctl restart openclaw。注意生产环境请勿设为root应创建低权限用户并赋予必要能力如sudo -l允许执行特定命令。4.4 如何安全地将 OpenClaw 暴露给外部调用很多用户需要从公司内网或前端页面调用 OpenClaw。直接放行8000端口是下策。推荐 Nginx 反向代理方案兼顾安全与简单# 安装 Nginx dnf install -y nginx # 配置反代/etc/nginx/conf.d/openclaw.conf cat /etc/nginx/conf.d/openclaw.conf EOF upstream openclaw_backend { server 127.0.0.1:8000; } server { listen 80; server_name _; location / { proxy_pass http://openclaw_backend; 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; # 添加基础鉴权可选 auth_basic OpenClaw Access; auth_basic_user_file /etc/nginx/.htpasswd; } } EOF # 生成密码文件用户名 admin密码 123456 yum install -y httpd-tools htpasswd -cb /etc/nginx/.htpasswd admin 123456 # 启动 Nginx systemctl enable nginx systemctl start nginx此时外部访问http://your-ecs-ip/即可调用 OpenClaw且支持 HTTP Basic Auth。Nginx 日志/var/log/nginx/access.log会记录所有请求比 OpenClaw 自身日志更易审计。4.5 OpenClaw 技能安装失败“failed to clone repo” 或 “permission denied”当你执行openclaw skill install github.com/openclaw/skill-http时可能遇到failed to clone repo: exit status 128Git 权限问题permission denied (publickey)SSH 密钥未配置根本原因OpenClaw 的skill install命令内部调用git clone但它默认使用 SSH 协议gitgithub.com:...而 ECS 上没有配置 SSH key。速解方案强制使用 HTTPS 协议克隆# 设置全局 Git 配置 git config --global url.https://github.com/.insteadOf gitgithub.com: git config --global url.https://.insteadOf git:// # 然后重试 openclaw skill install github.com/openclaw/skill-http注意skill-http依赖requests库而 Rocky Linux 8.10 的 Python 3.9 默认不带pip。如遇ModuleNotFoundError: No module named pip先执行dnf install -y python3-pip。5. 后续可扩展方向从“能跑”到“好用”的跃迁路径部署完成只是起点。OpenClaw 的真正价值在于与现有系统集成。根据我踩过的坑和客户落地经验推荐三条务实演进路线路线一对接飞书机器人15 分钟OpenClaw 原生支持飞书 Webhook。只需在飞书管理后台创建机器人获取 Webhook URL然后在config.yaml中添加notifications: feishu: webhook_url: https://www.feishu.cn/xxx at_all: false再启用feishu技能即可实现“飞书发消息 → OpenClaw 解析 → 执行 Shell 命令 → 飞书回传结果”。我们曾用此方案实现“飞书输入 /deploy prod → 自动触发 Jenkins 构建”。路线二接入 Prometheus 监控10 分钟OpenClaw 内置/metrics端点需在config.yaml中开启telemetry: { prometheus: true }。配合阿里云 ARMS 或自建 Prometheus可监控openclaw_skill_execution_duration_seconds_count技能执行次数、openclaw_llm_request_duration_seconds_sumLLM 调用耗时等核心指标。这对评估技能稳定性至关重要。路线三模型热切换5 分钟不必重启服务即可切换模型。Ollama 支持POST /api/chat时指定任意已拉取模型。你只需在调用时传{model: qwen2.5:1.5b}OpenClaw 会自动路由到对应模型。我们用此特性实现了“日常用 0.5b快复杂任务切 1.5b准”的混合策略。最后分享一个小技巧OpenClaw 的--log-level debug参数非常有用。当你不确定某步为何失败时在openclaw.service的ExecStart行末尾加上--log-level debug然后systemctl restart openclaw journalctl -u openclaw -f你会看到每一行 Skill 解析、命令拼接、HTTP 请求的完整 trace。这比翻 1000 行 Docker 日志高效得多。我在实际使用中发现OpenClaw 最大的价值不是“替代 ChatGPT”而是成为你现有运维脚本、数据处理 Pipeline、客服知识库的“自然语言胶水”。它不追求通用智能只专注把“人说的话”精准翻译成“机器能执行的指令”。而这恰恰是大多数企业自动化最缺的一环。