本地预编译部署候选
目标读者:服务端部署与维护人员。
R1 / G6A 提供部署准备与本地隔离验收入口,当前兼容 Contracts 0.4.0-alpha.1、schema 000025。这仍是 development/evaluation 候选;正式服务器、HTTPS、生产邮件和 R1 发行属于另行启动的 G6B。
开发者接入游戏仍使用固定 SDK 包。服务端运营者从 Infra 的 release/rc.py 锁定七仓库 commit/tree,执行 check 和 build,取得带输入清单、镜像身份、SDK 来源和 checksum 的独立 bundle/。运行时不挂应用源码、不执行 Go 编译或 npm 装包。构建产物可按同一输入重建,但不宣称 Docker tar 逐字节可重复。实际支持平台必须以本次验收清单为准。
最小示例
在交付的 bundle/ 内,以普通宿主用户运行;需要 Docker/Compose、Python 3.12+ 和 Bash。每次使用新的专属项目名,默认端口仅绑定回环地址。init 创建随机且相互独立的凭据及私有配置文件,不覆盖既有文件。
python3 deploy.py --env ./private.env --project echo-g6a-example init
python3 deploy.py --env ./private.env --project echo-g6a-example load
python3 deploy.py --env ./private.env --project echo-g6a-example validate
python3 deploy.py --env ./private.env --project echo-g6a-example deps
python3 deploy.py --env ./private.env --project echo-g6a-example migrate
python3 deploy.py --env ./private.env --project echo-g6a-example initialize
python3 deploy.py --env ./private.env --project echo-g6a-example up
迁移与 API 启动独立。迁移用户拥有 schema;应用与维护使用不同的受限数据库凭据,不能修改 migration 记录或执行 DDL。应用启动与已初始化数据库上的维护核对完整 schema checksum;空目标的归档/admission 检查只验证独立备份和最新 seal。S3 管理员、Public、Admin 和维护程序使用不同身份,应用凭据不具有对象存储管理权限。Public 的服务端 consent/feature gate 与 Admin 的 membership/session 校验继续有效。
常见错误
配置文件包含私密数据;不要共享文件或完整 docker compose config 输出。Console 只收到公开的 Admin API、游戏 Public API 和 Docs 地址。CONSOLE_URL 用于 Admin CORS,S3_PUBLIC_ENDPOINT 用于附件签名地址。更换这些运行配置并重启,使用同一组镜像;不要把 Key、JWT、SMTP 凭据或签名 URL 写进前端配置。
本地候选采用 HTTP 和 Mailpit 捕获合成邮件。未来反向代理可转发五个公开入口到回环端口;正式域名、证书信任与续期、真实 Godot 客户端 HTTPS、生产 SMTP 必须在 G6B 验证。Public API 不信任 Forwarded/X-Forwarded-For;真实代理的每客户端入口限流仍由代理负责。
运维与恢复
datactl、accountctl 使用预编译程序,默认 dry-run,只有 --apply 才修改。observe 是有界单次健康/就绪检查,输出本地 JSON;失败返回非零退出码,不会发送外部通知,也不会安装计划任务。
python3 deploy.py --env ./private.env --project echo-g6a-example datactl --action inspect
python3 deploy.py --env ./private.env --project echo-g6a-example observe
COMPOSE_ENV_FILE=./private.env COMPOSE_PROJECT_NAME=echo-g6a-example python3 scripts/backup-local.py --root ./private-backups --apply
保留政策仍为反馈/评论/附件 90 天、备份 7 天、去敏审计 180 天,SDK 本地 7 天。持续保留 PostgreSQL、对象存储、独立 recovery-journal、另存的 recovery-witness、私有备份根目录和当前恢复控制目录。候选的 authority 文件位于各自持久卷的 authority/ 子目录。journal/witness 不进入 DB/对象备份;同一主机的多个卷不构成异机灾备。
恢复仅面向独立空目标,须先验证已批准备份与最新 cutover seal。源应用保持 fenced/stopped,目标使用原独立 authority。恢复前校正删除/撤销并完成物理清理;旧密码、session、验证码和待接受邀请失效。重复已完成恢复只检查当前数据,不重放旧 dump。缺失/陈旧 authority、错误归属或清理失败均保持关闭。具体命令与有界重试见交付包 README 及数据生命周期。
stop 停止应用,down 保留持久卷。不能用原源的 down -v 删除目标仍在使用的 authority。应用替换或回滚只允许经过验证的相同契约/schema/恢复协议窗口;数据库 migration 始终 forward-only。
下一步
模块检查、无头浏览器与实际依赖验收分别记录。真实 Godot 编辑器/OS 输入需要单独执行,不能用脚本伪造 native acknowledgement。源码 canonical clean-stack 与镜像产物专项是两种证据;产物验收必须核对实际镜像、挂载、程序和 checksum,所有必需 browser suite 零失败/跳过/重试。
G6B 仍需决定服务器/架构、Git/CI/registry、域名证书、生产 SMTP、独立备份/authority 保存点和告警接收方,并完成生产容量与项目成本配额、实际 RPO/RTO、许可与支持/导出矩阵。MinIO 官方已停止维护其开源发行;现有固定镜像只用于本地评估,生产对象存储的维护来源尚待选择。SDK 许可仍限 development/evaluation;本地候选可运行不等于正式发行。
已授权的测试部署
单独获授权的测试部署可用 rc.py lock --images release/images.amd64.lock.json 冻结 AMD64 输入;原 ARM64 候选保持不变。目标机器必须加载并运行准确的 AMD64 镜像,独立通过 HTTPS、邮件、SDK 与运维验收。构建或交叉编译不代表平台已受支持。
需要显式持久目录时,在 bundle 私有环境中设置 CANDIDATE_DATA_ROOT,指向以 Compose project 命名的私有绝对目录,父目录须已存在且为 0700。deps 仅新建自有目录,将受管命名卷分别绑定到 PostgreSQL、对象、journal 和 witness 子目录;已有无归属数据或不同卷绑定会被拒绝。打包的部署、备份与恢复入口使用同一布局。恢复目标保留自己的 DB/对象目录,但将源 journal/witness 作为外部 authority,不能删除源 authority。这仍是同机恢复。
测试项目使用 echo-g6b-<name>。非 local 测试配置要求 SMTP_RECIPIENT_ALLOWLIST 只包含唯一获授权收件人。Admin API 在 SMTP 信封或消息写入之前执行限制;其他地址仍获得原有泛化响应,但不会外发邮件。入口还须将触发邮件的路由限制到授权测试者,控制实际邮件次数,并单独确认邮箱收到,不能只用 SMTP 接受代替送达。地址与凭据仅保留于私有配置。这些措施不绕过验证,也不代表生产就绪。
SMTP 连接期限为 2 秒、完整会话期限为 10 秒;请求自身更早的期限仍优先生效。这为 STARTTLS 与认证的多次往返保留有界时间,不代表邮件已经进入收件箱。
验证码请求先以最多 5 秒建立共同的邮件连接,此阶段不查询账号资格;之后符合条件与不符合条件的地址统一使用 3 秒投递期限和响应下限。总计最多 8 秒,保留在 Console 原有的 10 秒超时内,避免与账号资格相关的耗时差异。