增加docke部署

This commit is contained in:
2026-04-10 16:44:13 +08:00
parent e2f8054794
commit cd4ddb606d
5076 changed files with 701092 additions and 0 deletions

View File

@@ -0,0 +1,664 @@
# YouleGames Docker 部署版
> 原项目 `codes/agent/game` 的 Docker 化改造,所有硬编码域名/IP/密码已外部化为环境变量,通过单一 `.env` 文件控制所有配置。
---
## 目录结构
```
game-docker/
├── .env.example # 环境变量模板(部署时复制为 .env
├── docker-compose.yml # Docker Compose 编排8 个服务)
├── deploy.sh # 一键部署脚本
├── init-ssl.sh # SSL 证书首次申请脚本
├── env_config.php # PHP 环境变量加载器api/ 和 dlweb/ 共用)
├── api/ # 网站1: 游戏核心 API 服务源码
├── dlweb/ # 网站2: 代理管理后台源码
├── wxserver_daoqi/ # 网站3: 微信小程序后端源码
├── docker/
│ ├── nginx/
│ │ ├── default.conf.template # Nginx 配置模板envsubst 动态域名注入)
│ │ └── ssl-params.conf # SSL 安全参数
│ ├── api/
│ │ ├── Dockerfile # API 镜像PHP 8.1 + Apache
│ │ └── docker-entrypoint.sh # 启动时 sed 替换 JS 中硬编码域名
│ ├── dlweb/
│ │ ├── Dockerfile # DLWEB 镜像PHP 8.1 + Apache + Redis ext
│ │ └── docker-entrypoint.sh # 启动时 sed 替换 JS/HTML 中硬编码域名
│ ├── wxserver/
│ │ └── Dockerfile # wxserver 镜像Node.js 18 Alpine
│ ├── syncjob/
│ │ └── sync.sh # Synchronize.php 轮询脚本(每 30s
│ ├── cronjob/
│ │ ├── entrypoint.sh # cron 容器入口
│ │ └── daily-task.sh # 每日定时任务(替代 autorun.cmd
│ └── certbot/ # SSL 证书相关
└── game/ # 原始未修改代码备份(不参与部署)
```
---
## 整体架构
```
互联网
┌──────┴──────┐
│ Nginx │ ← SSL 终端 + 域名路由
│ :80 :443 │ 域名通过 .env 注入
└──┬───┬───┬─┘
┌───────────┤ │ ├───────────┐
▼ ▼ │ ▼ │
┌────────────┐ ┌────────┴──┐ ┌──────────┐
│ API │ │ DLWEB │ │ wxserver │
│ PHP 8.1 │ │ PHP 8.1 │ │ Node.js │
│ Apache │ │ Apache │ │ :3000 │
└─────┬──────┘ └─────┬─────┘ └──────────┘
│ │
│ ┌─────────┤ Docker 内网 (youle-net)
│ │ │
│ ▼ │
│ ┌──────────┐ │ ┌───────────┐ ┌───────────┐
│ │ syncjob │◄┼────►│ cronjob │ │ certbot │
│ │ 每30s轮询 │ │ │ 每日4:00 │ │ 12h续签 │
│ └──────────┘ │ └───────────┘ └───────────┘
│ │
▼ ▼
┌──────────────────────────┐ ┌──────────┐
│ MySQL (阿里云 RDS) │ │ Redis │
│ 多实例agent_db / │ │ :6379 │
│ game_db / grade_db │ └──────────┘
└──────────────────────────┘
```
### 服务清单8 个容器)
| 容器名 | 镜像 | 作用 | 端口 |
|--------|------|------|------|
| `youle-nginx` | nginx:alpine | SSL 终端 + 域名路由反向代理 | 80, 443 |
| `youle-api` | php:8.1-apache (自定义) | 游戏核心 API登录/支付/SDK | 8081 (内部) |
| `youle-dlweb` | php:8.1-apache (自定义) | 代理管理后台 | 8082 (内部) |
| `youle-wxserver` | node:18-alpine (自定义) | 微信小程序后端 | 3000 (内部) |
| `youle-syncjob` | alpine:3.19 | 每 30s POST `Synchronize.php`(数据同步) | 无 |
| `youle-cronjob` | alpine:3.19 | 每日凌晨 4:00 执行报表同步 | 无 |
| `youle-redis` | redis:7-alpine | 缓存服务(可选) | 6379 (内部) |
| `youle-certbot` | certbot/certbot | Let's Encrypt SSL 证书自动续签 | 无 |
---
## 快速部署
### 前置要求
- Docker Engine 20.10+
- Docker Compose v2+
- 域名已解析到服务器 IP3 个域名API / DLWEB / wxserver
- 服务器 80 和 443 端口可用
### 1. 准备环境变量
```bash
cp .env.example .env
vim .env
```
**必须修改的关键配置:**
```bash
# 域名(用于 Nginx SSL 和 certbot
API_DOMAIN=api.yourdomain.com
DLWEB_DOMAIN=dlapi.yourdomain.com
WX_DOMAIN=wxapi.yourdomain.com
# 数据库(各服务数据库连接)
API_DB_HOST=your-rds-host
API_DB_PASSWORD=your-password
DLWEB_DB_HOST=your-rds-host
DLWEB_DB_PASSWORD=your-password
# ... 其他数据库配置
# 微信配置
WX_MINI_APPID=your-appid
WX_MINI_APPSECRET=your-secret
WX_PAY_MCHID=your-mchid
WX_PAY_KEY=your-key
# SSL 邮箱
SSL_EMAIL=your-email@example.com
```
### 2. 首次申请 SSL 证书
```bash
chmod +x deploy.sh init-ssl.sh
# 先测试(不真正申请,验证域名解析是否正确)
./deploy.sh ssl-init --dry-run
# 正式申请
./deploy.sh ssl-init
```
### 3. 启动所有服务
```bash
./deploy.sh up
```
启动后验证:
```bash
# 查看所有容器状态
./deploy.sh status
# 查看特定服务日志
./deploy.sh logs api
./deploy.sh logs dlweb
./deploy.sh logs syncjob
./deploy.sh logs cronjob
```
### 4. 部署命令速查
| 命令 | 说明 |
|------|------|
| `./deploy.sh up` | 构建并启动所有服务 |
| `./deploy.sh down` | 停止并移除所有容器 |
| `./deploy.sh restart` | 重启所有服务 |
| `./deploy.sh rebuild` | 无缓存重建所有镜像 |
| `./deploy.sh rebuild api` | 只重建指定服务 |
| `./deploy.sh logs [service]` | 查看日志(支持 `-f` 实时跟踪) |
| `./deploy.sh status` | 查看容器运行状态 |
| `./deploy.sh ssl-init` | 首次申请 SSL 证书 |
| `./deploy.sh ssl-init --staging` | 用 Let's Encrypt 测试环境申请 |
| `./deploy.sh ssl-renew` | 手动续签证书 |
| `./deploy.sh ssl-status` | 查看证书到期时间 |
---
## 定时任务说明
Docker 部署包含两个定时任务容器,替代原 Windows 环境的 `HttpRequestService.exe``autorun.cmd`
### syncjob — 实时同步任务
**替代:** Windows `HttpRequestService.exe`(通过 `HttpRequest.exe.json` 配置)
**作用:** 每 30 秒 POST 请求 `dlweb/ext/Synchronize.php`,从游戏数据库 `ct_user_process_log` 表消费未处理日志,将玩家/代理数据同步到代理后台数据库。
**运行方式:** 通过 Docker 内网直连 `http://dlweb/ext/Synchronize.php`,不经过公网域名,零流量消耗。
**可配置项(`.env`**
```bash
# 轮询间隔(秒),默认 30
SYNC_INTERVAL=30
# 每次处理的日志条数,默认 200
SYNC_PROCESSCOUNT=200
```
**查看同步日志:**
```bash
./deploy.sh logs syncjob
# 或实时查看
docker logs -f youle-syncjob
```
### cronjob — 每日定时任务
**替代:** Windows 计划任务调用的 `tools-docker/autorun.cmd`
**作用:** 每日凌晨 4:00 执行以下流程(与原 `autorun.cmd` 完全一致):
| 步骤 | 原 autorun.cmd | Docker cronjob |
|------|---------------|----------------|
| 1. 停止同步服务 | `net stop HttpRequestService` | 创建 `/shared/syncjob.pause` 信号文件 |
| 2. 等待当前请求完成 | Windows 服务立即停止) | `sleep 5` |
| 3. 同步报表数据 | `HttpRequest.exe POST SynchronizeReportData.php` | `curl POST http://dlweb/ext/SynchronizeReportData.php` |
| 4. 恢复同步服务 | `net start HttpRequestService` | 删除 `/shared/syncjob.pause` 信号文件 |
> **暂停机制:** `syncjob` 和 `cronjob` 通过共享 Docker volume`shared-signal`)通信。`cronjob` 创建 `/shared/syncjob.pause` 文件时,`syncjob` 会自动跳过轮询,报表同步完成后删除该文件恢复。
**可配置项(`.env`**
```bash
# cron 表达式,默认凌晨 4:00
CRON_SCHEDULE=0 4 * * *
```
**修改执行时间示例:**
```bash
# 凌晨 3:30 执行
CRON_SCHEDULE=30 3 * * *
# 每天凌晨 2:00 和 14:00 各执行一次
CRON_SCHEDULE=0 2,14 * * *
```
**查看执行日志:**
```bash
./deploy.sh logs cronjob
# 或实时查看
docker logs -f youle-cronjob
```
**手动触发(测试用):**
```bash
docker exec youle-cronjob /bin/sh /app/daily-task.sh
```
---
## 环境变量说明
所有硬编码的域名、数据库地址、密钥都已外部化为环境变量。**修改配置不再需要改代码,只需改 `.env` 文件。**
### 变量分组总览
| 变量分组 | 说明 |
|---------|------|
| `API_DB_*` | 游戏核心 API 数据库 |
| `DLWEB_DB_*` | 代理后台主库 |
| `DLWEB_SLAVE_DB_*` | 代理后台从库 |
| `EXT_GAME_DB_*` | 外部游戏数据库Synchronize / SynchronizeReportData |
| `EXT_GRADE_DB_*` | 战绩数据库game.php |
| `EXT_DEV_DB_*` | 开发数据库DEBUG 模式) |
| `REDIS_*` | Redis 配置 |
| `WX_MINI_*` | 微信小程序 AppID / Secret |
| `WX_OA_*` | 微信公众号 AppID / Secret |
| `WX_PAY_*` | 微信支付商户配置 |
| `REMOTE_CONFIG_*` | 远程配置Gitee |
| `API_DOMAIN` / `DLWEB_DOMAIN` / `WX_DOMAIN` | 3 个服务域名Nginx + SSL + 前端 JS 自动推导) |
| `SITE_*` | PHP 后端各站点域名 |
| `DLWEB_*_URL` | 前端 JS/HTML 硬编码域名替换 |
| `SYNC_INTERVAL` / `SYNC_PROCESSCOUNT` | syncjob 同步参数 |
| `CRON_SCHEDULE` | cronjob 执行时间 |
| `GAME_SERVER_QUERY_URL` | 游戏服务器查询地址 |
| `INTERNAL_WHITELIST` | IP 白名单(逗号分隔) |
### 域名配置关系
```
.env 域名 │ 用途
─────────────────────┼──────────────────────────────────
API_DOMAIN │ Nginx server_name网站1+ 自动推导 DLWEB_API_BASE_URL
DLWEB_DOMAIN │ Nginx server_name网站2+ 自动推导 DLWEB_SDK_API_URL
WX_DOMAIN │ Nginx server_name网站3
```
---
## 环境变量加载机制
### PHP 服务env_config.php
所有 PHP 文件通过 `env($key, $default)` 函数读取配置:
```php
// 优先读 OS 环境变量Docker 场景),回退读 .env 文件
$host = env('API_DB_HOST', 'localhost');
```
加载优先级Docker 容器环境变量(`docker-compose env_file`> `.env` 文件 > 代码默认值。
### Node.js 服务wxserver_daoqi
直接使用 `process.env.VARIABLE_NAME`,由 `docker-compose env_file` 注入。
### 前端 JS / HTML
前端静态文件无法读取环境变量,通过 Docker entrypoint 脚本在容器启动时用 `sed` 替换硬编码域名:
- `docker/api/docker-entrypoint.sh` — 替换 API 服务中的 JS 文件
- `docker/dlweb/docker-entrypoint.sh` — 替换 DLWEB 服务中的 30+ 个 JS/HTML 文件
### Nginx 域名注入
`default.conf.template` 使用 `${API_DOMAIN}` / `${DLWEB_DOMAIN}` / `${WX_DOMAIN}` 占位符Nginx 容器启动时通过 `envsubst` 自动替换。
---
## SSL 证书管理
使用 Let's Encrypt 免费证书,由 `certbot` 容器自动管理。
```bash
# 首次申请(必须先确保域名已解析)
./deploy.sh ssl-init
# 用测试环境验证(不消耗申请限额)
./deploy.sh ssl-init --staging
# 手动续签
./deploy.sh ssl-renew
# 查看证书状态
./deploy.sh ssl-status
```
`certbot` 容器每 12 小时自动检查续签,证书到期前 30 天自动更新,无需人工干预。
---
## 数据持久化
以下 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 证书文件 |
---
## 与原版Windows 部署)的区别
| 项目 | 原版 Windows | Docker 版 |
|------|-------------|-----------|
| 环境 | Windows + Apache/XAMPP + Node.js | Docker 容器化 |
| 配置方式 | 硬编码在 PHP/JS/HTML 中 | 统一 `.env` 文件 |
| 域名切换 | 需改 30+ 个文件 | 只改 `.env` 的 3 个域名变量 |
| 数据库密码 | 明文散布在多个配置文件 | 集中在 `.env`(不进版本库) |
| SSL | 手动申请/部署证书 | certbot 自动申请 + 12h 自动续签 |
| Synchronize 轮询 | `HttpRequestService.exe`Windows 服务) | `syncjob` 容器Alpine + curl |
| 每日定时任务 | Windows 计划任务 → `autorun.cmd` | `cronjob` 容器Alpine crond |
| 内网请求 | `localhost:80`(同机 Apache | Docker 内网 `http://dlweb`(零公网流量) |
| PHP 环境变量 | `env_config.php` `env()` 函数 | `env()` 优先读容器环境变量,回退 `.env` 文件 |
| 微信支付配置 | 硬编码在 `WxPay.Config.php` | `define()` + class const`env()` 动态读取 |
| 游戏服务器列表 | 硬编码在 `game.config.php` | 支持外部 JSON 文件覆盖(`GAME_SERVERS_CONFIG_FILE` |
---
## 常见运维操作
### 场景一:更换域名
当需要将服务迁移到新域名时(例如 `daoqijuyou77.cn``newdomain.com`),操作步骤:
**1. 修改 `.env` 中的域名变量**
```bash
vim .env
```
需要修改的变量(按影响范围分类):
| 变量 | 说明 | 示例 |
|------|------|------|
| **Nginx 路由(必改)** | | |
| `API_DOMAIN` | 网站1 域名 | `api.newdomain.com` |
| `DLWEB_DOMAIN` | 网站2 域名 | `dlapi.newdomain.com` |
| `WX_DOMAIN` | 网站3 域名 | `wxapi.newdomain.com` |
| **PHP 后端域名(按需)** | | |
> **前端 JS 请求地址无需单独配置:** `DLWEB_API_BASE_URL`= `https://` + `API_DOMAIN`)和 `DLWEB_SDK_API_URL`= `https://` + `DLWEB_DOMAIN`)由 entrypoint 脚本自动推导。
| `SITE_API_URL` | API 服务完整 URL | `https://api.newdomain.com` |
| `SITE_API2_URL` | API2 服务完整 URL | `https://api2.newdomain.com` |
| `SITE_SDK_DOMAIN` | SDK 域名(不带协议) | `sdk.newdomain.com` |
| `SITE_OPEN_URL` | 开放平台 URL | `http://open.newdomain.com` |
| `SITE_PAY_NOTIFY_URL` | 支付回调通知 URL | `http://api.newdomain.com` |
| `QQ_CALLBACK_URL` | QQ 登录回调 | `http://syhd.newdomain.com` |
| **DLWEB 前端域名(按需)** | | |
| `DLWEB_SETTLE_URL` | 结算后台地址 | `http://dlsettle.newdomain.com/mobile/` |
| `DLWEB_SETTLE_FULL_URL` | 结算后台完整地址 | `http://dlsettle.newdomain.com` |
| `DLWEB_PROXY_URL` | 代理测试地址 | `https://proxytest.newdomain.com` |
| `DLWEB_PROXY_77_URL` | 代理测试地址77 | `https://proxytest.newdomain.com` |
| `DLWEB_DL_API_V3_URL` | V3 API 地址 | `https://dlapiv3.newdomain.com` |
| `DLWEB_OPERATE_URL` | 运营后台地址 | `https://operate.newdomain.com` |
| `DLWEB_AVATAR_URL` | 默认头像地址 | `https://dlwebv3.newdomain.com/images/noavatar.png` |
| `DLWEB_SDK_API2_URL` | SDK API2 地址 | `https://api2.newdomain.com` |
| `DLWEB_DOWNLOAD_CDN_URL` | 下载页 CDN | `http://cdn.newdomain.com` |
| `DLWEB_GAME_IMAGE_URL` | 游戏图片地址 | `http://games.newdomain.com` |
| `DLWEB_SKYGAMES_URL` | Skygames 地址 | `https://skygames.newdomain.com` |
| `SITE_GAME_SERVICE_URL` | 游戏服务查询 | `http://service.newdomain.com:1089/index.html` |
> **注意:** 注释掉的变量(`#` 开头)表示使用代码中的默认值。如果新域名与默认值不同,需要取消注释并修改。
**2. DNS 解析**
确保新域名已指向服务器 IP
```bash
# 验证 DNS 解析
nslookup api.newdomain.com
nslookup dlapi.newdomain.com
nslookup wxapi.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. 更新微信后台配置**
| 微信后台 | 配置项 | 新值 |
|---------|--------|------|
| 小程序后台 | request 合法域名 | `https://wxapi.newdomain.com` |
| 小程序后台 | 业务域名 | `wxapi.newdomain.com` |
| 公众号后台 | 业务域名 / JS接口安全域名 | `api.newdomain.com` |
| 公众号后台 | 网页授权域名 | `wxapi.newdomain.com` |
| 微信支付后台 | 支付授权目录 | `https://dlapi.newdomain.com/` |
---
### 场景二:更换数据库地址
当数据库实例迁移(例如 RDS 升级、切换区域)时:
**1. 修改 `.env` 中对应的数据库变量**
```bash
vim .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 / SynchronizeReportData.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
# 如果只改了 API 数据库
docker compose restart api
# 如果只改了 DLWEB 数据库
docker compose restart dlweb
# 如果改了外部游戏库(影响同步任务)
docker compose restart dlweb syncjob cronjob
# 如果改了多个,直接全部重启
./deploy.sh restart
```
**3. 验证连接**
```bash
# 查看 API 日志是否有数据库连接错误
docker logs --tail 20 youle-api
# 查看 DLWEB 日志
docker logs --tail 20 youle-dlweb
# 查看同步任务是否正常
docker logs --tail 10 youle-syncjob
```
> **提示:** 如果新数据库有 IP 白名单限制,需要将 Docker 宿主机的公网 IP 加入 RDS 白名单。
---
### 场景三:更换服务器(整体迁移)
将整个 Docker 部署迁移到新服务器:
**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
# 复制并修改配置(新服务器 IP 可能不同)
cp .env.example .env
vim .env
```
**4. 确认修改项**
| 检查项 | 是否需要改 | 说明 |
|--------|-----------|------|
| 域名(`*_DOMAIN` | 域名不变则不改 | DNS 需指向新服务器 IP |
| 数据库地址(`*_DB_HOST` | 通常不改 | RDS 地址不变,但需将新服务器 IP 加入白名单 |
| Redis 地址 | 不改 | Docker 内置 Redis随容器迁移 |
| 微信/支付配置 | 不改 | AppID/Secret 与服务器无关 |
| 游戏服务器查询地址 | 看情况 | `GAME_SERVER_QUERY_URL` 如果游戏服务器也迁移了需改 |
| IP 白名单 | 可能需改 | `INTERNAL_WHITELIST` 加入新 IP |
**5. 启动服务**
```bash
chmod +x deploy.sh init-ssl.sh
# 域名未变DNS 改指向后直接启动
./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://wxapi.yourdomain.com/
# 定时任务运行正常
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`。
---
### 操作速查表
| 变更内容 | 修改 `.env` 中的变量 | 重启命令 | 额外操作 |
|---------|---------------------|---------|---------|
| 全部域名 | `*_DOMAIN` + `DLWEB_*_URL` + `SITE_*` | `./deploy.sh ssl-init && ./deploy.sh restart` | DNS 解析 + 微信后台 |
| 单个域名 | 对应的 `*_DOMAIN` + 关联 URL 变量 | `./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 白名单 |
### 查看定时任务执行情况
```bash
# syncjob 实时同步状态
docker logs --tail 50 youle-syncjob
# cronjob 每日报表执行记录
docker logs --tail 50 youle-cronjob
# dlweb 容器内的同步调试日志
docker exec youle-dlweb ls /var/www/html/api/ext/debug/synchronize/
docker exec youle-dlweb ls /var/www/html/api/ext/debug/SynchronizeReportData/
```
### 调整同步频率
```bash
# 修改 .env
SYNC_INTERVAL=15 # 15 秒一次
SYNC_PROCESSCOUNT=500 # 每次处理 500 条
# 重启 syncjob
docker compose restart syncjob
```
### 调整每日任务执行时间
```bash
# 修改 .env
CRON_SCHEDULE=30 3 * * * # 改为凌晨 3:30
# 重启 cronjob
docker compose restart cronjob
```