1. 项目概述与核心价值

如果你和我一样,对市面上那些需要你把所有对话数据都上传到第三方服务器的AI助手感到不安,同时又希望拥有一个能真正帮你处理实际任务——比如自动浏览网页、执行命令行、管理文件——的智能伙伴,那么今天分享的这个项目,你一定会感兴趣。它叫 OpenClaw,一个开源的、能连接 Telegram 等通讯工具的个人AI助手。但更关键的是,我最近花了不少时间,把它的整套部署流程搬到了 Azure 云上,并做成了一个“一键式”的部署包。

这个项目的核心价值很简单: 让你在30分钟内,在 Azure 上拥有一个完全私有的、数据不出你掌控的AI助手 。你不再需要为任何云AI服务的订阅付费,所有的对话和任务执行都发生在你自己控制的虚拟机上,AI模型调用的是你已经授权和信任的 Azure OpenAI 或 Azure AI Foundry 服务。这意味着,从你的聊天记录到AI执行命令的上下文,全程都在你的私有环境里闭环。

我把它做成了一个基于 Bicep(Azure 原生的基础设施即代码语言)的自动化部署方案。你只需要准备好几样东西:一个 Azure 订阅、一对 SSH 密钥、你的 Azure AI 密钥,以及一个 Telegram 机器人令牌。然后运行几个脚本,一切从虚拟机创建、网络配置、系统加固,到 OpenClaw 的安装和启动,全部自动完成。最终你会得到一个通过 SSH 隧道安全访问的 Web 仪表盘,以及一个能通过 Telegram 与你对话并执行任务的 AI 助手。

2. 架构设计与安全考量

在动手之前,理解整个架构的设计思路和安全边界至关重要。这能帮你明白每一步操作背后的意图,以及在出现问题时知道该从哪里排查。

2.1 整体架构与数据流

整个部署的核心是一台位于 Azure 的 Ubuntu 24.04 虚拟机。我选择了 Standard_B2als_v2 这个型号,它拥有2个vCPU和4GB内存,对于运行 OpenClaw 的 Docker 容器来说,性能足够且成本可控(运行状态下每月大约22-27美元)。

数据流的设计遵循了“最小暴露”原则:

  1. 你的本地机器 :通过浏览器和 SSH 客户端进行操作。
  2. SSH 加密隧道 :你在本地建立一条到 Azure VM 的 SSH 隧道,将本地的 18789 端口转发到 VM 内部的 18789 端口。这是访问 OpenClaw 网关(Gateway)的唯一方式。
  3. Azure VM 上的 Docker 容器 :OpenClaw 服务运行在容器内,其网关服务监听在 localhost:18789 关键点在于,这个端口没有在 VM 的防火墙上对公网开放 ,因此从互联网上无法直接访问。
  4. Azure AI 服务 :OpenClaw 容器通过配置好的终结点和密钥,调用你独立的 Azure OpenAI 或 Azure AI Foundry 资源中的模型(例如 GPT-4o)。你的对话数据只会流向这个你已经授权和管理的 Azure AI 服务。

这种设计确保了 OpenClaw 的服务端点(18789端口)永远不会暴露在公网上,所有管理流量都经过加密的 SSH 通道。你的 AI 模型请求也是从你的 VM 直接发往你的 Azure AI 资源,没有经过任何第三方中转。

2.2 多层次安全加固策略

安全不是单点,而是层层设防。在这个部署方案中,我设置了至少六道安全防线:

  1. 云层防火墙(Azure NSG) :在 Azure 网络层面,创建了一个网络安全组(NSG)。它只允许从 你的当前公网IP地址 发起的、目标为22端口(SSH)的入站流量。其他所有入站流量(包括对18789端口的探测)都会被直接丢弃。
  2. 操作系统层防火墙(UFW) :在 Ubuntu VM 内部,启用了 Uncomplicated Firewall (UFW)。其默认策略是拒绝所有入站、允许所有出站。我们额外添加一条规则,允许 SSH(22端口)连接。这样,即使云层 NSG 被错误配置,VM 自身还有一道屏障。
  3. SSH 密钥认证 :在 VM 部署时,我们禁用了密码登录,强制使用 SSH 密钥对进行认证。这从根本上杜绝了暴力破解密码的可能性。
  4. 入侵防御(Fail2ban) :安装了 Fail2ban 服务,它会监控 SSH 的认证日志。如果检测到来自某个 IP 的连续失败登录尝试,会自动在 UFW 中创建临时规则封锁该 IP 一段时间。
  5. 自动安全更新 :配置了 unattended-upgrades 包,让系统自动安装重要的安全更新,减少因未打补丁而导致漏洞的风险。
  6. 密钥与配置隔离 :所有敏感信息(SSH 公钥、Azure AI 密钥、Telegram Token)都存放在 .gitignore 的文件中( parameters.json .env ),确保它们不会被意外提交到代码仓库。

