1. 项目概述:在AWS Lightsail上部署个人AI助手网关

最近在折腾一个挺有意思的东西,叫 openclaw。简单来说,它是一个开源的AI助手网关,可以让你通过一个统一的界面,连接和管理Telegram、Slack、Discord等二十多个消息平台的聊天机器人,背后再挂上像Anthropic Claude这样的AI模型。想象一下,你有一个24小时在线的AI助手,可以在你常用的所有聊天软件里随时响应你,帮你处理信息、回答问题,甚至管理任务,这想法挺酷的。

但问题来了,这种长期运行的服务放哪儿?放自己电脑上,关机就没了;用传统的云服务器(EC2),配置和管理又有点重,而且对个人项目来说,成本是个需要考虑的因素。这时候,AWS Lightsail进入了我的视线。Lightsail可以看作是AWS的“轻量级应用服务器”,它提供了预配置的虚拟机、存储和网络,价格透明且固定,非常适合个人项目、小型网站或者像openclaw这样的长期运行服务。

我这个项目 flo-kn/lightsail-openclaw ,核心就是用 Pulumi (一个“基础设施即代码”工具)和 TypeScript ,在AWS Lightsail上自动化地创建、配置并运行一个openclaw实例。整个过程从创建虚拟机、分配静态IP、设置安全组,到通过用户数据脚本自动安装Node.js和openclaw,全部代码化。最终,你每个月只需要花费大约10美元,就能拥有一个专属的、高可用的AI助手网关,并且所有基础设施的变更都有迹可循,易于复现和销毁。

如果你是一个开发者,想低成本、低维护地运行自己的AI聊天机器人服务;或者你对“基础设施即代码”感兴趣,想找一个具体的、端到端的Lightsail实践项目,那么接下来的内容应该会对你很有帮助。我会详细拆解整个架构设计、代码实现,并分享我在搭建过程中踩过的坑和总结的经验。

2. 架构设计与核心思路拆解

在动手写代码之前,搞清楚“为什么这么设计”至关重要。这不仅能帮你更好地理解项目,也能在你未来需要调整架构时,提供清晰的决策依据。

2.1 为什么选择AWS Lightsail而非EC2?

这是第一个关键决策。AWS EC2功能强大、灵活,但对于一个简单的、长期运行的守护进程来说,它显得有些“杀鸡用牛刀”。

  1. 成本确定性与简单性 :Lightsail提供的是套餐制。我选择的 small_3_0 套餐(2 vCPU, 2GB RAM, 60GB SSD)每月固定费用约为10美元,包含了计算、流量(有一定免费额度)和静态IP。在EC2上,你需要分别计算实例费、EBS存储费、流量费,并且IP地址如果独立分配(Elastic IP)且未关联运行中的实例,还会产生费用。Lightsail的打包价让成本预测变得极其简单。
  2. 开箱即用的体验 :Lightsail实例预装了操作系统镜像,并且管理控制台集成了基础监控、快照、防火墙(他们叫“网络”配置)等功能,对于单一实例的管理非常直观。
  3. 足够的性能 :openclaw本身是一个Node.js应用,作为消息中转网关和AI接口调用方,对计算资源要求并不苛刻。2核2G的配置足以流畅运行,并处理相当数量的并发消息。

注意 :Lightsail的缺点是扩展性有限(垂直升级套餐有上限,且不支持自动伸缩组等高级EC2特性),并且区域选择可能比EC2少。但对于个人或小规模固定负载应用,它是性价比极高的选择。

2.2 为什么选择Pulumi进行基础设施管理?

