Files
youlegames/codes/agent/game-docker
2026-04-10 17:00:08 +08:00
..
2026-04-10 16:44:13 +08:00
2026-04-10 17:00:08 +08:00
2026-04-10 16:44:13 +08:00
2026-04-10 16:44:13 +08:00
2026-04-10 16:44:13 +08:00
2026-04-10 16:44:13 +08:00
2026-04-10 16:44:13 +08:00
2026-04-10 16:44:13 +08:00
2026-04-10 16:44:13 +08:00
2026-04-10 16:44:13 +08:00
2026-04-10 17:00:08 +08:00

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
  • 域名已解析到服务器 IP3 个域名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.exeautorun.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 信号文件

暂停机制: syncjobcronjob 通过共享 Docker volumeshared-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.exeWindows 服务) 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 constenv() 动态读取
游戏服务器列表 硬编码在 game.config.php 支持外部 JSON 文件覆盖(GAME_SERVERS_CONFIG_FILE

常见运维操作

场景一:更换域名

当需要将服务迁移到新域名时(例如 daoqijuyou77.cnnewdomain.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 应设为 redisDocker 服务名),不是 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