修复小程序wxapi 的依赖全部改成 api

This commit is contained in:
2026-04-14 08:31:24 +08:00
parent bcf46d0fda
commit fcb61618b8
167 changed files with 27683 additions and 27521 deletions

View File

@@ -106,7 +106,7 @@ DLWEB_PORT=8082
# 所有子域名由 docker-compose.yml 从 ROOT_DOMAIN 自动拼接,无需单独配置: # 所有子域名由 docker-compose.yml 从 ROOT_DOMAIN 自动拼接,无需单独配置:
# api.ROOT_DOMAIN API 服务 # api.ROOT_DOMAIN API 服务
# dlapi.ROOT_DOMAIN 代理管理后台 # dlapi.ROOT_DOMAIN 代理管理后台
# wxapi.ROOT_DOMAIN 微信小程序 # api.ROOT_DOMAIN API 服务(含 wxserver /wx/ 路由)
# api2.ROOT_DOMAIN API2 服务 # api2.ROOT_DOMAIN API2 服务
# sdk.ROOT_DOMAIN SDK 域名 # sdk.ROOT_DOMAIN SDK 域名
# open.ROOT_DOMAIN 活动/图片资源 # open.ROOT_DOMAIN 活动/图片资源

View File

@@ -178,7 +178,27 @@ cat "$env:USERPROFILE\.ssh\id_ed25519.pub" | ssh root@47.98.203.17 `
--- ---
### 1. 上传项目到服务器 ### 1. 检查并修复行尾符LF
> **为什么需要这步?** Windows 的 Git 默认 `core.autocrlf=true`,可能将脚本文件写成 CRLF。CRLF 格式的 shell 脚本在 Linux 容器中会报 `not found` / `syntax error` 错误,导致容器无法启动。
在上传前运行 `fix-lf.ps1`,自动扫描所有关键文件并修复:
```powershell
.\fix-lf.ps1
```
> **根本修复(一次性,之后无需再跑):** 执行以下命令让 `.gitattributes` 永久接管行尾符,此后任何机器 clone 均自动生效:
> ```powershell
> git config core.autocrlf false
> git add --renormalize .
> git commit -m "fix: normalize all line endings to LF"
> git push
> ```
---
### 2. 上传项目到服务器
`game-docker` 目录上传到服务器 `/opt/youle/` 下: `game-docker` 目录上传到服务器 `/opt/youle/` 下:
@@ -222,7 +242,7 @@ git clone <仓库地址> game-docker
└── docker/ └── docker/
``` ```
### 2. 准备环境变量 ### 3. 准备环境变量
```bash ```bash
cd /opt/youle/game-docker cd /opt/youle/game-docker
@@ -234,7 +254,7 @@ vim .env
```bash ```bash
# 父域名(三个子域名自动推导,无需单独配置) # 父域名(三个子域名自动推导,无需单独配置)
# 将自动生成: api.<ROOT_DOMAIN> dlapi.<ROOT_DOMAIN> wxapi.<ROOT_DOMAIN> # 将自动生成: api.<ROOT_DOMAIN> dlapi.<ROOT_DOMAIN>
ROOT_DOMAIN=yourdomain.com ROOT_DOMAIN=yourdomain.com
# 数据库(各服务数据库连接) # 数据库(各服务数据库连接)
@@ -254,7 +274,7 @@ WX_PAY_KEY=your-key
SSL_EMAIL=your-email@example.com SSL_EMAIL=your-email@example.com
``` ```
### 3. 首次申请 SSL 证书 ### 4. 首次申请 SSL 证书
```bash ```bash
chmod +x deploy.sh init-ssl.sh chmod +x deploy.sh init-ssl.sh
@@ -266,7 +286,7 @@ chmod +x deploy.sh init-ssl.sh
./deploy.sh ssl-init ./deploy.sh ssl-init
``` ```
### 4. 启动所有服务 ### 5. 启动所有服务
```bash ```bash
./deploy.sh up ./deploy.sh up
@@ -285,7 +305,7 @@ chmod +x deploy.sh init-ssl.sh
./deploy.sh logs cronjob ./deploy.sh logs cronjob
``` ```
### 5. 部署命令速查 ### 6. 部署命令速查
| 命令 | 说明 | | 命令 | 说明 |
|------|------| |------|------|
@@ -413,9 +433,8 @@ docker exec youle-cronjob /bin/sh /app/daily-task.sh
``` ```
.env 配置 │ 自动推导结果 .env 配置 │ 自动推导结果
─────────────────────┼────────────────────────────────────────────────────── ─────────────────────┼──────────────────────────────────────────────────────
ROOT_DOMAIN │ API_DOMAIN = api.<ROOT_DOMAIN> → Nginx 网站1 ROOT_DOMAIN │ API_DOMAIN = api.<ROOT_DOMAIN> → Nginx 网站1(含 wxserver /wx/ 路由)
(唯一必填) │ DLWEB_DOMAIN = dlapi.<ROOT_DOMAIN> → Nginx 网站2 (唯一必填) │ DLWEB_DOMAIN = dlapi.<ROOT_DOMAIN> → Nginx 网站2
│ WX_DOMAIN = wxapi.<ROOT_DOMAIN> → Nginx 网站3
│ SITE_API_URL = https://api.<ROOT_DOMAIN> │ SITE_API_URL = https://api.<ROOT_DOMAIN>
│ SITE_PAY_NOTIFY_URL = https://api.<ROOT_DOMAIN> │ SITE_PAY_NOTIFY_URL = https://api.<ROOT_DOMAIN>
│ SITE_OPEN_URL = http://open.<ROOT_DOMAIN> │ SITE_OPEN_URL = http://open.<ROOT_DOMAIN>
@@ -452,7 +471,7 @@ $host = env('API_DB_HOST', 'localhost');
### Nginx 域名注入 ### Nginx 域名注入
`default.conf.template` 使用 `${API_DOMAIN}` / `${DLWEB_DOMAIN}` / `${WX_DOMAIN}` 占位符Nginx 容器启动时通过 `envsubst` 自动替换。 `default.conf.template` 使用 `${API_DOMAIN}` / `${DLWEB_DOMAIN}` 占位符Nginx 容器启动时通过 `envsubst` 自动替换。wxserver 不独立占用域名,通过 `api.xxx/wx/*` 路由接入。
--- ---
@@ -536,7 +555,6 @@ ROOT_DOMAIN=newdomain.com
|---------|------| |---------|------|
| `API_DOMAIN` | `api.newdomain.com` | | `API_DOMAIN` | `api.newdomain.com` |
| `DLWEB_DOMAIN` | `dlapi.newdomain.com` | | `DLWEB_DOMAIN` | `dlapi.newdomain.com` |
| `WX_DOMAIN` | `wxapi.newdomain.com` |
| `SITE_API_URL` | `https://api.newdomain.com` | | `SITE_API_URL` | `https://api.newdomain.com` |
| `SITE_PAY_NOTIFY_URL` | `https://api.newdomain.com` | | `SITE_PAY_NOTIFY_URL` | `https://api.newdomain.com` |
| `SITE_OPEN_URL` | `http://open.newdomain.com` | | `SITE_OPEN_URL` | `http://open.newdomain.com` |
@@ -557,7 +575,6 @@ ROOT_DOMAIN=newdomain.com
# 验证 DNS 解析 # 验证 DNS 解析
nslookup api.newdomain.com nslookup api.newdomain.com
nslookup dlapi.newdomain.com nslookup dlapi.newdomain.com
nslookup wxapi.newdomain.com
``` ```
**3. 重新申请 SSL 证书** **3. 重新申请 SSL 证书**
@@ -583,13 +600,102 @@ nslookup wxapi.newdomain.com
**5. 更新微信后台配置** **5. 更新微信后台配置**
| 微信后台 | 配置项 | 新值 | 更换域名后,必须同步更新微信三个后台的域名白名单,否则对应功能会直接报错或静默失败。
|---------|--------|------|
| 小程序后台 | request 合法域名 | `https://wxapi.newdomain.com` | > **关键路由说明:** Nginx 在 `api.newdomain.com` 上配置了 `/wx/` 前缀路由——以 `/wx/` 开头的请求会被反向代理到 wxserverNode.js其余请求仍由 PHP API 处理。wxserver 所有接口(包括小程序登录、公众号 OAuth均通过 `api.newdomain.com/wx/*` 访问。
| 小程序后台 | 业务域名 | `wxapi.newdomain.com` |
| 公众号后台 | 业务域名 / JS接口安全域名 | `api.newdomain.com` | ---
| 公众号后台 | 网页授权域名 | `wxapi.newdomain.com` |
| 微信支付后台 | 支付授权目录 | `https://dlapi.newdomain.com/` | #### 5.1 微信小程序后台
> **入口:** [mp.weixin.qq.com](https://mp.weixin.qq.com) → 开发 → 开发管理 → 开发设置 → 服务器域名
| 配置项 | 作用 | 新值 | 不更新时的现象 |
|--------|------|------|--------------|
| **request 合法域名** | 小程序调用 `wx.request()` 请求 wxserver 后端接口 | `https://api.newdomain.com` | `wx.request` 直接报 `invalid url`,所有网络请求失败 |
| **业务域名** | 小程序 `<web-view>` 组件加载公众号授权页(获取永久头像流程) | `api.newdomain.com` | 打开 web-view 时提示"不在业务域名列表中",授权页无法加载 |
> **注意:** 小程序域名配置每月只能修改 5 次,且每项域名必须已备案并启用 HTTPS。
---
#### 5.2 微信公众号后台
> **入口:** [mp.weixin.qq.com](https://mp.weixin.qq.com) → 设置与开发 → 公众号设置 → 功能设置
**① 业务域名**
| 配置值 | 用途 |
|--------|------|
| `api.newdomain.com` | 在公众号内打开的网页所在域名 |
用户在微信内置浏览器中打开的游戏支付页(`api.newdomain.com`)必须在业务域名列表内,否则页面会被提示"域名不合法"或无法正常访问。
> **验证文件:** 添加业务域名时,微信要求在该域名根目录放置 `.txt` 验证文件。将微信提供的文件(如 `MP_verify_xxx.txt`)放入 `api/` 根目录,然后 `./deploy.sh rebuild api`。
---
**② 网页授权域名(最重要)**
| 配置值 | 用途 |
|--------|------|
| `api.newdomain.com` | 公众号 OAuth2 授权回调域名 |
**为什么是 `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 域名与后台配置不一致" 错误,永久头像获取功能完全不可用。
> **⚠️ 远程配置也需要同步修改:** `WX_OA_REDIRECT_DOMAIN` 未配置时wxserver 会从远程配置文件读取 `minipro_api_url` key 作为回调域名(见 `wxserver_daoqi/config/index.js`)。即使 `.env` 中已正确填写 `WX_OA_REDIRECT_DOMAIN`,仍建议同步更新远程配置,避免环境变量配置丢失时出现静默回退至旧域名的问题。
>
> 远程配置文件地址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 镜像使其生效:
> ```bash
> ./deploy.sh rebuild api
> ```
---
**② JS 接口安全域名**
| 配置值 | 用途 |
|--------|------|
| `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 的页面所在域名必须在安全域名列表内。
不更新的后果:`wx.config()` 签名验证失败,微信支付按钮无法唤起支付界面,用户点击支付无反应。
---
#### 5.3 微信支付商户后台
> **入口:** [pay.weixin.qq.com](https://pay.weixin.qq.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`)指定。微信支付要求发起支付的页面域名必须在授权目录白名单内。
不更新的后果:下单时提示"当前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/` |
--- ---
@@ -710,7 +816,7 @@ chmod +x deploy.sh init-ssl.sh
# 各服务健康检查 # 各服务健康检查
curl -k https://api.yourdomain.com/ curl -k https://api.yourdomain.com/
curl -k https://dlapi.yourdomain.com/ curl -k https://dlapi.yourdomain.com/
curl -k https://wxapi.yourdomain.com/ curl -k https://api.yourdomain.com/wx/api/login # wxserver 健康检查
# 定时任务运行正常 # 定时任务运行正常
docker logs --tail 5 youle-syncjob docker logs --tail 5 youle-syncjob
@@ -836,6 +942,77 @@ docker compose ps
| 微信密钥 | `WX_*` | `docker compose restart api dlweb wxserver` | 微信后台 | | 微信密钥 | `WX_*` | `docker compose restart api dlweb wxserver` | 微信后台 |
| 整体迁移 | 视情况 | `./deploy.sh ssl-init && ./deploy.sh up` | DNS + RDS 白名单 | | 整体迁移 | 视情况 | `./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`(重新注入环境变量) |
> **COPY vs 挂载的区别:**
> - **`COPY` 进镜像** — 文件被打进 Docker 镜像层,修改后必须重新 build 才能生效,容器内的文件是镜像的副本
> - **volume 挂载** — 容器启动时直接挂载宿主机文件,只需 `scp` 传到服务器后重启容器即可,**无需重建镜像**
#### 操作命令速查
```bash
# ── 需要重建镜像的操作(修改源码/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 # 同时重建多个
# 重建所有服务
./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 会对比配置差异,只重启有变更的容器
```
---
### 场景七:查看日志 ### 场景七:查看日志
本项目日志分为两类:**Docker 容器标准输出日志**`docker logs`)和**业务调试日志**(写入 Docker Volume 的文件)。 本项目日志分为两类:**Docker 容器标准输出日志**`docker logs`)和**业务调试日志**(写入 Docker Volume 的文件)。
@@ -1120,8 +1297,6 @@ docker run --rm -v game-docker_certbot-certs:/etc/letsencrypt certbot/certbot de
--cert-name "${API_DOMAIN}" --non-interactive 2>/dev/null || true --cert-name "${API_DOMAIN}" --non-interactive 2>/dev/null || true
docker run --rm -v game-docker_certbot-certs:/etc/letsencrypt certbot/certbot delete \ docker run --rm -v game-docker_certbot-certs:/etc/letsencrypt certbot/certbot delete \
--cert-name "${DLWEB_DOMAIN}" --non-interactive 2>/dev/null || true --cert-name "${DLWEB_DOMAIN}" --non-interactive 2>/dev/null || true
docker run --rm -v game-docker_certbot-certs:/etc/letsencrypt certbot/certbot delete \
--cert-name "${WX_DOMAIN}" --non-interactive 2>/dev/null || true
# 或直接删除证书 volume # 或直接删除证书 volume
docker volume rm game-docker_certbot-certs game-docker_certbot-webroot 2>/dev/null || true docker volume rm game-docker_certbot-certs game-docker_certbot-webroot 2>/dev/null || true

View File

@@ -13,12 +13,11 @@ services:
- certbot-webroot:/var/www/certbot:ro - certbot-webroot:/var/www/certbot:ro
- certbot-certs:/etc/letsencrypt:ro - certbot-certs:/etc/letsencrypt:ro
environment: environment:
# 只替换这 4 个变量,不影响 nginx 内置的 $host $scheme 等 # 只替换这 3 个变量,不影响 nginx 内置的 $host $scheme 等
NGINX_ENVSUBST_FILTER: "API_DOMAIN|DLWEB_DOMAIN|WX_DOMAIN|ROOT_DOMAIN" NGINX_ENVSUBST_FILTER: "API_DOMAIN|DLWEB_DOMAIN|ROOT_DOMAIN"
ROOT_DOMAIN: ${ROOT_DOMAIN} ROOT_DOMAIN: ${ROOT_DOMAIN}
API_DOMAIN: api.${ROOT_DOMAIN} API_DOMAIN: api.${ROOT_DOMAIN}
DLWEB_DOMAIN: dlapi.${ROOT_DOMAIN} DLWEB_DOMAIN: dlapi.${ROOT_DOMAIN}
WX_DOMAIN: wxapi.${ROOT_DOMAIN}
depends_on: depends_on:
- api - api
- dlweb - dlweb

View File

@@ -13,20 +13,20 @@ upstream wxserver_service {
# ============================================= # =============================================
# 域名路由模式 + SSLLet's Encrypt 自动证书) # 域名路由模式 + SSLLet's Encrypt 自动证书)
# #
# 域名由 .env 文件中的 API_DOMAIN / DLWEB_DOMAIN / WX_DOMAIN 自动注入 # 域名由 .env 文件中的 API_DOMAIN / DLWEB_DOMAIN 自动注入
# 修改域名只需编辑 .env 然后 docker compose restart nginx # 修改域名只需编辑 .env 然后 docker compose restart nginx
# #
# ================== 微信域名配置指南 ================== # ================== 微信域名配置指南 ==================
# #
# .env 中配置的 3 个域名对应: # .env 中配置的 2 个域名对应:
# ${API_DOMAIN} → 网站1: game-docker/api # ${API_DOMAIN} → 网站1: game-docker/api + wxserver通过 /wx/ 前缀路由转发)
# ${DLWEB_DOMAIN} → 网站2: game-docker/dlweb/api # ${DLWEB_DOMAIN} → 网站2: game-docker/dlweb/api
# ${WX_DOMAIN} → 网站3: game-docker/wxserver_daoqi
# #
# 【微信小程序后台】(mp.weixin.qq.com → 开发管理 → 开发设置) # 【微信小程序后台】(mp.weixin.qq.com → 开发管理 → 开发设置)
# - request 合法域名: https://${WX_DOMAIN} # - request 合法域名: https://${API_DOMAIN}
# - 业务域名: ${WX_DOMAIN} # - 业务域名: ${API_DOMAIN}
# (验证文件放到 wxserver_daoqi/public/MP_verify_xxx.txt) # (验证文件放到 api/ 根目录,小程序和公众号的 MP_verify_xxx.txt 均放这里)
# wxserver 接口通过 ${API_DOMAIN}/wx/* 访问
# #
# 【微信公众号后台】(mp.weixin.qq.com → 设置与开发 → 公众号设置) # 【微信公众号后台】(mp.weixin.qq.com → 设置与开发 → 公众号设置)
# - 业务域名: ${API_DOMAIN} # - 业务域名: ${API_DOMAIN}
@@ -110,6 +110,7 @@ server {
# wxserver 路由:/wx/ 前缀转发给 wxserver 容器,自动去除 /wx 前缀 # wxserver 路由:/wx/ 前缀转发给 wxserver 容器,自动去除 /wx 前缀
# 例:/wx/auth/oa/callback → wxserver:/auth/oa/callback # 例:/wx/auth/oa/callback → wxserver:/auth/oa/callback
# 例:/wx/api/login → wxserver:/api/login
location /wx/ { location /wx/ {
proxy_pass http://wxserver_service/; proxy_pass http://wxserver_service/;
proxy_set_header Host $host; proxy_set_header Host $host;
@@ -119,6 +120,16 @@ server {
proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Port $server_port;
} }
# wxserver 上传文件访问(/wx/api/upload 上传后返回的 /uploads/ 地址)
location /uploads/ {
proxy_pass http://wxserver_service/uploads/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
# PHP API所有其他请求 # PHP API所有其他请求
location / { location / {
proxy_pass http://api_service; proxy_pass http://api_service;
@@ -150,25 +161,4 @@ server {
} }
} }
# ===== 网站3: 微信小程序后端 ===== # wxserver 不再独立占用域名,所有接口统一通过 api.xxx/wx/* 路由访问
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ${WX_DOMAIN};
ssl_certificate /etc/letsencrypt/live/${WX_DOMAIN}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/${WX_DOMAIN}/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
proxy_pass http://wxserver_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

View File

@@ -0,0 +1,39 @@
#!/usr/bin/env pwsh
# fix-lf.ps1 — 检查并修复 game-docker 中关键文件的行尾符CRLF → LF
# 在上传部署前运行,确保 shell 脚本等文件在 Linux 容器中可正常执行
$root = $PSScriptRoot
$patterns = @('*.sh', '*.conf', '*.env', 'Dockerfile', 'deploy.sh', 'init-ssl.sh',
'docker-compose*.yml', '*.yaml', 'entrypoint*')
Write-Host "扫描目录: $root" -ForegroundColor Cyan
Write-Host ""
$files = $patterns | ForEach-Object {
Get-ChildItem -Path $root -Recurse -Filter $_ -File
} | Sort-Object FullName -Unique
$crlfFiles = $files | Where-Object {
$bytes = [System.IO.File]::ReadAllBytes($_.FullName)
($bytes | Where-Object { $_ -eq 13 } | Measure-Object).Count -gt 0
}
if (-not $crlfFiles) {
Write-Host "✓ 所有关键文件行尾符正常LF无需修复。" -ForegroundColor Green
exit 0
}
Write-Host "发现 $($crlfFiles.Count) 个文件含 CRLF正在修复..." -ForegroundColor Yellow
Write-Host ""
foreach ($f in $crlfFiles) {
$content = [System.IO.File]::ReadAllText($f.FullName)
$fixed = $content -replace "`r`n", "`n"
[System.IO.File]::WriteAllText($f.FullName, $fixed, [System.Text.UTF8Encoding]::new($false))
$rel = $f.FullName.Substring($root.Length + 1)
Write-Host " 已修复: $rel" -ForegroundColor Green
}
Write-Host ""
Write-Host "✓ 修复完成,共处理 $($crlfFiles.Count) 个文件。" -ForegroundColor Green

View File

@@ -48,9 +48,8 @@ if [ -z "$ROOT_DOMAIN" ]; then
fi fi
: ${API_DOMAIN:="api.${ROOT_DOMAIN}"} : ${API_DOMAIN:="api.${ROOT_DOMAIN}"}
: ${DLWEB_DOMAIN:="dlapi.${ROOT_DOMAIN}"} : ${DLWEB_DOMAIN:="dlapi.${ROOT_DOMAIN}"}
: ${WX_DOMAIN:="wxapi.${ROOT_DOMAIN}"}
DOMAINS=("$API_DOMAIN" "$DLWEB_DOMAIN" "$WX_DOMAIN") DOMAINS=("$API_DOMAIN" "$DLWEB_DOMAIN")
# 判断使用 docker-compose 还是 docker compose # 判断使用 docker-compose 还是 docker compose
COMPOSE_CMD="docker compose" COMPOSE_CMD="docker compose"

View File

@@ -1,7 +0,0 @@
@echo off
title BaibaoxiangServer
cd /d "%~dp0"
echo Starting Baibaoxiang Server...
echo Server will run on port 3000 (or configured port)
node index.js
pause

View File

@@ -1,12 +0,0 @@
@echo off
title WeChat Server - Running
color 0A
cls
:: 切换到脚本所在目录,确保 node 能找到 index.js
cd /d "%~dp0"
echo Starting WeChat Server...
echo.
node index.js
pause

View File

@@ -1,21 +0,0 @@
@echo off
setlocal
set PORT=3000
echo Looking for process on port %PORT%...
:: 查找占用端口 3000 的进程 PID
set PID=
for /f "tokens=5" %%a in ('netstat -aon ^| findstr ":%PORT% " ^| findstr "LISTENING"') do (
set PID=%%a
)
if defined PID (
echo Found process with PID: %PID%
echo Killing process...
taskkill /F /PID %PID%
echo Server stopped successfully.
) else (
echo No server found running on port %PORT%.
)
pause