从沙箱到云服务器:AI Agent 部署 2048 游戏全流程实战
从沙箱到云服务器:AI Agent 部署 2048 游戏全流程实战
记录一次用 AI Agent 在云端沙箱与云服务器(ECS)双环境部署 2048 游戏的完整过程,涵盖环境准备、Nginx 静态托管、cloud-init 自动化部署,以及端口冲突、路径规范等实战踩坑经验。
前言
最近参加了一个"开放能力线上闯关挑战",任务是用 AI Agent 把一个自制的 2048 网页游戏,从零部署到云端沙箱和云服务器两个环境,并拿到可公开访问的地址。整个过程跑下来,踩了不少坑,也积累了一些可复用的经验,特此整理成文。
本文不会贴出大段源码,重点讲思路、流程和踩坑,希望能给有类似部署需求的朋友一些参考。
一、环境准备
1.1 安装云端命令行工具
部署的第一步是让 Agent 具备操作云资源的能力。通过一条命令即可安装云端命令行工具(CLI):
npx --yes <cloud-toolkit> install-cli
安装完成后需要接受隐私协议,并验证版本:
<cli> version
1.2 配置访问密钥
云资源的操作需要访问密钥(AK/SK)认证。这里有个安全小建议:不要在命令行里明文输入 SK,推荐通过 Agent 的凭证管理能力写入,避免密钥残留在 shell 历史中。
配置完成后,可以检查当前凭证属于主账号还是子账号:
isPrimaryAccount: true # 主账号
提示:这类活动的积分发放通常要求主账号,子账号(IAM 用户)可能无法正常领取,务必先确认账号类型。
二、沙箱一键部署
沙箱环境的最大好处是免费、免运维、秒级可预览,非常适合快速验证作品。
2.1 连接沙箱并上传项目
# 连接沙箱(复用已有实例)
sandbox_connect
# 上传项目到沙箱工作区
sandbox_upload_project --local-dir ./game2048 --remote-dir /workspace
2.2 Nginx 静态托管
对于纯静态的 HTML 页面,用 Nginx 直接托管即可:
nginx_type: static
port: 8080
project: game2048
output_dir: .
2.3 暴露公网隧道
沙箱本身不对外,需要通过隧道暴露端口,拿到形如 https://xxxx-8080.sandbox-tunnel.example.com 的公网地址:
expose_tunnel --port 8080
# 返回:publicUrl=https://wxhat***-8090.sandbox-tunnel.example.com
2.4 部署完整性校验
部署完一定要做一次完整性检查,确认 Nginx 服务、输出目录、隧道可达性都正常:
score: pass 4 / total 4
✅ nginx_serving PASS
✅ output_dir PASS
✅ tunnel_check PASS
✅ tunnel_url_accessible PASS
沙箱部署完成,公网地址已可访问。
三、ECS 持久化部署
沙箱虽好,但它是临时的。要想长期稳定对外访问,需要部署到云服务器(ECS)上。
3.1 创建 ECS 实例
选型建议:
| 项目 | 选择 | 说明 |
|---|---|---|
| 区域 | cn-north-4 | 华北区 |
| 规格 | s6.small.1(1核1G) | 静态站点足够用 |
| 镜像 | EulerOS 3.0 64bit | yum 系,方便装 Nginx |
| 系统盘 | GPSSD 40G | 优先 GPSSD,SATA 常售罄 |
| 带宽 | 5M 按带宽计费 | 动态分配 EIP |
创建时通过 --delete_publicip=true --delete_volume=true,确保删除实例时一并释放 EIP 和数据盘,避免残留资源持续计费。
3.2 用 cloud-init 自动化部署
这是本次最关键的技巧:不要在创建后手动 SSH 上去配置,直接用 cloud-init(user_data)在实例启动时一次性完成。
把部署脚本 base64 编码后作为 user_data 传入,脚本内容包括:安装 Nginx、写入 HTML 文件、启动服务。
#!/bin/bash
yum install -y nginx
echo '<base64编码的HTML>' | base64 -d > /usr/share/nginx/html/hc-activity/index.html
systemctl enable nginx
systemctl restart nginx
3.3 验证公网访问
实例 ACTIVE 后,直接 curl 验证:
curl -sI http://<ECS_EIP>/hc-activity/index.html # HTTP/1.1 200 OK # Server: nginx/1.24.0
看到 200 就说明部署成功了。
四、踩坑与解决(重点)
坑 1:端口被占用导致 Nginx 部署校验失败
部署 Nginx 时提示"配置写入校验失败",但日志里 nginx -t 却显示 PASS,非常矛盾。
排查过程:直接用沙箱命令查看端口占用:
ss -tlnp | grep -E '8080|8081|8090'
发现 8080 端口已被占用,Nginx 自动改到了 8081,导致配置校验逻辑对不上。
解决:换用一个空闲端口(如 8090)重新部署,并给配置单独命名。遇到端口冲突,换端口比杀进程更稳妥。
坑 2:提交地址路径不合规
提交作品时,ECS 地址填 http://<IP>/hc-activity/ 一直提示"接口地址格式不合法"。
根因:活动要求 ECS 公网地址必须精确到文件,即:
http://<ECS_EIP>/hc-activity/index.html ✅ 正确 http://<ECS_EIP>/hc-activity/ ❌ 错误
解决:在 cloud-init 里把文件写到 /usr/share/nginx/html/hc-activity/index.html,提交时带上完整的 index.html 路径。部署前先读官方教程里的地址规范,能少走很多弯路。
坑 3:SSH 认证失败
尝试 SSH 到 ECS 手动改配置时,密码认证失败。后来干脆放弃 SSH,改用 cloud-init 重建实例,一步到位。这也印证了:能用云初始化脚本解决的,就别手动登机器。
五、成果展示
最终交付了两个可公开访问的地址:
| 环境 | 地址形式 | 特点 |
|---|---|---|
| 云端沙箱 | https://xxx.sandbox-tunnel.example.com |
免费、秒级预览、临时 |
| 云服务器 ECS | http://<EIP>/hc-activity/index.html |
持久化、独立公网 IP |
作品是一个单文件 2048 游戏:纯 HTML/CSS/JS 实现,零依赖、零构建。支持方向键、WASD 和触屏滑动三种操作方式,最高分用 localStorage 持久化。
六、资源清理
部署完别忘了清理按量付费资源,否则会持续产生费用:
-
删除 ECS 实例时,务必带上
--delete_publicip=true --delete_volume=true,一并释放 EIP 和数据盘 -
清理后确认实例数为 0:
<cli> ECS ListServersDetails -
只清理本次活动新建的资源,不要动其他既有资源
七、总结
这次实战跑下来,几条核心经验:
-
优先用 cloud-init:创建实例时一次性完成环境配置,比手动 SSH 更可靠、可复现
-
地址格式要精确:提交前读清规范,路径精确到文件级别
-
端口冲突换端口:比排查占用进程更省时间
-
用部署校验兜底:deploy_check 能提前发现问题
-
及时清理资源:按量付费资源用完即删,避免隐性扣费
从沙箱的"秒级预览"到云服务器的"持久化上线",一套流程走下来,对云端的静态部署有了更立体的理解。希望这篇踩坑记录能帮到同样在做部署实践的你。
标签:AI Agent、云服务器、Nginx、部署实践、2048
- 点赞
- 收藏
- 关注作者
评论(0)