修复小程序wxapi 的依赖全部改成 api
This commit is contained in:
@@ -106,7 +106,7 @@ DLWEB_PORT=8082
|
||||
# 所有子域名由 docker-compose.yml 从 ROOT_DOMAIN 自动拼接,无需单独配置:
|
||||
# api.ROOT_DOMAIN API 服务
|
||||
# dlapi.ROOT_DOMAIN 代理管理后台
|
||||
# wxapi.ROOT_DOMAIN 微信小程序
|
||||
# api.ROOT_DOMAIN API 服务(含 wxserver /wx/ 路由)
|
||||
# api2.ROOT_DOMAIN API2 服务
|
||||
# sdk.ROOT_DOMAIN SDK 域名
|
||||
# open.ROOT_DOMAIN 活动/图片资源
|
||||
|
||||
@@ -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/` 下:
|
||||
|
||||
@@ -222,7 +242,7 @@ git clone <仓库地址> game-docker
|
||||
└── docker/
|
||||
```
|
||||
|
||||
### 2. 准备环境变量
|
||||
### 3. 准备环境变量
|
||||
|
||||
```bash
|
||||
cd /opt/youle/game-docker
|
||||
@@ -234,7 +254,7 @@ vim .env
|
||||
|
||||
```bash
|
||||
# 父域名(三个子域名自动推导,无需单独配置)
|
||||
# 将自动生成: api.<ROOT_DOMAIN> dlapi.<ROOT_DOMAIN> wxapi.<ROOT_DOMAIN>
|
||||
# 将自动生成: api.<ROOT_DOMAIN> dlapi.<ROOT_DOMAIN>
|
||||
ROOT_DOMAIN=yourdomain.com
|
||||
|
||||
# 数据库(各服务数据库连接)
|
||||
@@ -254,7 +274,7 @@ WX_PAY_KEY=your-key
|
||||
SSL_EMAIL=your-email@example.com
|
||||
```
|
||||
|
||||
### 3. 首次申请 SSL 证书
|
||||
### 4. 首次申请 SSL 证书
|
||||
|
||||
```bash
|
||||
chmod +x deploy.sh init-ssl.sh
|
||||
@@ -266,7 +286,7 @@ chmod +x deploy.sh init-ssl.sh
|
||||
./deploy.sh ssl-init
|
||||
```
|
||||
|
||||
### 4. 启动所有服务
|
||||
### 5. 启动所有服务
|
||||
|
||||
```bash
|
||||
./deploy.sh up
|
||||
@@ -285,7 +305,7 @@ chmod +x deploy.sh init-ssl.sh
|
||||
./deploy.sh logs cronjob
|
||||
```
|
||||
|
||||
### 5. 部署命令速查
|
||||
### 6. 部署命令速查
|
||||
|
||||
| 命令 | 说明 |
|
||||
|------|------|
|
||||
@@ -413,9 +433,8 @@ docker exec youle-cronjob /bin/sh /app/daily-task.sh
|
||||
```
|
||||
.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
|
||||
│ WX_DOMAIN = wxapi.<ROOT_DOMAIN> → Nginx 网站3
|
||||
│ SITE_API_URL = https://api.<ROOT_DOMAIN>
|
||||
│ SITE_PAY_NOTIFY_URL = https://api.<ROOT_DOMAIN>
|
||||
│ SITE_OPEN_URL = http://open.<ROOT_DOMAIN>
|
||||
@@ -452,7 +471,7 @@ $host = env('API_DB_HOST', 'localhost');
|
||||
|
||||
### 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` |
|
||||
| `DLWEB_DOMAIN` | `dlapi.newdomain.com` |
|
||||
| `WX_DOMAIN` | `wxapi.newdomain.com` |
|
||||
| `SITE_API_URL` | `https://api.newdomain.com` |
|
||||
| `SITE_PAY_NOTIFY_URL` | `https://api.newdomain.com` |
|
||||
| `SITE_OPEN_URL` | `http://open.newdomain.com` |
|
||||
@@ -557,7 +575,6 @@ ROOT_DOMAIN=newdomain.com
|
||||
# 验证 DNS 解析
|
||||
nslookup api.newdomain.com
|
||||
nslookup dlapi.newdomain.com
|
||||
nslookup wxapi.newdomain.com
|
||||
```
|
||||
|
||||
**3. 重新申请 SSL 证书**
|
||||
@@ -583,13 +600,102 @@ nslookup wxapi.newdomain.com
|
||||
|
||||
**5. 更新微信后台配置**
|
||||
|
||||
| 微信后台 | 配置项 | 新值 |
|
||||
|---------|--------|------|
|
||||
| 小程序后台 | request 合法域名 | `https://wxapi.newdomain.com` |
|
||||
| 小程序后台 | 业务域名 | `wxapi.newdomain.com` |
|
||||
| 公众号后台 | 业务域名 / JS接口安全域名 | `api.newdomain.com` |
|
||||
| 公众号后台 | 网页授权域名 | `wxapi.newdomain.com` |
|
||||
| 微信支付后台 | 支付授权目录 | `https://dlapi.newdomain.com/` |
|
||||
更换域名后,必须同步更新微信三个后台的域名白名单,否则对应功能会直接报错或静默失败。
|
||||
|
||||
> **关键路由说明:** Nginx 在 `api.newdomain.com` 上配置了 `/wx/` 前缀路由——以 `/wx/` 开头的请求会被反向代理到 wxserver(Node.js),其余请求仍由 PHP API 处理。wxserver 所有接口(包括小程序登录、公众号 OAuth)均通过 `api.newdomain.com/wx/*` 访问。
|
||||
|
||||
---
|
||||
|
||||
#### 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://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
|
||||
@@ -836,6 +942,77 @@ docker compose ps
|
||||
| 微信密钥 | `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`(重新注入环境变量) |
|
||||
|
||||
> **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 的文件)。
|
||||
@@ -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
|
||||
docker run --rm -v game-docker_certbot-certs:/etc/letsencrypt certbot/certbot delete \
|
||||
--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
|
||||
docker volume rm game-docker_certbot-certs game-docker_certbot-webroot 2>/dev/null || true
|
||||
|
||||
|
||||
@@ -13,12 +13,11 @@ services:
|
||||
- certbot-webroot:/var/www/certbot:ro
|
||||
- certbot-certs:/etc/letsencrypt:ro
|
||||
environment:
|
||||
# 只替换这 4 个变量,不影响 nginx 内置的 $host $scheme 等
|
||||
NGINX_ENVSUBST_FILTER: "API_DOMAIN|DLWEB_DOMAIN|WX_DOMAIN|ROOT_DOMAIN"
|
||||
# 只替换这 3 个变量,不影响 nginx 内置的 $host $scheme 等
|
||||
NGINX_ENVSUBST_FILTER: "API_DOMAIN|DLWEB_DOMAIN|ROOT_DOMAIN"
|
||||
ROOT_DOMAIN: ${ROOT_DOMAIN}
|
||||
API_DOMAIN: api.${ROOT_DOMAIN}
|
||||
DLWEB_DOMAIN: dlapi.${ROOT_DOMAIN}
|
||||
WX_DOMAIN: wxapi.${ROOT_DOMAIN}
|
||||
depends_on:
|
||||
- api
|
||||
- dlweb
|
||||
|
||||
@@ -13,20 +13,20 @@ upstream wxserver_service {
|
||||
# =============================================
|
||||
# 域名路由模式 + SSL(Let's Encrypt 自动证书)
|
||||
#
|
||||
# 域名由 .env 文件中的 API_DOMAIN / DLWEB_DOMAIN / WX_DOMAIN 自动注入
|
||||
# 域名由 .env 文件中的 API_DOMAIN / DLWEB_DOMAIN 自动注入
|
||||
# 修改域名只需编辑 .env 然后 docker compose restart nginx
|
||||
#
|
||||
# ================== 微信域名配置指南 ==================
|
||||
#
|
||||
# .env 中配置的 3 个域名对应:
|
||||
# ${API_DOMAIN} → 网站1: game-docker/api
|
||||
# .env 中配置的 2 个域名对应:
|
||||
# ${API_DOMAIN} → 网站1: game-docker/api + wxserver(通过 /wx/ 前缀路由转发)
|
||||
# ${DLWEB_DOMAIN} → 网站2: game-docker/dlweb/api
|
||||
# ${WX_DOMAIN} → 网站3: game-docker/wxserver_daoqi
|
||||
#
|
||||
# 【微信小程序后台】(mp.weixin.qq.com → 开发管理 → 开发设置)
|
||||
# - request 合法域名: https://${WX_DOMAIN}
|
||||
# - 业务域名: ${WX_DOMAIN}
|
||||
# (验证文件放到 wxserver_daoqi/public/MP_verify_xxx.txt)
|
||||
# - request 合法域名: https://${API_DOMAIN}
|
||||
# - 业务域名: ${API_DOMAIN}
|
||||
# (验证文件放到 api/ 根目录,小程序和公众号的 MP_verify_xxx.txt 均放这里)
|
||||
# wxserver 接口通过 ${API_DOMAIN}/wx/* 访问
|
||||
#
|
||||
# 【微信公众号后台】(mp.weixin.qq.com → 设置与开发 → 公众号设置)
|
||||
# - 业务域名: ${API_DOMAIN}
|
||||
@@ -110,6 +110,7 @@ server {
|
||||
|
||||
# wxserver 路由:/wx/ 前缀转发给 wxserver 容器,自动去除 /wx 前缀
|
||||
# 例:/wx/auth/oa/callback → wxserver:/auth/oa/callback
|
||||
# 例:/wx/api/login → wxserver:/api/login
|
||||
location /wx/ {
|
||||
proxy_pass http://wxserver_service/;
|
||||
proxy_set_header Host $host;
|
||||
@@ -119,6 +120,16 @@ server {
|
||||
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(所有其他请求)
|
||||
location / {
|
||||
proxy_pass http://api_service;
|
||||
@@ -150,25 +161,4 @@ server {
|
||||
}
|
||||
}
|
||||
|
||||
# ===== 网站3: 微信小程序后端 =====
|
||||
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";
|
||||
}
|
||||
}
|
||||
# 注:wxserver 不再独立占用域名,所有接口统一通过 api.xxx/wx/* 路由访问
|
||||
|
||||
39
codes/agent/game-docker/fix-lf.ps1
Normal file
39
codes/agent/game-docker/fix-lf.ps1
Normal 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
|
||||
@@ -48,9 +48,8 @@ if [ -z "$ROOT_DOMAIN" ]; then
|
||||
fi
|
||||
: ${API_DOMAIN:="api.${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
|
||||
COMPOSE_CMD="docker compose"
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user