传统上,人们会用AWS控制台点击创建,或者用AWS CLI写一堆脚本。但这都不够“优雅”和可持续。基础设施即代码(IaC)是云时代的最佳实践。常见的工具有Terraform和AWS CDK。我选择Pulumi,原因如下:

  1. 使用真正的编程语言 :Pulumi允许你使用TypeScript、Python、Go等通用语言来定义基础设施。这意味着你可以使用循环、条件判断、函数复用、代码提示、类型检查等所有你熟悉的软件开发实践。这对于逻辑稍复杂的配置来说,可读性和可维护性远高于HCL(Terraform)或YAML。
  2. 状态管理更省心 :Pulumi默认使用其免费的服务端来存储和管理你的基础设施状态文件( <stack-name>.json )。当然,你也可以像我在这个项目里做的一样,将其状态后端(Backend)配置到自己的S3桶里,实现完全自托管。这比手动管理Terraform的本地状态文件或搭建远程状态后端更简单一些。
  3. 与AWS生态的良好集成 :Pulumi对AWS资源有着完整的覆盖,并且由于其使用AWS SDK,通常能很快支持新发布的AWS服务或资源属性。

用Pulumi,我的整个基础设施(Lightsail实例、静态IP、密钥对、防火墙规则)都定义在一个 index.ts 文件里。要创建,运行 pulumi up ;要销毁,运行 pulumi destroy 。干净利落。

2.3 网络与安全模型解析

安全是重中之重,绝不能把服务器裸奔在公网上。项目的网络设计遵循了“最小权限原则”。

公网 (Internet)
        │
        ▼ (仅允许TCP 22端口入站)
┌─────────────────┐
│  Lightsail实例   │
│  IP: 1.2.3.4    │
│                 │
│ 防火墙规则:      │
│ - 入站: SSH(22) │
│ - 出站: 全部允许 │
└─────────────────┘
        │
        ▼ (所有出站连接,如HTTPS 443)
    [ Telegram API ]
    [ Anthropic API ]
    [ 其他消息平台 ]
  1. 极简的入站规则 :只开放 SSH(端口22) 用于管理。openclaw的管理仪表板(Dashboard)默认运行在实例本地的18789端口,它 不直接暴露在公网 。你需要通过SSH隧道( ssh -L )将本地端口映射到实例的该端口进行访问。这意味着,没有SSH密钥的人,根本无法接触到你的openclaw服务界面,安全性极高。
  2. 宽松的出站规则 :允许所有出站连接。这是必须的,因为openclaw需要主动向外连接Telegram的Bot API、Anthropic的模型API以及其他各种消息服务平台。
  3. 静态IP的重要性 :我为Lightsail实例附加了一个静态IP。这不仅仅是为了有一个固定的访问地址(SSH)。更重要的是,许多外部API服务(尤其是消息平台)可能会对频繁变动的源IP地址进行风控,比如限速或临时封禁。使用静态IP可以确保你的机器人始终以同一个身份对外连接,行为更可预测,也更稳定。

2.4 软件栈选型:Ubuntu 22.04 LTS 与 Node.js 24

  1. 操作系统:Ubuntu 22.04 LTS

    • 长期支持 :LTS版本提供长达5年的安全更新,直到2027年4月。这保证了在项目生命周期内无需担心系统突然停止支持。
    • 广泛的社区支持 :绝大多数Linux服务器的教程、问答和故障排查方案都基于Ubuntu或Debian系。遇到问题时,更容易找到解决方案。
    • 与Lightsail的兼容性 :Ubuntu是AWS Lightsail官方提供的“蓝图”之一,在包括 eu-central-1 (法兰克福)在内的所有区域都可用,部署无障碍。
  2. Node.js 版本:24.x

    • openclaw的硬性要求 :openclaw项目本身指定了需要Node.js 24或更高版本。
    • 通过NodeSource安装 :在Ubuntu上,通过系统自带的 apt 安装的Node.js版本通常较旧。NodeSource提供了为各个Ubuntu版本预构建的、最新的Node.js发行版APT仓库。这是在生产环境Ubuntu系统上获取特定Node.js版本最规范、最可靠的方式,比手动下载二进制包或使用 nvm (更适合开发环境)更利于自动化部署和系统服务管理。

这个技术选型组合,在稳定性、社区生态和满足应用需求之间取得了很好的平衡。

3. 核心细节解析与实操要点

理解了“为什么”,我们再来深入看看“是什么”。这一部分会详细拆解Pulumi代码的核心逻辑和实例的初始化过程。

