修复小程序wxapi 的依赖全部改成 api
This commit is contained in:
@@ -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 活动/图片资源
|
||||||
|
|||||||
@@ -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/` 开头的请求会被反向代理到 wxserver(Node.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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -13,20 +13,20 @@ upstream wxserver_service {
|
|||||||
# =============================================
|
# =============================================
|
||||||
# 域名路由模式 + SSL(Let's Encrypt 自动证书)
|
# 域名路由模式 + SSL(Let'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";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
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
|
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"
|
||||||
|
|||||||
@@ -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