部署与运维
当前部署
主机:jack@192.168.1.200;应用目录 /home/jack/apps/zymix_host;裸仓库 /home/jack/git/zymix_host.git。main 分支由 post-receive hook 部署。应用端口 18080;MySQL 3306 和 Redis 6379 不发布到宿主端口。
| 数据 | 位置与作用 |
|---|---|
| MySQL 数据文件 | /home/jack/apps/zymix_host/mysql-data → /var/lib/mysql |
| 业务数据库 | zymix_v2,项目、事件、会话摘要、存档、奖励和 code 防重记录 |
| Redis AOF | /home/jack/apps/zymix_host/redis-data → /data,生产使用 DB0 |
| 旧 JSON | /home/jack/apps/zymix_host/data/store.json,仅保留用于迁移追溯 |
| 环境密钥 | /home/jack/apps/zymix_host/.env,0600,不进 Git |
| 备份 | /home/jack/apps/zymix_host/backups,限制访问 |
| 发布日志 | releases/history.log;.deployed-revision 和 .deployed-image |
容器重建不删除上述绑定目录。旧 zymix 数据库在迁移后保留,包含旧版镜像残留,不能把它当成新版本数据源。任何时候都不得用删除 mysql-data 的方式处理发布问题。
发布
git push server main
ssh jack@192.168.1.200 'docker ps --format "{{.Names}} {{.Status}}"'
curl http://192.168.1.200:18080/ready
curl http://192.168.1.200:18080/health
hook 使用 flock 串行化发布,只处理 main,检出最新 main 后调用 deploy/release.sh。镜像按 Git SHA 标记,先构建、执行增量 schema,再替换应用并检查 /ready。失败回退上一应用镜像,保留数据库。post-receive 报错不能撤销已接受的 Git push,因此须检查远端输出和健康 revision,不能只看 push 退出码。
从旧 JSON 到 MySQL 的首次切换需要独立新库和数据迁移,见 storage-migration.md。release.sh 不自动重导入旧 JSON。数据库变更只做增量兼容;未来破坏性 schema 迁移需要单独备份和维护窗口。
配置与权限
运行配置已迁入 MySQL system_settings;项目、管理员和系统配置随 SQL 备份迁移。完整配置命令、缓存一致性和恢复步骤见 系统配置与缓存。
| 文件或服务 | 作用 |
|---|---|
| .env(0600) | 数据库连接凭据和 CREDENTIAL_ENCRYPTION_KEY 主密钥,仅部署与 ops 容器使用 |
| .runtime.env(0600) | 发布工具生成的最小运行配置,包含 zymix_runtime 数据库凭据和主密钥,不含 MySQL root 密码 |
| MySQL system_settings | 会话周期、限流、允许域名、Origin、Redis 地址和加密后的签名密钥 |
| zymix-redis-cache | 独立可淘汰配置缓存,128 MiB 上限,无持久化 |
| zymix-redis | 原有会话和限流 Redis,保留 AOF |
安全域只通过服务器 sh deploy/ops.sh allow-host openapi-fk.tcmpp.com 管理,没有 HTTP 修改入口;运行数据库账号无系统配置写权限。运维命令读取 .deployed-image,避免使用错误的 latest 镜像。
备份与恢复
执行 sh deploy/backup.sh,脚本从运行容器读取当前库名,使用 mysqldump --single-transaction 生成 SQL、权限 0600 和 SHA256。不在命令行打印密码。环境密钥备份应加密后保存到另一个受控位置;仅有数据库没有加密密钥无法恢复 AppSecret。
恢复应先创建空的隔离数据库,再导入 SQL 并对比项目数、存档、奖励、Unicode 内容与版本。不要直接覆盖生产数据库;验证通过后在停写窗口切换 MYSQL_DATABASE。Redis 不作为业务持久化唯一来源,恢复 Redis 丢失的登录状态时让客户端重新登录。
恢复命令示意(在服务器执行,RESTORE_DATABASE 必须为事先创建的隔离库):
docker exec -i -e RESTORE_DATABASE=zymix_restore zymix-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysql -u root "$RESTORE_DATABASE"' < backups/选定备份.sql
备份策略建议每日一次并异机保留,当前脚本为手动调用,未擅自创建定时任务。应监控磁盘空间、MySQL 错误、Redis 内存与淘汰、503/429、P95、备份日期和恢复演练结果。事件和 code 记录当前不自动删除;高流量部署需制定留存策略和归档任务,避免无限增长。
密码维护
管理员密码只以 scrypt 哈希保存在 MySQL admin_users,运行时不读取 ADMIN_USERNAME 或 ADMIN_PASSWORD_HASH。原明文凭证文件已删除;不得重新生成。密码重置由受控服务器操作更新数据库哈希,旧会话在下次请求校验时失效。不要通过更换 TOKEN_SECRET 重置密码,它还参与小游戏身份派生。
本后台是单管理员角色,能够管理所有项目;当前不提供按项目分配操作员角色或多主机高可用。MySQL、Redis 单实例故障时服务拒绝请求,不能把并发压测等同于高可用证明。