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 证书自动续签 | 无 |
快速部署
前置要求
- Linux 服务器(推荐 Ubuntu 22.04 / CentOS 8+,最低 2C 2G)
- 域名已解析到服务器 IP(3 个域名:API / DLWEB / wxserver)
- 服务器 80 和 443 端口可用
- Docker 和 Docker Compose(如未安装,
deploy.sh会自动安装并配置国内镜像加速)
1. 上传项目到服务器
将 game-docker 目录上传到服务器 /opt/youle/ 下:
# 方式一:从本地直接上传(Windows 使用 scp / WinSCP / SFTP)
scp -r game-docker/ root@your-server-ip:/opt/youle/
# 方式二:从 Git 仓库拉取
ssh root@your-server-ip
mkdir -p /opt/youle
cd /opt/youle
git clone <仓库地址> game-docker
上传后服务器上的目录结构:
/opt/youle/game-docker/
├── .env.example
├── docker-compose.yml
├── deploy.sh
├── init-ssl.sh
├── api/
├── dlweb/
├── wxserver_daoqi/
└── docker/
2. 准备环境变量
cd /opt/youle/game-docker
cp .env.example .env
vim .env
必须修改的关键配置:
# 域名(用于 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
3. 首次申请 SSL 证书
chmod +x deploy.sh init-ssl.sh
# 先测试(不真正申请,验证域名解析是否正确)
./deploy.sh ssl-init --dry-run
# 正式申请
./deploy.sh ssl-init
4. 启动所有服务
./deploy.sh up
启动后验证:
# 查看所有容器状态
./deploy.sh status
# 查看特定服务日志
./deploy.sh logs api
./deploy.sh logs dlweb
./deploy.sh logs syncjob
./deploy.sh logs cronjob
5. 部署命令速查
| 命令 | 说明 |
|---|---|
./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):
# 轮询间隔(秒),默认 30
SYNC_INTERVAL=30
# 每次处理的日志条数,默认 200
SYNC_PROCESSCOUNT=200
查看同步日志:
./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):
# cron 表达式,默认凌晨 4:00
CRON_SCHEDULE=0 4 * * *
修改执行时间示例:
# 凌晨 3:30 执行
CRON_SCHEDULE=30 3 * * *
# 每天凌晨 2:00 和 14:00 各执行一次
CRON_SCHEDULE=0 2,14 * * *
查看执行日志:
./deploy.sh logs cronjob
# 或实时查看
docker logs -f youle-cronjob
手动触发(测试用):
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) 函数读取配置:
// 优先读 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 容器自动管理。
# 首次申请(必须先确保域名已解析)
./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 中的域名变量
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:
# 验证 DNS 解析
nslookup api.newdomain.com
nslookup dlapi.newdomain.com
nslookup wxapi.newdomain.com
3. 重新申请 SSL 证书
# 测试验证(不消耗申请限额)
./deploy.sh ssl-init --staging
# 正式申请
./deploy.sh ssl-init
4. 重启所有服务
./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 中对应的数据库变量
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. 重启受影响的服务
# 如果只改了 API 数据库
docker compose restart api
# 如果只改了 DLWEB 数据库
docker compose restart dlweb
# 如果改了外部游戏库(影响同步任务)
docker compose restart dlweb syncjob cronjob
# 如果改了多个,直接全部重启
./deploy.sh restart
3. 验证连接
# 查看 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. 打包项目文件
# 在旧服务器上
cd /path/to/game-docker
# 排除不必要文件
tar czf game-docker.tar.gz --exclude='.env' --exclude='game/' .
2. 传输到新服务器
scp game-docker.tar.gz newserver:/opt/
3. 在新服务器上部署
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. 启动服务
chmod +x deploy.sh init-ssl.sh
# 域名未变:DNS 改指向后直接启动
./deploy.sh ssl-init # 新服务器需重新申请证书
./deploy.sh up
# 域名变了:参照「场景一:更换域名」
6. 验证所有服务
# 容器状态
./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 配置
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 白名单 |
查看定时任务执行情况
# 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/
调整同步频率
# 修改 .env
SYNC_INTERVAL=15 # 15 秒一次
SYNC_PROCESSCOUNT=500 # 每次处理 500 条
# 重启 syncjob
docker compose restart syncjob
调整每日任务执行时间
# 修改 .env
CRON_SCHEDULE=30 3 * * * # 改为凌晨 3:30
# 重启 cronjob
docker compose restart cronjob