695 lines
23 KiB
Markdown
695 lines
23 KiB
Markdown
# 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/` 下:
|
||
|
||
```bash
|
||
# 方式一:从本地直接上传(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. 准备环境变量
|
||
|
||
```bash
|
||
cd /opt/youle/game-docker
|
||
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
|
||
```
|
||
|
||
### 3. 首次申请 SSL 证书
|
||
|
||
```bash
|
||
chmod +x deploy.sh init-ssl.sh
|
||
|
||
# 先测试(不真正申请,验证域名解析是否正确)
|
||
./deploy.sh ssl-init --dry-run
|
||
|
||
# 正式申请
|
||
./deploy.sh ssl-init
|
||
```
|
||
|
||
### 4. 启动所有服务
|
||
|
||
```bash
|
||
./deploy.sh up
|
||
```
|
||
|
||
启动后验证:
|
||
|
||
```bash
|
||
# 查看所有容器状态
|
||
./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`):**
|
||
|
||
```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
|
||
```
|