用浏览器完成2048部署:从华为云沙箱预览到ECS与Nginx实战
这次我在 AI 辅助下,把一个纯前端 2048 小游戏从华为云沙箱预览迁移到了 ECS,并完成了公网访问验证。整个过程通过浏览器和云端工作区完成,没有从本机上传文件,也没有从本机建立 SSH 连接。本文记录实际采用的部署方法,以及遇到问题时如何判断是实例、服务、隧道还是任务提交环节出了问题。
一、先把游戏做成单文件
这个 2048 使用 4×4 棋盘,支持方向键、WASD 和触摸滑动,包含相同数字合并、计分、新游戏与撤销等功能。HTML、CSS 和 JavaScript 全部放在 index.html 中,没有 npm 依赖,也不需要 Vite 等构建工具。这样部署时只需要一个静态文件,沙箱和 ECS 都可以直接用 Nginx 托管。
本次生成的 HTML 为 13719 字节。我先在沙箱里完成界面和交互验收,确认方块移动、相同数字合并以及分数增加正常,再把同一份代码用于 ECS,避免迁移时又生成一份行为不同的游戏。
二、沙箱预览:实例、服务和隧道要分别检查
沙箱阶段遇到过规格资源不足。后来复用了已有的持久化容器,而不是反复新建环境。这里有一个容易误判的状态:管理页的“已就绪”不等于“运行中”。只有开机成功并确认实例运行后,才能继续检查服务。
游戏最初放在云端工作区的 /workspace/game2048/index.html,Nginx 使用 8080 端口提供静态页面,再通过平台公开隧道访问。持久化数据盘保留了文件,但实例重启后,服务进程和部分运行配置仍可能需要恢复。
另一个典型问题是浏览器出现 tunnel not found。这次实际排查发现,旧链接不能在沙箱关机后继续当作有效地址使用。恢复实例和 Nginx 后,需要重新获取当前隧道地址,再做 HTTP 检查。只看到“已创建隧道”的提示还不够,必须确认返回的是游戏 HTML,而不是网关提示页。
三、ECS 配置:使用网页初始化脚本代替本机 SSH
进入 ECS 持久化部署阶段后,我先检查了目标区域是否有可复用的 ECS。本次没有现成实例,因此选择了按需计费的小规格实例。实际配置为华北北京四、1 vCPU / 1 GiB、Debian 12 公共镜像、40 GiB 通用型 SSD 系统盘,以及 1 Mbit/s 公网带宽。
为了便于控制短期实验费用,最后选择了固定带宽计费。2026 年 10 月 23 日,本次控制台显示的配置合计为 0.1618 元/小时。这只是当时所选配置的报价,其他区域、规格或购买时间请以控制台实时价格和最终账单为准。
部署入口位于 ECS 自定义购买页面的“高级配置 → 实例自定义数据注入 → 以文本形式”。在这里填写初始化脚本,实例首次启动时由云端执行安装、文件还原和服务启动工作。本次登录凭证选择“创建后设置”,没有为了部署而新建 SSH 密钥对,也没有把个人云账号的 AK/SK 写进实例。
原游戏文件已经存在于码道云端工作区。我在云端将它压缩为 gzip 并编码成 Base64,把编码文本嵌入初始化脚本;ECS 启动后在云端解码并还原到 /var/www/html/hc-activity/index.html。这一步传递的是云端生成的游戏文本,没有使用浏览器的本机文件选择器,也没有上传本机附件。
下面是初始化脚本中的服务安装和验证部分。执行到 test 之前,需要先在同一个云端脚本里完成完整游戏 HTML 的写入或解码;本片段不包含游戏源码,不能单独代替整个部署脚本。
#!/bin/bash
set -eu
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -y install nginx curl
install -d -m 755 /var/www/html/hc-activity
# 在此之前,将云端生成的完整 index.html 写入这个路径。
test -s /var/www/html/hc-activity/index.html
chmod 644 /var/www/html/hc-activity/index.html
nginx -t
systemctl enable --now nginx
# 127.0.0.1 指 ECS 自身,不是运行浏览器的电脑。
curl --fail --max-time 10 -sS -o /dev/null -w 'HTTP:%{http_code}\n' http://127.0.0.1/hc-activity/index.html
四、安全组只开放实际需要的端口
这次没有直接使用默认的 Web 服务器安全组,因为检查后发现它还包含面向公网的 SSH 和远程桌面规则。我为实验新建了独立安全组,对公网仅开放 TCP 80,让评审和浏览器能够访问静态游戏;没有开放公网 SSH 22 或 RDP 3389,也没有给 ECS 配置额外的云服务委托。
这里的 HTTP 站点只用于临时展示公开游戏,不承载账号登录、密码或其他敏感输入。如果后续作为正式站点长期运营,应另外完成域名、HTTPS、访问控制和相应的网站合规配置。
五、用响应内容和哈希确认迁移成功
ECS 显示“运行中”只能说明实例已启动,并不代表 cloud-init 已经执行完毕。等初始化完成后,我从码道云端对公网地址执行 HTTP 检查,并将响应与原始文件比较。
# 在云端工作区执行;将 <EIP> 替换为实际公网地址。
curl -sS --connect-timeout 8 --max-time 20 -o /tmp/ecs2048-check.html -w 'HTTP:%{http_code}\n' http://<EIP>/hc-activity/index.html
wc -c /tmp/ecs2048-check.html
md5sum /tmp/ecs2048-check.html
sha256sum /tmp/ecs2048-check.html
本次公网检查实际返回 HTTP 200,响应大小为 13719 字节,MD5 和 SHA256 都与沙箱阶段已验收的源文件一致;同时检查了页面标题和棋盘元素标记。这样可以区分“端口通了”和“确实返回了正确游戏文件”这两件事。
浏览器若受所在环境的网络策略限制,也可能无法直接打开某些公网地址。这次没有修改或绕过浏览器安全策略,而是保留云端 HTTP 校验结果,并结合此前对同一份代码的交互验收确认迁移结果。仅靠 HTTP 200 不能替代首次游戏功能测试。
六、部署验证和活动提交分开核对
游戏部署成功后,我按官方活动的沙箱、ECS 顺序提交成果。提交规则以官方活动页和官方 huawei-cloud-activity-submit 技能为准,不能把临时失效地址当作有效作品,也不应该反复提交同一个地址。
过程中曾出现“活动不存在或已结束”的接口提示。这个提示本身无法区分活动结束还是服务端活动校验暂时异常,因此我没有只凭这条报错就认定活动已结束。后续接口恢复后,实际提交返回成功,再到成长中心检查积分明细,确认沙箱与 ECS 两个部署任务分别记录到账。
这里不附任何个人凭据、项目标识或真实实例地址。凭据不应写进博客、初始化脚本或游戏页面;读取官方工具说明时,也要同时确认它会把凭据传给谁、是否写入云端文件,以及是否符合自己的授权范围。
七、验证完成后清理计费资源
这是一项短期部署实验,因此创建时设置了定时删除,并让公网 IP 随实例释放。完成验证和成果提交后,又手动清理了本次 ECS,并核对 ECS、系统盘和公网 IP 列表,确认没有留下这次实验的计费资源。原始游戏源码保留在码道云端任务中。
只关闭 ECS 并不等于清理完毕:系统盘和公网带宽等关联资源也需要核对。删除后的游戏公网地址会失效,文章因此只保留通用路径示例;已产生的费用还可能在后续账单周期显示,最终以账单为准。
对这次实践帮助最大的检查顺序是:实例是否真的运行、Nginx 是否启动、隧道或公网地址是否有效、响应是否为正确游戏、成果提交是否成功、计费资源是否清理。把这些状态分开核对,定位问题会清楚很多。
本文根据本次实际部署记录整理,使用 AI 辅助组织文字;部署结果、文件校验和资源释放情况均已实际核对。
- 点赞
- 收藏
- 关注作者
评论(0)