3.1 Pulumi项目结构解析

项目的目录结构清晰,各司其职:

lightsail-openclaw/
├── index.ts                 # 核心:基础设施定义代码
├── Pulumi.yaml             # 项目元数据(名称、运行时、描述)
├── Pulumi.prod.yaml        # 环境特定的配置(敏感信息,应.gitignore)
├── scripts/
│   └── bootstrap.sh        # 黄金环节:实例启动后自动执行的脚本
├── package.json            # 定义Node.js依赖(@pulumi/aws等)
└── tsconfig.json          # TypeScript编译配置
  • index.ts :这是大脑。它使用Pulumi的AWS SDK来声明我们需要的所有资源。
  • Pulumi.yaml :这是项目的身份证。它告诉Pulumi这是一个TypeScript项目,名字叫什么。
  • Pulumi.prod.yaml :这是环境配置。比如我们想要部署的区域( eu-central-1 ),或者给资源打上的标签( author: your-name )。 这个文件包含敏感信息(如果配置了密钥),必须加入到 .gitignore 中。 项目里通常提供一个 Pulumi.prod.yaml.example 作为模板。
  • scripts/bootstrap.sh :这是灵魂。当Lightsail实例首次启动时,AWS会执行这个脚本。我们将通过它完成所有软件的自动化安装和初始配置。

3.2 深入 index.ts :基础设施即代码实战

让我们逐块分析核心的 index.ts 文件,了解Pulumi是如何定义资源的。

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsNative from "@pulumi/aws-native";
import * as crypto from "crypto";
import * as fs from "fs";

首先导入必要的包。 @pulumi/aws 是经典版的AWS资源提供商,而 @pulumi/aws-native 是新一代的、由AWS直接提供Schema的“原生”资源提供商,有时功能更新或略有不同。这里我们主要使用经典版。

// 从Pulumi的配置中读取参数
const config = new pulumi.Config();
const author = config.require("author"); // 负责人,用于资源标签
const org = config.require("org");       // 组织名,用于资源命名
const region = aws.config.region || "eu-central-1"; // 区域,默认为法兰克福

Pulumi的配置系统( pulumi config set )让我们可以动态传入值,避免将环境信息硬编码在代码中。

// 生成一个唯一的密钥对名称,避免与其他资源冲突
const keyPairName = pulumi.interpolate`${org}-openclaw-${crypto.randomBytes(4).toString("hex")}`;
// 在AWS EC2(Lightsail密钥对实际由EC2服务管理)中创建密钥对
const keyPair = new aws.ec2.KeyPair(keyPairName, {
    keyName: keyPairName,
    publicKey: // ... 通常这里会读取一个已有的公钥文件,但Pulumi也可以自动生成
});

这里有一个关键点: Lightsail的密钥对资源在Pulumi的AWS经典提供商中并没有直接对应的资源类型 。但幸运的是,Lightsail实例在创建时可以引用一个在EC2服务中创建的密钥对。所以我们需要先创建一个EC2密钥对。

实操心得 :关于密钥对生成,有两种常见模式:

  1. 自动生成(本项目采用) :让Pulumi/AWS生成密钥对,然后将私钥作为栈输出( stack output )保存到本地。这种方式最自动化,但你必须妥善保管好输出的私钥文件( .pem )。
  2. 使用现有公钥 :如果你已经有一个SSH密钥对(比如 ~/.ssh/id_rsa.pub ),你可以将公钥内容读取到变量中,然后在创建 KeyPair 资源时传入。这样你可以继续使用自己熟悉的私钥进行连接。代码类似: publicKey: fs.readFileSync("/path/to/id_rsa.pub", "utf-8")
// 准备用户数据脚本 (User Data)
const bootstrapScript = fs.readFileSync("./scripts/bootstrap.sh", "utf-8");

用户数据(User Data)是实例启动时自动运行的脚本。我们将 bootstrap.sh 的内容读入一个变量,后续传递给Lightsail实例。

