6.8 KiB
6.8 KiB
环境变量配置
所有硬编码的域名、数据库地址、密钥都已外部化为环境变量。修改配置不再需要改代码,只需改 .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) 函数读取配置:
// 优先读 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传到服务器后重启容器即可,无需重建镜像
操作命令速查
# ── 需要重建镜像的操作(修改源码/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 会对比配置差异,只重启有变更的容器