# 常见运维操作 --- ## 场景一:更换域名 当需要将服务迁移到新域名时(例如 `daoqijuyou.cn` → `newdomain.com`),只需改一个变量。 ### 1. 修改 `.env` 中的 `ROOT_DOMAIN` ```bash vim .env ``` ```bash # 改成新父域名,三个子域名自动跟随 ROOT_DOMAIN=newdomain.com ``` `docker-compose.yml` 将自动推导: | 推导变量 | 结果 | |---------|------| | `API_DOMAIN` | `api.newdomain.com` | | `DLWEB_DOMAIN` | `dlapi.newdomain.com` | | `SITE_API_URL` | `https://api.newdomain.com` | | `SITE_PAY_NOTIFY_URL` | `https://api.newdomain.com` | | `SITE_OPEN_URL` | `http://open.newdomain.com` | | `DLWEB_DL_API_V3_URL` | `https://dlapi.newdomain.com` | > **子域名不符合标准规律时**,在 `.env` 中单独覆盖对应变量即可: > ```bash > DLWEB_DOMAIN=dl-manage.newdomain.com > ``` > **其他独立 URL 变量**(`DLWEB_SETTLE_URL`、`DLWEB_PROXY_URL`、`QQ_CALLBACK_URL` 等)仍需在 `.env` 中手动配置,详见 `.env.example` 中的注释。 ### 2. DNS 解析 ```bash # 验证 DNS 解析 nslookup api.newdomain.com nslookup dlapi.newdomain.com ``` ### 3. 重新申请 SSL 证书 ```bash ./deploy.sh ssl-init --staging # 测试验证 ./deploy.sh ssl-init # 正式申请 ``` ### 4. 重启所有服务 ```bash ./deploy.sh restart ``` 重启时自动完成: - Nginx 使用新域名的 `server_name` 和 SSL 证书 - `docker-entrypoint.sh` 用新域名替换 JS/HTML 中的硬编码 URL - PHP `env()` 读取新的环境变量值 ### 5. 更新微信后台配置 > **关键路由说明:** Nginx 在 `api.newdomain.com` 上配置了 `/wx/` 前缀路由——以 `/wx/` 开头的请求被反向代理到 wxserver(Node.js),其余请求仍由 PHP API 处理。 #### 5.1 微信小程序后台 > **入口:** [mp.weixin.qq.com](https://mp.weixin.qq.com) → 开发 → 开发管理 → 开发设置 → 服务器域名 | 配置项 | 新值 | 不更新时的现象 | |--------|------|--------------| | **request 合法域名** | `https://api.newdomain.com` | `wx.request` 报 `invalid url`,所有网络请求失败 | | **业务域名** | `api.newdomain.com` | web-view 提示"不在业务域名列表中" | > 小程序域名配置每月只能修改 5 次,且每项域名必须已备案并启用 HTTPS。 #### 5.2 微信公众号后台 > **入口:** [mp.weixin.qq.com](https://mp.weixin.qq.com) → 设置与开发 → 公众号设置 → 功能设置 | 配置项 | 填写值 | 不更新时的现象 | |--------|--------|--------------| | 业务域名 | `api.newdomain.com` | 微信内置浏览器提示"域名不合法" | | 网页授权域名 | `api.newdomain.com` | 授权跳转被微信拦截,永久头像功能不可用 | | JS 接口安全域名 | `api.newdomain.com` | `wx.config()` 签名验证失败,微信支付按钮无法唤起 | > **⚠️ 远程配置也需同步修改:** `WX_OA_REDIRECT_DOMAIN` 未配置时,wxserver 从远程配置文件读取 `minipro_api_url`。建议同步更新 Gitee Raw 配置 `minipro_api_url` 为 `api.newdomain.com/wx`。 #### 5.3 微信支付商户后台 > **入口:** [pay.weixin.qq.com](https://pay.weixin.qq.com) → 账户中心 → 商户信息 → 支付配置 → JSAPI 支付授权目录 | 配置值 | 用途 | |--------|------| | `https://api.newdomain.com/` | JSAPI 支付页面所在目录(必须包含末尾斜杠) | 不更新的后果:下单时提示"当前 URL 未注册",JSAPI 支付彻底无法使用。 #### 配置清单汇总 | 平台 | 配置项 | 填写值 | |------|--------|--------| | 微信小程序后台 | request 合法域名 | `https://api.newdomain.com` | | 微信小程序后台 | 业务域名 | `api.newdomain.com` | | 微信公众号后台 | 业务域名 | `api.newdomain.com` | | 微信公众号后台 | 网页授权域名 | `api.newdomain.com` | | 微信公众号后台 | JS 接口安全域名 | `api.newdomain.com` | | 微信支付商户后台 | JSAPI 支付授权目录 | `https://api.newdomain.com/` | --- ## 场景二:更换数据库地址 当数据库实例迁移(例如 RDS 升级、切换区域)时: ### 1. 修改 `.env` 中对应的数据库变量 | 数据库 | 需修改的变量 | 使用者 | |--------|-------------|--------| | API 主库 | `API_DB_HOST`, `API_DB_PORT`, `API_DB_USER`, `API_DB_PASSWORD` | api 服务 | | 代理后台主库 | `DLWEB_DB_HOST`, `DLWEB_DB_PORT`, `DLWEB_DB_USER`, `DLWEB_DB_PASSWORD` | dlweb 服务 | | 代理后台从库 | `DLWEB_SLAVE_DB_HOST`, `DLWEB_SLAVE_DB_PORT`, `DLWEB_SLAVE_DB_USER`, `DLWEB_SLAVE_DB_PASSWORD` | dlweb 读操作 | | 外部游戏库 | `EXT_GAME_DB_HOST`, `EXT_GAME_DB_PORT`, `EXT_GAME_DB_USER`, `EXT_GAME_DB_PASSWORD` | Synchronize.php | | 战绩库 | `EXT_GRADE_DB_HOST`, `EXT_GRADE_DB_PORT`, `EXT_GRADE_DB_USER`, `EXT_GRADE_DB_PASSWORD` | game.php | | 开发库 | `EXT_DEV_DB_HOST`, `EXT_DEV_DB_PORT`, `EXT_DEV_DB_USER`, `EXT_DEV_DB_PASSWORD` | DEBUG 模式 | ### 2. 重启受影响的服务 ```bash docker compose restart api # 只改了 API 数据库 docker compose restart dlweb # 只改了 DLWEB 数据库 docker compose restart dlweb syncjob cronjob # 改了外部游戏库 ./deploy.sh restart # 改了多个,全部重启 ``` ### 3. 验证连接 ```bash docker logs --tail 20 youle-api docker logs --tail 20 youle-dlweb docker logs --tail 10 youle-syncjob ``` > 如果新数据库有 IP 白名单限制,需要将 Docker 宿主机的公网 IP 加入 RDS 白名单。 --- ## 场景三:更换服务器(整体迁移) ### 1. 打包项目文件(旧服务器) ```bash cd /path/to/game-docker tar czf game-docker.tar.gz --exclude='.env' --exclude='game/' . ``` ### 2. 传输到新服务器 ```bash scp game-docker.tar.gz newserver:/opt/ ``` ### 3. 在新服务器上部署 ```bash cd /opt tar xzf game-docker.tar.gz -C game-docker cd game-docker cp .env.example .env vim .env ``` ### 4. 确认修改项 | 检查项 | 是否需要改 | 说明 | |--------|-----------|------| | 域名(`*_DOMAIN`) | 域名不变则不改 | DNS 需指向新服务器 IP | | 数据库地址(`*_DB_HOST`) | 通常不改 | RDS 地址不变,但需将新服务器 IP 加入白名单 | | Redis 地址 | 不改 | Docker 内置 Redis,随容器迁移 | | 微信/支付配置 | 不改 | AppID/Secret 与服务器无关 | | 游戏服务器查询地址 | 看情况 | 游戏服务器也迁移了则需改 | | IP 白名单 | 可能需改 | `INTERNAL_WHITELIST` 加入新 IP | ### 5. 启动服务 ```bash chmod +x deploy.sh init-ssl.sh ./deploy.sh ssl-init # 新服务器需重新申请证书 ./deploy.sh up ``` ### 6. 验证所有服务 ```bash ./deploy.sh status curl -k https://api.yourdomain.com/ curl -k https://dlapi.yourdomain.com/ curl -k https://api.yourdomain.com/wx/api/login docker logs --tail 5 youle-syncjob docker logs --tail 5 youle-cronjob ``` --- ## 场景四:更改 Redis 配置 ```bash vim .env # 修改以下变量: # REDIS_HOST=new-redis-host # REDIS_PORT=6379 # REDIS_PASSWORD=new-password docker compose restart dlweb redis ``` > 使用 Docker 内置 Redis(默认),`REDIS_HOST` 应设为 `redis`(Docker 服务名),不是 `localhost`。 --- ## 场景五:单独开启 / 关闭特定服务 ### 服务清单与依赖关系 | 服务名 | 容器名 | 说明 | 依赖 | |--------|--------|------|------| | `nginx` | `youle-nginx` | 反向代理 + SSL | api / dlweb / wxserver | | `api` | `youle-api` | 游戏核心 API | — | | `dlweb` | `youle-dlweb` | 代理管理后台 | redis | | `wxserver` | `youle-wxserver` | 微信小程序后端 | — | | `syncjob` | `youle-syncjob` | 每 30s 数据同步 | dlweb(内网) | | `cronjob` | `youle-cronjob` | 每日凌晨报表任务 | dlweb(内网) | | `redis` | `youle-redis` | 缓存 | — | | `certbot` | `youle-certbot` | 证书自动续签 | — | ### 开启单个服务 ```bash docker compose up -d api docker compose up -d dlweb docker compose up -d wxserver docker compose up -d syncjob docker compose up -d cronjob ``` ### 关闭单个服务 ```bash docker compose stop api docker compose stop syncjob # stop + 删除容器(下次 up 会重新创建) docker compose rm -sf syncjob ``` > `stop` 只停止容器,不删除;`rm -sf` 停止并删除容器(均不会丢失数据 volume)。 ### 常见场景 **只重建并重启某个业务服务(代码更新后):** ```bash docker compose up -d --build api docker compose up -d --build dlweb docker compose up -d --build wxserver ``` **关闭 certbot 自动续签(调试期间避免请求频率限制):** ```bash docker compose stop certbot docker compose up -d certbot # 恢复 ``` **仅重启 nginx(修改配置后生效):** ```bash docker compose restart nginx # 或热重载(不中断连接) docker exec youle-nginx nginx -s reload ``` **查看所有服务当前状态:** ```bash docker compose ps # 或 ./deploy.sh status ``` --- ## 操作速查表 | 变更内容 | 修改 `.env` 中的变量 | 重启命令 | 额外操作 | |---------|---------------------|---------|---------| | 更换域名 | `ROOT_DOMAIN`(子域名不标准时单独覆盖) | `./deploy.sh ssl-init && ./deploy.sh restart` | DNS 解析 + 微信后台 | | API 数据库 | `API_DB_*` | `docker compose restart api` | RDS 白名单 | | DLWEB 数据库 | `DLWEB_DB_*` | `docker compose restart dlweb` | RDS 白名单 | | 游戏数据库 | `EXT_GAME_DB_*` | `docker compose restart dlweb syncjob cronjob` | RDS 白名单 | | 战绩数据库 | `EXT_GRADE_DB_*` | `docker compose restart dlweb` | RDS 白名单 | | Redis | `REDIS_*` | `docker compose restart dlweb redis` | — | | 微信密钥 | `WX_*` | `docker compose restart api dlweb wxserver` | 微信后台 | | 整体迁移 | 视情况 | `./deploy.sh ssl-init && ./deploy.sh up` | DNS + RDS 白名单 | --- ## 数据持久化 以下 Docker Volume 用于持久化存储: | Volume | 挂载点 | 说明 | |--------|--------|------| | `api-logs` | /var/www/html/logs | API 服务日志 | | `api-source-logs` | /var/www/html/source/logs | API source 模块日志 | | `dlweb-logs` | /var/www/html/api/logs | DLWEB 服务日志 | | `dlweb-debug` | /var/www/html/api/ext/debug | DLWEB 同步/报表调试日志 | | `redis-data` | /data | Redis 持久化数据 | | `shared-signal` | /shared | syncjob ↔ cronjob 暂停信号文件 | | `certbot-webroot` | /var/www/certbot | ACME 域名验证文件 | | `certbot-certs` | /etc/letsencrypt | SSL 证书文件 |