// 创建Lightsail实例
const instance = new aws.lightsail.Instance("openclaw-instance", {
    name: pulumi.interpolate`${org}-openclaw`, // 实例名称
    availabilityZone: `${region}a`,           // 可用区,通常选择区域后的字母a
    blueprintId: "ubuntu_22_04",              // 操作系统镜像ID
    bundleId: "small_3_0",                    // 实例套餐ID
    keyPairName: keyPair.keyName,             // 关联上面创建的密钥对
    userData: bootstrapScript,                // 注入启动脚本
    tags: { Author: author },                 // 打上标签,便于资源管理
});

这是最核心的资源声明。我们定义了一个Lightsail实例:

  • blueprintId: "ubuntu_22_04" 指定了操作系统。
  • bundleId: "small_3_0" 指定了计算规格。
  • keyPairName 关联了密钥对,这样创建后就可以用对应的私钥SSH登录。
  • userData 是我们实现自动化配置的关键,脚本内容会在实例首次启动时以 root 身份执行。
// 创建并关联静态IP
const staticIp = new aws.lightsail.StaticIp("openclaw-ip", {
    name: pulumi.interpolate`${org}-openclaw-ip`,
});
const ipAttachment = new aws.lightsail.StaticIpAttachment("openclaw-ip-attach", {
    staticIpName: staticIp.name,
    instanceName: instance.name,
});

静态IP是一个独立的资源,创建后需要“附着”到实例上。这样即使实例重启,这个IP地址也不会变。

// 配置防火墙(在Lightsail中称为InstancePublicPorts)
// 只开放SSH端口22的入站访问
const firewall = new aws.lightsail.InstancePublicPorts("openclaw-ports", {
    instanceName: instance.name,
    portInfos: [{
        protocol: "tcp",
        fromPort: 22,
        toPort: 22,
        cidrs: ["0.0.0.0/0"], // 允许任何IP访问SSH。在生产中,可考虑限制为自家IP段。
    }],
});

这里定义了入站防火墙规则。 只开放22端口 是安全基石。 cidrs: ["0.0.0.0/0"] 意味着从任何IP都可以尝试SSH连接(当然,需要正确的密钥)。对于个人项目,这样设置可以方便地从任何地方管理。如果你有固定的公网IP,强烈建议将其替换为类似 ["123.123.123.123/32"] 的格式,以大幅减少被暴力破解的风险。

// 输出有用的信息
export const instanceName = instance.name;
export const publicIp = staticIp.ipAddress; // 输出静态IP地址
export const privateKey = keyPair.privateKey; // 输出Pulumi生成的私钥(需保密!)
export const sshCommand = pulumi.interpolate`ssh -i openclaw.pem ubuntu@${staticIp.ipAddress}`;

最后, export 将这些值作为Pulumi栈的输出。在部署完成后,你可以通过 pulumi stack output publicIp 直接获取IP地址,通过 pulumi stack output privateKey --show-secrets > openclaw.pem 来保存私钥。这个 sshCommand 输出更是直接给出了连接命令,非常贴心。

3.3 解密 bootstrap.sh :实例的自动化初始化

用户数据脚本是实例的“第一印象”,它决定了实例启动后变成一个什么样的服务器。我们的 bootstrap.sh 脚本做了以下几件关键事:

  1. 系统更新与基础工具安装 :首先 apt update && apt upgrade -y 确保系统是最新的,然后安装一些常用的工具如 curl , wget , git 等。这是一个好习惯。
  2. 安装Node.js 24 via NodeSource
    curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
    sudo apt-get install -y nodejs
    
    这是官方推荐的安装方式。脚本会自动配置APT仓库并安装指定版本的Node.js和npm。
  3. 安装openclaw :由于openclaw是一个npm包,安装非常简单: sudo npm install -g openclaw -g 参数将其安装到全局,方便在任何位置直接运行 openclaw 命令。
  4. (可选)配置系统服务 :一个更完善的脚本可能还会包含将openclaw配置为systemd服务的步骤,这样它就可以在系统启动时自动运行,并且在崩溃时自动重启。原项目的 openclaw onboard --install-daemon 命令可能会处理这部分,但将其预置在启动脚本中会更稳健。

