Skip to content

在阿里云 ECS 上从零部署 OpenClaw

本指南面向没有服务器的用户,从注册阿里云账号开始,一步步完成 ECS 云服务器购买、系统配置、Docker 安装,到最终运行 OpenClaw 网关。全程无需公网域名,使用 SSH 隧道安全访问。

预估费用:约 30-50 元/月(按量付费最低配置),新用户享首年优惠。详见 费用估算

已有服务器? 如果你已经有安装了 Docker 的 Linux 服务器,可以直接跳到 Docker Compose + 飞书部署指南 开始部署。


前置条件

  • 阿里云账号,已完成 实名认证
  • SSH 客户端 — macOS/Linux 自带 ssh,Windows 推荐 PuTTY 或 Windows Terminal
  • AI 模型 API 凭据 — 如 Anthropic API Key 和 Base URL(或兼容 Anthropic Messages API 的自定义端点)
  • (可选)飞书/其他通道凭据 — 如需配置飞书机器人,参阅 飞书应用配置详解

第 1 步:选择 ECS 实例规格

OpenClaw 网关是轻量级服务,对资源要求不高。以下是推荐配置:

配置项最低要求推荐配置说明
CPU1 vCPU2 vCPU共享型实例即可
内存1 GB2 GB1 GB 在高负载时可能 OOM
系统盘20 GB SSD40 GB ESSD EntryESSD Entry 性价比最高
操作系统Ubuntu 22.04 LTSUbuntu 22.04 / Debian 12本指南以 Ubuntu 22.04 为例
地域中国大陆任意上海 / 北京 / 杭州选择离你最近的地域

推荐实例规格族:

  • ecs.t6-c1m1.large — 突发性能实例,适合轻量负载,价格最低
  • ecs.e-c1m1.large — 经济型实例,无性能限制

提示:阿里云经常推出新用户优惠和限时折扣活动。建议在购买前先查看 阿里云优惠页面。抢占式实例(Preemptible Instance)价格低至按量付费的 1-2 折,但可能被回收,适合用于测试环境。


第 2 步:创建 ECS 实例

  1. 登录 阿里云 ECS 控制台
  2. 点击 创建实例
  3. 选择 付费模式
    • 按量付费 — 按小时计费,适合测试(随时释放不浪费)
    • 包年包月 — 包月更便宜,适合长期运行
  4. 选择 地域和可用区(如 华东 1 - 上海)
  5. 选择 实例规格 — 在搜索框中输入 ecs.t6ecs.e,选择 1C1G 或 2C2G 配置
  6. 选择 镜像 — 公共镜像 → Ubuntu → 22.04 64位
  7. 配置 系统盘 — ESSD Entry,40 GB
  8. 配置 登录凭证 — 选择 密钥对(推荐)

