1. 为什么我放弃 Docker在 Linux 裸机上部署 OpenClawOpenClaw 是一个带实时控制面板的 AI 工具服务端能对接大模型通道、跑任务流、暴露 WebSocket 日志面板。官方给了 Docker 镜像一条docker run就能起来但我这次偏不用 Docker——原因很直接OpenClaw 跑起来之后对宿主机网络 I/O 和文件句柄的占用比较激进多一层容器网络转发WebSocket 偶发断流排查起来会多一层变量。裸机部署虽然配环境麻烦点但出问题的时候journalctl一看就知道是谁的锅。这篇教程面向的是手上有一台干净的 Ubuntu 22.04 服务器2 核 4G 就够跑通想用 systemd 把 OpenClaw 做成开机自启的守护服务前面挂 Nginx 做反向代理并且通过 TaoToken 统一管理模型 Key 和 API 通道的人。全程非 Docker命令可直接复制。我会把 systemd unit、Nginx server 块、config.toml 骨架都贴出来最后用systemctl status和curl两个动作确认服务真的活了、通道真的通了。环境交代一下Ubuntu 22.04 LTS 纯净版root 权限操作OpenClaw 装在/opt/openclaw服务监听127.0.0.1:8000。你的路径和端口可以不一样改的时候对应着改就行。2. 前置准备TaoToken 通道与 Key 的获取OpenClaw 本身是个壳真正干活的是背后接的模型通道。如果你直接往 config 里塞各家厂商的原始 Key后面换模型、加通道、做限额都得改配置文件很烦。我这次用 TaoToken 做统一入口一个 Key 走所有模型config.toml 里只写一个 base_url 和一个 api_key换模型只改模型名。操作路径是这样的打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册登录后进控制台。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在里面能看到余额、用量和通道状态。然后去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 创建一个 Key复制出来存好这个就是待会儿要填进 config.toml 的api_key。API 的基础地址是https://taotoken.net/api注意这个地址后面不加任何 UTM 参数直接写进配置就行。如果你后面要跑长期编码任务或者 Agent 类的持续调用可以看一下 Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 按套餐走比按量计费更可控。想先在网页上验证模型通不通可以用模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 发一条消息试试确认 Key 有效再往下走。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面写了兼容 OpenAI 格式的调用方式OpenClaw 的 config 就是按这个格式填的。如果你用的是 Claude Code 那套 Anthropic 协议参考 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 里的说明base_url 和 header 写法略有不同别混用。3. 基础环境与 OpenClaw 代码拉取先把系统包更新装好编译工具。OpenClaw 依赖 Python 3.10Ubuntu 22.04 自带的就是 3.10省了编译 Python 的功夫。但 pip 装某些 C 扩展的时候会调 gcc所以 build-essential 这些必须提前装不然报错能烦死你。apt update apt upgrade -y apt install -y git curl python3-venv python3-dev build-essential libssl-dev libffi-dev nginx代码放/opt下面建虚拟环境别直接往系统 Python 里装cd /opt git clone https://github.com/openclaw-project/openclaw.git cd openclaw python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt依赖装完后先别急着跑配置文件还没写。OpenClaw 默认读config/config.toml我们直接手写一份把 TaoToken 的通道填进去。3.1 config.toml 骨架在/opt/openclaw/config/下新建config.toml内容如下。注意base_url写 TaoToken 的 API 地址api_key填你刚才创建的那个 Keymodel按你实际要用的模型名填[server] host 127.0.0.1 port 8000 log_level info [llm] provider openai-compatible base_url https://taotoken.net/api api_key sk-你的TaoToken密钥 model gpt-4o-mini timeout 120 max_retries 3 [storage] data_dir ./data config_dir ./config [websocket] enabled true path /ws heartbeat_interval 30这里有个细节base_url结尾不要带/v1OpenClaw 内部会自己拼/v1/chat/completions。如果你填成https://taotoken.net/api/v1请求路径会变成/api/v1/v1/chat/completions直接 404。这个坑我踩过排查了半天。4. systemd 服务单元让 OpenClaw 开机自启直接在终端python main.py start跑SSH 一断进程就没了。必须挂到 systemd 里。新建/etc/systemd/system/openclaw.service[Unit] DescriptionOpenClaw Service Afternetwork.target [Service] Typesimple WorkingDirectory/opt/openclaw ExecStart/opt/openclaw/venv/bin/python main.py start Restartalways RestartSec5 Userroot LimitNOFILE65536 EnvironmentPYTHONUNBUFFERED1 [Install] WantedBymulti-user.targetWorkingDirectory这行是关键。systemd 启动服务时默认工作目录是/而 OpenClaw 代码里用相对路径读./config/config.toml不指定工作目录就会报FileNotFoundError。我第一次部署就是漏了这行状态红彤彤的failedjournalctl -xeu openclaw.service一看才知道是路径问题。LimitNOFILE65536是防止 WebSocket 连接多了之后文件句柄不够用。Restartalways配合RestartSec5保证进程崩了 5 秒后自动拉起。写完重载并启动systemctl daemon-reload systemctl enable openclaw systemctl start openclaw systemctl status openclaw看到Active: active (running)就对了。如果还是 failed直接看日志journalctl -xeu openclaw.service -n 505. Nginx 反向代理WebSocket 必须加的两行后端跑在127.0.0.1:8000对外得走 Nginx。新建/etc/nginx/sites-available/openclawserver { 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_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } }proxy_http_version 1.1、Upgrade、Connection upgrade这三行是 WebSocket 的命门。Nginx 默认用 HTTP/1.0 转发不带 Upgrade 头后端的 WS 握手直接失败面板上的实时日志会一直转圈然后 502。我第一次配的时候只写了普通 proxy_pass页面能打开但日志面板死活不刷新F12 一看 WS 连接 101 失败加上这三行就好了。proxy_read_timeout 3600s是防止 WS 连接空闲一会儿就被 Nginx 掐断。默认 60 秒实时面板如果没数据推送就会被踢体验很差。启用配置并重载ln -s /etc/nginx/sites-available/openclaw /etc/nginx/sites-enabled/ nginx -t systemctl reload nginxnginx -t必须返回syntax is ok和test is successful才能 reload不然配置有语法错误会导致 Nginx 起不来。6. 验证请求curl 确认通道真的通了服务状态是 running 不代表模型通道能用。分两步验证。第一步确认 OpenClaw 本地端口在监听curl -s http://127.0.0.1:8000/health返回{status:ok}之类的 JSON 就说明服务本身活着。第二步确认 TaoToken 通道能通。直接用 curl 打 TaoToken 的 API模拟 OpenClaw 内部的调用方式curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoToken密钥 \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: ping}], max_tokens: 10 }返回里带choices字段和内容就说明 Key 有效、通道正常。如果返回 401检查 Key 有没有复制错返回 404检查 base_url 是不是多写了/v1返回 429说明额度或频率限制去控制台看一下。第三步通过 Nginx 走一遍完整链路curl -s http://your_domain.com/health和本地 curl 返回一致说明 Nginx 反代没问题。然后浏览器打开http://your_domain.com看控制面板能不能加载、实时日志面板有没有数据滚动。日志滚动起来整条链路就通了。7. 本篇常见错误排查systemd 启动报FileNotFoundError: config/config.toml九成是漏了WorkingDirectory/opt/openclaw。systemd 默认工作目录是/相对路径全找不到。加上这行daemon-reload后重启。Nginx 502 Bad Gateway先curl http://127.0.0.1:8000/health确认后端活着。后端活着但 Nginx 502检查proxy_pass的端口对不对以及 Nginx 有没有权限访问。SELinux 开启的系统还要setsebool -P httpd_can_network_connect 1。WebSocket 连接 101 失败或面板日志不刷新检查 Nginx 配置里有没有proxy_http_version 1.1、Upgrade、Connection upgrade这三行。缺任何一行 WS 都握手失败。TaoToken 返回 404base_url写成了https://taotoken.net/api/v1。改成https://taotoken.net/api让 OpenClaw 自己拼路径。TaoToken 返回 401Key 复制时带了空格或者 Key 被删了。去 API Keys 页面重新生成一个注意复制完整。服务跑一会儿就挂journalctl看到 OOM2 核 4G 的机器如果同时跑多个模型请求内存可能不够。在 systemd unit 里加MemoryMax3G限制或者去 Coding Plan 页面看看有没有更适合持续调用的方案。改了 config.toml 不生效OpenClaw 不会热加载配置改完必须systemctl restart openclaw。改 Nginx 配置则是systemctl reload nginx不用重启。整套跑下来systemd 管进程、Nginx 管入口、TaoToken 管通道三层各司其职。后面要换模型只改 config.toml 里的model字段要加通道去 TaoToken 控制台操作不用动服务器上的任何配置。这套骨架搭好之后OpenClaw 的升级就是git pull加pip install -r requirements.txt再systemctl restart openclaw三行命令的事。