重要提示 :用户数据脚本默认以 root 身份运行。这意味着你不需要在命令前加 sudo 。同时,脚本中的任何错误都可能导致实例启动后状态不符合预期。因此,在脚本中增加日志输出( echo "Starting..." >> /var/log/user-data.log )和错误检查( set -e 让脚本遇到错误立即退出)是非常好的实践。

4. 完整实操过程:从零到一的部署指南

理论说了这么多,现在让我们亲手走一遍完整的部署流程。请确保你的本地开发环境已经就绪。

4.1 前期准备:环境与工具配置

  1. 安装必备工具

    • Node.js & Bun :Pulumi支持TypeScript,我们需要Node.js环境。同时项目使用Bun作为包管理器(更快)。请根据官网指引安装 Bun
    • Pulumi CLI :前往 Pulumi官网 下载并安装对应你操作系统的Pulumi CLI。
    • AWS CLI v2 :这是与AWS交互的基础工具。同样,请从AWS官网安装并配置。
  2. 配置AWS认证 (这是最关键的一步): 项目推荐使用AWS IAM Identity Center (SSO)进行认证,这是管理多账户和临时凭证的最佳实践。

    # 1. 运行配置向导,它会引导你输入SSO起始URL、区域和账户信息
    aws configure sso
    # 2. 根据提示登录浏览器完成授权
    # 3. 为这个配置命名一个profile,例如 `my-openclaw-profile`
    

    配置完成后,你可以通过 aws sso login --profile my-openclaw-profile 来刷新登录状态。登录后,AWS CLI会自动获取一组临时凭证,Pulumi会使用这些凭证来操作你的AWS资源。

    踩坑记录 :确保你的IAM Identity Center用户或所属组,在目标AWS账户中拥有足够的权限,至少需要包含 Lightsail:* , EC2:CreateKeyPair , EC2:ImportKeyPair , S3:* (用于创建状态存储桶)等操作的权限。权限不足是部署失败最常见的原因之一。

4.2 初始化Pulumi项目与状态后端

Pulumi需要知道你的基础设施“状态”存储在哪里。我们将使用一个S3桶作为后端。

# 1. 克隆项目代码
git clone <repository-url>
cd lightsail-openclaw

# 2. 创建一个全局唯一的S3桶名,用于存储Pulumi状态
export PULUMI_BACKEND="my-unique-org-openclaw-pulumi-backend"
aws s3 mb s3://$PULUMI_BACKEND --region eu-central-1
# 如果桶已存在,你会看到提示,换一个名字即可。

# 3. 告诉Pulumi使用这个S3桶作为后端
pulumi login s3://$PULUMI_BACKEND

# 4. 为生产环境创建一个Pulumi“栈”(Stack)。栈是配置的隔离环境,比如dev, prod。
pulumi stack init prod

# 5. 设置栈的加密密码短语,并导出到环境变量。Pulumi用此密码加密状态文件中的敏感信息。
# 首次运行会提示你输入,请务必记住它。
export PULUMI_CONFIG_PASSPHRASE="your-strong-passphrase-here"

4.3 配置项目参数并安装依赖

接下来,我们需要设置这个特定栈(prod)的配置参数。

# 1. 安装项目依赖(TypeScript类型定义和Pulumi AWS包)
bun install

# 2. 设置AWS区域(必须与后续S3桶、Lightsail实例区域一致)
pulumi config set aws:region eu-central-1

# 3. 设置作者和组织信息,这些会用于资源命名和标签
pulumi config set author "YourName"
pulumi config set org "your-org-name" # 用于生成资源名,如 your-org-name-openclaw

这些配置会被保存在本地的 Pulumi.prod.yaml 文件中。 请务必检查 .gitignore 文件是否包含 Pulumi.*.yaml ,确保此包含敏感信息(如果后续设置了其他密钥)的文件不会被意外提交到Git仓库。

4.4 预览与部署基础设施

在真正创建资源之前,先进行预览是一个好习惯。