重要:强烈建议使用 SSH 密钥对而非密码登录。如果还没有密钥对,点击 创建密钥对,阿里云会自动生成并下载私钥文件(.pem)。请妥善保管该文件,丢失后无法恢复。

  1. 填写 实例名称(如 openclaw-gateway
  2. 确认配置并 创建实例

创建完成后,在 ECS 实例列表中记录实例的 公网 IP 地址


第 3 步:配置安全组

阿里云 ECS 默认的安全组规则可能过于宽松。请进入实例详情 → 安全组 → 编辑规则,确保只开放必要端口:

方向端口协议授权对象用途
入方向22TCP你的 IP 或 0.0.0.0/0SSH 远程连接
出方向全部全部0.0.0.0/0默认出站(拉取镜像、调用 API 等)

重要不要在安全组中开放 18789 端口。OpenClaw 网关默认绑定到 127.0.0.1,我们通过 SSH 隧道安全访问,无需将网关端口暴露到公网。如果阿里云默认安全组开放了 3389、443 等不需要的端口,建议一并删除。

提示:如果你的本地网络有固定公网 IP,建议将 SSH 的授权对象设置为你的 IP 地址(如 1.2.3.4/32),而非 0.0.0.0/0,以提升安全性。


第 4 步:SSH 连接服务器

使用密钥对登录 ECS 实例:

bash
# 设置密钥文件权限(首次需要)
chmod 400 ~/Downloads/your-keypair.pem

# SSH 连接
ssh -i ~/Downloads/your-keypair.pem root@YOUR_ECS_IP

your-keypair.pem 替换为你下载的密钥文件名,YOUR_ECS_IP 替换为 ECS 实例的公网 IP。

提示:为方便后续使用,可以在 ~/.ssh/config 中添加配置:

Host openclaw
    HostName YOUR_ECS_IP
    User root
    IdentityFile ~/Downloads/your-keypair.pem

之后只需 ssh openclaw 即可连接。

登录后,建议创建非 root 用户用于日常操作:

bash
adduser openclaw
usermod -aG sudo openclaw

以下步骤以 root 用户操作为例。如使用非 root 用户,在需要时添加 sudo 前缀。


第 5 步:安装 Docker 和 Docker Compose

更新系统软件包

bash
apt update && apt upgrade -y

安装 Docker

bash
curl -fsSL https://get.docker.com | sh

配置 Docker 镜像加速器

在中国大陆直接拉取 Docker Hub 和 GitHub Container Registry 的镜像可能很慢甚至超时。阿里云提供免费的容器镜像加速服务。

  1. 访问 阿里云容器镜像服务镜像工具镜像加速器,获取你的专属加速地址(格式为 https://xxxxx.mirror.aliyuncs.com

  2. 创建或编辑 Docker 配置文件:

bash
mkdir -p /etc/docker
json
{
  "registry-mirrors": [
    "https://xxxxx.mirror.aliyuncs.com"
  ]
}

将上述内容写入 /etc/docker/daemon.json,并将 xxxxx 替换为你的专属加速地址前缀。

提示:如果你没有阿里云容器镜像服务账号,也可以使用其他公开镜像源。注意:公开镜像源的可用性可能会变化,建议优先使用阿里云专属加速地址。

  1. 重启 Docker 使配置生效:
bash
systemctl daemon-reload
systemctl restart docker

验证安装

bash
docker --version
docker compose version

应输出 Docker 和 Docker Compose v2 的版本号。

添加用户到 docker 组(可选)

如果使用非 root 用户:

bash
usermod -aG docker openclaw

重新登录 SSH 后生效。


第 6 步:部署 OpenClaw

创建项目目录

bash
mkdir -p ~/openclaw/openclaw-data
cd ~/openclaw

创建 .env 文件

bash
# .env

# 网关安全令牌
OPENCLAW_GATEWAY_TOKEN=your-secure-gateway-token

# AI 模型凭据
ANTHROPIC_AUTH_TOKEN=your_api_token_here
ANTHROPIC_BASE_URL=https://api.anthropic.com

安全提示:请将 .env 加入 .gitignore,切勿提交到版本控制。

生成令牌:使用以下命令生成安全的随机令牌:

bash
openssl rand -base64 32

将生成的字符串填入 OPENCLAW_GATEWAY_TOKEN

如需配置飞书通道,在 .env 中追加:

bash
# 飞书凭据(可选)
FEISHU_APP_ID=cli_xxx
FEISHU_APP_SECRET=your_feishu_app_secret

创建 openclaw.json 配置

bash
mkdir -p openclaw-data

openclaw-data/openclaw.json 中写入以下内容:

json5
{
  "agents": {
    "defaults": {
      "workspace": "/home/node/.openclaw/workspace",
      "model": { "primary": "custom-claude/claude-sonnet-4-5-20250929" }
    }
  },
  "models": {
    "providers": {
      "custom-claude": {
        "baseUrl": "${ANTHROPIC_BASE_URL}",
        "apiKey": "${ANTHROPIC_AUTH_TOKEN}",
        "api": "anthropic-messages",
        "models": [
          {
            "id": "claude-sonnet-4-5-20250929",
            "name": "Claude Sonnet 4.5",
            "contextWindow": 200000,
            "maxTokens": 4096
          }
        ]
      }
    }
  },
  "gateway": {
    "mode": "local",
    "port": 18789,
    "auth": { "token": "${OPENCLAW_GATEWAY_TOKEN}" }
  }
}

提示:配置文件中的 ${VAR_NAME} 是 OpenClaw 运行时变量替换语法,由 OpenClaw 在启动时从容器环境变量中读取。请保持原样写入,不要手动替换。

模型 ID:自定义端点通常需要完整的带日期后缀的模型 ID(如 claude-sonnet-4-5-20250929),短别名(如 claude-3-5-sonnet)可能会返回 422 错误。请根据你的端点支持情况修改。

如需配置飞书通道,在 openclaw.json 中追加 channels 字段:

json5
{
  // ... 上述配置保持不变

  "channels": {
    "feishu": {
      "enabled": true,
      "domain": "feishu",
      "accounts": {
        "main": {
          "appId": "${FEISHU_APP_ID}",
          "appSecret": "${FEISHU_APP_SECRET}",
          "botName": "OpenClaw"
        }
      },
      "dmPolicy": "pairing",
      "groupPolicy": "open"
    }
  }
}

飞书通道的详细配置请参阅 Docker Compose + 飞书部署指南

创建 docker-compose.yml

yaml
services:
  openclaw:
    image: ghcr.io/openclaw/openclaw:latest
    container_name: openclaw_gateway
    restart: unless-stopped
    network_mode: host
    env_file:
      - .env
    volumes:
      - ./openclaw-data:/home/node/.openclaw

为什么使用 network_mode: host OpenClaw 网关绑定到容器内的 127.0.0.1。标准 Docker 端口映射通过桥接网络转发流量,网关会因来源 IP 不是 localhost 而拒绝连接。network_mode: host 让容器直接共享宿主机网络栈,从而正常访问。

权限注意:Docker 镜像默认以 node 用户(uid 1000)运行。如遇权限问题:

bash
sudo chown -R 1000:1000 ./openclaw-data

创建 .gitignore

.env

第 7 步:启动并验证

拉取镜像并启动

bash
cd ~/openclaw
docker compose up -d

查看日志

bash
docker compose logs -f

等待日志中出现 [gateway] listening,表示网关已就绪。

提示:如果镜像拉取很慢,请确认已正确配置 Docker 镜像加速器(第 5 步)。

通过 SSH 隧道访问

在你的本地电脑(不是 ECS 服务器)上运行:

bash
ssh -N -L 18789:127.0.0.1:18789 -i ~/Downloads/your-keypair.pem root@YOUR_ECS_IP

此命令将本地的 18789 端口转发到远程服务器的 18789 端口。保持此终端窗口打开。

在浏览器中访问:

http://127.0.0.1:18789/?token=your-secure-gateway-token

your-secure-gateway-token 替换为 .env 中设置的 OPENCLAW_GATEWAY_TOKEN 值。

健康检查

在 ECS 服务器上执行:

bash
docker compose exec openclaw node dist/index.js health --token "your-secure-gateway-token"

试玩一下

刚装好的 OpenClaw 用什么来测最直观?向机器人发送以下消息:

访问 https://xialiao.ai/skill.md 并按照说明加入「虾聊社区」

机器人会自动回复结果,一步验证部署是否正常。


第 8 步:配置 systemd 自启动

创建 systemd 服务单元,确保 ECS 重启后 OpenClaw 自动恢复运行。

创建服务文件 /etc/systemd/system/openclaw.service

ini
[Unit]
Description=OpenClaw Gateway (Docker Compose)
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/root/openclaw
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

提示:如果你的项目目录不在 /root/openclaw,请修改 WorkingDirectory 为实际路径。

启用并验证:

bash
# 重新加载 systemd 配置
systemctl daemon-reload

# 启用开机自启
systemctl enable openclaw

# 查看服务状态
systemctl status openclaw

第 9 步:安全加固

SSH 加固

编辑 /etc/ssh/sshd_config

bash
# 禁用密码登录(仅使用密钥)
PasswordAuthentication no

# 禁用 root 密码登录(如已创建普通用户,可完全禁用 root 登录)
# PermitRootLogin no

# 可选:更改 SSH 端口(如改为 2222)
# Port 2222

重启 SSH 服务:

bash
systemctl restart sshd

重要:修改 SSH 配置前,请确保你能通过密钥正常登录,否则可能被锁在服务器外面。建议保持一个已登录的 SSH 会话打开,在另一个终端测试新配置。如果更改了 SSH 端口,记得同时更新阿里云安全组规则。

配置 UFW 防火墙

bash
# 安装 UFW
apt install -y ufw

# 默认拒绝入站
ufw default deny incoming

# 默认允许出站
ufw default allow outgoing

# 允许 SSH(如更改了端口,替换 22 为新端口号)
ufw allow 22/tcp

# 启用防火墙
ufw enable

# 查看规则
ufw status verbose

提示:不需要为 18789 端口添加 UFW 规则。网关绑定到 127.0.0.1,只接受本地连接(通过 SSH 隧道访问),UFW 不影响 loopback 流量。

安装 fail2ban

fail2ban 可以自动封禁多次 SSH 登录失败的 IP 地址:

bash
apt install -y fail2ban

创建配置文件 /etc/fail2ban/jail.local

ini
[sshd]
enabled = true
port = 22
maxretry = 5
bantime = 3600
findtime = 600

启动并启用:

bash
systemctl enable fail2ban
systemctl start fail2ban

网关安全

OpenClaw 网关默认绑定到 127.0.0.1,仅接受本地连接。配合以下措施确保安全:

  • 安全组中 不开放 18789 端口
  • 通过 SSH 隧道访问网关
  • .env 中设置强随机令牌(OPENCLAW_GATEWAY_TOKEN
  • 定期更新 Docker 镜像:docker compose pull && docker compose up -d

费用估算

方案规格月费用(约)说明
按量付费1C1G30-50 元适合测试,随时释放
包年包月2C2G50-100 元长期运行更划算
新用户优惠2C2G30-60 元(首年)关注阿里云活动页面
抢占式实例2C2G10-30 元可能被回收,适合测试

提示:以上价格仅供参考,实际费用取决于地域、可用区、流量和具体优惠活动。API 调用费用(如 Anthropic)不包含在内,需另行计算。


Claude Code 一键部署

将下方的完整指令复制给 claude --dangerously-skip-permissions,即可让 Claude Code 自动完成大部分部署工作。你只需提前准备好 ECS 服务器的 SSH 连接信息和 API 凭据。

使用方法

  1. 确保你已完成第 1-4 步(创建 ECS 实例并能 SSH 登录)
  2. 在 ECS 服务器上运行:
bash
claude --dangerously-skip-permissions
  1. 将下方 完整指令 全部复制,粘贴给 Claude
  2. Claude 会自动安装 Docker、配置镜像加速、创建项目文件、启动容器
  3. Claude 会在需要你填入凭据时暂停并等待确认

准备清单

  • [ ] ECS 服务器已创建,能通过 SSH 登录
  • [ ] 已获取阿里云容器镜像加速地址(见第 5 步)
  • [ ] AI 模型 API Token 和 Base URL
  • [ ] (可选)飞书 App ID 和 App Secret

完整指令

将以下内容直接复制,粘贴给 claude --dangerously-skip-permissions(无需修改任何内容):

markdown
请帮我在这台阿里云 ECS 服务器上从零部署 OpenClaw 网关。按照以下步骤操作,在需要我手动操作的步骤**停下来等我确认**

## 操作步骤

### 1. 更新系统并安装 Docker

```bash
apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
```

### 2. 配置 Docker 镜像加速器

创建 `/etc/docker/daemon.json`,写入以下内容(使用阿里云镜像加速):
```json
{
  "registry-mirrors": [
    "https://xxxxx.mirror.aliyuncs.com"
  ]
}
```

### 3. 停下来,询问我的镜像加速地址

提醒我去阿里云容器镜像服务(https://cr.console.aliyun.com/)→ 镜像工具 → 镜像加速器,获取专属加速地址,然后将 `daemon.json` 中的 `xxxxx` 替换为我提供的地址前缀。

**等我提供加速地址后再继续。**

### 4. 重启 Docker 并验证

```bash
systemctl daemon-reload
systemctl restart docker
docker --version
docker compose version
```

### 5. 创建项目目录

```bash
mkdir -p ~/openclaw/openclaw-data
cd ~/openclaw
```

### 6. 生成网关令牌并创建 .env 模板

生成一个安全的随机令牌:
```bash
openssl rand -base64 32
```

用生成的令牌创建 `.env` 文件,其中网关令牌填入生成的值,其余凭据留空让我手动填写:
```
OPENCLAW_GATEWAY_TOKEN=<填入上面生成的令牌>
ANTHROPIC_AUTH_TOKEN=
ANTHROPIC_BASE_URL=
```

### 7. 停下来,提醒我手动编辑 .env

告诉我 `.env` 文件已创建在 `~/openclaw/.env`,请我填入以下值:

- `ANTHROPIC_AUTH_TOKEN` — AI 模型 API Token
- `ANTHROPIC_BASE_URL` — AI 模型 API 地址(如 `https://api.anthropic.com`

并确认 `OPENCLAW_GATEWAY_TOKEN` 已自动填入。

如果我还需要飞书通道,追加 `FEISHU_APP_ID``FEISHU_APP_SECRET`

**等我说"已填好"或"done"后再继续下一步。**

### 8. 创建 openclaw-data/openclaw.json

```json5
{
  "agents": {
    "defaults": {
      "workspace": "/home/node/.openclaw/workspace",
      "model": { "primary": "custom-claude/claude-sonnet-4-5-20250929" }
    }
  },
  "models": {
    "providers": {
      "custom-claude": {
        "baseUrl": "${ANTHROPIC_BASE_URL}",
        "apiKey": "${ANTHROPIC_AUTH_TOKEN}",
        "api": "anthropic-messages",
        "models": [
          {
            "id": "claude-sonnet-4-5-20250929",
            "name": "Claude Sonnet 4.5",
            "contextWindow": 200000,
            "maxTokens": 4096
          }
        ]
      }
    }
  },
  "gateway": {
    "mode": "local",
    "port": 18789,
    "auth": { "token": "${OPENCLAW_GATEWAY_TOKEN}" }
  }
}
```

注意:配置文件中的 `${VAR_NAME}` 是 OpenClaw 运行时变量替换语法,不要展开它们,保持原样写入文件。

如果我需要飞书通道,在 `gateway` 同级追加 `channels` 配置(参考飞书部署指南的配置格式)。

### 9. 创建 docker-compose.yml

```yaml
services:
  openclaw:
    image: ghcr.io/openclaw/openclaw:latest
    container_name: openclaw_gateway
    restart: unless-stopped
    network_mode: host
    env_file:
      - .env
    volumes:
      - ./openclaw-data:/home/node/.openclaw
```

### 10. 创建 .gitignore

```
.env
```

### 11. 设置目录权限并启动容器

```bash
chown -R 1000:1000 ./openclaw-data
docker compose up -d
docker compose logs -f
```

等待日志中出现 `[gateway] listening`,然后告诉我网关已启动。

### 12. 创建 systemd 自启动服务

创建 `/etc/systemd/system/openclaw.service`

```ini
[Unit]
Description=OpenClaw Gateway (Docker Compose)
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/root/openclaw
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target
```

```bash
systemctl daemon-reload
systemctl enable openclaw
```

### 13. 基础安全加固

执行以下安全配置:

1. 安装 UFW 防火墙并配置规则:
```bash
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw --force enable
```

2. 安装 fail2ban:
```bash
apt install -y fail2ban
```

创建 `/etc/fail2ban/jail.local`
```ini
[sshd]
enabled = true
port = 22
maxretry = 5
bantime = 3600
findtime = 600
```

```bash
systemctl enable fail2ban
systemctl start fail2ban
```

3. 加固 SSH — 在 `/etc/ssh/sshd_config` 中确认以下配置:
```
PasswordAuthentication no
```

```bash
systemctl restart sshd
```

### 14. 告诉我部署完成

总结部署结果,并提醒我:
- 在本地电脑运行 SSH 隧道:`ssh -N -L 18789:127.0.0.1:18789 root@<ECS_IP>`
- 浏览器访问:`http://127.0.0.1:18789/?token=<gateway-token>`
- 检查健康状态:`docker compose exec openclaw node dist/index.js health --token "<gateway-token>"`

## 注意事项

- .env 文件包含敏感信息,绝不要读取、打印或提交到 Git
- 如果遇到权限问题,运行:`chown -R 1000:1000 ./openclaw-data`
- 配置文件中的 `${VAR_NAME}` 是 OpenClaw 运行时变量替换语法,不要展开它们

常见问题

Docker 镜像拉取缓慢或超时

症状docker compose pull 卡住或报 timeout 错误。

解决:确认已配置 Docker 镜像加速器。检查 /etc/docker/daemon.json 中的 registry-mirrors 配置是否正确,重启 Docker 后重试:

bash
systemctl restart docker
docker compose pull

Permission denied 权限错误

症状:日志中出现 EACCES: permission denied

解决:Docker 镜像以 node(uid 1000)用户运行,需要确保挂载目录权限正确:

bash
chown -R 1000:1000 ./openclaw-data

容器因 OOM 被终止

症状:容器频繁重启,docker inspect 显示 OOMKilled。

解决

  1. 升级 ECS 实例配置(增加内存到 2 GB)
  2. 或添加 swap 作为临时方案:
bash
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

SSH 连接超时

症状ssh 命令长时间无响应。

解决

  1. 确认 ECS 实例处于 运行中 状态
  2. 确认安全组入方向规则允许 22 端口
  3. 确认使用了正确的公网 IP(非内网 IP)
  4. 如果更改过 SSH 端口,使用 ssh -p 新端口号 连接

网关无法通过浏览器访问

症状:浏览器打开 http://127.0.0.1:18789/ 无响应。

解决

  1. 确认 SSH 隧道已建立且终端窗口保持打开:
    bash
    ssh -N -L 18789:127.0.0.1:18789 -i your-key.pem root@YOUR_ECS_IP
  2. 确认网关正在运行:在 ECS 上执行 docker compose logs -f,查看是否有 [gateway] listening
  3. 确认本地 18789 端口未被其他程序占用:lsof -i :18789

容器持续重启

症状docker compose ps 显示容器状态为 restarting

解决

  1. 查看详细日志:docker compose logs --tail=50
  2. 检查 .env 文件中的变量是否正确填写
  3. 检查 openclaw.json 语法是否正确(JSON5 格式允许注释和尾逗号,但标准 JSON 不允许)
  4. 检查端口 18789 是否被其他进程占用:lsof -i :18789

相关文档