From 7758930a018ed61d483842beb2f472e907c0270d Mon Sep 17 00:00:00 2001 From: Joywayer Date: Tue, 14 Apr 2026 12:14:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20README.md=20?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E4=B9=B1=E7=A0=81=EF=BC=88UTF-8=20=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E9=97=AE=E9=A2=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codes/agent/game-docker/README.md | 1318 ++++++++++++++--------------- 1 file changed, 659 insertions(+), 659 deletions(-) diff --git a/codes/agent/game-docker/README.md b/codes/agent/game-docker/README.md index e0f6aeb..3a37c08 100644 --- a/codes/agent/game-docker/README.md +++ b/codes/agent/game-docker/README.md @@ -1,154 +1,154 @@ -# YouleGames Docker 閮ㄧ讲鐗? +# YouleGames Docker 部署版 -> 鍘熼」鐩?`codes/agent/game` 鐨?Docker 鍖栨敼閫狅紝鎵€鏈夌‖缂栫爜鍩熷悕/IP/瀵嗙爜宸插閮ㄥ寲涓虹幆澧冨彉閲忥紝閫氳繃鍗曚竴 `.env` 鏂囦欢鎺у埗鎵€鏈夐厤缃€? +> 原项目 `codes/agent/game` 的 Docker 化改造,所有硬编码域名/IP/密码已外部化为环境变量,通过单一 `.env` 文件控制所有配置。 --- -## 鐩綍缁撴瀯 +## 目录结构 ``` game-docker/ -鈹溾攢鈹€ .env.example # 鐜鍙橀噺妯℃澘锛堥儴缃叉椂澶嶅埗涓?.env锛? -鈹溾攢鈹€ docker-compose.yml # Docker Compose 缂栨帓锛? 涓湇鍔★級 -鈹溾攢鈹€ deploy.sh # 涓€閿儴缃茶剼鏈? -鈹溾攢鈹€ init-ssl.sh # SSL 璇佷功棣栨鐢宠鑴氭湰 -鈹溾攢鈹€ env_config.php # PHP 鐜鍙橀噺鍔犺浇鍣紙api/ 鍜?dlweb/ 鍏辩敤锛? -鈹溾攢鈹€ api/ # 缃戠珯1: 娓告垙鏍稿績 API 鏈嶅姟婧愮爜 -鈹溾攢鈹€ dlweb/ # 缃戠珯2: 浠g悊绠$悊鍚庡彴婧愮爜 -鈹溾攢鈹€ wxserver_daoqi/ # 缃戠珯3: 寰俊灏忕▼搴忓悗绔簮鐮? -鈹溾攢鈹€ docker/ -鈹? 鈹溾攢鈹€ nginx/ -鈹? 鈹? 鈹溾攢鈹€ default.conf.template # Nginx 閰嶇疆妯℃澘锛坋nvsubst 鍔ㄦ€佸煙鍚嶆敞鍏ワ級 -鈹? 鈹? 鈹斺攢鈹€ ssl-params.conf # SSL 瀹夊叏鍙傛暟 -鈹? 鈹溾攢鈹€ api/ -鈹? 鈹? 鈹溾攢鈹€ Dockerfile # API 闀滃儚锛圥HP 8.1 + Apache锛? -鈹? 鈹? 鈹斺攢鈹€ docker-entrypoint.sh # 鍚姩鏃?sed 鏇挎崲 JS 涓‖缂栫爜鍩熷悕 -鈹? 鈹溾攢鈹€ dlweb/ -鈹? 鈹? 鈹溾攢鈹€ Dockerfile # DLWEB 闀滃儚锛圥HP 8.1 + Apache + Redis ext锛? -鈹? 鈹? 鈹斺攢鈹€ docker-entrypoint.sh # 鍚姩鏃?sed 鏇挎崲 JS/HTML 涓‖缂栫爜鍩熷悕 -鈹? 鈹溾攢鈹€ wxserver/ -鈹? 鈹? 鈹斺攢鈹€ Dockerfile # wxserver 闀滃儚锛圢ode.js 18 Alpine锛? -鈹? 鈹溾攢鈹€ syncjob/ -鈹? 鈹? 鈹斺攢鈹€ sync.sh # Synchronize.php 杞鑴氭湰锛堟瘡 30s锛? -鈹? 鈹溾攢鈹€ cronjob/ -鈹? 鈹? 鈹溾攢鈹€ entrypoint.sh # cron 瀹瑰櫒鍏ュ彛 -鈹? 鈹? 鈹斺攢鈹€ daily-task.sh # 姣忔棩瀹氭椂浠诲姟锛堟浛浠?autorun.cmd锛? -鈹? 鈹斺攢鈹€ certbot/ # SSL 璇佷功鐩稿叧 -鈹斺攢鈹€ game/ # 鍘熷鏈慨鏀逛唬鐮佸浠斤紙涓嶅弬涓庨儴缃诧級 +├── .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 鈹? - 鈹?鈹?姣?0s杞 鈹?鈹? 鈹?姣忔棩4:00 鈹? 鈹?12h缁 鈹? - 鈹?鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? - 鈹? 鈹? - 鈻? 鈻? - 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? - 鈹? MySQL (闃块噷浜?RDS) 鈹? 鈹? Redis 鈹? - 鈹? 澶氬疄渚嬶細agent_db / 鈹? 鈹? :6379 鈹? - 鈹? game_db / grade_db 鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? - 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? + 互联网 + │ + ┌──────┴──────┐ + │ 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 缁堢 + 鍩熷悕璺敱鍙嶅悜浠g悊 | 80, 443 | -| `youle-api` | php:8.1-apache (鑷畾涔? | 娓告垙鏍稿績 API锛堢櫥褰?鏀粯/SDK锛?| 8081 (鍐呴儴) | -| `youle-dlweb` | php:8.1-apache (鑷畾涔? | 浠g悊绠$悊鍚庡彴 | 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 璇佷功鑷姩缁 | 鏃?| +| `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锛? 涓煙鍚嶏細API / DLWEB / wxserver锛? -- 鏈嶅姟鍣?80 鍜?443 绔彛鍙敤 -- Docker 鍜?Docker Compose锛堝鏈畨瑁咃紝`deploy.sh` 浼氳嚜鍔ㄥ畨瑁呭苟閰嶇疆鍥藉唴闀滃儚鍔犻€燂級 +- Linux 服务器(推荐 Ubuntu 22.04 / CentOS 8+,最低 2C 2G) +- 域名已解析到服务器 IP(3 个域名:API / DLWEB / wxserver) +- 服务器 80 和 443 端口可用 +- Docker 和 Docker Compose(如未安装,`deploy.sh` 会自动安装并配置国内镜像加速) --- -### 0. 閰嶇疆 SSH 瀵嗛挜璁よ瘉锛堝繀椤伙級 +### 0. 配置 SSH 密钥认证(必须) -`sync.ps1` 姣忔鎵ц浼氳皟鐢ㄥ娆?`scp` / `ssh`锛屽鏋滄湭閰嶇疆瀵嗛挜璁よ瘉锛屾瘡鏉″懡浠ら兘浼氬脊鍑哄瘑鐮佹彁绀哄鑷磋剼鏈腑鏂€備互涓嬫楠ゅ湪 **Windows PowerShell** 涓畬鎴愶紙Windows 10/11 鍐呯疆 OpenSSH 瀹㈡埛绔紝鏃犻渶棰濆瀹夎锛夈€? +`sync.ps1` 每次执行会调用多次 `scp` / `ssh`,如果未配置密钥认证,每条命令都会弹出密码提示导致脚本中断。以下步骤在 **Windows PowerShell** 中完成(Windows 10/11 内置 OpenSSH 客户端,无需额外安装)。 -#### 绗竴姝ワ細妫€鏌ユ槸鍚﹀凡鏈?SSH 瀵嗛挜 +#### 第一步:检查是否已有 SSH 密钥 ```powershell -# 榛樿瀵嗛挜璺緞 +# 默认密钥路径 Test-Path "$env:USERPROFILE\.ssh\id_ed25519" -# 杈撳嚭 True 琛ㄧず宸叉湁瀵嗛挜锛屽彲璺冲埌绗笁姝? +# 输出 True 表示已有密钥,可跳到第三步 ``` -濡傛灉宸叉湁 RSA 鏃у瘑閽ワ紙`id_rsa`锛夛紝鍚屾牱鍙敤锛屾妸涓嬮潰鍛戒护涓殑 `id_ed25519` 鏇挎崲涓?`id_rsa`銆? +如果已有 RSA 旧密钥(`id_rsa`),同样可用,把下面命令中的 `id_ed25519` 替换为 `id_rsa`。 -#### 绗簩姝ワ細鐢熸垚瀵嗛挜瀵? +#### 第二步:生成密钥对 ```powershell -# 鐢熸垚 Ed25519 瀵嗛挜锛堟洿瀹夊叏銆佹洿鐭級 +# 生成 Ed25519 密钥(更安全、更短) ssh-keygen -t ed25519 -C "youle-deploy" -f "$env:USERPROFILE\.ssh\id_ed25519" -# 鎻愮ず passphrase 鏃剁洿鎺ュ洖杞︿袱娆★紙涓嶈瀵嗙爜锛岃剼鏈墠鑳借嚜鍔ㄨ繍琛岋級 +# 提示 passphrase 时直接回车两次(不设密码,脚本才能自动运行) ``` -鎵ц鍚庣敓鎴愪袱涓枃浠讹細 +执行后生成两个文件: -| 鏂囦欢 | 璇存槑 | +| 文件 | 说明 | |------|------| -| `~/.ssh/id_ed25519` | **绉侀挜**锛岀粷涓嶄笂浼犳湇鍔″櫒锛屾湰鍦颁繚绠?| -| `~/.ssh/id_ed25519.pub` | **鍏挜**锛岃鍙戠粰鏈嶅姟鍣?| +| `~/.ssh/id_ed25519` | **私钥**,绝不上传服务器,本地保管 | +| `~/.ssh/id_ed25519.pub` | **公钥**,要发给服务器 | -#### 绗笁姝ワ細灏嗗叕閽ヤ笂浼犲埌鏈嶅姟鍣? +#### 第三步:将公钥上传到服务器 -> 姝ゆ楠や細瑕佹眰杈撳叆涓€娆″瘑鐮侊紝涔嬪悗涓嶅啀闇€瑕併€? +> 此步骤会要求输入一次密码,之后不再需要。 ```powershell -# 涓€琛屽懡浠わ細璇诲彇鍏挜 鈫?杩藉姞鍒版湇鍔″櫒 authorized_keys +# 一行命令:读取公钥 → 追加到服务器 authorized_keys cat "$env:USERPROFILE\.ssh\id_ed25519.pub" | ssh root@47.98.203.17 ` "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys" ``` -#### 绗洓姝ワ細楠岃瘉鍏嶅瘑鐧诲綍 +#### 第四步:验证免密登录 ```powershell -# 鐩存帴鐧诲綍锛屼笉寮瑰瘑鐮佹彁绀哄垯鎴愬姛 +# 直接登录,不弹密码提示则成功 ssh root@47.98.203.17 "echo 'SSH key auth OK'" ``` -杈撳嚭 `SSH key auth OK` 鍗宠〃绀洪厤缃垚鍔燂紝`sync.ps1` 鍙甯镐娇鐢ㄣ€? +输出 `SSH key auth OK` 即表示配置成功,`sync.ps1` 可正常使用。 -#### 鍙€夛細閰嶇疆 SSH 鍒悕锛堢畝鍖栧懡浠わ級 +#### 可选:配置 SSH 别名(简化命令) -鍦?`C:\Users\<浣犵殑鐢ㄦ埛鍚?\.ssh\config`锛堟枃浠朵笉瀛樺湪鍒欐柊寤猴級涓坊鍔狅細 +在 `C:\Users\<你的用户名>\.ssh\config`(文件不存在则新建)中添加: ``` Host youle @@ -158,37 +158,37 @@ Host youle ServerAliveInterval 60 ``` -閰嶇疆鍚庡彲浣跨敤鐭悕绉版搷浣滐細 +配置后可使用短名称操作: ```powershell -ssh youle # 鐩存帴鐧诲綍 -# sync.ps1 浣跨敤鍒悕 +ssh youle # 直接登录 +# sync.ps1 使用别名 .\sync.ps1 -Server youle ``` -#### 鍙€夛細澶氬彴鐢佃剳鍏辩敤鍚屼竴鍙版湇鍔″櫒 +#### 可选:多台电脑共用同一台服务器 -鎶婃瘡鍙扮數鑴戠敓鎴愮殑 `id_ed25519.pub` 鍐呭閮借拷鍔犲埌鏈嶅姟鍣ㄧ殑 `~/.ssh/authorized_keys`锛堜竴琛屼竴涓級锛屼笉闇€瑕佸垹闄ゆ棫鐨勫叕閽ワ細 +把每台电脑生成的 `id_ed25519.pub` 内容都追加到服务器的 `~/.ssh/authorized_keys`(一行一个),不需要删除旧的公钥: ```powershell -# 鍦ㄧ浜屽彴鐢佃剳涓婃墽琛屽悓鏍风殑涓婁紶鍛戒护鍗冲彲锛?> 杩藉姞鑰屼笉鏄鐩栵級 +# 在第二台电脑上执行同样的上传命令即可(>> 追加而不是覆盖) cat "$env:USERPROFILE\.ssh\id_ed25519.pub" | ssh root@47.98.203.17 ` "cat >> ~/.ssh/authorized_keys" ``` --- -### 1. 妫€鏌ュ苟淇琛屽熬绗︼紙LF锛? +### 1. 检查并修复行尾符(LF) -> **涓轰粈涔堥渶瑕佽繖姝ワ紵** Windows 鐨?Git 榛樿 `core.autocrlf=true`锛屽彲鑳藉皢鑴氭湰鏂囦欢鍐欐垚 CRLF銆侰RLF 鏍煎紡鐨?shell 鑴氭湰鍦?Linux 瀹瑰櫒涓細鎶?`not found` / `syntax error` 閿欒锛屽鑷村鍣ㄦ棤娉曞惎鍔ㄣ€? +> **为什么需要这步?** Windows 的 Git 默认 `core.autocrlf=true`,可能将脚本文件写成 CRLF。CRLF 格式的 shell 脚本在 Linux 容器中会报 `not found` / `syntax error` 错误,导致容器无法启动。 -鍦ㄤ笂浼犲墠杩愯 `fix-lf.ps1`锛岃嚜鍔ㄦ壂鎻忔墍鏈夊叧閿枃浠跺苟淇锛? +在上传前运行 `fix-lf.ps1`,自动扫描所有关键文件并修复: ```powershell .\fix-lf.ps1 ``` -> **鏍规湰淇锛堜竴娆℃€э紝涔嬪悗鏃犻渶鍐嶈窇锛夛細** 鎵ц浠ヤ笅鍛戒护璁?`.gitattributes` 姘镐箙鎺ョ琛屽熬绗︼紝姝ゅ悗浠讳綍鏈哄櫒 clone 鍧囪嚜鍔ㄧ敓鏁堬細 +> **根本修复(一次性,之后无需再跑):** 执行以下命令让 `.gitattributes` 永久接管行尾符,此后任何机器 clone 均自动生效: > ```powershell > git config core.autocrlf false > git add --renormalize . @@ -198,51 +198,51 @@ cat "$env:USERPROFILE\.ssh\id_ed25519.pub" | ssh root@47.98.203.17 ` --- -### 2. 涓婁紶椤圭洰鍒版湇鍔″櫒 +### 2. 上传项目到服务器 -灏?`game-docker` 鐩綍涓婁紶鍒版湇鍔″櫒 `/opt/youle/` 涓嬶細 +将 `game-docker` 目录上传到服务器 `/opt/youle/` 下: ```powershell -# 鎺ㄨ崘锛氫娇鐢?sync.ps1锛坱ar 鍘嬬缉鍗曡繛鎺ワ紝姣?scp -r 蹇害 10-50 鍊嶏級 -# 棣栨閮ㄧ讲鐢?full 妯″紡锛屼笂浼犲叏閮ㄦ枃浠讹紙绾?10 MB 鍘嬬缉鍖咃級 +# 推荐:使用 sync.ps1(tar 压缩单连接,比 scp -r 快约 10-50 倍) +# 首次部署用 full 模式,上传全部文件(约 10 MB 压缩包) .\sync.ps1 -Mode full -# 鏃ュ父浠g爜鏇存柊鐢?app 妯″紡锛堟帓闄ゆ枃妗?娴嬭瘯锛岀害 7 MB锛? +# 日常代码更新用 app 模式(排除文档/测试,约 7 MB) .\sync.ps1 -# 浠呮洿鏂?Docker 閰嶇疆鏂囦欢锛坉ocker-compose.yml銆乨eploy.sh 绛夛紝涓嶅埌 1 MB锛? +# 仅更新 Docker 配置文件(docker-compose.yml、deploy.sh 等,不到 1 MB) .\sync.ps1 -Mode config ``` -> **鍓嶆彁锛?* 宸插畬鎴愭楠?0 鐨?SSH 瀵嗛挜璁よ瘉閰嶇疆锛屽惁鍒?`sync.ps1` 浼氬弽澶嶅脊瀵嗙爜鎻愮ず銆? +> **前提:** 已完成步骤 0 的 SSH 密钥认证配置,否则 `sync.ps1` 会反复弹密码提示。 -`sync.ps1` 浼氳嚜鍔ㄥ湪鏈嶅姟鍣ㄤ笂鍒涘缓 `/opt/youle/game-docker/` 鐩綍锛堝涓嶅瓨鍦級銆? +`sync.ps1` 会自动在服务器上创建 `/opt/youle/game-docker/` 目录(如不存在)。 -濡備笉浣跨敤 `sync.ps1`锛屼篃鍙墜鍔ㄤ笂浼狅細 +如不使用 `sync.ps1`,也可手动上传: ```bash -# 浠?Git 浠撳簱鎷夊彇 +# 从 Git 仓库拉取 ssh root@your-server-ip mkdir -p /opt/youle cd /opt/youle -git clone <浠撳簱鍦板潃> game-docker +git clone <仓库地址> game-docker ``` -涓婁紶鍚庢湇鍔″櫒涓婄殑鐩綍缁撴瀯锛? +上传后服务器上的目录结构: ``` /opt/youle/game-docker/ -鈹溾攢鈹€ .env.example -鈹溾攢鈹€ docker-compose.yml -鈹溾攢鈹€ deploy.sh -鈹溾攢鈹€ init-ssl.sh -鈹溾攢鈹€ api/ -鈹溾攢鈹€ dlweb/ -鈹溾攢鈹€ wxserver_daoqi/ -鈹斺攢鈹€ docker/ +├── .env.example +├── docker-compose.yml +├── deploy.sh +├── init-ssl.sh +├── api/ +├── dlweb/ +├── wxserver_daoqi/ +└── docker/ ``` -### 3. 鍑嗗鐜鍙橀噺 +### 3. 准备环境变量 ```bash cd /opt/youle/game-docker @@ -250,150 +250,150 @@ cp .env.example .env vim .env ``` -**蹇呴』淇敼鐨勫叧閿厤缃細** +**必须修改的关键配置:** ```bash -# 鐖跺煙鍚嶏紙涓変釜瀛愬煙鍚嶈嚜鍔ㄦ帹瀵硷紝鏃犻渶鍗曠嫭閰嶇疆锛? -# 灏嗚嚜鍔ㄧ敓鎴? api. dlapi. +# 父域名(三个子域名自动推导,无需单独配置) +# 将自动生成: api. dlapi. ROOT_DOMAIN=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 邮箱 SSL_EMAIL=your-email@example.com ``` -### 4. 棣栨鐢宠 SSL 璇佷功 +### 4. 首次申请 SSL 证书 ```bash chmod +x deploy.sh init-ssl.sh -# 鍏堟祴璇曪紙涓嶇湡姝g敵璇凤紝楠岃瘉鍩熷悕瑙f瀽鏄惁姝g‘锛? +# 先测试(不真正申请,验证域名解析是否正确) ./deploy.sh ssl-init --dry-run -# 姝e紡鐢宠 +# 正式申请 ./deploy.sh ssl-init ``` -### 5. 鍚姩鎵€鏈夋湇鍔? +### 5. 启动所有服务 ```bash ./deploy.sh up ``` -鍚姩鍚庨獙璇侊細 +启动后验证: ```bash -# 鏌ョ湅鎵€鏈夊鍣ㄧ姸鎬? +# 查看所有容器状态 ./deploy.sh status -# 鏌ョ湅鐗瑰畾鏈嶅姟鏃ュ織 +# 查看特定服务日志 ./deploy.sh logs api ./deploy.sh logs dlweb ./deploy.sh logs syncjob ./deploy.sh logs cronjob ``` -### 6. 閮ㄧ讲鍛戒护閫熸煡 +### 6. 部署命令速查 -| 鍛戒护 | 璇存槑 | +| 命令 | 说明 | |------|------| -| `./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` | 鏌ョ湅璇佷功鍒版湡鏃堕棿 | +| `./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 閮ㄧ讲鍖呭惈涓や釜瀹氭椂浠诲姟瀹瑰櫒锛屾浛浠e師 Windows 鐜鐨?`HttpRequestService.exe` 鍜?`autorun.cmd`銆? +Docker 部署包含两个定时任务容器,替代原 Windows 环境的 `HttpRequestService.exe` 和 `autorun.cmd`。 -### syncjob 鈥?瀹炴椂鍚屾浠诲姟 +### syncjob — 实时同步任务 -**鏇夸唬锛?* Windows `HttpRequestService.exe`锛堥€氳繃 `HttpRequest.exe.json` 閰嶇疆锛? +**替代:** Windows `HttpRequestService.exe`(通过 `HttpRequest.exe.json` 配置) -**浣滅敤锛?* 姣?30 绉?POST 璇锋眰 `dlweb/ext/Synchronize.php`锛屼粠娓告垙鏁版嵁搴?`ct_user_process_log` 琛ㄦ秷璐规湭澶勭悊鏃ュ織锛屽皢鐜╁/浠g悊鏁版嵁鍚屾鍒颁唬鐞嗗悗鍙版暟鎹簱銆? +**作用:** 每 30 秒 POST 请求 `dlweb/ext/Synchronize.php`,从游戏数据库 `ct_user_process_log` 表消费未处理日志,将玩家/代理数据同步到代理后台数据库。 -**杩愯鏂瑰紡锛?* 閫氳繃 Docker 鍐呯綉鐩磋繛 `http://dlweb/ext/Synchronize.php`锛屼笉缁忚繃鍏綉鍩熷悕锛岄浂娴侀噺娑堣€椼€? +**运行方式:** 通过 Docker 内网直连 `http://dlweb/ext/Synchronize.php`,不经过公网域名,零流量消耗。 -**鍙厤缃」锛坄.env`锛夛細** +**可配置项(`.env`):** ```bash -# 杞闂撮殧锛堢锛夛紝榛樿 30 +# 轮询间隔(秒),默认 30 SYNC_INTERVAL=30 -# 姣忔澶勭悊鐨勬棩蹇楁潯鏁帮紝榛樿 200 +# 每次处理的日志条数,默认 200 SYNC_PROCESSCOUNT=200 ``` -**鏌ョ湅鍚屾鏃ュ織锛?* +**查看同步日志:** ```bash ./deploy.sh logs syncjob -# 鎴栧疄鏃舵煡鐪? +# 或实时查看 docker logs -f youle-syncjob ``` -### cronjob 鈥?姣忔棩瀹氭椂浠诲姟 +### cronjob — 每日定时任务 -**鏇夸唬锛?* Windows 璁″垝浠诲姟璋冪敤鐨?`tools-docker/autorun.cmd` +**替代:** Windows 计划任务调用的 `tools-docker/autorun.cmd` -**浣滅敤锛?* 姣忔棩鍑屾櫒 4:00 鎵ц浠ヤ笅娴佺▼锛堜笌鍘?`autorun.cmd` 瀹屽叏涓€鑷达級锛? +**作用:** 每日凌晨 4:00 执行以下流程(与原 `autorun.cmd` 完全一致): -| 姝ラ | 鍘?autorun.cmd | Docker cronjob | +| 步骤 | 原 autorun.cmd | Docker cronjob | |------|---------------|----------------| -| 1. 鍋滄鍚屾鏈嶅姟 | `net stop HttpRequestService` | 鍒涘缓 `/shared/syncjob.pause` 淇″彿鏂囦欢 | -| 2. 绛夊緟褰撳墠璇锋眰瀹屾垚 | 锛圵indows 鏈嶅姟绔嬪嵆鍋滄锛?| `sleep 5` | -| 3. 鍚屾鎶ヨ〃鏁版嵁 | `HttpRequest.exe POST SynchronizeReportData.php` | `curl POST http://dlweb/ext/SynchronizeReportData.php` | -| 4. 鎭㈠鍚屾鏈嶅姟 | `net start HttpRequestService` | 鍒犻櫎 `/shared/syncjob.pause` 淇″彿鏂囦欢 | +| 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` 浼氳嚜鍔ㄨ烦杩囪疆璇紝鎶ヨ〃鍚屾瀹屾垚鍚庡垹闄よ鏂囦欢鎭㈠銆? +> **暂停机制:** `syncjob` 和 `cronjob` 通过共享 Docker volume(`shared-signal`)通信。`cronjob` 创建 `/shared/syncjob.pause` 文件时,`syncjob` 会自动跳过轮询,报表同步完成后删除该文件恢复。 -**鍙厤缃」锛坄.env`锛夛細** +**可配置项(`.env`):** ```bash -# cron 琛ㄨ揪寮忥紝榛樿鍑屾櫒 4:00 +# cron 表达式,默认凌晨 4:00 CRON_SCHEDULE=0 4 * * * ``` -**淇敼鎵ц鏃堕棿绀轰緥锛?* +**修改执行时间示例:** ```bash -# 鍑屾櫒 3:30 鎵ц +# 凌晨 3:30 执行 CRON_SCHEDULE=30 3 * * * -# 姣忓ぉ鍑屾櫒 2:00 鍜?14:00 鍚勬墽琛屼竴娆? +# 每天凌晨 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 @@ -401,157 +401,157 @@ docker exec youle-cronjob /bin/sh /app/daily-task.sh --- -## 鐜鍙橀噺璇存槑 +## 环境变量说明 -鎵€鏈夌‖缂栫爜鐨勫煙鍚嶃€佹暟鎹簱鍦板潃銆佸瘑閽ラ兘宸插閮ㄥ寲涓虹幆澧冨彉閲忋€?*淇敼閰嶇疆涓嶅啀闇€瑕佹敼浠g爜锛屽彧闇€鏀?`.env` 鏂囦欢銆?* +所有硬编码的域名、数据库地址、密钥都已外部化为环境变量。**修改配置不再需要改代码,只需改 `.env` 文件。** -### 鍙橀噺鍒嗙粍鎬昏 +### 变量分组总览 -| 鍙橀噺鍒嗙粍 | 璇存槑 | +| 变量分组 | 说明 | |---------|------| -| `API_DB_*` | 娓告垙鏍稿績 API 鏁版嵁搴?| -| `DLWEB_DB_*` | 浠g悊鍚庡彴涓诲簱 | -| `DLWEB_SLAVE_DB_*` | 浠g悊鍚庡彴浠庡簱 | -| `EXT_GAME_DB_*` | 澶栭儴娓告垙鏁版嵁搴擄紙Synchronize / SynchronizeReportData锛?| -| `EXT_GRADE_DB_*` | 鎴樼哗鏁版嵁搴擄紙game.php锛?| -| `EXT_DEV_DB_*` | 寮€鍙戞暟鎹簱锛圖EBUG 妯″紡锛?| -| `REDIS_*` | Redis 閰嶇疆 | -| `WX_MINI_*` | 寰俊灏忕▼搴?AppID / Secret | -| `WX_OA_*` | 寰俊鍏紬鍙?AppID / Secret | -| `WX_PAY_*` | 寰俊鏀粯鍟嗘埛閰嶇疆 | -| `REMOTE_CONFIG_*` | 杩滅▼閰嶇疆锛圙itee锛?| -| `ROOT_DOMAIN` | 鐖跺煙鍚嶏紙鑷姩鎺ㄥ 3 涓瓙鍩熷悕 + 鎵€鏈夋淳鐢?URL锛?| -| `SITE_*` | PHP 鍚庣鍚勭珯鐐瑰煙鍚?| -| `DLWEB_*_URL` | 鍓嶇 JS/HTML 纭紪鐮佸煙鍚嶆浛鎹?| -| `SYNC_INTERVAL` / `SYNC_PROCESSCOUNT` | syncjob 鍚屾鍙傛暟 | -| `CRON_SCHEDULE` | cronjob 鎵ц鏃堕棿 | -| `GAME_SERVER_QUERY_URL` | 娓告垙鏈嶅姟鍣ㄦ煡璇㈠湴鍧€ | -| `INTERNAL_WHITELIST` | IP 鐧藉悕鍗曪紙閫楀彿鍒嗛殧锛?| +| `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) | +| `ROOT_DOMAIN` | 父域名(自动推导 3 个子域名 + 所有派生 URL) | +| `SITE_*` | PHP 后端各站点域名 | +| `DLWEB_*_URL` | 前端 JS/HTML 硬编码域名替换 | +| `SYNC_INTERVAL` / `SYNC_PROCESSCOUNT` | syncjob 同步参数 | +| `CRON_SCHEDULE` | cronjob 执行时间 | +| `GAME_SERVER_QUERY_URL` | 游戏服务器查询地址 | +| `INTERNAL_WHITELIST` | IP 白名单(逗号分隔) | -### 鍩熷悕閰嶇疆鍏崇郴 +### 域名配置关系 ``` -.env 閰嶇疆 鈹? 鑷姩鎺ㄥ缁撴灉 -鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹尖攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ -ROOT_DOMAIN 鈹? API_DOMAIN = api. 鈫?Nginx 缃戠珯1锛堝惈 wxserver /wx/ 璺敱锛? -锛堝敮涓€蹇呭~锛? 鈹? DLWEB_DOMAIN = dlapi. 鈫?Nginx 缃戠珯2 - 鈹? SITE_API_URL = https://api. - 鈹? SITE_PAY_NOTIFY_URL = https://api. - 鈹? SITE_OPEN_URL = http://open. - 鈹? DLWEB_DL_API_V3_URL = https://dlapi. +.env 配置 │ 自动推导结果 +─────────────────────┼────────────────────────────────────────────────────── +ROOT_DOMAIN │ API_DOMAIN = api. → Nginx 网站1(含 wxserver /wx/ 路由) +(唯一必填) │ DLWEB_DOMAIN = dlapi. → Nginx 网站2 + │ SITE_API_URL = https://api. + │ SITE_PAY_NOTIFY_URL = https://api. + │ SITE_OPEN_URL = http://open. + │ DLWEB_DL_API_V3_URL = https://dlapi. ``` -> 鎺ㄥ鐢?`docker-compose.yml` 鐨?`environment:` 鍧楀畬鎴愶紝瀹瑰櫒鍐呮墍鏈夋淳鐢熷彉閲忓潎鏃犻渶鎵嬪姩閰嶇疆銆傚瀛愬煙鍚嶄笉绗﹀悎 `<鍓嶇紑>.` 瑙勫緥锛屽彲鍦?`.env` 涓崟鐙鐩栧搴斿彉閲忋€? +> 推导由 `docker-compose.yml` 的 `environment:` 块完成,容器内所有派生变量均无需手动配置。如子域名不符合 `<前缀>.` 规律,可在 `.env` 中单独覆盖对应变量。 --- -## 鐜鍙橀噺鍔犺浇鏈哄埗 +## 环境变量加载机制 -### PHP 鏈嶅姟锛坋nv_config.php锛? +### PHP 服务(env_config.php) -鎵€鏈?PHP 鏂囦欢閫氳繃 `env($key, $default)` 鍑芥暟璇诲彇閰嶇疆锛? +所有 PHP 文件通过 `env($key, $default)` 函数读取配置: ```php -// 浼樺厛璇?OS 鐜鍙橀噺锛圖ocker 鍦烘櫙锛夛紝鍥為€€璇?.env 鏂囦欢 +// 优先读 OS 环境变量(Docker 场景),回退读 .env 文件 $host = env('API_DB_HOST', 'localhost'); ``` -鍔犺浇浼樺厛绾э細Docker 瀹瑰櫒鐜鍙橀噺锛坄docker-compose env_file`锛? `.env` 鏂囦欢 > 浠g爜榛樿鍊笺€? +加载优先级:Docker 容器环境变量(`docker-compose env_file`)> `.env` 文件 > 代码默认值。 -### Node.js 鏈嶅姟锛坵xserver_daoqi锛? +### Node.js 服务(wxserver_daoqi) -鐩存帴浣跨敤 `process.env.VARIABLE_NAME`锛岀敱 `docker-compose env_file` 娉ㄥ叆銆? +直接使用 `process.env.VARIABLE_NAME`,由 `docker-compose env_file` 注入。 -### 鍓嶇 JS / HTML +### 前端 JS / HTML -鍓嶇闈欐€佹枃浠舵棤娉曡鍙栫幆澧冨彉閲忥紝閫氳繃 Docker entrypoint 鑴氭湰鍦ㄥ鍣ㄥ惎鍔ㄦ椂鐢?`sed` 鏇挎崲纭紪鐮佸煙鍚嶏細 +前端静态文件无法读取环境变量,通过 Docker entrypoint 脚本在容器启动时用 `sed` 替换硬编码域名: -- `docker/api/docker-entrypoint.sh` 鈥?鏇挎崲 API 鏈嶅姟涓殑 JS 鏂囦欢 -- `docker/dlweb/docker-entrypoint.sh` 鈥?鏇挎崲 DLWEB 鏈嶅姟涓殑 30+ 涓?JS/HTML 鏂囦欢 +- `docker/api/docker-entrypoint.sh` — 替换 API 服务中的 JS 文件 +- `docker/dlweb/docker-entrypoint.sh` — 替换 DLWEB 服务中的 30+ 个 JS/HTML 文件 -### Nginx 鍩熷悕娉ㄥ叆 +### Nginx 域名注入 -`default.conf.template` 浣跨敤 `${API_DOMAIN}` / `${DLWEB_DOMAIN}` 鍗犱綅绗︼紝Nginx 瀹瑰櫒鍚姩鏃堕€氳繃 `envsubst` 鑷姩鏇挎崲銆倃xserver 涓嶇嫭绔嬪崰鐢ㄥ煙鍚嶏紝閫氳繃 `api.xxx/wx/*` 璺敱鎺ュ叆銆? +`default.conf.template` 使用 `${API_DOMAIN}` / `${DLWEB_DOMAIN}` 占位符,Nginx 容器启动时通过 `envsubst` 自动替换。wxserver 不独立占用域名,通过 `api.xxx/wx/*` 路由接入。 --- -## SSL 璇佷功绠$悊 +## SSL 证书管理 -浣跨敤 Let's Encrypt 鍏嶈垂璇佷功锛岀敱 `certbot` 瀹瑰櫒鑷姩绠$悊銆? +使用 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 澶╄嚜鍔ㄦ洿鏂帮紝鏃犻渶浜哄伐骞查銆? +`certbot` 容器每 12 小时自动检查续签,证书到期前 30 天自动更新,无需人工干预。 --- -## 鏁版嵁鎸佷箙鍖? +## 数据持久化 -浠ヤ笅 Docker volume 鐢ㄤ簬鎸佷箙鍖栧瓨鍌細 +以下 Docker volume 用于持久化存储: -| 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 璇佷功鏂囦欢 | +| `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 部署)的区别 -| 椤圭洰 | 鍘熺増 Windows | Docker 鐗?| +| 项目 | 原版 Windows | Docker 版 | |------|-------------|-----------| -| 鐜 | Windows + Apache/XAMPP + Node.js | Docker 瀹瑰櫒鍖?| -| 閰嶇疆鏂瑰紡 | 纭紪鐮佸湪 PHP/JS/HTML 涓?| 缁熶竴 `.env` 鏂囦欢 | -| 鍩熷悕鍒囨崲 | 闇€鏀?30+ 涓枃浠?| 鍙敼 `.env` 鐨?3 涓煙鍚嶅彉閲?| -| 鏁版嵁搴撳瘑鐮?| 鏄庢枃鏁e竷鍦ㄥ涓厤缃枃浠?| 闆嗕腑鍦?`.env`锛堜笉杩涚増鏈簱锛?| -| SSL | 鎵嬪姩鐢宠/閮ㄧ讲璇佷功 | certbot 鑷姩鐢宠 + 12h 鑷姩缁 | -| Synchronize 杞 | `HttpRequestService.exe`锛圵indows 鏈嶅姟锛?| `syncjob` 瀹瑰櫒锛圓lpine + curl锛?| -| 姣忔棩瀹氭椂浠诲姟 | Windows 璁″垝浠诲姟 鈫?`autorun.cmd` | `cronjob` 瀹瑰櫒锛圓lpine 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`锛?| +| 环境 | 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`) | --- -## 甯歌杩愮淮鎿嶄綔 +## 常见运维操作 -### 鍦烘櫙涓€锛氭洿鎹㈠煙鍚? +### 场景一:更换域名 -褰撻渶瑕佸皢鏈嶅姟杩佺Щ鍒版柊鍩熷悕鏃讹紙渚嬪 `daoqijuyou.cn` 鈫?`newdomain.com`锛夛紝鍙渶鏀逛竴涓彉閲忥細 +当需要将服务迁移到新域名时(例如 `daoqijuyou.cn` → `newdomain.com`),只需改一个变量: -**1. 淇敼 `.env` 涓殑 `ROOT_DOMAIN`** +**1. 修改 `.env` 中的 `ROOT_DOMAIN`** ```bash vim .env ``` ```bash -# 鏀规垚鏂扮埗鍩熷悕锛屼笁涓瓙鍩熷悕鑷姩璺熼殢 +# 改成新父域名,三个子域名自动跟随 ROOT_DOMAIN=newdomain.com ``` -`docker-compose.yml` 灏嗚嚜鍔ㄦ帹瀵硷細 +`docker-compose.yml` 将自动推导: -| 鎺ㄥ鍙橀噺 | 缁撴灉 | +| 推导变量 | 结果 | |---------|------| | `API_DOMAIN` | `api.newdomain.com` | | `DLWEB_DOMAIN` | `dlapi.newdomain.com` | @@ -560,311 +560,311 @@ ROOT_DOMAIN=newdomain.com | `SITE_OPEN_URL` | `http://open.newdomain.com` | | `DLWEB_DL_API_V3_URL` | `https://dlapi.newdomain.com` | -> **瀛愬煙鍚嶄笉绗﹀悎鏍囧噯瑙勫緥鏃?*锛堝浣跨敤瀹屽叏涓嶅悓鐨勫墠缂€锛夛紝鍦?`.env` 涓崟鐙鐩栧搴斿彉閲忓嵆鍙紝浼樺厛绾ч珮浜庤嚜鍔ㄦ帹瀵硷細 +> **子域名不符合标准规律时**(如使用完全不同的前缀),在 `.env` 中单独覆盖对应变量即可,优先级高于自动推导: > ```bash -> DLWEB_DOMAIN=dl-manage.newdomain.com # 瑕嗙洊鍗曚釜瀛愬煙鍚? +> DLWEB_DOMAIN=dl-manage.newdomain.com # 覆盖单个子域名 > ``` -> **鍏朵粬鐙珛 URL 鍙橀噺**锛坄DLWEB_SETTLE_URL`銆乣DLWEB_PROXY_URL`銆乣QQ_CALLBACK_URL` 绛夛級浠嶉渶鍦?`.env` 涓墜鍔ㄩ厤缃紝璇﹁ `.env.example` 涓殑娉ㄩ噴銆? +> **其他独立 URL 变量**(`DLWEB_SETTLE_URL`、`DLWEB_PROXY_URL`、`QQ_CALLBACK_URL` 等)仍需在 `.env` 中手动配置,详见 `.env.example` 中的注释。 -**2. DNS 瑙f瀽** +**2. DNS 解析** -纭繚鏂板煙鍚嶅凡鎸囧悜鏈嶅姟鍣?IP锛? +确保新域名已指向服务器 IP: ```bash -# 楠岃瘉 DNS 瑙f瀽 +# 验证 DNS 解析 nslookup api.newdomain.com nslookup dlapi.newdomain.com ``` -**3. 閲嶆柊鐢宠 SSL 璇佷功** +**3. 重新申请 SSL 证书** ```bash -# 娴嬭瘯楠岃瘉锛堜笉娑堣€楃敵璇烽檺棰濓級 +# 测试验证(不消耗申请限额) ./deploy.sh ssl-init --staging -# 姝e紡鐢宠 +# 正式申请 ./deploy.sh ssl-init ``` -**4. 閲嶅惎鎵€鏈夋湇鍔?* +**4. 重启所有服务** ```bash ./deploy.sh restart ``` -閲嶅惎鏃朵細鑷姩瀹屾垚锛? -- Nginx 浣跨敤鏂板煙鍚嶇殑 `server_name` 鍜?SSL 璇佷功 -- `docker-entrypoint.sh` 鐢ㄦ柊鍩熷悕鏇挎崲 JS/HTML 涓殑纭紪鐮?URL -- PHP `env()` 璇诲彇鏂扮殑鐜鍙橀噺鍊? +重启时会自动完成: +- Nginx 使用新域名的 `server_name` 和 SSL 证书 +- `docker-entrypoint.sh` 用新域名替换 JS/HTML 中的硬编码 URL +- PHP `env()` 读取新的环境变量值 -**5. 鏇存柊寰俊鍚庡彴閰嶇疆** +**5. 更新微信后台配置** -鏇存崲鍩熷悕鍚庯紝蹇呴』鍚屾鏇存柊寰俊涓変釜鍚庡彴鐨勫煙鍚嶇櫧鍚嶅崟锛屽惁鍒欏搴斿姛鑳戒細鐩存帴鎶ラ敊鎴栭潤榛樺け璐ャ€? +更换域名后,必须同步更新微信三个后台的域名白名单,否则对应功能会直接报错或静默失败。 -> **鍏抽敭璺敱璇存槑锛?* Nginx 鍦?`api.newdomain.com` 涓婇厤缃簡 `/wx/` 鍓嶇紑璺敱鈥斺€斾互 `/wx/` 寮€澶寸殑璇锋眰浼氳鍙嶅悜浠g悊鍒?wxserver锛圢ode.js锛夛紝鍏朵綑璇锋眰浠嶇敱 PHP API 澶勭悊銆倃xserver 鎵€鏈夋帴鍙o紙鍖呮嫭灏忕▼搴忕櫥褰曘€佸叕浼楀彿 OAuth锛夊潎閫氳繃 `api.newdomain.com/wx/*` 璁块棶銆? +> **关键路由说明:** Nginx 在 `api.newdomain.com` 上配置了 `/wx/` 前缀路由——以 `/wx/` 开头的请求会被反向代理到 wxserver(Node.js),其余请求仍由 PHP API 处理。wxserver 所有接口(包括小程序登录、公众号 OAuth)均通过 `api.newdomain.com/wx/*` 访问。 --- -#### 5.1 寰俊灏忕▼搴忓悗鍙? +#### 5.1 微信小程序后台 -> **鍏ュ彛锛?* [mp.weixin.qq.com](https://mp.weixin.qq.com) 鈫?寮€鍙?鈫?寮€鍙戠鐞?鈫?寮€鍙戣缃?鈫?鏈嶅姟鍣ㄥ煙鍚? +> **入口:** [mp.weixin.qq.com](https://mp.weixin.qq.com) → 开发 → 开发管理 → 开发设置 → 服务器域名 -| 閰嶇疆椤?| 浣滅敤 | 鏂板€?| 涓嶆洿鏂版椂鐨勭幇璞?| +| 配置项 | 作用 | 新值 | 不更新时的现象 | |--------|------|------|--------------| -| **request 鍚堟硶鍩熷悕** | 灏忕▼搴忚皟鐢?`wx.request()` 璇锋眰 wxserver 鍚庣鎺ュ彛 | `https://api.newdomain.com` | `wx.request` 鐩存帴鎶?`invalid url`锛屾墍鏈夌綉缁滆姹傚け璐?| -| **涓氬姟鍩熷悕** | 灏忕▼搴?`` 缁勪欢鍔犺浇鍏紬鍙锋巿鏉冮〉锛堣幏鍙栨案涔呭ご鍍忔祦绋嬶級 | `api.newdomain.com` | 鎵撳紑 web-view 鏃舵彁绀?涓嶅湪涓氬姟鍩熷悕鍒楄〃涓?锛屾巿鏉冮〉鏃犳硶鍔犺浇 | +| **request 合法域名** | 小程序调用 `wx.request()` 请求 wxserver 后端接口 | `https://api.newdomain.com` | `wx.request` 直接报 `invalid url`,所有网络请求失败 | +| **业务域名** | 小程序 `` 组件加载公众号授权页(获取永久头像流程) | `api.newdomain.com` | 打开 web-view 时提示"不在业务域名列表中",授权页无法加载 | -> **娉ㄦ剰锛?* 灏忕▼搴忓煙鍚嶉厤缃瘡鏈堝彧鑳戒慨鏀?5 娆★紝涓旀瘡椤瑰煙鍚嶅繀椤诲凡澶囨骞跺惎鐢?HTTPS銆? +> **注意:** 小程序域名配置每月只能修改 5 次,且每项域名必须已备案并启用 HTTPS。 --- -#### 5.2 寰俊鍏紬鍙峰悗鍙? +#### 5.2 微信公众号后台 -> **鍏ュ彛锛?* [mp.weixin.qq.com](https://mp.weixin.qq.com) 鈫?璁剧疆涓庡紑鍙?鈫?鍏紬鍙疯缃?鈫?鍔熻兘璁剧疆 +> **入口:** [mp.weixin.qq.com](https://mp.weixin.qq.com) → 设置与开发 → 公众号设置 → 功能设置 -**鈶?涓氬姟鍩熷悕** +**① 业务域名** -| 閰嶇疆鍊?| 鐢ㄩ€?| +| 配置值 | 用途 | |--------|------| -| `api.newdomain.com` | 鍦ㄥ叕浼楀彿鍐呮墦寮€鐨勭綉椤垫墍鍦ㄥ煙鍚?| +| `api.newdomain.com` | 在公众号内打开的网页所在域名 | -鐢ㄦ埛鍦ㄥ井淇″唴缃祻瑙堝櫒涓墦寮€鐨勬父鎴忔敮浠橀〉锛坄api.newdomain.com`锛夊繀椤诲湪涓氬姟鍩熷悕鍒楄〃鍐咃紝鍚﹀垯椤甸潰浼氳鎻愮ず"鍩熷悕涓嶅悎娉?鎴栨棤娉曟甯歌闂€? +用户在微信内置浏览器中打开的游戏支付页(`api.newdomain.com`)必须在业务域名列表内,否则页面会被提示"域名不合法"或无法正常访问。 -> **楠岃瘉鏂囦欢锛?* 娣诲姞涓氬姟鍩熷悕鏃讹紝寰俊瑕佹眰鍦ㄨ鍩熷悕鏍圭洰褰曟斁缃?`.txt` 楠岃瘉鏂囦欢銆傚皢寰俊鎻愪緵鐨勬枃浠讹紙濡?`MP_verify_xxx.txt`锛夋斁鍏?`api/` 鏍圭洰褰曪紝鐒跺悗 `./deploy.sh rebuild api`銆? +> **验证文件:** 添加业务域名时,微信要求在该域名根目录放置 `.txt` 验证文件。将微信提供的文件(如 `MP_verify_xxx.txt`)放入 `api/` 根目录,然后 `./deploy.sh rebuild api`。 --- -**鈶?缃戦〉鎺堟潈鍩熷悕锛堟渶閲嶈锛?* +**② 网页授权域名(最重要)** -| 閰嶇疆鍊?| 鐢ㄩ€?| +| 配置值 | 用途 | |--------|------| -| `api.newdomain.com` | 鍏紬鍙?OAuth2 鎺堟潈鍥炶皟鍩熷悕 | +| `api.newdomain.com` | 公众号 OAuth2 授权回调域名 | -**涓轰粈涔堟槸 `api.newdomain.com`锛?* -灏忕▼搴忓唴宓?web-view 璺宠浆鍒?`https://api.newdomain.com/wx/auth/oa/login`锛孨ginx `/wx/` 璺敱灏嗘璇锋眰鍙嶅悜浠g悊鍒?wxserver 鐨?`/auth/oa/login`锛寃xserver 鍐嶆妸鐢ㄦ埛閲嶅畾鍚戝埌寰俊鎺堟潈椤碉紝`redirect_uri` 涓?`https://api.newdomain.com/wx/auth/oa/callback`锛堥€氳繃 `WX_OA_REDIRECT_DOMAIN` 鐜鍙橀噺鎺у埗锛夈€傚井淇¤姹?`redirect_uri` 鐨勫煙鍚嶅繀椤诲湪鍏紬鍙峰悗鍙扮殑鎺堟潈鍩熷悕鍒楄〃鍐咃紝鎵€浠ュ~ `api.newdomain.com`銆? +**为什么是 `api.newdomain.com`:** +小程序内嵌 web-view 跳转到 `https://api.newdomain.com/wx/auth/oa/login`,Nginx `/wx/` 路由将此请求反向代理到 wxserver 的 `/auth/oa/login`,wxserver 再把用户重定向到微信授权页,`redirect_uri` 为 `https://api.newdomain.com/wx/auth/oa/callback`(通过 `WX_OA_REDIRECT_DOMAIN` 环境变量控制)。微信要求 `redirect_uri` 的域名必须在公众号后台的授权域名列表内,所以填 `api.newdomain.com`。 -涓嶆洿鏂扮殑鍚庢灉锛氭巿鏉冭烦杞椂寰俊鐩存帴鎷︽埅锛屾樉绀?"redirect_uri 鍩熷悕涓庡悗鍙伴厤缃笉涓€鑷? 閿欒锛屾案涔呭ご鍍忚幏鍙栧姛鑳藉畬鍏ㄤ笉鍙敤銆? +不更新的后果:授权跳转时微信直接拦截,显示 "redirect_uri 域名与后台配置不一致" 错误,永久头像获取功能完全不可用。 -> **鈿狅笍 杩滅▼閰嶇疆涔熼渶瑕佸悓姝ヤ慨鏀癸細** `WX_OA_REDIRECT_DOMAIN` 鏈厤缃椂锛寃xserver 浼氫粠杩滅▼閰嶇疆鏂囦欢璇诲彇 `minipro_api_url` key 浣滀负鍥炶皟鍩熷悕锛堣 `wxserver_daoqi/config/index.js`锛夈€傚嵆浣?`.env` 涓凡姝g‘濉啓 `WX_OA_REDIRECT_DOMAIN`锛屼粛寤鸿鍚屾鏇存柊杩滅▼閰嶇疆锛岄伩鍏嶇幆澧冨彉閲忛厤缃涪澶辨椂鍑虹幇闈欓粯鍥為€€鑷虫棫鍩熷悕鐨勯棶棰樸€? +> **⚠️ 远程配置也需要同步修改:** `WX_OA_REDIRECT_DOMAIN` 未配置时,wxserver 会从远程配置文件读取 `minipro_api_url` key 作为回调域名(见 `wxserver_daoqi/config/index.js`)。即使 `.env` 中已正确填写 `WX_OA_REDIRECT_DOMAIN`,仍建议同步更新远程配置,避免环境变量配置丢失时出现静默回退至旧域名的问题。 > -> 杩滅▼閰嶇疆鏂囦欢鍦板潃锛圙itee Raw锛夛細`https://gitee.com/daoqijuyou/config/raw/master/update_jsonv2.txt` -> 鎵惧埌 `minipro_api_url` 瀛楁锛屾洿鏂板€间负锛歚api.newdomain.com/wx`锛堜笉鍚?`https://`锛寃xserver 浼氳嚜鍔ㄨˉ鍏咃級 +> 远程配置文件地址(Gitee Raw):`https://gitee.com/daoqijuyou/config/raw/master/update_jsonv2.txt` +> 找到 `minipro_api_url` 字段,更新值为:`api.newdomain.com/wx`(不含 `https://`,wxserver 会自动补充) -> **楠岃瘉鏂囦欢锛?* 娣诲姞鎺堟潈鍩熷悕鏃讹紝寰俊瑕佹眰鍦ㄨ鍩熷悕鏍圭洰褰曟斁缃竴涓?`.txt` 楠岃瘉鏂囦欢銆傚皢寰俊鎻愪緵鐨勯獙璇佹枃浠讹紙濡?`MP_verify_xxx.txt`锛夌洿鎺ユ斁鍏?`api/` 鏍圭洰褰曪紝鐒跺悗閲嶅缓 api 闀滃儚浣垮叾鐢熸晥锛? +> **验证文件:** 添加授权域名时,微信要求在该域名根目录放置一个 `.txt` 验证文件。将微信提供的验证文件(如 `MP_verify_xxx.txt`)直接放入 `api/` 根目录,然后重建 api 镜像使其生效: > ```bash > ./deploy.sh rebuild api > ``` --- -**鈶?JS 鎺ュ彛瀹夊叏鍩熷悕** +**② JS 接口安全域名** -| 閰嶇疆鍊?| 鐢ㄩ€?| +| 配置值 | 用途 | |--------|------| -| `api.newdomain.com` | 寰俊 JS-SDK锛坄wx.config()`锛夐〉闈㈡墍鍦ㄥ煙鍚?| +| `api.newdomain.com` | 微信 JS-SDK(`wx.config()`)页面所在域名 | -**涓轰粈涔堟槸 `api.newdomain.com`锛?* -API 鏈嶅姟锛坄youle-api`锛夌殑 PHP 椤甸潰浣跨敤 jsapi_ticket 绛惧悕锛岀敓鎴?`wx.config()` 鍙傛暟锛屼娇鐢ㄥ井淇?JS-SDK 璋冭捣鏀粯锛坄WeixinJSBridge.invoke(getBrandWCPayRequest)`锛夈€傚井淇¤姹傝皟鐢?JS-SDK 鐨勯〉闈㈡墍鍦ㄥ煙鍚嶅繀椤诲湪瀹夊叏鍩熷悕鍒楄〃鍐呫€? +**为什么是 `api.newdomain.com`:** +API 服务(`youle-api`)的 PHP 页面使用 jsapi_ticket 签名,生成 `wx.config()` 参数,使用微信 JS-SDK 调起支付(`WeixinJSBridge.invoke(getBrandWCPayRequest)`)。微信要求调用 JS-SDK 的页面所在域名必须在安全域名列表内。 -涓嶆洿鏂扮殑鍚庢灉锛歚wx.config()` 绛惧悕楠岃瘉澶辫触锛屽井淇℃敮浠樻寜閽棤娉曞敜璧锋敮浠樼晫闈紝鐢ㄦ埛鐐瑰嚮鏀粯鏃犲弽搴斻€? +不更新的后果:`wx.config()` 签名验证失败,微信支付按钮无法唤起支付界面,用户点击支付无反应。 --- -#### 5.3 寰俊鏀粯鍟嗘埛鍚庡彴 +#### 5.3 微信支付商户后台 -> **鍏ュ彛锛?* [pay.weixin.qq.com](https://pay.weixin.qq.com) 鈫?璐︽埛涓績 鈫?鍟嗘埛淇℃伅 鈫?鏀粯閰嶇疆 鈫?JSAPI 鏀粯鎺堟潈鐩綍 +> **入口:** [pay.weixin.qq.com](https://pay.weixin.qq.com) → 账户中心 → 商户信息 → 支付配置 → JSAPI 支付授权目录 -| 閰嶇疆鍊?| 鐢ㄩ€?| +| 配置值 | 用途 | |--------|------| -| `https://api.newdomain.com/` | JSAPI 鏀粯椤甸潰鎵€鍦ㄧ洰褰曪紙蹇呴』鍖呭惈鏈熬鏂滄潬锛?| +| `https://api.newdomain.com/` | JSAPI 支付页面所在目录(必须包含末尾斜杠) | -**涓轰粈涔堟槸 `api.newdomain.com`锛?* -JSAPI 鏀粯椤甸潰锛坄api/source/apis/pay.php`锛夎繍琛屽湪 `api.newdomain.com` 鍩熷悕涓嬶紝缁熶竴涓嬪崟鏃剁殑 `notify_url`锛堟敮浠樺洖璋冮€氱煡鍦板潃锛変篃鐢?`SITE_PAY_NOTIFY_URL`锛堥粯璁ゅ€?`https://api.newdomain.com`锛夋寚瀹氥€傚井淇℃敮浠樿姹傚彂璧锋敮浠樼殑椤甸潰鍩熷悕蹇呴』鍦ㄦ巿鏉冪洰褰曠櫧鍚嶅崟鍐呫€? +**为什么是 `api.newdomain.com`:** +JSAPI 支付页面(`api/source/apis/pay.php`)运行在 `api.newdomain.com` 域名下,统一下单时的 `notify_url`(支付回调通知地址)也由 `SITE_PAY_NOTIFY_URL`(默认值 `https://api.newdomain.com`)指定。微信支付要求发起支付的页面域名必须在授权目录白名单内。 -涓嶆洿鏂扮殑鍚庢灉锛氫笅鍗曟椂鎻愮ず"褰撳墠URL鏈敞鍐?锛孞SAPI 鏀粯褰诲簳鏃犳硶浣跨敤銆? +不更新的后果:下单时提示"当前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/` | +| **微信小程序后台** | 开发 → 开发管理 → 开发设置 → 服务器域名 | request 合法域名 | `https://api.newdomain.com` | +| **微信小程序后台** | 开发 → 开发管理 → 开发设置 → 服务器域名 | 业务域名 | `api.newdomain.com` | +| **微信公众号后台** | 设置与开发 → 公众号设置 → 功能设置 | 业务域名 | `api.newdomain.com` | +| **微信公众号后台** | 设置与开发 → 公众号设置 → 功能设置 | 网页授权域名 | `api.newdomain.com` | +| **微信公众号后台** | 设置与开发 → 公众号设置 → 功能设置 | JS 接口安全域名 | `api.newdomain.com` | +| **微信支付商户后台** | 账户中心 → 商户信息 → 支付配置 | JSAPI 支付授权目录 | `https://api.newdomain.com/` | --- -### 鍦烘櫙浜岋細鏇存崲鏁版嵁搴撳湴鍧€ +### 场景二:更换数据库地址 -褰撴暟鎹簱瀹炰緥杩佺Щ锛堜緥濡?RDS 鍗囩骇銆佸垏鎹㈠尯鍩燂級鏃讹細 +当数据库实例迁移(例如 RDS 升级、切换区域)时: -**1. 淇敼 `.env` 涓搴旂殑鏁版嵁搴撳彉閲?* +**1. 修改 `.env` 中对应的数据库变量** ```bash vim .env ``` -鎸夋暟鎹簱鍒嗙粍锛? +按数据库分组: -| 鏁版嵁搴?| 闇€淇敼鐨勫彉閲?| 浣跨敤鑰?| +| 数据库 | 需修改的变量 | 使用者 | |--------|-------------|--------| -| API 涓诲簱 | `API_DB_HOST`, `API_DB_PORT`, `API_DB_USER`, `API_DB_PASSWORD` | api 鏈嶅姟 | -| 浠g悊鍚庡彴涓诲簱 | `DLWEB_DB_HOST`, `DLWEB_DB_PORT`, `DLWEB_DB_USER`, `DLWEB_DB_PASSWORD` | dlweb 鏈嶅姟 | -| 浠g悊鍚庡彴浠庡簱 | `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 妯″紡 | +| 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. 閲嶅惎鍙楀奖鍝嶇殑鏈嶅姟** +**2. 重启受影响的服务** ```bash -# 濡傛灉鍙敼浜?API 鏁版嵁搴? +# 如果只改了 API 数据库 docker compose restart api -# 濡傛灉鍙敼浜?DLWEB 鏁版嵁搴? +# 如果只改了 DLWEB 数据库 docker compose restart dlweb -# 濡傛灉鏀逛簡澶栭儴娓告垙搴擄紙褰卞搷鍚屾浠诲姟锛? +# 如果改了外部游戏库(影响同步任务) docker compose restart dlweb syncjob cronjob -# 濡傛灉鏀逛簡澶氫釜锛岀洿鎺ュ叏閮ㄩ噸鍚? +# 如果改了多个,直接全部重启 ./deploy.sh restart ``` -**3. 楠岃瘉杩炴帴** +**3. 验证连接** ```bash -# 鏌ョ湅 API 鏃ュ織鏄惁鏈夋暟鎹簱杩炴帴閿欒 +# 查看 API 日志是否有数据库连接错误 docker logs --tail 20 youle-api -# 鏌ョ湅 DLWEB 鏃ュ織 +# 查看 DLWEB 日志 docker logs --tail 20 youle-dlweb -# 鏌ョ湅鍚屾浠诲姟鏄惁姝e父 +# 查看同步任务是否正常 docker logs --tail 10 youle-syncjob ``` -> **鎻愮ず锛?* 濡傛灉鏂版暟鎹簱鏈?IP 鐧藉悕鍗曢檺鍒讹紝闇€瑕佸皢 Docker 瀹夸富鏈虹殑鍏綉 IP 鍔犲叆 RDS 鐧藉悕鍗曘€? +> **提示:** 如果新数据库有 IP 白名单限制,需要将 Docker 宿主机的公网 IP 加入 RDS 白名单。 --- -### 鍦烘櫙涓夛細鏇存崲鏈嶅姟鍣紙鏁翠綋杩佺Щ锛? +### 场景三:更换服务器(整体迁移) -灏嗘暣涓?Docker 閮ㄧ讲杩佺Щ鍒版柊鏈嶅姟鍣細 +将整个 Docker 部署迁移到新服务器: -**1. 鎵撳寘椤圭洰鏂囦欢** +**1. 打包项目文件** ```bash -# 鍦ㄦ棫鏈嶅姟鍣ㄤ笂 +# 在旧服务器上 cd /path/to/game-docker -# 鎺掗櫎涓嶅繀瑕佹枃浠? +# 排除不必要文件 tar czf game-docker.tar.gz --exclude='.env' --exclude='game/' . ``` -**2. 浼犺緭鍒版柊鏈嶅姟鍣?* +**2. 传输到新服务器** ```bash scp game-docker.tar.gz newserver:/opt/ ``` -**3. 鍦ㄦ柊鏈嶅姟鍣ㄤ笂閮ㄧ讲** +**3. 在新服务器上部署** ```bash cd /opt tar xzf game-docker.tar.gz -C game-docker cd game-docker -# 澶嶅埗骞朵慨鏀归厤缃紙鏂版湇鍔″櫒 IP 鍙兘涓嶅悓锛? +# 复制并修改配置(新服务器 IP 可能不同) cp .env.example .env vim .env ``` -**4. 纭淇敼椤?* +**4. 确认修改项** -| 妫€鏌ラ」 | 鏄惁闇€瑕佹敼 | 璇存槑 | +| 检查项 | 是否需要改 | 说明 | |--------|-----------|------| -| 鍩熷悕锛坄*_DOMAIN`锛?| 鍩熷悕涓嶅彉鍒欎笉鏀?| DNS 闇€鎸囧悜鏂版湇鍔″櫒 IP | -| 鏁版嵁搴撳湴鍧€锛坄*_DB_HOST`锛?| 閫氬父涓嶆敼 | RDS 鍦板潃涓嶅彉锛屼絾闇€灏嗘柊鏈嶅姟鍣?IP 鍔犲叆鐧藉悕鍗?| -| Redis 鍦板潃 | 涓嶆敼 | Docker 鍐呯疆 Redis锛岄殢瀹瑰櫒杩佺Щ | -| 寰俊/鏀粯閰嶇疆 | 涓嶆敼 | AppID/Secret 涓庢湇鍔″櫒鏃犲叧 | -| 娓告垙鏈嶅姟鍣ㄦ煡璇㈠湴鍧€ | 鐪嬫儏鍐?| `GAME_SERVER_QUERY_URL` 濡傛灉娓告垙鏈嶅姟鍣ㄤ篃杩佺Щ浜嗛渶鏀?| -| IP 鐧藉悕鍗?| 鍙兘闇€鏀?| `INTERNAL_WHITELIST` 鍔犲叆鏂?IP | +| 域名(`*_DOMAIN`) | 域名不变则不改 | DNS 需指向新服务器 IP | +| 数据库地址(`*_DB_HOST`) | 通常不改 | RDS 地址不变,但需将新服务器 IP 加入白名单 | +| Redis 地址 | 不改 | Docker 内置 Redis,随容器迁移 | +| 微信/支付配置 | 不改 | AppID/Secret 与服务器无关 | +| 游戏服务器查询地址 | 看情况 | `GAME_SERVER_QUERY_URL` 如果游戏服务器也迁移了需改 | +| IP 白名单 | 可能需改 | `INTERNAL_WHITELIST` 加入新 IP | -**5. 鍚姩鏈嶅姟** +**5. 启动服务** ```bash chmod +x deploy.sh init-ssl.sh -# 鍩熷悕鏈彉锛欴NS 鏀规寚鍚戝悗鐩存帴鍚姩 -./deploy.sh ssl-init # 鏂版湇鍔″櫒闇€閲嶆柊鐢宠璇佷功 +# 域名未变:DNS 改指向后直接启动 +./deploy.sh ssl-init # 新服务器需重新申请证书 ./deploy.sh up -# 鍩熷悕鍙樹簡锛氬弬鐓с€屽満鏅竴锛氭洿鎹㈠煙鍚嶃€? +# 域名变了:参照「场景一:更换域名」 ``` -**6. 楠岃瘉鎵€鏈夋湇鍔?* +**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 # wxserver 鍋ュ悍妫€鏌? +curl -k https://api.yourdomain.com/wx/api/login # wxserver 健康检查 -# 瀹氭椂浠诲姟杩愯姝e父 +# 定时任务运行正常 docker logs --tail 5 youle-syncjob docker logs --tail 5 youle-cronjob ``` --- -### 鍦烘櫙鍥涳細浠呮洿鏀?Redis 閰嶇疆 +### 场景四:仅更改 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`锛圖ocker 鏈嶅姟鍚嶏級锛屼笉鏄?`localhost`銆? +> **注意:** 如果使用 Docker 内置 Redis(默认),`REDIS_HOST` 应设为 `redis`(Docker 服务名),不是 `localhost`。 --- -### 鍦烘櫙浜旓細鍗曠嫭寮€鍚?/ 鍏抽棴鐗瑰畾鏈嶅姟 +### 场景五:单独开启 / 关闭特定服务 -鎵€鏈夋湇鍔″潎鍙嫭绔嬪惎鍋滐紝涓嶅奖鍝嶅叾浠栬繍琛屼腑鐨勫鍣ㄣ€? +所有服务均可独立启停,不影响其他运行中的容器。 -#### 鏈嶅姟娓呭崟涓庝緷璧栧叧绯? +#### 服务清单与依赖关系 -| 鏈嶅姟鍚?| 瀹瑰櫒鍚?| 璇存槑 | 渚濊禆 | +| 服务名 | 容器名 | 说明 | 依赖 | |--------|--------|------|------| -| `nginx` | `youle-nginx` | 鍙嶅悜浠g悊 + SSL | api / dlweb / wxserver | -| `api` | `youle-api` | 娓告垙鏍稿績 API | 鈥?| -| `dlweb` | `youle-dlweb` | 浠g悊绠$悊鍚庡彴 | redis | -| `wxserver` | `youle-wxserver` | 寰俊灏忕▼搴忓悗绔?| 鈥?| -| `syncjob` | `youle-syncjob` | 姣?30s 鏁版嵁鍚屾 | dlweb锛堝唴缃戯級 | -| `cronjob` | `youle-cronjob` | 姣忔棩鍑屾櫒鎶ヨ〃浠诲姟 | dlweb锛堝唴缃戯級 | -| `redis` | `youle-redis` | 缂撳瓨 | 鈥?| -| `certbot` | `youle-certbot` | 璇佷功鑷姩缁 | 鈥?| +| `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 cd /opt/youle/game-docker -# 鍚姩鏌愪釜鏈嶅姟锛堣嫢闀滃儚涓嶅瓨鍦ㄤ細鑷姩鏋勫缓锛? +# 启动某个服务(若镜像不存在会自动构建) docker compose up -d api docker compose up -d dlweb docker compose up -d wxserver @@ -875,172 +875,172 @@ docker compose up -d nginx docker compose up -d certbot ``` -#### 鍏抽棴鍗曚釜鏈嶅姟 +#### 关闭单个服务 ```bash -# 鍋滄骞剁Щ闄ゅ鍣紙鏁版嵁 volume 涓嶅彈褰卞搷锛? +# 停止并移除容器(数据 volume 不受影响) docker compose stop api docker compose stop syncjob docker compose stop cronjob -# 鎴栬€?stop + 绉婚櫎瀹瑰櫒锛堢瓑鏁堜簬 stop + rm锛? +# 或者 stop + 移除容器(等效于 stop + rm) docker compose rm -sf syncjob ``` -> **娉ㄦ剰锛?* `stop` 鍙仠姝㈠鍣紝涓嶅垹闄わ紱`rm -sf` 鍋滄骞跺垹闄ゅ鍣紙涓嬫 `up` 浼氶噸鏂板垱寤猴級銆備袱绉嶆柟寮忓潎涓嶄細涓㈠け鏁版嵁 volume銆? +> **注意:** `stop` 只停止容器,不删除;`rm -sf` 停止并删除容器(下次 `up` 会重新创建)。两种方式均不会丢失数据 volume。 -#### 甯歌鍦烘櫙 +#### 常见场景 -**涓存椂鍏抽棴鍚屾浠诲姟锛堢淮鎶ゆ暟鎹簱鏃讹級锛?* +**临时关闭同步任务(维护数据库时):** ```bash docker compose stop syncjob cronjob -# 缁存姢瀹屾垚鍚庢仮澶? +# 维护完成后恢复 docker compose up -d syncjob cronjob ``` -**鍙噸寤哄苟閲嶅惎鏌愪釜涓氬姟鏈嶅姟锛堜唬鐮佹洿鏂板悗锛夛細** +**只重建并重启某个业务服务(代码更新后):** ```bash -# 閲嶆柊鏋勫缓闀滃儚骞堕噸鍚紝鍏朵粬鏈嶅姟涓嶅彈褰卞搷 +# 重新构建镜像并重启,其他服务不受影响 docker compose up -d --build api docker compose up -d --build dlweb docker compose up -d --build wxserver ``` -**鍏抽棴 certbot 鑷姩缁锛堣皟璇曟湡闂撮伩鍏嶈姹傞鐜囬檺鍒讹級锛?* +**关闭 certbot 自动续签(调试期间避免请求频率限制):** ```bash docker compose stop certbot -# 璋冭瘯瀹屾瘯鍚庢仮澶? +# 调试完毕后恢复 docker compose up -d certbot ``` -**浠呴噸鍚?nginx锛堜慨鏀归厤缃悗鐢熸晥锛夛細** +**仅重启 nginx(修改配置后生效):** ```bash docker compose restart nginx -# 鎴栫儹閲嶈浇锛堜笉涓柇杩炴帴锛? +# 或热重载(不中断连接) docker exec youle-nginx nginx -s reload ``` -**鏌ョ湅鎵€鏈夋湇鍔″綋鍓嶇姸鎬侊細** +**查看所有服务当前状态:** ```bash docker compose ps -# 鎴? +# 或 ./deploy.sh status ``` --- -### 鎿嶄綔閫熸煡琛? +### 操作速查表 -| 鍙樻洿鍐呭 | 淇敼 `.env` 涓殑鍙橀噺 | 閲嶅惎鍛戒护 | 棰濆鎿嶄綔 | +| 变更内容 | 修改 `.env` 中的变量 | 重启命令 | 额外操作 | |---------|---------------------|---------|---------| -| 鏇存崲鍩熷悕 | `ROOT_DOMAIN`锛堝瓙鍩熷悕涓嶆爣鍑嗘椂鍗曠嫭瑕嗙洊锛?| `./deploy.sh ssl-init && ./deploy.sh restart` | DNS 瑙f瀽 + 寰俊鍚庡彴 | -| 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 鐧藉悕鍗?| +| 更换域名 | `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 白名单 | --- -### 鍦烘櫙锛氫慨鏀规湰鍦版枃浠跺悗濡備綍鐢熸晥 +### 场景:修改本地文件后如何生效 -涓嶅悓鏂囦欢鍦ㄩ暅鍍忎腑鐨勫鐞嗘柟寮忎笉鍚岋紝鍐冲畾浜嗘敼瀹屼唬鐮佸悗闇€瑕佹墽琛屽摢绉嶆搷浣溿€? +不同文件在镜像中的处理方式不同,决定了改完代码后需要执行哪种操作。 -#### 鏂囦欢 鈫?鎿嶄綔瀵圭収琛? +#### 文件 → 操作对照表 -| 鏂囦欢璺緞 | 鎵€灞炲鍣?| 杞藉叆鏂瑰紡 | 淇敼鍚庨渶瑕佹墽琛岀殑鎿嶄綔 | +| 文件路径 | 所属容器 | 载入方式 | 修改后需要执行的操作 | |---------|---------|---------|-------------------| -| `api/**` | `youle-api` | `COPY` 杩涢暅鍍?| `./deploy.sh rebuild api` 閲嶅缓闀滃儚 | -| `dlweb/**` | `youle-dlweb` | `COPY` 杩涢暅鍍?| `./deploy.sh rebuild dlweb` 閲嶅缓闀滃儚 | -| `wxserver_daoqi/**` | `youle-wxserver` | `COPY` 杩涢暅鍍?| `./deploy.sh rebuild wxserver` 閲嶅缓闀滃儚 | -| `env_config.php` | `youle-api` / `youle-dlweb` | `COPY` 杩涢暅鍍?| `./deploy.sh rebuild api dlweb` 閲嶅缓涓や釜闀滃儚 | -| `docker/api/Dockerfile` | `youle-api` | 鏋勫缓瀹氫箟 | `./deploy.sh rebuild api` | -| `docker/api/docker-entrypoint.sh` | `youle-api` | `COPY` 杩涢暅鍍?| `./deploy.sh rebuild api` | -| `docker/dlweb/Dockerfile` | `youle-dlweb` | 鏋勫缓瀹氫箟 | `./deploy.sh rebuild dlweb` | -| `docker/dlweb/docker-entrypoint.sh` | `youle-dlweb` | `COPY` 杩涢暅鍍?| `./deploy.sh rebuild dlweb` | -| `docker/wxserver/Dockerfile` | `youle-wxserver` | 鏋勫缓瀹氫箟 | `./deploy.sh rebuild wxserver` | -| `docker/nginx/default.conf.template` | `youle-nginx` | volume 鎸傝浇锛坄:ro`锛?| `scp` 涓婁紶 鈫?`docker restart youle-nginx` | -| `docker/nginx/ssl-params.conf` | `youle-nginx` | volume 鎸傝浇锛坄:ro`锛?| `scp` 涓婁紶 鈫?`docker restart youle-nginx` | -| `docker/syncjob/sync.sh` | `youle-syncjob` | volume 鎸傝浇锛坄:ro`锛?| `scp` 涓婁紶 鈫?`docker restart youle-syncjob` | -| `docker/cronjob/entrypoint.sh` | `youle-cronjob` | volume 鎸傝浇锛坄:ro`锛?| `scp` 涓婁紶 鈫?`docker restart youle-cronjob` | -| `docker/cronjob/daily-task.sh` | `youle-cronjob` | volume 鎸傝浇锛坄:ro`锛?| `scp` 涓婁紶 鈫?`docker restart youle-cronjob` | -| `docker-compose.yml` | 鎵€鏈夊鍣?| compose 缂栨帓 | `docker compose up -d`锛堟湁鍙樺姩鐨勫鍣ㄨ嚜鍔ㄩ噸寤猴級 | -| `.env` | 鎵€鏈夊鍣?| compose `env_file` | `docker compose up -d`锛堥噸鏂版敞鍏ョ幆澧冨彉閲忥級 | +| `api/**` | `youle-api` | `COPY` 进镜像 | `./deploy.sh rebuild api` 重建镜像 | +| `dlweb/**` | `youle-dlweb` | `COPY` 进镜像 | `./deploy.sh rebuild dlweb` 重建镜像 | +| `wxserver_daoqi/**` | `youle-wxserver` | `COPY` 进镜像 | `./deploy.sh rebuild wxserver` 重建镜像 | +| `env_config.php` | `youle-api` / `youle-dlweb` | `COPY` 进镜像 | `./deploy.sh rebuild api dlweb` 重建两个镜像 | +| `docker/api/Dockerfile` | `youle-api` | 构建定义 | `./deploy.sh rebuild api` | +| `docker/api/docker-entrypoint.sh` | `youle-api` | `COPY` 进镜像 | `./deploy.sh rebuild api` | +| `docker/dlweb/Dockerfile` | `youle-dlweb` | 构建定义 | `./deploy.sh rebuild dlweb` | +| `docker/dlweb/docker-entrypoint.sh` | `youle-dlweb` | `COPY` 进镜像 | `./deploy.sh rebuild dlweb` | +| `docker/wxserver/Dockerfile` | `youle-wxserver` | 构建定义 | `./deploy.sh rebuild wxserver` | +| `docker/nginx/default.conf.template` | `youle-nginx` | volume 挂载(`:ro`) | `scp` 上传 → `docker restart youle-nginx` | +| `docker/nginx/ssl-params.conf` | `youle-nginx` | volume 挂载(`:ro`) | `scp` 上传 → `docker restart youle-nginx` | +| `docker/syncjob/sync.sh` | `youle-syncjob` | volume 挂载(`:ro`) | `scp` 上传 → `docker restart youle-syncjob` | +| `docker/cronjob/entrypoint.sh` | `youle-cronjob` | volume 挂载(`:ro`) | `scp` 上传 → `docker restart youle-cronjob` | +| `docker/cronjob/daily-task.sh` | `youle-cronjob` | volume 挂载(`:ro`) | `scp` 上传 → `docker restart youle-cronjob` | +| `docker-compose.yml` | 所有容器 | compose 编排 | `docker compose up -d`(有变动的容器自动重建) | +| `.env` | 所有容器 | compose `env_file` | `docker compose up -d`(重新注入环境变量) | -> **COPY vs 鎸傝浇鐨勫尯鍒細** -> - **`COPY` 杩涢暅鍍?* 鈥?鏂囦欢琚墦杩?Docker 闀滃儚灞傦紝淇敼鍚庡繀椤婚噸鏂?build 鎵嶈兘鐢熸晥锛屽鍣ㄥ唴鐨勬枃浠舵槸闀滃儚鐨勫壇鏈? -> - **volume 鎸傝浇** 鈥?瀹瑰櫒鍚姩鏃剁洿鎺ユ寕杞藉涓绘満鏂囦欢锛屽彧闇€ `scp` 浼犲埌鏈嶅姟鍣ㄥ悗閲嶅惎瀹瑰櫒鍗冲彲锛?*鏃犻渶閲嶅缓闀滃儚** +> **COPY vs 挂载的区别:** +> - **`COPY` 进镜像** — 文件被打进 Docker 镜像层,修改后必须重新 build 才能生效,容器内的文件是镜像的副本 +> - **volume 挂载** — 容器启动时直接挂载宿主机文件,只需 `scp` 传到服务器后重启容器即可,**无需重建镜像** -#### 鎿嶄綔鍛戒护閫熸煡 +#### 操作命令速查 ```bash -# 鈹€鈹€ 闇€瑕侀噸寤洪暅鍍忕殑鎿嶄綔锛堜慨鏀规簮鐮?Dockerfile/entrypoint 绛?COPY 鏂囦欢锛夆攢鈹€ +# ── 需要重建镜像的操作(修改源码/Dockerfile/entrypoint 等 COPY 文件)── -# 閲嶅缓鍗曚釜鏈嶅姟锛堟棤缂撳瓨锛岀害 1-5 鍒嗛挓锛? -./deploy.sh rebuild api # 鍙噸寤?API -./deploy.sh rebuild dlweb # 鍙噸寤?DLWEB -./deploy.sh rebuild wxserver # 鍙噸寤?wxserver -./deploy.sh rebuild api dlweb # 鍚屾椂閲嶅缓澶氫釜 +# 重建单个服务(无缓存,约 1-5 分钟) +./deploy.sh rebuild api # 只重建 API +./deploy.sh rebuild dlweb # 只重建 DLWEB +./deploy.sh rebuild wxserver # 只重建 wxserver +./deploy.sh rebuild api dlweb # 同时重建多个 -# 閲嶅缓鎵€鏈夋湇鍔? +# 重建所有服务 ./deploy.sh rebuild -# 鈹€鈹€ 鍙渶 scp + 閲嶅惎鐨勬搷浣滐紙淇敼 volume 鎸傝浇鏂囦欢锛岀绾х敓鏁堬級鈹€鈹€ +# ── 只需 scp + 重启的操作(修改 volume 挂载文件,秒级生效)── -# Nginx 閰嶇疆 +# Nginx 配置 scp docker/nginx/ssl-params.conf root@47.98.203.17:/opt/youle/game-docker/docker/nginx/ssl-params.conf scp docker/nginx/default.conf.template root@47.98.203.17:/opt/youle/game-docker/docker/nginx/default.conf.template ssh root@47.98.203.17 "docker restart youle-nginx" -# syncjob 鑴氭湰 +# syncjob 脚本 scp docker/syncjob/sync.sh root@47.98.203.17:/opt/youle/game-docker/docker/syncjob/sync.sh ssh root@47.98.203.17 "docker restart youle-syncjob" -# cronjob 鑴氭湰 +# cronjob 脚本 scp docker/cronjob/entrypoint.sh root@47.98.203.17:/opt/youle/game-docker/docker/cronjob/entrypoint.sh scp docker/cronjob/daily-task.sh root@47.98.203.17:/opt/youle/game-docker/docker/cronjob/daily-task.sh ssh root@47.98.203.17 "docker restart youle-cronjob" -# 鈹€鈹€ .env / docker-compose.yml 鍙樻洿 鈹€鈹€ +# ── .env / docker-compose.yml 变更 ── ssh root@47.98.203.17 "cd /opt/youle/game-docker && docker compose up -d" -# compose 浼氬姣旈厤缃樊寮傦紝鍙噸鍚湁鍙樻洿鐨勫鍣? +# compose 会对比配置差异,只重启有变更的容器 ``` --- -### 鍦烘櫙涓冿細鏌ョ湅鏃ュ織 +### 场景七:查看日志 -鏈」鐩棩蹇楀垎涓轰袱绫伙細**Docker 瀹瑰櫒鏍囧噯杈撳嚭鏃ュ織**锛坄docker logs`锛夊拰**涓氬姟璋冭瘯鏃ュ織**锛堝啓鍏?Docker Volume 鐨勬枃浠讹級銆? +本项目日志分为两类:**Docker 容器标准输出日志**(`docker logs`)和**业务调试日志**(写入 Docker Volume 的文件)。 -#### 鏃ュ織浣嶇疆鎬昏 +#### 日志位置总览 -| 鏃ュ織绫诲瀷 | 鏉ユ簮瀹瑰櫒 | 鏌ョ湅鏂瑰紡 | 璇存槑 | +| 日志类型 | 来源容器 | 查看方式 | 说明 | |---------|---------|---------|------| -| Nginx 璁块棶/閿欒鏃ュ織 | `youle-nginx` | `docker logs` | HTTP 璇锋眰璁板綍銆丼SL 閿欒 | -| API Apache 閿欒鏃ュ織 | `youle-api` | `docker logs` | PHP Fatal Error銆丄pache 500 | -| API PHP 閿欒鏃ュ織 | `youle-api` | `docker logs` | PHP Warning/Notice锛堝啓鍏?Apache 閿欒娴侊級| -| API 涓氬姟鏃ュ織 | `youle-api` | Volume 鏂囦欢 | `/var/www/html/logs/YYYY-MM-DD.log` | -| API source 妯″潡鏃ュ織 | `youle-api` | Volume 鏂囦欢 | `/var/www/html/source/logs/` | -| DLWEB Apache 閿欒鏃ュ織 | `youle-dlweb` | `docker logs` | PHP Fatal Error銆丄pache 500 | -| DLWEB 涓氬姟鏃ュ織 | `youle-dlweb` | Volume 鏂囦欢 | `/var/www/html/api/logs/` | -| 鍚屾浠诲姟璋冭瘯鏃ュ織 | `youle-dlweb` | Volume 鏂囦欢 | `/var/www/html/api/ext/debug/synchronize/YYYY-MM-DD.log` | -| 鎶ヨ〃鍚屾璋冭瘯鏃ュ織 | `youle-dlweb` | Volume 鏂囦欢 | `/var/www/html/api/ext/debug/SynchronizeReportData/YYYY-MM-DD.log` | -| 鑷姩浠诲姟璋冭瘯鏃ュ織 | `youle-dlweb` | Volume 鏂囦欢 | `/var/www/html/api/ext/debug/autotask/YYYY-MM-DD.log` | -| syncjob 杩愯鏃ュ織 | `youle-syncjob` | `docker logs` | curl 璇锋眰缁撴灉锛屾瘡 30s 涓€鏉?| -| cronjob 璋冨害鏃ュ織 | `youle-cronjob` | `docker logs` | cron 瑙﹀彂璁板綍 | -| wxserver 杩愯鏃ュ織 | `youle-wxserver` | `docker logs` | Node.js 鏍囧噯杈撳嚭 | +| Nginx 访问/错误日志 | `youle-nginx` | `docker logs` | HTTP 请求记录、SSL 错误 | +| API Apache 错误日志 | `youle-api` | `docker logs` | PHP Fatal Error、Apache 500 | +| API PHP 错误日志 | `youle-api` | `docker logs` | PHP Warning/Notice(写入 Apache 错误流)| +| API 业务日志 | `youle-api` | Volume 文件 | `/var/www/html/logs/YYYY-MM-DD.log` | +| API source 模块日志 | `youle-api` | Volume 文件 | `/var/www/html/source/logs/` | +| DLWEB Apache 错误日志 | `youle-dlweb` | `docker logs` | PHP Fatal Error、Apache 500 | +| DLWEB 业务日志 | `youle-dlweb` | Volume 文件 | `/var/www/html/api/logs/` | +| 同步任务调试日志 | `youle-dlweb` | Volume 文件 | `/var/www/html/api/ext/debug/synchronize/YYYY-MM-DD.log` | +| 报表同步调试日志 | `youle-dlweb` | Volume 文件 | `/var/www/html/api/ext/debug/SynchronizeReportData/YYYY-MM-DD.log` | +| 自动任务调试日志 | `youle-dlweb` | Volume 文件 | `/var/www/html/api/ext/debug/autotask/YYYY-MM-DD.log` | +| syncjob 运行日志 | `youle-syncjob` | `docker logs` | curl 请求结果,每 30s 一条 | +| cronjob 调度日志 | `youle-cronjob` | `docker logs` | cron 触发记录 | +| wxserver 运行日志 | `youle-wxserver` | `docker logs` | Node.js 标准输出 | --- -#### 1. 鏌ョ湅瀹瑰櫒鏍囧噯杈撳嚭鏃ュ織锛坉ocker logs锛? +#### 1. 查看容器标准输出日志(docker logs) ```bash -# 鏌ョ湅鏈€杩?50 琛岋紙蹇€熸瑙堬級 +# 查看最近 50 行(快速概览) docker logs --tail 50 youle-nginx docker logs --tail 50 youle-api docker logs --tail 50 youle-dlweb @@ -1048,77 +1048,77 @@ docker logs --tail 50 youle-syncjob docker logs --tail 50 youle-cronjob docker logs --tail 50 youle-wxserver -# 瀹炴椂璺熻釜鏃ュ織锛圕trl+C 閫€鍑猴級 +# 实时跟踪日志(Ctrl+C 退出) docker logs -f youle-api docker logs -f youle-syncjob -# 鏌ョ湅鏈€杩?100 琛屽苟瀹炴椂璺熻釜 +# 查看最近 100 行并实时跟踪 docker logs --tail 100 -f youle-dlweb -# 鏌ョ湅甯︽椂闂存埑鐨勬棩蹇? +# 查看带时间戳的日志 docker logs -t --tail 50 youle-nginx -# 鏌ョ湅鏌愭椂闂存涔嬪悗鐨勬棩蹇楋紙ISO 8601 鏍煎紡锛? +# 查看某时间段之后的日志(ISO 8601 格式) docker logs --since 2026-04-13T10:00:00 youle-api -docker logs --since 1h youle-syncjob # 鏈€杩?1 灏忔椂 +docker logs --since 1h youle-syncjob # 最近 1 小时 ``` -> **鎻愮ず锛?* `docker logs` 鏌ョ湅鐨勬槸瀹瑰櫒鐨?stdout/stderr 杈撳嚭锛孭HP Fatal Error 鍜?Apache 閿欒鍧囦細鍑虹幇鍦ㄨ繖閲屻€? +> **提示:** `docker logs` 查看的是容器的 stdout/stderr 输出,PHP Fatal Error 和 Apache 错误均会出现在这里。 --- -#### 2. 鏌ョ湅涓氬姟璋冭瘯鏃ュ織鏂囦欢锛圴olume 鏂囦欢锛? +#### 2. 查看业务调试日志文件(Volume 文件) -涓氬姟璋冭瘯鏃ュ織鍐欏叆 Docker Volume锛屾寜鏃ユ湡鍒嗘枃浠讹紙`YYYY-MM-DD.log`锛夈€? +业务调试日志写入 Docker Volume,按日期分文件(`YYYY-MM-DD.log`)。 ```bash -# --- API 涓氬姟鏃ュ織 --- +# --- API 业务日志 --- -# 鍒楀嚭鎵€鏈夋棩蹇楁枃浠? +# 列出所有日志文件 docker exec youle-api ls -lh /var/www/html/logs/ -# 鏌ョ湅浠婂ぉ鐨?API 涓氬姟鏃ュ織锛堟湯灏?50 琛岋級 +# 查看今天的 API 业务日志(末尾 50 行) docker exec youle-api tail -50 /var/www/html/logs/$(date +%Y-%m-%d).log -# 瀹炴椂璺熻釜浠婂ぉ鐨?API 鏃ュ織 +# 实时跟踪今天的 API 日志 docker exec youle-api tail -f /var/www/html/logs/$(date +%Y-%m-%d).log -# 鏌ョ湅瀹屾暣鍐呭 +# 查看完整内容 docker exec youle-api cat /var/www/html/logs/$(date +%Y-%m-%d).log -# --- API source 妯″潡鏃ュ織 --- +# --- API source 模块日志 --- docker exec youle-api ls -lhR /var/www/html/source/logs/ docker exec youle-api tail -50 /var/www/html/source/logs/$(date +%Y-%m-%d).log -# --- DLWEB 涓氬姟鏃ュ織 --- +# --- DLWEB 业务日志 --- -# 鍒楀嚭鎵€鏈夋棩蹇楁枃浠? +# 列出所有日志文件 docker exec youle-dlweb ls -lh /var/www/html/api/logs/ -# 鏌ョ湅浠婂ぉ鐨?DLWEB 涓氬姟鏃ュ織 +# 查看今天的 DLWEB 业务日志 docker exec youle-dlweb tail -50 /var/www/html/api/logs/$(date +%Y-%m-%d).log -# --- 鍚屾浠诲姟璋冭瘯鏃ュ織锛圫ynchronize.php锛?-- +# --- 同步任务调试日志(Synchronize.php)--- -# 鍒楀嚭鏃ュ織鏂囦欢 +# 列出日志文件 docker exec youle-dlweb ls -lh /var/www/html/api/ext/debug/synchronize/ -# 鏌ョ湅浠婂ぉ鐨勫悓姝ユ棩蹇楋紙鏈€杩?50 琛岋級 +# 查看今天的同步日志(最近 50 行) docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log -# 瀹炴椂璺熻釜鍚屾鏃ュ織锛堟瘡 30s 鍒锋柊锛? +# 实时跟踪同步日志(每 30s 刷新) docker exec youle-dlweb tail -f /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log -# --- 鎶ヨ〃鍚屾璋冭瘯鏃ュ織锛圫ynchronizeReportData.php锛?-- +# --- 报表同步调试日志(SynchronizeReportData.php)--- docker exec youle-dlweb ls -lh /var/www/html/api/ext/debug/SynchronizeReportData/ docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/SynchronizeReportData/$(date +%Y-%m-%d).log -# --- 鑷姩浠诲姟璋冭瘯鏃ュ織锛坅utotask锛?-- +# --- 自动任务调试日志(autotask)--- docker exec youle-dlweb ls -lh /var/www/html/api/ext/debug/autotask/ docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/autotask/$(date +%Y-%m-%d).log @@ -1126,44 +1126,44 @@ docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/autotask/$(date +%Y --- -#### 3. 涓€閿煡鐪嬫墍鏈夊叧閿棩蹇楋紙姹囨€诲懡浠わ級 +#### 3. 一键查看所有关键日志(汇总命令) ```bash -# 蹇€熷仴搴锋鏌ワ細鍚屾椂鏌ョ湅 syncjob 鐘舵€?+ 浠婂ぉ鐨勫悓姝ヨ皟璇曟棩蹇楁湯灏? -echo '=== syncjob 瀹瑰櫒鏃ュ織锛堟渶杩?0琛岋級===' +# 快速健康检查:同时查看 syncjob 状态 + 今天的同步调试日志末尾 +echo '=== syncjob 容器日志(最近20行)===' docker logs --tail 20 youle-syncjob echo -echo '=== 鍚屾璋冭瘯鏃ュ織锛堟渶杩?0琛岋級===' +echo '=== 同步调试日志(最近20行)===' docker exec youle-dlweb tail -20 /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log echo -echo '=== API 涓氬姟鏃ュ織锛堟渶杩?0琛岋級===' +echo '=== API 业务日志(最近20行)===' docker exec youle-api tail -20 /var/www/html/logs/$(date +%Y-%m-%d).log ``` --- -#### 4. 鏌ョ湅 Nginx 璁块棶鏃ュ織锛堣姹傛帓鏌ワ級 +#### 4. 查看 Nginx 访问日志(请求排查) ```bash -# Nginx 璁块棶鏃ュ織锛堟渶杩?100 鏉¤姹傦級 +# Nginx 访问日志(最近 100 条请求) docker logs --tail 100 youle-nginx -# 杩囨护 HTTP 500 閿欒 +# 过滤 HTTP 500 错误 docker logs youle-nginx 2>&1 | grep ' 500 ' -# 杩囨护鐗瑰畾 IP 鐨勮姹? -docker logs youle-nginx 2>&1 | grep '瀹㈡埛绔疘P鍦板潃' +# 过滤特定 IP 的请求 +docker logs youle-nginx 2>&1 | grep '客户端IP地址' -# 杩囨护 SSL/TLS 鎻℃墜閿欒锛堝鎴风鍙戦€佷簡闈?HTTPS 璇锋眰鍒?80 绔彛锛? +# 过滤 SSL/TLS 握手错误(客户端发送了非 HTTPS 请求到 80 端口) docker logs youle-nginx 2>&1 | grep 'SSL_do_handshake\|no required SSL' ``` --- -#### 5. 浣跨敤 deploy.sh 蹇嵎鏌ョ湅 +#### 5. 使用 deploy.sh 快捷查看 ```bash -# 绛夋晥浜?docker logs --tail 100 + 瀹炴椂璺熻釜 +# 等效于 docker logs --tail 100 + 实时跟踪 ./deploy.sh logs api ./deploy.sh logs dlweb ./deploy.sh logs syncjob @@ -1171,70 +1171,70 @@ docker logs youle-nginx 2>&1 | grep 'SSL_do_handshake\|no required SSL' ./deploy.sh logs nginx ./deploy.sh logs wxserver -# 鍔?-f 瀹炴椂璺熻釜 +# 加 -f 实时跟踪 ./deploy.sh logs -f api ./deploy.sh logs -f syncjob ``` -### 璋冩暣鍚屾棰戠巼 +### 调整同步频率 ```bash -# 淇敼 .env -SYNC_INTERVAL=15 # 15 绉掍竴娆? -SYNC_PROCESSCOUNT=500 # 姣忔澶勭悊 500 鏉? +# 修改 .env +SYNC_INTERVAL=15 # 15 秒一次 +SYNC_PROCESSCOUNT=500 # 每次处理 500 条 -# 閲嶅惎 syncjob +# 重启 syncjob docker compose restart syncjob ``` -### 璋冩暣姣忔棩浠诲姟鎵ц鏃堕棿 +### 调整每日任务执行时间 ```bash -# 淇敼 .env -CRON_SCHEDULE=30 3 * * * # 鏀逛负鍑屾櫒 3:30 +# 修改 .env +CRON_SCHEDULE=30 3 * * * # 改为凌晨 3:30 -# 閲嶅惎 cronjob +# 重启 cronjob docker compose restart cronjob ``` --- -### 鍦烘櫙鍏細鍗歌浇鍜屾竻鐞? +### 场景六:卸载和清理 -鏍规嵁闇€姹傞€夋嫨鍗歌浇鑼冨洿锛屾搷浣滀笉鍙€嗭紝璇锋彁鍓嶅浠介噸瑕佹暟鎹€? +根据需求选择卸载范围,操作不可逆,请提前备份重要数据。 -#### 鍗歌浇鍓嶏細澶囦唤鍏抽敭鏁版嵁 +#### 卸载前:备份关键数据 ```bash cd /opt/youle/game-docker -# 1. 澶囦唤 .env锛堝寘鍚墍鏈夊瘑閽ワ紝涓嶅湪鐗堟湰搴撲腑锛? +# 1. 备份 .env(包含所有密钥,不在版本库中) cp .env ~/youle-env-backup.env -# 2. 澶囦唤 Redis 鏁版嵁锛堝鏈変笟鍔℃暟鎹瓨鍌ㄥ湪 Redis 涓級 +# 2. 备份 Redis 数据(如有业务数据存储在 Redis 中) docker exec youle-redis redis-cli -a "${REDIS_PASSWORD}" BGSAVE -# 鎴栫洿鎺ュ浠?volume +# 或直接备份 volume docker run --rm -v game-docker_redis-data:/data -v ~/:/backup alpine \ tar czf /backup/redis-data-backup.tar.gz /data -# 3. 澶囦唤鏃ュ織锛堟寜闇€锛? +# 3. 备份日志(按需) docker cp youle-api:/var/www/html/logs ~/api-logs-backup docker cp youle-dlweb:/var/www/html/api/logs ~/dlweb-logs-backup ``` --- -#### 浠呭仠姝㈡墍鏈夊鍣紙淇濈暀闀滃儚鍜屾暟鎹紝鍙殢鏃舵仮澶嶏級 +#### 仅停止所有容器(保留镜像和数据,可随时恢复) ```bash cd /opt/youle/game-docker docker compose stop -# 楠岃瘉 +# 验证 docker compose ps ``` -鎭㈠杩愯锛? +恢复运行: ```bash docker compose start @@ -1242,124 +1242,124 @@ docker compose start --- -#### 鍋滄骞跺垹闄ゅ鍣紙淇濈暀闀滃儚銆乿olumes 鍜岄」鐩枃浠讹級 +#### 停止并删除容器(保留镜像、volumes 和项目文件) ```bash cd /opt/youle/game-docker docker compose down -# 楠岃瘉瀹瑰櫒宸插垹闄? +# 验证容器已删除 docker ps -a | grep youle ``` -> 姝ゆ搷浣滀笉浼氬垹闄ゆ暟鎹?volume 鍜屽凡鏋勫缓鐨勯暅鍍忥紝鍐嶆 `docker compose up -d` 鍙揩閫熸仮澶嶏紝鏃犻渶閲嶆柊鏋勫缓銆? +> 此操作不会删除数据 volume 和已构建的镜像,再次 `docker compose up -d` 可快速恢复,无需重新构建。 --- -#### 瀹屽叏鍗歌浇锛堝垹闄ゅ鍣?+ volumes + 闀滃儚锛? +#### 完全卸载(删除容器 + volumes + 镜像) -> **璀﹀憡锛?* 浠ヤ笅鎿嶄綔灏嗗垹闄?Redis 缂撳瓨鍜屾墍鏈夋棩蹇楁暟鎹紝涓嶅彲鎭㈠銆? +> **警告:** 以下操作将删除 Redis 缓存和所有日志数据,不可恢复。 ```bash cd /opt/youle/game-docker -# 鍋滄骞跺垹闄ゅ鍣?+ 鎵€鏈夌浉鍏?volumes +# 停止并删除容器 + 所有相关 volumes docker compose down -v -# 鍒犻櫎鏈」鐩瀯寤虹殑闀滃儚 +# 删除本项目构建的镜像 docker rmi game-docker-api game-docker-dlweb game-docker-wxserver 2>/dev/null || true -# 楠岃瘉 +# 验证 docker volume ls | grep game-docker docker images | grep game-docker ``` --- -#### 褰诲簳娓呯悊锛堝垹闄ゅ鍣?+ volumes + 闀滃儚 + 椤圭洰鐩綍 + SSL 璇佷功锛? +#### 彻底清理(删除容器 + volumes + 镜像 + 项目目录 + SSL 证书) -> **璀﹀憡锛?* SSL 璇佷功鍒犻櫎鍚庨渶閲嶆柊鐢宠锛圠et's Encrypt 鏈夐鐜囬檺鍒讹紝姣?7 澶╂渶澶?5 娆★級銆? +> **警告:** SSL 证书删除后需重新申请(Let's Encrypt 有频率限制,每 7 天最多 5 次)。 ```bash cd /opt/youle/game-docker -# 1. 鍋滄骞跺垹闄ゅ鍣?+ volumes +# 1. 停止并删除容器 + volumes docker compose down -v -# 2. 鍒犻櫎鏋勫缓闀滃儚 +# 2. 删除构建镜像 docker rmi game-docker-api game-docker-dlweb game-docker-wxserver 2>/dev/null || true -# 3. 娓呯悊 Docker 鎮┖璧勬簮锛堝彲閫夛級 +# 3. 清理 Docker 悬空资源(可选) docker system prune -f -# 4. 鍒犻櫎 SSL 璇佷功锛圠et's Encrypt锛? +# 4. 删除 SSL 证书(Let's Encrypt) docker run --rm -v game-docker_certbot-certs:/etc/letsencrypt certbot/certbot delete \ --cert-name "${API_DOMAIN}" --non-interactive 2>/dev/null || true docker run --rm -v game-docker_certbot-certs:/etc/letsencrypt certbot/certbot delete \ --cert-name "${DLWEB_DOMAIN}" --non-interactive 2>/dev/null || true -# 鎴栫洿鎺ュ垹闄よ瘉涔?volume +# 或直接删除证书 volume docker volume rm game-docker_certbot-certs game-docker_certbot-webroot 2>/dev/null || true -# 5. 鍒犻櫎椤圭洰鐩綍 +# 5. 删除项目目录 rm -rf /opt/youle/game-docker ``` --- -#### 鍒犻櫎鍗曚釜鏈嶅姟鐨勫鍣ㄥ拰闀滃儚 +#### 删除单个服务的容器和镜像 ```bash cd /opt/youle/game-docker -# 浠?dlweb 涓轰緥 +# 以 dlweb 为例 docker compose stop dlweb docker compose rm -sf dlweb docker rmi game-docker-dlweb -# 涓嬫鍚姩鏃朵細閲嶆柊鏋勫缓 +# 下次启动时会重新构建 docker compose up -d --build dlweb ``` --- -#### 娓呯悊瀹氭椂浠诲姟娈嬬暀 +#### 清理定时任务残留 ```bash -# 鍋滄骞跺垹闄?syncjob / cronjob 瀹瑰櫒 +# 停止并删除 syncjob / cronjob 容器 docker compose stop syncjob cronjob docker compose rm -sf syncjob cronjob -# 娓呯悊鍏变韩淇″彿 volume锛堝鏈夋畫鐣欐殏鍋滄枃浠讹級 +# 清理共享信号 volume(如有残留暂停文件) docker run --rm -v game-docker_shared-signal:/shared alpine rm -f /shared/syncjob.pause -# 濡傞渶瀹屽叏鍒犻櫎鍏变韩 volume +# 如需完全删除共享 volume docker volume rm game-docker_shared-signal ``` --- -#### 鍗歌浇鎿嶄綔閫熸煡 +#### 卸载操作速查 -| 鐩爣 | 鍛戒护 | 淇濈暀鍐呭 | +| 目标 | 命令 | 保留内容 | |------|------|----------| -| 涓存椂鍋滄锛堝彲鎭㈠锛?| `docker compose stop` | 瀹瑰櫒 / 闀滃儚 / volumes / 鏂囦欢 | -| 鍒犻櫎瀹瑰櫒 | `docker compose down` | 闀滃儚 / volumes / 鏂囦欢 | -| 鍒犻櫎瀹瑰櫒 + volumes | `docker compose down -v` | 闀滃儚 / 鏂囦欢 | -| 鍒犻櫎瀹瑰櫒 + volumes + 闀滃儚 | `docker compose down -v` + `docker rmi ...` | 鏂囦欢 | -| 瀹屽叏娓呯悊 | 涓婅堪鍏ㄩ儴 + `rm -rf /opt/youle/game-docker` | 鏃?| +| 临时停止(可恢复) | `docker compose stop` | 容器 / 镜像 / volumes / 文件 | +| 删除容器 | `docker compose down` | 镜像 / volumes / 文件 | +| 删除容器 + volumes | `docker compose down -v` | 镜像 / 文件 | +| 删除容器 + volumes + 镜像 | `docker compose down -v` + `docker rmi ...` | 文件 | +| 完全清理 | 上述全部 + `rm -rf /opt/youle/game-docker` | 无 | --- -### 鍦烘櫙鍏細娓呴櫎鏃ュ織 +### 场景八:清除日志 -> **璇存槑锛?* Volume 鏂囦欢鏃ュ織锛堜笟鍔¤皟璇曟棩蹇楋級鍜?Docker 瀹瑰櫒鏃ュ織锛坰tdout锛夐渶瑕佸垎鍒竻鐞嗐€傛竻鐞嗗墠寤鸿鍏堝浠芥垨纭涓嶅啀闇€瑕佽繖浜涙棩蹇椼€? +> **说明:** Volume 文件日志(业务调试日志)和 Docker 容器日志(stdout)需要分别清理。清理前建议先备份或确认不再需要这些日志。 -#### 1. 娓呴櫎 Docker 瀹瑰櫒鏃ュ織锛坰tdout/stderr锛? +#### 1. 清除 Docker 容器日志(stdout/stderr) -Docker 瀹瑰櫒鐨勬爣鍑嗚緭鍑烘棩蹇楀瓨鍌ㄥ湪瀹夸富鏈?`/var/lib/docker/containers/<瀹瑰櫒ID>/<瀹瑰櫒ID>-json.log`锛岀洿鎺ユ竻绌鸿鏂囦欢鍗冲彲銆? +Docker 容器的标准输出日志存储在宿主机 `/var/lib/docker/containers/<容器ID>/<容器ID>-json.log`,直接清空该文件即可。 ```bash -# 娓呯┖鍗曚釜瀹瑰櫒鐨?docker logs锛堝鍣ㄤ繚鎸佽繍琛岋紝涓嶄腑鏂湇鍔★級 +# 清空单个容器的 docker logs(容器保持运行,不中断服务) truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-syncjob) truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-api) truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-dlweb) @@ -1367,59 +1367,59 @@ truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-nginx) truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-cronjob) truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-wxserver) -# 涓€閿竻绌烘墍鏈?youle-* 瀹瑰櫒鐨?docker logs +# 一键清空所有 youle-* 容器的 docker logs for name in youle-nginx youle-api youle-dlweb youle-wxserver youle-syncjob youle-cronjob youle-redis youle-certbot; do logpath=$(docker inspect --format='{{.LogPath}}' $name 2>/dev/null) [ -n "$logpath" ] && truncate -s 0 "$logpath" && echo "Cleared: $name" done ``` -> **娉ㄦ剰锛?* `truncate -s 0` 娓呯┖鏂囦欢鍐呭锛屼笉鍒犻櫎鏂囦欢锛屽鍣ㄦ棤闇€閲嶅惎锛屽悗缁棩蹇楁甯稿啓鍏ャ€? +> **注意:** `truncate -s 0` 清空文件内容,不删除文件,容器无需重启,后续日志正常写入。 --- -#### 2. 娓呴櫎涓氬姟璋冭瘯鏃ュ織鏂囦欢锛圴olume 鍐呯殑鎸夋棩鏈熸枃浠讹級 +#### 2. 清除业务调试日志文件(Volume 内的按日期文件) ```bash -# --- 娓呴櫎 API 涓氬姟鏃ュ織 --- +# --- 清除 API 业务日志 --- -# 鍒犻櫎鎵€鏈夊巻鍙叉棩蹇楋紙淇濈暀浠婂ぉ锛? +# 删除所有历史日志(保留今天) docker exec youle-api sh -c " find /var/www/html/logs/ -name '*.log' ! -name '$(date +%Y-%m-%d).log' -delete " -# 娓呯┖浠婂ぉ鐨勬棩蹇楁枃浠讹紙淇濈暀鏂囦欢锛屾竻绌哄唴瀹癸級 +# 清空今天的日志文件(保留文件,清空内容) docker exec youle-api truncate -s 0 /var/www/html/logs/$(date +%Y-%m-%d).log -# 鍒犻櫎鍏ㄩ儴鏃ュ織鏂囦欢锛堝惈浠婂ぉ锛? +# 删除全部日志文件(含今天) docker exec youle-api sh -c 'rm -f /var/www/html/logs/*.log' -# --- 娓呴櫎 DLWEB 涓氬姟鏃ュ織 --- +# --- 清除 DLWEB 业务日志 --- -# 鍒犻櫎鎵€鏈夊巻鍙叉棩蹇楋紙淇濈暀浠婂ぉ锛? +# 删除所有历史日志(保留今天) docker exec youle-dlweb sh -c " find /var/www/html/api/logs/ -name '*.log' ! -name '$(date +%Y-%m-%d).log' -delete " -# 鍒犻櫎鍏ㄩ儴鏃ュ織鏂囦欢 +# 删除全部日志文件 docker exec youle-dlweb sh -c 'rm -f /var/www/html/api/logs/*.log' -# --- 娓呴櫎鍚屾浠诲姟璋冭瘯鏃ュ織 --- +# --- 清除同步任务调试日志 --- -# 鍒犻櫎 30 澶╁墠鐨勬棫鏃ュ織 +# 删除 30 天前的旧日志 docker exec youle-dlweb find /var/www/html/api/ext/debug/ -name '*.log' -mtime +30 -delete -# 鍒犻櫎鎵€鏈夊巻鍙叉棩蹇楋紙淇濈暀浠婂ぉ锛? +# 删除所有历史日志(保留今天) docker exec youle-dlweb sh -c " find /var/www/html/api/ext/debug/ -name '*.log' ! -name '$(date +%Y-%m-%d).log' -delete " -# 娓呯┖浠婂ぉ鐨勫悓姝ユ棩蹇楋紙淇濈暀鏂囦欢锛? +# 清空今天的同步日志(保留文件) docker exec youle-dlweb truncate -s 0 /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log -# 鍒犻櫎鍏ㄩ儴璋冭瘯鏃ュ織锛堟墍鏈夊瓙鐩綍锛? +# 删除全部调试日志(所有子目录) docker exec youle-dlweb sh -c ' rm -f /var/www/html/api/ext/debug/synchronize/*.log rm -f /var/www/html/api/ext/debug/SynchronizeReportData/*.log @@ -1429,15 +1429,15 @@ docker exec youle-dlweb sh -c ' --- -#### 3. 涓€閿竻鐞嗘墍鏈夋棩蹇楋紙docker logs + 涓氬姟鏃ュ織锛? +#### 3. 一键清理所有日志(docker logs + 业务日志) -> **璀﹀憡锛?* 浠ヤ笅鑴氭湰灏嗘竻绌烘墍鏈夊鍣ㄦ棩蹇楀拰鍏ㄩ儴涓氬姟鏃ュ織鏂囦欢锛屾墽琛屽墠璇风‘璁や笉闇€瑕佷繚鐣欑幇鏈夋棩蹇椼€? +> **警告:** 以下脚本将清空所有容器日志和全部业务日志文件,执行前请确认不需要保留现有日志。 ```bash #!/bin/bash -# 涓€閿竻鐞嗘墍鏈夋棩蹇楋紙鍦ㄦ湇鍔″櫒 /opt/youle/game-docker/ 鐩綍涓嬫墽琛岋級 +# 一键清理所有日志(在服务器 /opt/youle/game-docker/ 目录下执行) -echo '=== 娓呯┖ Docker 瀹瑰櫒鏃ュ織 ===' +echo '=== 清空 Docker 容器日志 ===' for name in youle-nginx youle-api youle-dlweb youle-wxserver youle-syncjob youle-cronjob youle-redis youle-certbot; do logpath=$(docker inspect --format='{{.LogPath}}' $name 2>/dev/null) if [ -n "$logpath" ] && [ -f "$logpath" ]; then @@ -1446,11 +1446,11 @@ for name in youle-nginx youle-api youle-dlweb youle-wxserver youle-syncjob youle fi done -echo '=== 娓呯┖涓氬姟鏃ュ織鏂囦欢 ===' -# API 涓氬姟鏃ュ織 +echo '=== 清空业务日志文件 ===' +# API 业务日志 docker exec youle-api sh -c 'rm -f /var/www/html/logs/*.log /var/www/html/source/logs/*.log 2>/dev/null; echo " Cleared api logs"' -# DLWEB 涓氬姟鏃ュ織 + 璋冭瘯鏃ュ織 +# DLWEB 业务日志 + 调试日志 docker exec youle-dlweb sh -c ' rm -f /var/www/html/api/logs/*.log 2>/dev/null rm -f /var/www/html/api/ext/debug/synchronize/*.log 2>/dev/null @@ -1459,10 +1459,10 @@ docker exec youle-dlweb sh -c ' echo " Cleared dlweb logs" ' -echo '=== 瀹屾垚 ===' +echo '=== 完成 ===' ``` -灏嗕互涓婂唴瀹逛繚瀛樹负鏈嶅姟鍣ㄤ笂鐨?`/opt/youle/game-docker/clear-logs.sh`锛岃祴浜堟墽琛屾潈闄愬悗浣跨敤锛? +将以上内容保存为服务器上的 `/opt/youle/game-docker/clear-logs.sh`,赋予执行权限后使用: ```bash chmod +x /opt/youle/game-docker/clear-logs.sh @@ -1471,106 +1471,106 @@ chmod +x /opt/youle/game-docker/clear-logs.sh --- -#### 4. 鏃ュ織娓呯悊閫熸煡 +#### 4. 日志清理速查 -> 浠ヤ笅鍛戒护鍦?**SSH 鐧诲綍鏈嶅姟鍣ㄥ悗**鐩存帴鎵ц锛堟棤闇€ `ssh root@...` 鍓嶇紑锛夈€? +> 以下命令在 **SSH 登录服务器后**直接执行(无需 `ssh root@...` 前缀)。 -**鏌ョ湅鏃ュ織** +**查看日志** -| 鐩爣 | 鍛戒护 | +| 目标 | 命令 | |------|------| -| nginx 璁块棶鏃ュ織锛堟湯灏?0琛岋級 | `docker logs --tail 50 youle-nginx` | -| nginx 璁块棶鏃ュ織锛堝疄鏃惰窡韪級 | `docker logs -f youle-nginx` | -| wxserver 鏃ュ織锛堟湯灏?0琛岋級 | `docker logs --tail 50 youle-wxserver` | -| wxserver 鏃ュ織锛堝疄鏃惰窡韪級 | `docker logs -f youle-wxserver` | -| API PHP 閿欒鏃ュ織锛堟湯灏?0琛岋級 | `docker exec youle-api tail -50 /var/log/apache2/php_errors.log` | -| API 涓氬姟鏃ュ織_浠婂ぉ锛堟湯灏?0琛岋級 | `docker exec youle-api tail -50 /var/www/html/logs/$(date +%Y-%m-%d).log` | -| API 涓氬姟鏃ュ織_浠婂ぉ锛堝畬鏁达級 | `docker exec youle-api cat /var/www/html/logs/$(date +%Y-%m-%d).log` | -| API 涓氬姟鏃ュ織_浠婂ぉ锛堝疄鏃惰窡韪級 | `docker exec youle-api tail -f /var/www/html/logs/$(date +%Y-%m-%d).log` | -| 鍒楀嚭 API 涓氬姟鏃ュ織鏂囦欢 | `docker exec youle-api ls -lh /var/www/html/logs/` | -| 鍚屾璋冭瘯鏃ュ織_浠婂ぉ锛堟湯灏?0琛岋級 | `docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log` | -| 鍚屾璋冭瘯鏃ュ織_浠婂ぉ锛堝疄鏃惰窡韪級 | `docker exec youle-dlweb tail -f /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log` | -| 鍒楀嚭鍚屾璋冭瘯鏃ュ織鏂囦欢 | `docker exec youle-dlweb ls -lh /var/www/html/api/ext/debug/synchronize/` | -| syncjob 浠诲姟鏃ュ織锛堟湯灏?0琛岋級 | `docker logs --tail 50 youle-syncjob` | -| cronjob 浠诲姟鏃ュ織锛堟湯灏?0琛岋級 | `docker logs --tail 50 youle-cronjob` | +| nginx 访问日志(末尾50行) | `docker logs --tail 50 youle-nginx` | +| nginx 访问日志(实时跟踪) | `docker logs -f youle-nginx` | +| wxserver 日志(末尾50行) | `docker logs --tail 50 youle-wxserver` | +| wxserver 日志(实时跟踪) | `docker logs -f youle-wxserver` | +| API PHP 错误日志(末尾50行) | `docker exec youle-api tail -50 /var/log/apache2/php_errors.log` | +| API 业务日志_今天(末尾50行) | `docker exec youle-api tail -50 /var/www/html/logs/$(date +%Y-%m-%d).log` | +| API 业务日志_今天(完整) | `docker exec youle-api cat /var/www/html/logs/$(date +%Y-%m-%d).log` | +| API 业务日志_今天(实时跟踪) | `docker exec youle-api tail -f /var/www/html/logs/$(date +%Y-%m-%d).log` | +| 列出 API 业务日志文件 | `docker exec youle-api ls -lh /var/www/html/logs/` | +| 同步调试日志_今天(末尾50行) | `docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log` | +| 同步调试日志_今天(实时跟踪) | `docker exec youle-dlweb tail -f /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log` | +| 列出同步调试日志文件 | `docker exec youle-dlweb ls -lh /var/www/html/api/ext/debug/synchronize/` | +| syncjob 任务日志(末尾50行) | `docker logs --tail 50 youle-syncjob` | +| cronjob 任务日志(末尾50行) | `docker logs --tail 50 youle-cronjob` | -**娓呯悊鏃ュ織** +**清理日志** -| 鐩爣 | 鍛戒护 | +| 目标 | 命令 | |------|------| -| 娓呯┖ nginx docker logs | `truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-nginx)` | -| 娓呯┖ wxserver docker logs | `truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-wxserver)` | -| 娓呯┖ API docker logs | `truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-api)` | -| 娓呯┖ dlweb docker logs | `truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-dlweb)` | -| 娓呯┖鎵€鏈夊鍣?docker logs | `for n in youle-nginx youle-api youle-dlweb youle-wxserver youle-syncjob youle-cronjob youle-redis youle-certbot; do truncate -s 0 $(docker inspect --format='{{.LogPath}}' $n 2>/dev/null) 2>/dev/null; done` | -| 娓呯┖浠婂ぉ API 涓氬姟鏃ュ織 | `docker exec youle-api truncate -s 0 /var/www/html/logs/$(date +%Y-%m-%d).log` | -| 娓呯┖浠婂ぉ鍚屾璋冭瘯鏃ュ織 | `docker exec youle-dlweb truncate -s 0 /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log` | -| 鍒犻櫎 API 鍏ㄩ儴鍘嗗彶鏃ュ織 | `docker exec youle-api sh -c 'rm -f /var/www/html/logs/*.log'` | -| 鍒犻櫎璋冭瘯鏃ュ織 30 澶╁墠鏃ф枃浠?| `docker exec youle-dlweb find /var/www/html/api/ext/debug/ -name '*.log' -mtime +30 -delete` | -| 鍒犻櫎璋冭瘯鏃ュ織鍏ㄩ儴鏂囦欢 | `docker exec youle-dlweb sh -c 'rm -f /var/www/html/api/ext/debug/synchronize/*.log /var/www/html/api/ext/debug/SynchronizeReportData/*.log /var/www/html/api/ext/debug/autotask/*.log'` | -| 涓€閿竻鐞嗗叏閮ㄦ棩蹇?| `/opt/youle/game-docker/clear-logs.sh` | +| 清空 nginx docker logs | `truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-nginx)` | +| 清空 wxserver docker logs | `truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-wxserver)` | +| 清空 API docker logs | `truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-api)` | +| 清空 dlweb docker logs | `truncate -s 0 $(docker inspect --format='{{.LogPath}}' youle-dlweb)` | +| 清空所有容器 docker logs | `for n in youle-nginx youle-api youle-dlweb youle-wxserver youle-syncjob youle-cronjob youle-redis youle-certbot; do truncate -s 0 $(docker inspect --format='{{.LogPath}}' $n 2>/dev/null) 2>/dev/null; done` | +| 清空今天 API 业务日志 | `docker exec youle-api truncate -s 0 /var/www/html/logs/$(date +%Y-%m-%d).log` | +| 清空今天同步调试日志 | `docker exec youle-dlweb truncate -s 0 /var/www/html/api/ext/debug/synchronize/$(date +%Y-%m-%d).log` | +| 删除 API 全部历史日志 | `docker exec youle-api sh -c 'rm -f /var/www/html/logs/*.log'` | +| 删除调试日志 30 天前旧文件 | `docker exec youle-dlweb find /var/www/html/api/ext/debug/ -name '*.log' -mtime +30 -delete` | +| 删除调试日志全部文件 | `docker exec youle-dlweb sh -c 'rm -f /var/www/html/api/ext/debug/synchronize/*.log /var/www/html/api/ext/debug/SynchronizeReportData/*.log /var/www/html/api/ext/debug/autotask/*.log'` | +| 一键清理全部日志 | `/opt/youle/game-docker/clear-logs.sh` | ``` --- -### 鍦烘櫙涔濓細浠?Windows 鏈湴鏌ョ湅鍜屽垹闄や笟鍔℃棩蹇? +### 场景九:从 Windows 本地查看和删除业务日志 -> 浠ヤ笅鍛戒护鍦?**Windows PowerShell** 涓墽琛岋紝閫氳繃 SSH 鐩存帴璇诲彇鏈嶅姟鍣ㄤ笂鐨勪笟鍔℃棩蹇楁枃浠躲€? -> 鏃ュ織鏉ユ簮鐩綍锛堟湰鍦颁唬鐮佹槧灏勫埌瀹瑰櫒鐨?Volume锛夛細 -> - `api/logs/` 鈫?瀹瑰櫒鍐?`/var/www/html/logs/` -> - `dlweb/api/ext/debug/` 鈫?瀹瑰櫒鍐?`/var/www/html/api/ext/debug/` +> 以下命令在 **Windows PowerShell** 中执行,通过 SSH 直接读取服务器上的业务日志文件。 +> 日志来源目录(本地代码映射到容器的 Volume): +> - `api/logs/` → 容器内 `/var/www/html/logs/` +> - `dlweb/api/ext/debug/` → 容器内 `/var/www/html/api/ext/debug/` --- -#### 鏌ョ湅鏃ュ織 +#### 查看日志 ```powershell -# 鈹€鈹€ 鑾峰彇浠婂ぉ鐨勬棩鏈熷瓧绗︿覆 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── 获取今天的日期字符串 ────────────────────────────────────────── $today = (Get-Date -Format "yyyy-MM-dd") -# 鈹€鈹€ api/logs 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── api/logs ───────────────────────────────────────────────────── -# 鍒楀嚭鎵€鏈夋棩蹇楁枃浠? +# 列出所有日志文件 ssh root@47.98.203.17 "docker exec youle-api ls -lh /var/www/html/logs/" -# 鏌ョ湅浠婂ぉ鐨?API 涓氬姟鏃ュ織锛堟湯灏?50 琛岋級 +# 查看今天的 API 业务日志(末尾 50 行) ssh root@47.98.203.17 "docker exec youle-api tail -50 /var/www/html/logs/$today.log" -# 鏌ョ湅浠婂ぉ鐨?API 涓氬姟鏃ュ織锛堝畬鏁村唴瀹癸級 +# 查看今天的 API 业务日志(完整内容) ssh root@47.98.203.17 "docker exec youle-api cat /var/www/html/logs/$today.log" -# 瀹炴椂璺熻釜浠婂ぉ鐨?API 涓氬姟鏃ュ織锛圕trl+C 鍋滄锛? +# 实时跟踪今天的 API 业务日志(Ctrl+C 停止) ssh root@47.98.203.17 "docker exec youle-api tail -f /var/www/html/logs/$today.log" -# 鈹€鈹€ dlweb/api/ext/debug/synchronize 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── dlweb/api/ext/debug/synchronize ────────────────────────────── -# 鍒楀嚭鎵€鏈夊悓姝ヨ皟璇曟棩蹇楁枃浠? +# 列出所有同步调试日志文件 ssh root@47.98.203.17 "docker exec youle-dlweb ls -lh /var/www/html/api/ext/debug/synchronize/" -# 鏌ョ湅浠婂ぉ鐨勫悓姝ヨ皟璇曟棩蹇楋紙鏈熬 50 琛岋級 +# 查看今天的同步调试日志(末尾 50 行) ssh root@47.98.203.17 "docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/synchronize/$today.log" -# 鏌ョ湅浠婂ぉ鐨勫悓姝ヨ皟璇曟棩蹇楋紙瀹屾暣鍐呭锛? +# 查看今天的同步调试日志(完整内容) ssh root@47.98.203.17 "docker exec youle-dlweb cat /var/www/html/api/ext/debug/synchronize/$today.log" -# 瀹炴椂璺熻釜鍚屾璋冭瘯鏃ュ織锛圕trl+C 鍋滄锛? +# 实时跟踪同步调试日志(Ctrl+C 停止) ssh root@47.98.203.17 "docker exec youle-dlweb tail -f /var/www/html/api/ext/debug/synchronize/$today.log" -# 鈹€鈹€ dlweb/api/ext/debug/SynchronizeReportData 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── dlweb/api/ext/debug/SynchronizeReportData ──────────────────── ssh root@47.98.203.17 "docker exec youle-dlweb ls -lh /var/www/html/api/ext/debug/SynchronizeReportData/" ssh root@47.98.203.17 "docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/SynchronizeReportData/$today.log" -# 鈹€鈹€ dlweb/api/ext/debug/autotask 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── dlweb/api/ext/debug/autotask ───────────────────────────────── ssh root@47.98.203.17 "docker exec youle-dlweb ls -lh /var/www/html/api/ext/debug/autotask/" ssh root@47.98.203.17 "docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/autotask/$today.log" -# 鈹€鈹€ 涓€閿眹鎬伙細鍚屾椂鏌ョ湅涓や釜鐩綍浠婂ぉ鐨勬棩蹇楁湯灏?鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── 一键汇总:同时查看两个目录今天的日志末尾 ───────────────────── $today = (Get-Date -Format "yyyy-MM-dd") ssh root@47.98.203.17 @" @@ -1587,42 +1587,42 @@ docker exec youle-dlweb tail -30 /var/www/html/api/ext/debug/SynchronizeReportDa --- -#### 鍒犻櫎鏃ュ織 +#### 删除日志 ```powershell -# 鈹€鈹€ 鑾峰彇浠婂ぉ鐨勬棩鏈熷瓧绗︿覆 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── 获取今天的日期字符串 ────────────────────────────────────────── $today = (Get-Date -Format "yyyy-MM-dd") -# 鈹€鈹€ api/logs 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── api/logs ───────────────────────────────────────────────────── -# 娓呯┖浠婂ぉ鐨?API 涓氬姟鏃ュ織锛堜繚鐣欐枃浠讹紝娓呯┖鍐呭锛? +# 清空今天的 API 业务日志(保留文件,清空内容) ssh root@47.98.203.17 "docker exec youle-api truncate -s 0 /var/www/html/logs/$today.log" -# 鍒犻櫎浠婂ぉ鐨?API 涓氬姟鏃ュ織鏂囦欢 +# 删除今天的 API 业务日志文件 ssh root@47.98.203.17 "docker exec youle-api rm -f /var/www/html/logs/$today.log" -# 鍒犻櫎鎵€鏈?API 涓氬姟鏃ュ織锛堜繚鐣欎粖澶╋級 +# 删除所有 API 业务日志(保留今天) ssh root@47.98.203.17 "docker exec youle-api sh -c `"find /var/www/html/logs/ -name '*.log' ! -name '$today.log' -delete`"" -# 鍒犻櫎鍏ㄩ儴 API 涓氬姟鏃ュ織锛堝惈浠婂ぉ锛? +# 删除全部 API 业务日志(含今天) ssh root@47.98.203.17 "docker exec youle-api sh -c 'rm -f /var/www/html/logs/*.log'" -# 鈹€鈹€ dlweb/api/ext/debug 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── dlweb/api/ext/debug ────────────────────────────────────────── -# 娓呯┖浠婂ぉ鐨勫悓姝ヨ皟璇曟棩蹇楋紙淇濈暀鏂囦欢锛屾竻绌哄唴瀹癸級 +# 清空今天的同步调试日志(保留文件,清空内容) ssh root@47.98.203.17 "docker exec youle-dlweb truncate -s 0 /var/www/html/api/ext/debug/synchronize/$today.log" -# 鍒犻櫎浠婂ぉ鐨勫悓姝ヨ皟璇曟棩蹇楁枃浠? +# 删除今天的同步调试日志文件 ssh root@47.98.203.17 "docker exec youle-dlweb rm -f /var/www/html/api/ext/debug/synchronize/$today.log" -# 鍒犻櫎 30 澶╁墠鐨勬棫璋冭瘯鏃ュ織锛堜笁涓瓙鐩綍锛? +# 删除 30 天前的旧调试日志(三个子目录) ssh root@47.98.203.17 "docker exec youle-dlweb find /var/www/html/api/ext/debug/ -name '*.log' -mtime +30 -delete" -# 鍒犻櫎鎵€鏈夎皟璇曟棩蹇楋紙淇濈暀浠婂ぉ锛屼笁涓瓙鐩綍锛? +# 删除所有调试日志(保留今天,三个子目录) ssh root@47.98.203.17 "docker exec youle-dlweb sh -c `"find /var/www/html/api/ext/debug/ -name '*.log' ! -name '$today.log' -delete`"" -# 鍒犻櫎鍏ㄩ儴璋冭瘯鏃ュ織锛堝惈浠婂ぉ锛屼笁涓瓙鐩綍锛? +# 删除全部调试日志(含今天,三个子目录) ssh root@47.98.203.17 @" docker exec youle-dlweb sh -c ' rm -f /var/www/html/api/ext/debug/synchronize/*.log @@ -1632,7 +1632,7 @@ docker exec youle-dlweb sh -c ' "@ -# 鈹€鈹€ 涓€閿竻鐞嗭細api/logs + dlweb/api/ext/debug 鍏ㄩ儴鏃ュ織 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ +# ── 一键清理:api/logs + dlweb/api/ext/debug 全部日志 ──────────── ssh root@47.98.203.17 @" docker exec youle-api sh -c 'rm -f /var/www/html/logs/*.log' @@ -1647,16 +1647,16 @@ echo "Done" --- -#### 蹇嵎閫熸煡琛? +#### 快捷速查表 -| 鎿嶄綔 | PowerShell 鍛戒护 | +| 操作 | PowerShell 命令 | |------|----------------| -| 鏌ョ湅 api/logs 浠婂ぉ鏃ュ織 | `ssh root@47.98.203.17 "docker exec youle-api cat /var/www/html/logs/$(Get-Date -Format 'yyyy-MM-dd').log"` | -| 鏌ョ湅鍚屾璋冭瘯鏃ュ織 | `ssh root@47.98.203.17 "docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/synchronize/$(Get-Date -Format 'yyyy-MM-dd').log"` | -| 瀹炴椂璺熻釜鍚屾鏃ュ織 | `ssh root@47.98.203.17 "docker exec youle-dlweb tail -f /var/www/html/api/ext/debug/synchronize/$(Get-Date -Format 'yyyy-MM-dd').log"` | -| 娓呯┖ api/logs 浠婂ぉ鏃ュ織 | `ssh root@47.98.203.17 "docker exec youle-api truncate -s 0 /var/www/html/logs/$(Get-Date -Format 'yyyy-MM-dd').log"` | -| 娓呯┖鍚屾璋冭瘯鏃ュ織 | `ssh root@47.98.203.17 "docker exec youle-dlweb truncate -s 0 /var/www/html/api/ext/debug/synchronize/$(Get-Date -Format 'yyyy-MM-dd').log"` | -| 鍒犻櫎鍏ㄩ儴璋冭瘯鏃ュ織 | `ssh root@47.98.203.17 "docker exec youle-dlweb sh -c 'rm -f /var/www/html/api/ext/debug/synchronize/*.log /var/www/html/api/ext/debug/SynchronizeReportData/*.log /var/www/html/api/ext/debug/autotask/*.log'"` | +| 查看 api/logs 今天日志 | `ssh root@47.98.203.17 "docker exec youle-api cat /var/www/html/logs/$(Get-Date -Format 'yyyy-MM-dd').log"` | +| 查看同步调试日志 | `ssh root@47.98.203.17 "docker exec youle-dlweb tail -50 /var/www/html/api/ext/debug/synchronize/$(Get-Date -Format 'yyyy-MM-dd').log"` | +| 实时跟踪同步日志 | `ssh root@47.98.203.17 "docker exec youle-dlweb tail -f /var/www/html/api/ext/debug/synchronize/$(Get-Date -Format 'yyyy-MM-dd').log"` | +| 清空 api/logs 今天日志 | `ssh root@47.98.203.17 "docker exec youle-api truncate -s 0 /var/www/html/logs/$(Get-Date -Format 'yyyy-MM-dd').log"` | +| 清空同步调试日志 | `ssh root@47.98.203.17 "docker exec youle-dlweb truncate -s 0 /var/www/html/api/ext/debug/synchronize/$(Get-Date -Format 'yyyy-MM-dd').log"` | +| 删除全部调试日志 | `ssh root@47.98.203.17 "docker exec youle-dlweb sh -c 'rm -f /var/www/html/api/ext/debug/synchronize/*.log /var/www/html/api/ext/debug/SynchronizeReportData/*.log /var/www/html/api/ext/debug/autotask/*.log'"` | ## 数据库远程管理(Navicat SSH 隧道)