# 1. 确保你已登录AWS SSO
aws sso login --profile my-openclaw-profile

# 2. 确保Pulumi状态后端和密码短语已设置(如果在新终端中,需要重新设置环境变量)
export PULUMI_BACKEND="my-unique-org-openclaw-pulumi-backend"
export PULUMI_CONFIG_PASSPHRASE="your-strong-passphrase-here"
pulumi login s3://$PULUMI_BACKEND

# 3. 选择我们之前创建的prod栈
pulumi stack select prod

# 4. 预览Pulumi将要执行的操作(创建、更新或删除哪些资源)
pulumi preview

仔细阅读 pulumi preview 的输出。它应该显示将要创建一个KeyPair、一个Lightsail实例、一个StaticIp和一个防火墙规则。确认无误后,执行部署:

# 5. 执行部署。Pulumi会再次显示变更摘要,并提示你确认 (yes/no)。
pulumi up

输入 yes 后,Pulumi就会开始调用AWS API创建资源。这个过程大约需要2-3分钟。当看到 Outputs: 部分显示 publicIp sshCommand 时,就表示部署成功了!

4.5 连接服务器与初始化openclaw

部署成功后,我们首先需要获取SSH私钥并连接到实例。

# 1. 将Pulumi生成的私钥保存到本地文件,并设置严格的权限(非常重要!)
pulumi stack output privateKey --show-secrets > openclaw.pem
chmod 600 openclaw.pem # 只有所有者可读写,防止其他用户读取

# 2. 使用输出的命令进行SSH连接
ssh -i openclaw.pem ubuntu@$(pulumi stack output publicIp)
# 或者使用之前输出的sshCommand

首次连接成功,你应该能看到Ubuntu系统的欢迎信息。此时, bootstrap.sh 脚本应该已经执行完毕。你可以运行 node --version openclaw --version 来验证Node.js和openclaw是否已正确安装。

接下来,进行openclaw的初始配置:

# 在Lightsail实例的SSH会话中运行
openclaw onboard --install-daemon

这个交互式命令会引导你完成:

  1. 设置你的工作区(Workspace)名称和存储路径(默认在 ~/.openclaw/ )。
  2. 配置AI模型提供商(例如Anthropic Claude)的API密钥。
  3. 添加“通道”(Channel),也就是连接哪个消息平台(如Telegram Bot)。
  4. 创建“代理”(Agent),定义AI的行为和指令。
  5. 最后, --install-daemon 选项会帮你将openclaw配置为一个系统守护进程(例如使用systemd),使其能在后台持续运行,并在系统重启后自动启动。

完成这些步骤后,你的openclaw服务就应该已经在实例的18789端口运行了。

4.6 访问管理仪表板

openclaw提供了一个Web管理仪表板。由于安全考虑,我们没有在防火墙上开放18789端口。访问它需要通过SSH隧道。

在本地机器上,新开一个终端窗口,执行:

ssh -i openclaw.pem -L 18789:localhost:18789 ubuntu@$(pulumi stack output publicIp) -N

这个命令建立了SSH隧道:

  • -L 18789:localhost:18789 :将本地的18789端口转发到远程实例 localhost 的18789端口。
  • -N :表示不执行远程命令,只建立隧道。

保持这个终端窗口运行。然后,在你的本地浏览器中访问 http://localhost:18789 ,你应该就能看到openclaw的仪表板界面了。在这里,你可以更直观地管理代理、通道和会话。

5. 运维、问题排查与成本控制

服务跑起来只是开始,长期的稳定运行和问题处理同样重要。

5.1 日常运维与监控

  1. 查看服务状态 :通过SSH登录后,可以使用systemctl命令查看openclaw守护进程的状态。

    sudo systemctl status openclaw
    

    如果服务意外停止,可以尝试重启: sudo systemctl restart openclaw

  2. 查看应用日志 :日志是排查问题的第一手资料。openclaw的日志可能输出到系统日志( journalctl )或自己的日志文件。通常可以这样查看:

    # 查看systemd服务的日志
    sudo journalctl -u openclaw -f  # -f 表示实时跟踪
    # 或者查看openclaw工作目录下的日志文件
    tail -f ~/.openclaw/logs/openclaw.log
    
  3. Lightsail控制台监控 :登录AWS控制台,进入Lightsail服务,选择你的实例。在这里你可以看到CPU利用率、网络流量、磁盘IO等基础监控图表,并可以设置报警阈值(例如CPU持续超过80%时发出警报)。

