refactor: 移除自签名证书方案,服务只跑 HTTP

麦克风安全上下文改由部署方案解决:本机用 localhost,
对外部署挂 HTTPS 反向代理。删除 certs/、gen-cert.sh、
/cert 路由与 HTTPS server 分支,文档同步更新。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-18 19:28:59 +08:00
parent 9be38aa44e
commit 5f7f68150e
11 changed files with 41 additions and 177 deletions

View File

@@ -11,11 +11,11 @@
|---|---|---|
| **拷贝的文件** | 整个 `calx/` 目录 | 见下方清单。`models/`(模型)建议一起拷,省下载 |
| **要装的软件** | Node.js、`ffmpeg``whisper-cpp` | 前者官网/brew后两者 `brew install` |
| **不用带** | `node_modules`(没有)`certs/`(新机自动生成) | 证书含本机 IP换机必须重新生成 |
| **不用带** | `node_modules`(没有) | 真·零依赖 |
必须一起迁移的文件清单:
```
index.html server.js bootstrap.sh start.sh gen-cert.sh
index.html server.js bootstrap.sh start.sh grammar/
models/ggml-small.bin (465MB必需)
models/ggml-base.bin (141MB可选更快)
README.md DEPLOY.md CLAUDE.md
@@ -32,15 +32,9 @@ cd calx
bash bootstrap.sh
```
脚本会自动:检查 Node → 装 `ffmpeg`/`whisper-cpp` → 补下模型(若缺)→ 生成自签证书 → 启动服务。
脚本会自动:检查 Node → 装 `ffmpeg`/`whisper-cpp` → 补下模型(若缺)→ 启动服务。
可反复运行,已装的会跳过。
启动后终端打印:
```
HTTP : http://localhost:8000 http://<本机IP>:8000
HTTPS: https://<本机IP>:8443
```
---
## 方式 B手动部署逐步
@@ -54,29 +48,23 @@ mkdir -p models && cd models
curl -L -o ggml-small.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin
cd ..
# 3. 生成证书 + 启动
bash gen-cert.sh
# 3. 启动
node server.js
```
---
## 各端怎么访问
## 怎么访问
### 💻 电脑本机
Chrome / Edge / Safari 打开 `http://localhost:8000` —— 麦克风直接可用,点「开始」授权即可。
### 💻 本机运行
Chrome / Edge / Safari 打开 `http://localhost:8000` —— 麦克风直接可用localhost 是浏览器认可的安全上下文),点「开始」授权即可。
### 📱 iPhone / iPad要用语音 → 必须 HTTPS + 信任证书,一次性
> iOS 只有在「HTTPS + 受信任证书」下才允许网页用麦克风,这是苹果硬限制。用 **Safari** 完成
### 🌐 对外部署(其它设备访问
浏览器只在**安全上下文**HTTPS 或 localhost里放行麦克风。把服务挂在支持 HTTPS 的反向代理nginx / Caddy / 云平台均可)后面,其余零改动
1. 手机与电脑连**同一 Wi-Fi**(或你的远程方案能到 `8443` 端口)。
2. Safari 打开 `https://<电脑IP>:8443/cert` → 下载描述文件(提示不受信任,继续)。
3. **设置 → 通用 → VPN 与设备管理** → 安装 `calx-local`
4. **设置 → 通用 → 关于本机 → 证书信任设置** → 打开对 `calx-local` 的**完全信任**。
5. Safari 打开 `https://<电脑IP>:8443/` → 点「开始」→ **允许麦克风** → 全程免手。
### 🤖 安卓 / 其它
Chrome 打开 `https://<电脑IP>:8443/`,首次会警告证书不受信 → 「高级 → 继续前往」→ 允许麦克风。
```
浏览器 ──HTTPS──> 反向代理 ──HTTP──> node server.js (:8000)
```
---
@@ -87,13 +75,10 @@ Chrome 打开 `https://<电脑IP>:8443/`,首次会警告证书不受信 →
WHISPER_MODEL=models/ggml-base.bin node server.js
# 改端口
PORT=8000 HTTPS_PORT=8443 node server.js
# 电脑 IP 变了(换网络) → 证书失效,重新生成,手机重做信任步骤
bash gen-cert.sh
PORT=8000 node server.js
```
前端玩法参数(读题开关 / 限时秒数 / 随机题数 / 错题加权 / 静音检测灵敏度)在 `index.html` 顶部 `CONFIG`,或游戏首页「⚙️ 家长设置」里改常用项。
前端玩法参数(读题开关 / 限时秒数 / 口诀范围 / 随机题数 / 错题加权 / 抢答参数 / 静音检测灵敏度)在 `index.html` 顶部 `CONFIG`,或游戏首页「⚙️ 家长设置」里改常用项。
---
@@ -101,8 +86,7 @@ bash gen-cert.sh
| 现象 | 原因 / 处理 |
|---|---|
| 点「开始」不弹麦克风授权 | 不是 HTTPS或 iOS 证书没「完全信任」→ 重做 iOS 第 2~4 步 |
| iOS 证书装了仍拦麦克风 | 证书 SAN 的 IP 与访问 IP 不一致 → `bash gen-cert.sh` 后重装证书 |
| 点「开始」不弹麦克风授权 | 不是安全上下文:本机用 `http://localhost:8000`;对外部署走 HTTPS 反向代理 |
| 识别没反应 / 不准 | 看服务端日志有无 `[stt] … -> "xxx"``/health``modelExists` 应为 true环境别太吵、吐字清楚 |
| `whisper-cli: command not found` | `brew install whisper-cpp` |
| `ffmpeg: command not found` | `brew install ffmpeg` |
@@ -111,7 +95,6 @@ bash gen-cert.sh
## 验证部署是否成功
```bash
curl -s http://localhost:8000/health # {"ok":true,...,"modelExists":true}
curl -sk https://localhost:8443/health # 同上(自签名用 -k
curl -s http://localhost:8000/health # {"ok":true,...,"modelExists":true}
```
`modelExists:true` + 两个端口都返回 = 部署成功。
`modelExists:true` = 部署成功。