# 环境变量配置 所有硬编码的域名、数据库地址、密钥都已外部化为环境变量。**修改配置不再需要改代码,只需改 `.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. → 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` 中单独覆盖对应变量。 --- ## 环境变量加载机制 ### 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 会对比配置差异,只重启有变更的容器 ```