5.2 常见问题排查速查表

问题现象 可能原因 排查步骤
pulumi up 失败,提示权限不足 AWS凭证无效或IAM权限不足 1. 运行 aws sts get-caller-identity 确认当前凭证有效且所属身份正确。
2. 检查关联的IAM策略是否包含必要的Lightsail、EC2、S3权限。
SSH连接被拒绝 防火墙未开放22端口;密钥对错误;实例尚未启动完成 1. 在Lightsail控制台检查实例的“网络”选项卡,确认TCP 22端口对 0.0.0.0/0 开放。
2. 确认使用的私钥文件( openclaw.pem )是 pulumi stack output 输出的那个,并且权限是600。
3. 等待实例状态从“启动中”变为“运行中”。
能SSH,但 openclaw 命令未找到 bootstrap.sh 用户数据脚本执行失败或未完成 1. 检查用户数据脚本日志: cat /var/log/cloud-init-output.log
2. 手动运行安装命令: sudo npm install -g openclaw
本地浏览器无法访问 localhost:18789 SSH隧道未建立;openclaw服务未运行 1. 确认建立隧道的SSH命令在运行,且无错误。
2. 在实例上检查openclaw服务状态: sudo systemctl status openclaw
3. 检查端口监听:`sudo netstat -tlnp
机器人不响应消息 AI API密钥配置错误;通道配置错误;网络出站问题 1. 检查openclaw日志,看是否有连接API失败或认证错误的记录。
2. 在仪表板或配置中确认Telegram Bot Token等通道配置正确。
3. 在实例上测试网络连通性: curl -v https://api.anthropic.com

5.3 成本控制与优化建议

  1. 月度预算 small_3_0 实例 + 静态IP,每月固定约10美元。注意Lightsail套餐包含一定的出站流量(通常每月1TB或更多),对于聊天机器人这种文本交互应用,几乎不可能用完,所以流量费用通常为0。
  2. 关机省钱 :如果你只是临时测试,不需要7x24小时运行,可以在Lightsail控制台手动“停止”实例。停止后,你只需支付静态IP和可能存在的存储快照费用(极低),计算资源不再计费。 但注意,停止实例会释放动态公网IP,但静态IP会保留。 再次启动时,实例可能会获得新的内部IP,但静态IP不变。
  3. 使用快照 :在对实例进行重大变更前(比如升级系统、安装新软件),可以在控制台创建“快照”。快照按存储空间收费,但可以作为系统盘的回滚点,非常有用。
  4. 设置账单警报 :在AWS Cost Management控制台中设置月度预算警报,当费用超过一定阈值(比如12美元)时通过邮件通知你,避免意外超支。

5.4 销毁资源

当你不再需要这个环境时,可以使用Pulumi一键销毁所有创建的资源,避免持续产生费用。

# 确保在项目目录下,并且栈是 `prod`
pulumi destroy

Pulumi会列出所有将被销毁的资源(实例、静态IP、密钥对、防火墙规则),经你确认后,便会执行清理操作。 此操作不可逆,请谨慎执行。

销毁后,你本地的 openclaw.pem 私钥文件以及Pulumi状态文件中关于这些资源的信息都将失效。如果你之后需要重新部署,再次运行 pulumi up 即可,Pulumi会重新创建一套全新的资源。

整个流程走下来,你会发现,借助Pulumi和Lightsail,将一个复杂的个人服务从概念到生产部署,变得如此清晰和可重复。你不仅得到了一个可用的AI助手网关,更收获了一套可版本控制、可审计、一键式部署的基础设施代码。这才是这个项目带来的最大价值。

更多推荐