Files
youlegames/codes/agent/game-docker/docs/03-env-variables.md

142 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 环境变量配置
所有硬编码的域名、数据库地址、密钥都已外部化为环境变量。**修改配置不再需要改代码,只需改 `.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 |
| `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.<ROOT_DOMAIN> → Nginx 网站1含 wxserver /wx/ 路由)
(唯一必填) │ DLWEB_DOMAIN = dlapi.<ROOT_DOMAIN> → Nginx 网站2
│ SITE_API_URL = https://api.<ROOT_DOMAIN>
│ SITE_PAY_NOTIFY_URL = https://api.<ROOT_DOMAIN>
│ SITE_OPEN_URL = http://open.<ROOT_DOMAIN>
│ DLWEB_DL_API_V3_URL = https://dlapi.<ROOT_DOMAIN>
```
> 推导由 `docker-compose.yml` 的 `environment:` 块完成,容器内所有派生变量均无需手动配置。如子域名不符合 `<前缀>.<ROOT_DOMAIN>` 规律,可在 `.env` 中单独覆盖对应变量。
---
## 环境变量加载机制
### 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}` 占位符Nginx 容器启动时通过 `envsubst` 自动替换。wxserver 不独立占用域名,通过 `api.xxx/wx/*` 路由接入。
---
## 文件修改与生效方式
不同文件在镜像中的处理方式不同,决定了改完代码后需要执行哪种操作。
### 文件 → 操作对照表
| 文件路径 | 所属容器 | 载入方式 | 修改后需要执行的操作 |
|---------|---------|---------|-------------------|
| `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` 传到服务器后重启容器即可,**无需重建镜像**
### 操作命令速查
```bash
# ── 需要重建镜像的操作(修改源码/Dockerfile/entrypoint 等 COPY 文件)──
./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 挂载文件,秒级生效)──
# 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 脚本
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 脚本
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 变更 ──
ssh root@47.98.203.17 "cd /opt/youle/game-docker && docker compose up -d"
# compose 会对比配置差异,只重启有变更的容器
```