Move reverse proxy docs to PWA_NPS.md for NPS setup; remove bundled nginx config.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-12 15:04:43 +08:00
parent 21400700c5
commit 90e77f8f70
6 changed files with 420 additions and 335 deletions
+12 -36
View File
@@ -140,50 +140,26 @@ SKIP_PYTORCH=1 bash deploy.sh deps
下载过程中出现 `Retrying... Read timed out` 属于正常重试,**并非卡死**,请耐心等待 10-30 分钟。 下载过程中出现 `Retrying... Read timed out` 属于正常重试,**并非卡死**,请耐心等待 10-30 分钟。
### 0.7 PWA 安装 App HTTPS 反向代理 ### 0.7 PWA 安装 App(需 HTTPS
| 访问方式 | 浏览器行为 | | 访问方式 | 浏览器行为 |
|----------|------------| |----------|------------|
| `http://IP:5683` | 只能「快捷方式 / 添加到主屏幕」**不能**系统级一键安装 | | `http://内网IP:5683` | 只能「快捷方式 / 添加到主屏幕」 |
| `https://IP``https://域名` | Chrome/Edge 可弹出 **「安装 Trading Studio」**,独立窗口运行 | | `https://域名`(经云服务器反代) | Chrome/Edge 可 **「安装 Trading Studio」** |
**原因:** PWA 规范要求 **HTTPS 安全上下文**`localhost` 除外)。局域网直连 HTTP 是正常现象,不是代码 bug 内网 HTTP 直连无法一键安装 App,这是浏览器 PWA 安全策略,不是程序缺陷
#### 推荐方案:Nginx + 自签证书(纯局域网) **反向代理不在本仓库代码中配置。** 若你使用 **云服务器 + NPS 内网穿透**(或其它反代方案),请阅读独立教程:
```bash 👉 **[PWA_NPS.md](./PWA_NPS.md)** — 云服务器 HTTPS 反代 + NPS 穿透到 `5683` 的完整步骤
cd /opt/Trading_Studio
bash server-update.sh # 或 git pull
# 1. 安装 Nginx 要点摘要:
sudo apt install -y nginx
# 2. 生成自签 SSL(替换为你的服务器局域网 IP) 1. 内网物理机 PM2 监听 `5683` 即可
sudo bash scripts/gen_ssl_cert.sh 192.168.8.100 2. NPS 将 `127.0.0.1:5683` 穿透到云服务器
3. 云服务器用已有 Nginx/面板配置 **HTTPS 域名** 反代到 NPS 端口
# 3. 启用站点配置 4. 反代须透传 **WebSocket**Gradio 必需)
sudo cp nginx/trading_studio.conf /etc/nginx/sites-available/trading_studio.conf 5. 用户通过 `https://你的域名` 访问后再安装 App
sudo ln -sf /etc/nginx/sites-available/trading_studio.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# 4. 确保 Gradio 仍由 PM2 监听 127.0.0.1:5683(仅本机),外网只走 443
pm2 restart trading_studio
```
**访问:** `https://192.168.8.100`(首次需在手机/平板点「高级 → 继续访问」信任证书)
**安装 App**
- 电脑 Chrome:地址栏出现 ⊕ 安装图标,或点页面「安装 App」按钮
- 安卓 Chrome:菜单 → 安装应用
- iPad/iPhone Safari:分享 → 添加到主屏幕(iOS 无系统安装弹窗,但 HTTPS 下体验更完整)
#### 有公网域名时
在 Nginx 前加 [Let's Encrypt](https://letsencrypt.org/) 免费证书(`certbot`),可免信任自签证书步骤。
#### 无反向代理时的替代
HTTP 下点击「安装 App」会显示手动引导;桌面快捷方式仍可用,功能不受影响。
--- ---
+187
View File
@@ -0,0 +1,187 @@
# PWA 安装 App 教程 — 云服务器反代 + NPS 内网穿透
Trading Studio 的 Gradio 服务跑在**内网物理机** `0.0.0.0:5683`
要通过浏览器 **「安装 App」**(而非仅快捷方式),用户访问的地址必须是 **HTTPS**
本教程面向:**云服务器做 HTTPS 反向代理 + NPS 穿透到内网 3060Ti 机器** 的架构。
**不在 Trading Studio 代码仓库内捆绑任何 Nginx/Caddy 配置文件**,反代在你自己的云服务器 / NPS 面板中完成。
---
## 一、为什么 HTTP 只能快捷方式?
| 访问地址 | 安装表现 |
|----------|----------|
| `http://内网IP:5683` | 仅「添加快捷方式 / 创建快捷方式」 |
| `https://你的域名`(经云服务器) | Chrome/Edge 可 **「安装 Trading Studio」** |
PWA 要求 **安全上下文(HTTPS**。内网直连 HTTP 是浏览器限制,与项目代码无关。
---
## 二、推荐架构
```
手机 / 平板 / 电脑
▼ https://studio.example.com (云服务器:SSL 证书 + 反代)
云服务器 Nginx / Caddy / 面板反代
▼ NPS 隧道(TCP 或 HTTP 代理)
内网 3060Ti 物理机
PM2 → Gradio 0.0.0.0:5683
```
要点:
1. **内网机**:只跑 `pm2`,监听 `5683`,无需在云服务器上装 PyTorch。
2. **NPS**:把内网 `5683` 映射到云服务器某一端口,或做 HTTP 域名转发。
3. **云服务器**:对外提供 **HTTPS 域名**,反代到 NPS 暴露的地址。
4. **用户永远用 HTTPS 域名访问**,不要用 `http://IP:5683` 装 App。
---
## 三、内网物理机(Trading Studio
确保服务正常:
```bash
cd /opt/Trading_Studio
pm2 status
# 应看到 trading_studio 运行中,监听 5683
curl -I http://127.0.0.1:5683
```
`config.py` 中保持:
```python
HOST = "0.0.0.0"
PORT = 5683
```
Ollama 等仍走局域网 `.env` 配置,与穿透无关。
---
## 四、NPS 客户端配置(内网机)
在 NPS **客户端**(npc)新增隧道,将本机 Gradio 暴露给服务端。常见两种方式:
### 方式 A:TCP 隧道(简单)
| 配置项 | 示例值 |
|--------|--------|
| 类型 | TCP |
| 内网目标 | `127.0.0.1:5683` |
| 服务端端口 | 如 `25683`(云服务器上监听) |
云服务器反代目标:`http://127.0.0.1:25683`
### 方式 B:HTTP 代理 / 域名模式(推荐,若 NPS 面板支持)
| 配置项 | 示例值 |
|--------|--------|
| 类型 | HTTP 代理 |
| 内网目标 | `127.0.0.1:5683` |
| 自定义域名 | `studio.example.com`(需在云解析到云服务器 IP |
此时 HTTPS 可在 NPS 服务端或上层 Nginx 终止,按你现有 NPS 面板习惯配置即可。
> 不同 NPS 版本面板字段名略有差异,核心都是:**外网请求 → NPS → 内网 5683**。
---
## 五、云服务器 HTTPS 反向代理
在**云服务器**(已安装 SSL 证书)上配置反代。以下为**示例**,请按你现有环境(宝塔 / 1Panel / 手写 Nginx)调整,**勿复制到 Trading Studio 仓库**。
### Nginx 示例(仅文档参考)
```nginx
server {
listen 443 ssl http2;
server_name studio.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
client_max_body_size 200M;
location / {
# TCP 隧道时指向 NPS 映射端口;HTTP 模式时指向 NPS 提供的 upstream
proxy_pass http://127.0.0.1:25683;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}
```
**Gradio 必须开启 WebSocket 透传**`Upgrade` / `Connection` 头),否则页面能开但交互/上传会失败。
### 证书
- 有域名:Let's Encrypt / 云厂商免费证书均可。
- 仅 IP:部分浏览器 PWA 安装仍要求可信证书,**强烈建议绑定域名**。
---
## 六、验证穿透与 HTTPS
1. 内网机:`curl http://127.0.0.1:5683` 返回 200
2. 云服务器:`curl http://127.0.0.1:25683`NPS 映射端口)正常
3. 外网浏览器:`https://studio.example.com` 能打开 Trading Studio
4. 地址栏为 **🔒 安全**(非「不安全」)
---
## 七、安装 App(各端)
配置好 HTTPS 域名后:
| 设备 | 操作 |
|------|------|
| Windows Chrome / Edge | 地址栏 **⊕ 安装**,或点击页面 **「安装 App」** |
| 安卓 Chrome | 菜单 → **安装应用** |
| iPad / iPhone Safari | 分享 → **添加到主屏幕**iOS 无 Chrome 式安装弹窗,但 HTTPS 下可全屏独立运行) |
若仍只能快捷方式,检查:
- [ ] 是否仍用 `http://` 或内网 IP 访问
- [ ] 证书是否有效、是否混合内容报错
- [ ] NPS / 反代是否透传 WebSocket
- [ ] 浏览器 DevTools → Application → Manifest 是否加载成功
---
## 八、安全建议
1. **不要**将 `5683` 直接端口映射到公网而不加鉴权;至少使用 HTTPS + 强密码或 IP 白名单。
2. NPS 服务端与客户端使用强密钥,定期更换。
3. 云服务器防火墙仅开放 443 / NPS 必要端口。
4. Trading Studio 处理交易录音,建议域名 + HTTPS + 访问控制。
---
## 九、HTTP 内网直连(不装 App)
局域网内 `http://192.168.x.x:5683` 可正常使用全部功能,仅 **PWA 安装** 受限。
点击页面「安装 App」会提示需 HTTPS;功能不受影响。
---
## 相关文档
- 内网部署:`DEPLOY.md`
- 服务器更新:`bash server-update.sh`
+220 -219
View File
@@ -1,219 +1,220 @@
# Trading Studio # Trading Studio
**本地量化交易复盘 → B 站长视频配音生产流水线** **本地量化交易复盘 → B 站长视频配音生产流水线**
Trading Studio 是一套运行在 Ubuntu 物理服务器(RTX 3060 Ti)上的自动化配音系统,专为数字资产量化交易员设计。通过「盲录碎碎念 → 本地 GPU 识别 → 局域网大模型严厉润色 → 本地 GPU 声音克隆」的闭环,高效产出 B 站反思类长视频配音,辅助交易纪律的自我进化。 Trading Studio 是一套运行在 Ubuntu 物理服务器(RTX 3060 Ti)上的自动化配音系统,专为数字资产量化交易员设计。通过「盲录碎碎念 → 本地 GPU 识别 → 局域网大模型严厉润色 → 本地 GPU 声音克隆」的闭环,高效产出 B 站反思类长视频配音,辅助交易纪律的自我进化。
**Git 仓库:** https://git.bz121.com/dekun/Trading_Studio.git **Git 仓库:** https://git.bz121.com/dekun/Trading_Studio.git
--- ---
## 系统定位 ## 系统定位
| 环节 | 技术栈 | 运行位置 | | 环节 | 技术栈 | 运行位置 |
|------|--------|----------| |------|--------|----------|
| 碎碎念录音转写 | Faster-Whisper (CUDA float16) | 本地 3060 Ti | | 碎碎念录音转写 | Faster-Whisper (CUDA float16) | 本地 3060 Ti |
| 纪律审判式润色 | Gemma4 Abliterated @ Ollama | 局域网 `192.168.8.64` | | 纪律审判式润色 | Gemma4 Abliterated @ Ollama | 局域网 `192.168.8.64` |
| 固定音色配音 | ChatTTS (CUDA) | 本地 3060 Ti | | 固定音色配音 | ChatTTS (CUDA) | 本地 3060 Ti |
| Web 中控 | Gradio | 端口 **5683** | | Web 中控 | Gradio | 端口 **5683** |
--- ---
## 架构说明 ## 架构说明
``` ```
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────┐
│ Gradio 中控 (app.py:5683) │ │ Gradio 中控 (app.py:5683) │
├──────────────┬──────────────────────┬───────────────────────┤ ├──────────────┬──────────────────────┬───────────────────────┤
│ 音色锁定 │ 音频识别 │ 润色 + 合成 │ │ 音色锁定 │ 音频识别 │ 润色 + 合成 │
│ tts_service │ whisper_service │ llm_service │ │ tts_service │ whisper_service │ llm_service │
│ │ │ tts_service │ │ │ │ tts_service │
└──────┬───────┴──────────┬───────────┴──────────┬────────────┘ └──────┬───────┴──────────┬───────────┴──────────┬────────────┘
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
speaker_emb.pt Faster-Whisper Ollama HTTP speaker_emb.pt Faster-Whisper Ollama HTTP
(本地持久化) CUDA / small 192.168.8.64:11434 (本地持久化) CUDA / small 192.168.8.64:11434
gemma-4-abliterated gemma-4-abliterated
``` ```
### 模块解耦 ### 模块解耦
| 文件 | 职责 | | 文件 | 职责 |
|------|------| |------|------|
| `config.py` | Ollama 地址、模型名、Prompt、路径等全局配置 | | `config.py` | Ollama 地址、模型名、Prompt、路径等全局配置 |
| `whisper_service.py` | Faster-Whisper CUDA 转写 | | `whisper_service.py` | Faster-Whisper CUDA 转写 |
| `llm_service.py` | 远程 Ollama HTTP 非流式润色 | | `llm_service.py` | 远程 Ollama HTTP 非流式润色 |
| `tts_service.py` | ChatTTS 音色提取与 wav 合成 | | `tts_service.py` | ChatTTS 音色提取与 wav 合成 |
| `app.py` | Gradio 前端与流程编排 | | `app.py` | Gradio 前端与流程编排 |
--- ---
## 快速开始 ## 快速开始
> 完整环境配置请参阅 [DEPLOY.md](./DEPLOY.md) > 完整环境配置请参阅 [DEPLOY.md](./DEPLOY.md)
### 一键部署(生产环境推荐) ### 一键部署(生产环境推荐)
**root** 用户部署到 `/opt/Trading_Studio` 并由 PM2 常驻: **root** 用户部署到 `/opt/Trading_Studio` 并由 PM2 常驻:
```bash ```bash
sudo -i sudo -i
git clone https://git.bz121.com/dekun/Trading_Studio.git /opt/Trading_Studio git clone https://git.bz121.com/dekun/Trading_Studio.git /opt/Trading_Studio
cd /opt/Trading_Studio cd /opt/Trading_Studio
chmod +x deploy.sh chmod +x deploy.sh
bash deploy.sh bash deploy.sh
``` ```
浏览器访问:`http://<服务器IP>:5683` 浏览器访问:`http://<服务器IP>:5683`
日常更新: 日常更新:
```bash ```bash
cd /opt/Trading_Studio && bash deploy.sh update cd /opt/Trading_Studio && bash deploy.sh update
``` ```
### 手动部署(开发调试) ### 手动部署(开发调试)
```bash ```bash
git clone https://git.bz121.com/dekun/Trading_Studio.git /opt/Trading_Studio git clone https://git.bz121.com/dekun/Trading_Studio.git /opt/Trading_Studio
cd /opt/Trading_Studio cd /opt/Trading_Studio
python3 -m venv venv python3 -m venv venv
source venv/bin/activate source venv/bin/activate
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install -r requirements.txt pip install -r requirements.txt
python app.py python app.py
``` ```
--- ---
## 使用流程 ## 使用流程
### 首次使用:锁定音色 ### 首次使用:锁定音色
1. 进入 **「音色锁定」** 标签页 1. 进入 **「音色锁定」** 标签页
2. 上传 10-30 秒干净人声参考(你的碎碎念盲录样本) 2. 上传 10-30 秒干净人声参考(你的碎碎念盲录样本)
3. (可选)填写参考音频的精确转写,提升 zero-shot 还原度 3. (可选)填写参考音频的精确转写,提升 zero-shot 还原度
4. 点击 **锁定音色** → 生成 `speaker_emb.pt` 4. 点击 **锁定音色** → 生成 `speaker_emb.pt`
### 日常生产 ### 日常生产
**方式 A — 分步操作:** **方式 A — 分步操作:**
1. **音频极速识别**:上传复盘录音 → Whisper 转写 1. **音频极速识别**:上传复盘录音 → Whisper 转写
2. **Gemma4 纪律审判**:一键润色,生成逻辑清晰、语气严厉的反思稿 2. **Gemma4 纪律审判**:一键润色,生成逻辑清晰、语气严厉的反思稿
3. **ChatTTS 合成**:输出 24kHz `.wav` 成品配音 3. **ChatTTS 合成**:输出 24kHz `.wav` 成品配音
**方式 B — 一键生产:** **方式 B — 一键生产:**
上传录音后点击 **启动全流程**,系统自动串联三步。 上传录音后点击 **启动全流程**,系统自动串联三步。
--- ---
## 核心配置(config.py ## 核心配置(config.py
| 配置项 | 默认值 | | 配置项 | 默认值 |
|--------|--------| |--------|--------|
| 中控端口 | `5683``0.0.0.0` 局域网可访问) | | 中控端口 | `5683``0.0.0.0` 局域网可访问) |
| Ollama 地址 | `http://192.168.8.64:11434` | | Ollama 地址 | `http://192.168.8.64:11434` |
| 模型名称 | `huihui_ai/gemma-4-abliterated:e4b` | | 模型名称 | `huihui_ai/gemma-4-abliterated:e4b` |
| Whisper 模型 | `small` / CUDA / float16 | | Whisper 模型 | `small` / CUDA / float16 |
| 音色文件 | `speaker_emb.pt` | | 音色文件 | `speaker_emb.pt` |
| 音频输出 | `outputs/` 目录 | | 音频输出 | `outputs/` 目录 |
--- ---
## PM2 守护运行 ## PM2 守护运行
标准路径 `/opt/Trading_Studio`root 用户: 标准路径 `/opt/Trading_Studio`root 用户:
```bash ```bash
# 一键部署 + PM2 启动(推荐) # 一键部署 + PM2 启动(推荐)
cd /opt/Trading_Studio && bash deploy.sh cd /opt/Trading_Studio && bash deploy.sh
# 或手动 PM2 # 或手动 PM2
pm2 start ecosystem.config.js pm2 start ecosystem.config.js
# 常用管理 # 常用管理
pm2 status pm2 status
pm2 logs trading_studio pm2 logs trading_studio
bash deploy.sh restart # 重启 bash deploy.sh restart # 重启
bash deploy.sh update # 拉代码 + 更新依赖 + 重启 bash deploy.sh update # 拉代码 + 更新依赖 + 重启
pm2 save && pm2 startup # 开机自启(deploy.sh 已自动配置) pm2 save && pm2 startup # 开机自启(deploy.sh 已自动配置)
``` ```
--- ---
## .gitignore 配置 ## .gitignore 配置
提交 Git 时请确保忽略以下产物(已在 `.gitignore` 中预设): 提交 Git 时请确保忽略以下产物(已在 `.gitignore` 中预设):
```gitignore ```gitignore
venv/ venv/
*.wav *.wav
*.pt *.pt
*.log *.log
uploads/ uploads/
outputs/ outputs/
``` ```
**说明:** **说明:**
- `venv/` — Python 虚拟环境,每台机器独立创建 - `venv/` — Python 虚拟环境,每台机器独立创建
- `*.wav` — 录音与合成音频,体积大且含隐私 - `*.wav` — 录音与合成音频,体积大且含隐私
- `*.pt` — ChatTTS 音色 Embedding 与模型权重 - `*.pt` — ChatTTS 音色 Embedding 与模型权重
- `*.log` — 运行日志 - `*.log` — 运行日志
--- ---
## 目录结构 ## 目录结构
``` ```
Trading_Studio/ Trading_Studio/
├── deploy.sh # 一键部署脚本(/opt + PM2 ├── deploy.sh # 一键部署脚本(/opt + PM2
├── app.py # Gradio 主入口 ├── app.py # Gradio 主入口
├── config.py # 全局配置 ├── config.py # 全局配置
├── whisper_service.py # Whisper CUDA 识别 ├── whisper_service.py # Whisper CUDA 识别
├── llm_service.py # Ollama 远程润色 ├── llm_service.py # Ollama 远程润色
├── tts_service.py # ChatTTS 音色与合成 ├── tts_service.py # ChatTTS 音色与合成
├── ecosystem.config.js # PM2 守护配置 ├── ecosystem.config.js # PM2 守护配置
├── requirements.txt # Python 依赖 ├── requirements.txt # Python 依赖
├── README.md # 本文件 ├── README.md # 本文件
├── DEPLOY.md # 部署指南(含一键部署教程) ├── DEPLOY.md # 部署指南(含一键部署教程)
├── .gitignore ├── PWA_NPS.md # 云服务器反代 + NPS 穿透 + PWA 安装教程
├── speaker_emb.pt # 音色文件(运行时生成,不入库) ├── .gitignore
├── uploads/ # 上传临时目录 ├── speaker_emb.pt # 音色文件(运行时生成,不入库)
── outputs/ # 合成 wav 输出 ── uploads/ # 上传临时目录
``` └── outputs/ # 合成 wav 输出
```
**生产标准路径:** `/opt/Trading_Studio`
**生产标准路径:** `/opt/Trading_Studio`
---
---
## 硬件要求
## 硬件要求
- **GPU** NVIDIA RTX 3060 Ti8GB 显存,建议锁定 120W 功耗墙)
- **系统** Ubuntu 22.04 / 24.04 LTS - **GPU** NVIDIA RTX 3060 Ti8GB 显存,建议锁定 120W 功耗墙)
- **CUDA** 12.1+(与 PyTorch cu121 匹配) - **系统:** Ubuntu 22.04 / 24.04 LTS
- **局域网:** 可访问 `192.168.8.64:11434` 的 Ollama 节点 - **CUDA** 12.1+(与 PyTorch cu121 匹配)
- **局域网:** 可访问 `192.168.8.64:11434` 的 Ollama 节点
---
---
## 常见问题
## 常见问题
**Q: Whisper 报 CUDA 错误?**
A: 确认 `nvidia-smi` 正常,且未同时运行其他占显存任务。Whisper 使用 `float16` 已针对 8GB 优化。 **Q: Whisper 报 CUDA 错误?**
A: 确认 `nvidia-smi` 正常,且未同时运行其他占显存任务。Whisper 使用 `float16` 已针对 8GB 优化。
**Q: Ollama 连接失败?**
A: 在服务器上执行 `curl http://192.168.8.64:11434/api/tags` 验证连通性,确认模型已 `ollama pull` **Q: Ollama 连接失败?**
A: 在服务器上执行 `curl http://192.168.8.64:11434/api/tags` 验证连通性,确认模型已 `ollama pull`
**Q: TTS 音色不稳定?**
A: 重新锁定音色,填写参考音频精确转写,并保持 `temperature=0.3` 低随机性。 **Q: TTS 音色不稳定?**
A: 重新锁定音色,填写参考音频精确转写,并保持 `temperature=0.3` 低随机性。
**Q: 合成音频为空或噪声?**
A: 检查润色文本长度(过短可能导致异常),确认 `speaker_emb.pt` 存在且有效。 **Q: 合成音频为空或噪声?**
A: 检查润色文本长度(过短可能导致异常),确认 `speaker_emb.pt` 存在且有效。
---
---
## License
## License
Private — 仅供个人量化交易复盘使用。
Private — 仅供个人量化交易复盘使用。
+1 -1
View File
@@ -239,7 +239,7 @@ PWA_HEAD = """
function manualInstallGuide() { function manualInstallGuide() {
var httpWarn = ""; var httpWarn = "";
if (!isSecure()) { if (!isSecure()) {
httpWarn = "<div class='pwa-modal-warn'><strong>⚠️ 当前为 HTTP 访问</strong><br>浏览器只能创建<strong>快捷方式</strong>,无法弹出系统级「安装 App」。<br>要一键安装,请配置 <strong>HTTPS 反向代理</strong>服务器 DEPLOY.md。</div>"; httpWarn = "<div class='pwa-modal-warn'><strong>⚠️ 当前为 HTTP 访问</strong><br>浏览器只能创建<strong>快捷方式</strong>,无法弹出系统级「安装 App」。<br>请通过 <strong>HTTPS 域名</strong>服务器反代 + NPS 穿透)访问,详见 <strong>PWA_NPS.md</strong>。</div>";
} }
var steps = isIOS() var steps = isIOS()
? "<ol><li>点击 Safari 底部分享按钮 <strong>□↑</strong></li><li>选择 <strong>「添加到主屏幕」</strong></li><li>点击 <strong>添加</strong></li></ol>" ? "<ol><li>点击 Safari 底部分享按钮 <strong>□↑</strong></li><li>选择 <strong>「添加到主屏幕」</strong></li><li>点击 <strong>添加</strong></li></ol>"
-45
View File
@@ -1,45 +0,0 @@
# Trading Studio — Nginx HTTPS 反向代理
# 将 https://你的域名或IP 转发到本机 Gradio 5683
#
# 安装步骤见 DEPLOY.md「PWA 安装与 HTTPS」
# HTTP 自动跳转 HTTPS(可选,不需要可删除此 server 块)
server {
listen 80;
listen [::]:80;
server_name trading.local _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name trading.local _;
# 自签证书路径(先用 scripts/gen_ssl_cert.sh 生成)
ssl_certificate /etc/nginx/ssl/trading_studio.crt;
ssl_certificate_key /etc/nginx/ssl/trading_studio.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
client_max_body_size 200M;
location / {
proxy_pass http://127.0.0.1:5683;
proxy_http_version 1.1;
# Gradio WebSocket 必需
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}
-34
View File
@@ -1,34 +0,0 @@
#!/usr/bin/env bash
# 生成本地 HTTPS 自签证书(局域网 PWA 安装用)
# 用法: sudo bash scripts/gen_ssl_cert.sh [服务器局域网IP]
set -euo pipefail
SERVER_IP="${1:-}"
SSL_DIR="/etc/nginx/ssl"
KEY="${SSL_DIR}/trading_studio.key"
CRT="${SSL_DIR}/trading_studio.crt"
if [[ "${EUID:-0}" -ne 0 ]]; then
echo "请使用 root: sudo bash scripts/gen_ssl_cert.sh 192.168.x.x"
exit 1
fi
if [[ -z "${SERVER_IP}" ]]; then
SERVER_IP=$(hostname -I | awk '{print $1}')
echo "[INFO] 未指定 IP,使用: ${SERVER_IP}"
fi
mkdir -p "${SSL_DIR}"
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout "${KEY}" \
-out "${CRT}" \
-subj "/CN=TradingStudio/O=Trading/C=CN" \
-addext "subjectAltName=IP:${SERVER_IP},DNS:trading.local,DNS:localhost"
chmod 600 "${KEY}"
echo "[OK] 证书已生成:"
echo " ${CRT}"
echo " ${KEY}"
echo ""
echo "手机/平板首次访问 HTTPS 需点「继续访问」信任自签证书,之后即可安装 App。"