实操心得:关于公网IP变动 家庭宽带用户的公网IP可能会变化。如果你某天突然无法 SSH 连接到 VM,很可能就是 IP 变了。这时你需要去 Azure 门户,找到该 VM 所属的网络安全组(NSG),修改那条允许 SSH 的入站规则,将源 IP 地址更新为你新的公网IP(格式为 x.x.x.x/32 )。这是一个需要手动维护的点。

3. 前期准备:资源与密钥获取

万事开头难,但准备工作做扎实了,后续就是一马平川。你需要准备好以下几样东西,请务必在开始部署前逐一确认。

3.1 本地环境与 Azure 基础

首先,你需要在本地电脑上安装 Azure CLI 。这是后续所有自动化脚本与 Azure 交互的基础。安装完成后,打开终端,用以下命令登录你的 Azure 订阅:

az login --use-device-code

执行后,命令行会显示一个 URL 和一个代码。用浏览器打开那个 URL,输入代码,并完成 Azure 账户登录。如果你有多个租户(例如公司租户和个人租户),可能需要指定:

az login --tenant <你的租户ID> --use-device-code

登录成功后,可以通过 az account show 来确认当前激活的订阅是否正确。

接下来,生成用于连接 VM 的 SSH 密钥对 。如果你还没有 Ed25519 算法的密钥,建议生成一对新的,安全性更好:

ssh-keygen -t ed25519 -C “openclaw-azure-deployment”

连续按回车,接受默认的存储路径( ~/.ssh/id_ed25519 )和空密码。生成后,查看你的公钥内容:

cat ~/.ssh/id_ed25519.pub

复制整个输出的内容,从 ssh-ed25519 一直到你的邮箱,稍后需要粘贴到配置文件中。

最后,获取你当前的 公网 IP 地址

curl -4 ifconfig.me

记下输出的 IP,并在后面加上 /32 ,例如 123.45.67.89/32 。这个值将用于锁定 Azure NSG,只允许你这个 IP 连接 VM。

3.2 AI 模型与通讯渠道配置

这是项目的核心依赖:一个可用的 Azure AI 模型和一个 Telegram 机器人。

获取 Azure AI 密钥与终结点:

  1. 打开 Azure 门户
  2. 导航到你的 Azure OpenAI Azure AI Foundry 资源。
  3. 在左侧菜单中选择“密钥和终结点”。
  4. 复制“密钥1”和“终结点”的值。 请特别注意 :你需要确保使用的终结点 URL 以 /openai/v1 结尾。例如:
    • Azure OpenAI 服务: https://<你的资源名称>.openai.azure.com/openai/v1
    • Azure AI Foundry (资源级): https://<你的资源名称>.services.ai.azure.com/openai/v1
  5. 记下你打算使用的模型 部署名称 。这个名称是你在 Azure AI Studio 中创建模型部署时自定义的,必须完全匹配。

创建 Telegram 机器人:

  1. 在 Telegram 中搜索 @BotFather
  2. 发送 /newbot 指令。
  3. 根据提示,为你的机器人设置一个显示名称(例如 My Private Assistant )和一个用户名(必须以 bot 结尾,例如 my_private_assistant_bot )。
  4. 创建成功后,BotFather 会提供一个令牌(Token),格式如 1234567890:ABCdefGhIJKlmNoPQRsTUVwxyZ 。妥善保存这个令牌。

注意事项:模型部署名称的坑 这里最容易出错的就是“部署名称”。它不是模型系列名(如 gpt-4o ),而是你在 Azure AI Studio 中,为某个模型创建部署时自己起的名字。你可以在 Azure 门户中,进入你的 AI 资源,在“模型部署”部分找到准确的名称。后续配置中如果填错,会导致 404 model_not_found 错误。

