Files
fj/run.md
T
selfreleaseandDevin 6329f3f6b4 feat: 分享传播与经文纸水墨背景
- 分享按钮:系统分享 + 二维码卡片(qr.png),移动端移入播放行不再遮挡标题
- og 分享卡片元数据 + og.png 封面;beforeinstallprompt 安装提示
- robots.txt / sitemap.xml / poster.png 传播物料
- .sutra-paper 宣纸底纹:桌面 bg.jpg,移动端竖版 bg-m.jpg,夜间模式罩层适配
- 移动端设置区重排为双列标签网格

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-05 14:30:43 +08:00

86 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 运行手册 · 经典诵读站点
## 技术栈
| 项 | 版本 / 说明 |
|---|---|
| 前端 | 原生 HTML + CSS + JS(无框架、无构建),PWA(manifest + sw.js,安装后无地址栏) |
| 后端 | Python 3 标准库 `http.server`(无第三方依赖)[Native] |
| TTS | 千问 `qwen3-tts-flash`,走 DashScope 兼容接口 `/api/v1/services/aigc/multimodal-generation/generation` |
| 经文数据 | `sutras/*.json` 外置数据文件,目录实时扫描,加经不改代码 |
| 背景音乐 | `bgm/` 目录音频文件循环播放(前端淡入淡出),deploy.sh 随 `sutras/` 一并同步 |
| 传播资源 | `og.png` 分享卡片图、`qr.png` 二维码、`poster.png` 海报、`bg.jpg` 经文底纹、`robots.txt`/`sitemap.xml` |
| 后台面板 | 连点页脚提示 6 次唤出,`GET /api/stats` 返回运行统计(访客 IP 取 X-Forwarded-For 末位) |
## 首次准备
```bash
cd "/Users/freedak/Documents/AIDashboard/心经"
cp .env.example .env # 填入真实 DASHSCOPE_API_KEY
```
`.env` 变量:`DASHSCOPE_API_KEY`(必填)、`DASHSCOPE_BASE`、`TTS_MODEL`、`PORT`(默认 8000)。
## 应用启停
```bash
# 启动 [Native]
python3 server.py
# 打开 http://127.0.0.1:8000
# 停止:Ctrl+C
```
## 接口
- `POST /api/tts`,请求体 `{"text": "...", "voice": "Cherry"}`(≤800 字),返回 `audio/wav` 字节流;合成结果缓存在 `cache/` 目录(sha256(模型|音色|文本) 为键,原子写入,重启不丢、跨用户共享)。
- `GET /api/sutras`,返回 `{"sutras": [{id, name, cat, order}]}`,实时扫描 `sutras/` 目录。
- 静态文件由同一端口托管;经文正文走 `GET sutras/<id>.json`。
## 经文管理(加减经典)
经文为外置数据,**增删不需要改任何代码、不需要重启服务**:
```bash
./add_sutra.sh sutras/新经.json # 加经:校验 JSON → 上传 → 接口验证
./add_sutra.sh --remove daodejing # 减经:按文件名或 JSON 内 id 字段匹配删除
```
JSON 字段:`id`(唯一,对应文件名)、`order`(下拉排序)、`name`、`cat`(佛经/道家,决定下拉分组)、`title`、`seal`(印章文字)、`translator`、`source`、`sourceUrl`、`pageSize`(每页段数)、`segments`(数组,项为 `{h?, g?, t}`:h=段标题、 g=小注、t=正文,t 必填且 ≤800 字)。
注意:
- 校验不过(缺字段/空段/超 800 字)会被脚本拒绝,不会上传坏数据
- 删经后其 TTS 缓存 WAV 留在 `cache/` 无害
- 新经的 TTS 缓存首次播放时才生成(预热见下)
## 排错
| 现象 | 原因 | 处理 |
|---|---|---|
| 页面报"未配置 DASHSCOPE_API_KEY" | `.env` 缺失或键名不对 | 检查 `.env` |
| 502 / TTS 服务返回 4xx | 密钥失效、音色与模型不匹配 | 换音色或核对密钥 |
| 浏览器播放无声 | 系统静音 / 自动播放策略 | 点击播放按钮触发 |
## 端口表
| 服务 | 端口 |
|---|---|
| 本地 Web + API | 8000(`.env` 的 `PORT` 可改) |
| 线上应用 | 8018(127.0.0.1,仅经 nginx 反代) |
## 部署备份
**线上部署**(2026-09-28 已上线):
- 域名:`https://fj.all8ai.top`(HTTP 301 → HTTPS,Let's Encrypt 证书自动续期)
- 服务器:`154.8.162.18`(OpenCloudOS 9.4),应用目录 `/opt/fj`
- 进程:`systemctl status|restart fj`(`/etc/systemd/system/fj.service`,Restart=always)
- 反代:`/etc/nginx/conf.d/fj.conf` → `http://127.0.0.1:8018`(与 gugong/bs 等站点并存,互不冲突)
- 环境变量:服务器上 `/opt/fj/.env`(`PORT=8018`、密钥等,不入 Git,也不被 deploy.sh 覆盖)
- 更新发布:一键 `./deploy.sh`(同步前端+`server.py`+`sutras/` 目录(--delete)→ 重启 `fj.service` → 健康检查 https://fj.all8ai.top)。密码登录用 `FJ_PASS=xxx ./deploy.sh`(需本机 sshpass);已配 SSH key 则直接 `./deploy.sh`。**注意**:`.env` 不在同步列表内,服务器端 `PORT=8018` 不会被本地 `PORT=8000` 覆盖
- 只加/减单部经:用 `./add_sutra.sh`(更快,无需重启服务)
**TTS 缓存预热**:服务器上曾有 `/tmp/fj_warm.py` 一次性把全部经 × 2 音色合成进 `cache/`。新经如需预热可复用该脚本模式(遍历 segments × Seren/Ethan 调本机 `127.0.0.1:8018/api/tts`,已缓存自动跳过)。
备份:`cache/` 可删(自动重建);`/opt/fj` 目录 + `fj.service` + `fj.conf` 为全部恢复所需。