4. 分步部署实操全记录

准备工作就绪,现在可以开始真正的部署了。整个过程由三个脚本驱动,它们分别负责基础设施部署、VM 初始化和应用配置。

4.1 第一步:克隆仓库与初始配置

首先,将项目仓库克隆到本地,并赋予脚本执行权限:

git clone https://github.com/Emrullah007/openclaw-azure.git
cd openclaw-azure
chmod +x scripts/*.sh

接着,配置基础设施参数。复制示例文件并编辑:

cp infra/parameters.example.json infra/parameters.json
nano infra/parameters.json

你需要修改 sshPublicKey value ,将其替换为你之前复制的整个 SSH 公钥字符串。同时,将 allowedSshSourceIp value 替换为你的公网IP加 /32 后缀。

然后,配置环境变量,这决定了 OpenClaw 如何连接你的 AI 模型和 Telegram:

cp docker/.env.example docker/.env
nano docker/.env

你需要修改以下几个关键变量:

  • AZURE_API_BASE :填入你复制的、以 /openai/v1 结尾的终结点 URL。
  • AZURE_API_KEY :填入你的 Azure AI 密钥。
  • AZURE_DEPLOYMENT_NAME :填入你记下的模型部署名称。
  • TELEGRAM_BOT_TOKEN :填入你的 Telegram 机器人令牌。
  • OPENCLAW_WORKSPACE_DIR :保持默认即可,除非你在后续部署步骤中自定义了 VM 的管理员用户名。

4.2 第二步:一键部署 Azure 基础设施

运行部署脚本,它将引导你完成资源创建:

./scripts/deploy.sh

这个交互式脚本会依次询问:

  1. 区域 :选择离你最近的 Azure 区域,默认是 eastus (美国东部),通常资源最充足。
  2. 资源组名称 :按回车使用默认的 openclaw-rg ,所有资源(VM、网络、磁盘等)都会放在这个组里,方便日后统一管理或删除。
  3. 虚拟机名称 :输入一个全局唯一的名称,作为 VM 和其公共 DNS 标签的一部分。如果名称已被占用,脚本会提示你重试。
  4. 管理员用户名 :按回车使用默认的 azureuser ,或者自定义一个。

脚本会使用 Bicep 模板( infra/main.bicep )在后台执行部署,大约需要3分钟。部署成功后,控制台会清晰地输出 VM 的公共 IP、DNS 名称以及后续连接所需的 SSH 命令。这些信息也会自动保存到本地的 .deployment-info 文件中,供后续脚本读取。

避坑技巧:VM 型号不可用 如果你选择的区域暂时没有 Standard_B2als_v2 型号的库存,脚本会检测到部署失败并提示你。这时,你可以选择另一个区域重新尝试。美国东部(East US)通常是可用性最好的区域之一。

4.3 第三步:虚拟机初始化与安全加固

基础设施就绪后,需要初始化 VM 并加固安全。运行:

./scripts/setup-vm.sh

这个脚本会通过 SSH 连接到新创建的 VM,并自动执行一系列操作:

  • 更新系统包
  • 安装 Docker :使用 Docker 官方 apt 仓库安装,而非便捷脚本,确保来源可信且可审计。
  • 配置 UFW 防火墙 :默认拒绝所有入站,仅允许 SSH。
  • 安装并配置 Fail2ban :保护 SSH 服务。
  • 启用无人值守的安全更新
  • 将当前用户加入 docker ,以便无需 sudo 即可运行 Docker 命令。

脚本执行完毕后,会打印一份安全配置摘要。此时,你的 VM 已经是一个经过基本加固的生产环境。

4.4 第四步:部署与配置 OpenClaw 应用

最后,在本地运行配置脚本,它会在 VM 上完成 OpenClaw 的安装和启动:

./scripts/configure-openclaw.sh

这个脚本的工作流程如下:

  1. 通过 SSH 连接到 VM。
  2. 克隆官方的 OpenClaw 代码仓库到 VM 的 ~/openclaw 目录。
  3. 根据你本地 docker/.env 文件的内容,在 VM 上生成 OpenClaw 的配置文件 ~/.openclaw/openclaw.json 这一步是关键 ,它绕过了 OpenClaw 内置的、可能不兼容 Azure AI 的配置向导。
  4. 将本地的 .env 文件复制到 VM 的 OpenClaw 目录,供 Docker Compose 使用。
  5. 在 VM 上执行 docker compose build docker compose up -d ,构建镜像并启动容器。首次构建可能需要几分钟下载基础镜像。
  6. 脚本执行成功后,会输出最重要的信息: 一个带令牌的仪表盘访问 URL ,以及用于配对 Telegram 的命令。

至此,OpenClaw 服务已经在你的 Azure VM 上运行起来了。

5. 连接、配对与日常使用指南

服务跑起来了,但你还不能直接访问。因为按照我们的安全设计,所有访问都必须通过 SSH 隧道。

5.1 建立安全连接并访问仪表盘

首先,你需要打开一个 SSH 隧道,这个隧道同时也会给你一个 VM 的终端:

ssh -L 18789:localhost:18789 azureuser@<你的VM-IP>

保持这个终端窗口打开,它维持着隧道。

然后, 在同一个 SSH 会话(即上一步打开的终端)中 ,运行以下命令来获取带认证令牌的仪表盘 URL:

docker compose -f ~/openclaw/docker-compose.yml run --rm openclaw-cli dashboard --no-open

复制命令输出的完整 URL,它看起来像 http://localhost:18789/#token=eyJh... 务必复制整个 URL

现在,在你本地电脑的浏览器中,粘贴并打开这个完整的 URL。你会看到 OpenClaw 的仪表盘界面。点击“Connect”按钮。

5.2 设备授权与 Telegram 配对

点击“Connect”后,你的浏览器会被注册为一个新设备,需要授权。回到 VM 的 SSH 终端,列出待授权的设备:

docker compose -f ~/openclaw/docker-compose.yml run --rm openclaw-cli devices list

你会看到一个待处理的设备请求及其 ID。使用该 ID 批准它:

docker compose -f ~/openclaw/docker-compose.yml run --rm openclaw-cli devices approve <设备ID>

批准后, 回到浏览器,刷新页面 。现在你应该能看到完整的 OpenClaw 仪表盘了。

接下来,配对 Telegram。在你的 Telegram 应用中,找到你创建的机器人,向它发送 /start 命令。机器人会回复一个配对码(一串字符)。

在 VM 的 SSH 终端中,使用这个配对码完成配对:

docker compose -f ~/openclaw/docker-compose.yml run --rm openclaw-cli pairing approve telegram <配对码>

现在,你的 Telegram 机器人已经激活。你可以直接在 Telegram 里和它对话,它会调用你的 Azure AI 模型来响应,并且可以执行你配置好的任务(如浏览网页、运行命令等)。

效率技巧:使用别名 setup-vm.sh 脚本已经在 VM 的 ~/.bashrc 中添加了一个 oc 别名,指向完整的 Docker Compose 命令。你可以通过 source ~/.bashrc 加载它,之后命令可以简化为:

oc devices list
oc devices approve <id>
oc pairing approve telegram <code>

这能节省大量打字时间。

6. 运维、监控与故障排查

部署完成只是开始,稳定的运行和高效的问题排查同样重要。

6.1 日常操作与成本控制

为了控制成本,当你不需要使用 AI 助手时,可以关闭虚拟机。Azure 对已停止(解除分配)的 VM 只收取磁盘和公共 IP 地址的费用,每月仅需几美元。

任务 命令
停止 VM (暂停计费) az vm deallocate -g openclaw-rg -n <你的VM名称>
启动 VM az vm start -g openclaw-rg -n <你的VM名称>
SSH 连接 VM ssh azureuser@<你的VM-IP>
建立隧道并连接 ssh -L 18789:localhost:18789 azureuser@<你的VM-IP>
查看容器日志 在 VM 上: docker compose -f ~/openclaw/docker-compose.yml logs -f
完全销毁所有资源 在项目根目录: ./scripts/destroy.sh

重新连接流程(VM 重启后):

  1. 如果 VM 是停止状态,先用 az vm start 启动它。
  2. 建立 SSH 隧道: ssh -L 18789:localhost:18789 azureuser@<VM-IP>
  3. 在隧道终端里,确保容器运行: docker compose -f ~/openclaw/docker-compose.yml up -d
  4. 获取新的仪表盘 URL: oc dashboard --no-open
  5. 用新 URL 打开浏览器。如果提示未授权,可能需要重新批准设备( oc devices list -> oc devices approve <id> )。

6.2 常见问题与解决方案

在实际操作中,你可能会遇到以下几个典型问题:

问题一:仪表盘打开显示 “unauthorized”

  • 原因 :你直接访问了 http://localhost:18789 ,而没有使用带令牌的完整 URL。
  • 解决 :务必在 VM 的 SSH 终端里运行 oc dashboard --no-open 命令,复制输出的完整 URL(包含 #token= 部分)到浏览器打开。

问题二:AI 请求失败,报错 “404” 或 “model_not_found”

  • 原因 :这是最常见的问题,几乎都是 AZURE_API_BASE AZURE_DEPLOYMENT_NAME 配置错误。
  • 排查 :在 VM 上检查配置文件:
    cat ~/.openclaw/openclaw.json
    
  • 确认点
    1. baseUrl 字段的值必须 精确地 /openai/v1 结尾。
    2. deployment 字段的值必须与你在 Azure AI Studio 中创建的模型部署名称 完全一致 (区分大小写)。
  • 修复 :如果错误,需要修改 ~/.openclaw/openclaw.json 文件,然后重启容器: docker compose -f ~/openclaw/docker-compose.yml restart 。同时,也应更新你本地的 docker/.env 文件,以便未来重新部署时使用正确值。

问题三:VM 响应缓慢或无响应

  • 原因 Standard_B2als_v2 是突发性能系列 VM。当 CPU 积分耗尽时,性能会被限制在基线水平(约20%)。如果 OpenClaw 容器因配置错误不断崩溃重启,会快速消耗积分。
  • 排查 :在 Azure 门户中,进入你的 VM,查看“监控” -> “指标”,添加“CPU 剩余积分”图表。
  • 解决
    1. 首先按前述方法排查并解决容器崩溃的根本原因(通常是配置错误)。
    2. 停止 VM(解除分配),等待几分钟后再启动,这通常会将 VM 迁移到一个有可用积分的主机上。
    3. 考虑为小型 VM 添加交换文件(Swap)作为内存缓冲(详见项目文档的“Running on Small VMs”部分)。

问题四:无法 SSH 连接到 VM

  • 原因 :最大的可能性是你的公网 IP 地址变了,而 Azure NSG 规则仍然只允许旧的 IP。
  • 解决
    1. 在本地终端运行 curl -4 ifconfig.me 获取新 IP。
    2. 登录 Azure 门户,找到你的 VM 所在的资源组 openclaw-rg
    3. 找到名为 openclaw-vm-nsg 的网络安全组资源。
    4. 进入“入站安全规则”,找到那条允许 SSH(端口22)的规则。
    5. 将“源”字段更新为你的新 IP,格式为 <新IP>/32
    6. 等待约1-2分钟规则生效,即可重新连接。

6.3 升级与维护

当 OpenClaw 发布新版本时,升级过程很简单。首先 SSH 连接到你的 VM,然后执行:

# 拉取最新的 Docker 镜像
docker compose -f ~/openclaw/docker-compose.yml pull

# 重启容器以使用新镜像
docker compose -f ~/openclaw/docker-compose.yml up -d

# (可选)清理旧的、未使用的镜像以释放磁盘空间
docker image prune -a

前提 :确保你的 ~/openclaw/.env 文件中设置了 OPENCLAW_IMAGE=ghcr.io/openclaw/openclaw:latest 。部署脚本默认会配置好这一点。如果没有这个设置, pull 命令将无法获取更新。

定期维护可以运行一些简单的命令来检查系统状态:

  • docker compose -f ~/openclaw/docker-compose.yml ps :查看容器运行状态。
  • df -h :检查 VM 磁盘使用情况。
  • sudo apt update && sudo apt upgrade :更新系统软件包(安全更新已自动进行,此命令更新其他包)。

整个项目设计为可完全销毁和重建。如果你需要推倒重来,只需在项目目录下运行 ./scripts/destroy.sh ,输入资源组名确认后,所有通过脚本创建的 Azure 资源(VM、磁盘、网络、IP等)都会被删除。你的 Azure AI 模型资源在独立的资源组中,不会受到影响。之后,你可以从“部署 Azure 基础设施”步骤开始,重新部署一个干净的环境。

更多推荐