spark-server/docs/popadmin-music-novels-deploy.md
DESKTOP-L8OUL9F\gfl0034 d3a68c3cad feat(music): 分类多对多、后台完整编辑与 OpenAPI
新增总/子分类与曲目绑定;playlist 可按 categoryId 筛选并返回分类树;
popadmin 支持行内改曲名/排序/上下架/会员开关与封面背景音频上传;文档同步。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 10:38:06 +08:00

83 lines
4.3 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.

# popadmin 音乐 / 小说 & sparkapi `/docs` 部署要点
## 1. spark-server(音乐 API + OpenAPI)
```bash
# 本机(Windows/WSL):构建并部署到新加坡机
make deploy
# 会:linux 交叉编译 → docker image → 上传 ECS → spark-migrate(含 0020_music / 0021_music_background / 0022_music_categories)→ 重启容器 → nginx reload
```
新加坡机手工补跑迁移(仅 image 已更新但 migrate 未跑时):
```bash
docker exec spark-server spark-migrate -config /app/configs/config.yaml
# 或 compose 目录下:docker compose run --rm spark-server spark-migrate -config /app/configs/config.yaml
sudo nginx -t && sudo nginx -s reload
# 确认 include 了 popadmin-spark-admin-locations.conf(含 music,client_max_body_size 55m)
```
### Admin JWT(必对齐,否则音乐列表登录循环)
`/api/admin/spark/music*` 经 nginx 反代到 spark-server,走 `AdminAuth`,必须与 Java popadmin 登录签发密钥一致:
| 侧 | 配置 |
|---|---|
| Java | `/etc/wyrs-admin/app.env` → `WYRS_ADMIN_JWT_SECRET`(未设则用 jar 默认 `...-production-2025`) |
| spark | `/data/spark-server/configs/config.yaml` → `admin.jwt_secret` 或 `SPARK_ADMIN_JWT_SECRET` |
注意:
- spark **prod** 会拒绝 jar 默认值 `wyrs-admin-jwt-secret-change-in-production-2025`(无法启动)。生产应两边写**同一套非默认**密钥;改后 `docker restart spark-server` + `systemctl restart wyrs-admin`,用户需重新登录一次。
- Java 签发算法为 **HS512**;spark `AdminAuth` **与** `popadmin-im`(`:8091`,`/api/admin/sg/*`、`/spark/im/*`)均需同时接受 HS512 / HS256。仅 HS256 时仪表盘轮询 `/sg/host-metrics` 会 401,前端 `api()` 清会话 → **全局登录循环**。
- 三处密钥须一致:`/etc/wyrs-admin/app.env` 的 `WYRS_ADMIN_JWT_SECRET`、`/etc/popadmin-im/env` 同名变量、spark `admin.jwt_secret`(或 `SPARK_ADMIN_JWT_SECRET`)。
症状:带 popadmin token 调 music 返回 `401` + `登录已失效` → 密钥不一致或算法不兼容;IM 等仍走 Java `:8090` 故可正常。
验证:
- `GET https://sparkapi.wyrs365.com/v1/music/playlist` → `code=0`,曲目含 `coverUrl` / `backgroundUrl`(可空)/ `audioUrl`
- `GET https://sparkapi.wyrs365.com/docs` → 可见 music / admin-music
- popadmin **重新登录**后「音乐列表」不再跳登录;`GET /api/admin/spark/music` → `200` + `success:true`
- popadmin「音乐列表」:封面 / **背景** / mp3 上传;`POST /api/admin/spark/music/{id}/background`
## 2. Aliyun wyrs-admin(popadmin 静态)
热更音乐背景图 UI(与现网一致):
```bash
# 源:spark-server/deploy/popadmin/popadmin.js(已含背景列与上传)
scp -i ~/.ssh/wyrs_shanghai_deploy.pem deploy/popadmin/popadmin.js \
root@47.236.66.9:/opt/wyrs-admin/static-override/popadmin.js
# 若 index 带 ?v= 缓存戳,同步 bump popadmin.index.html
```
新加坡若用 static-override,覆盖后强刷浏览器即可。
## 3. FullStoryNovel CMS(小说 iframe)
- 部署 `static/admin/admin.js`(`embed=1&from=popadmin` + postMessage SSO)
- 部署 nginx:去掉 `X-Frame-Options SAMEORIGIN`,改为
`Content-Security-Policy: frame-ancestors 'self' https://popadmin.wyrs365.com`
- 确认 `fullstorynovel.service` :8095 与 `adopt-ops-session` 可用
验证:popadmin →「小说内容管理」iframe 加载 novels;或新窗口打开 `https://admin.fullstorynovel.com/admin/`。
## 4. 设备登录文档(devices-client)
OpenAPI 已按 `Spark资源文档/devices-client.md` 更新契约。
**当前 Go 实现仍为旧登录**(Body 必填客户端 `device_id`、字符串 `device_type`,JWT 无 `aid`)。上线新契约前需改 auth/login、JWT、meta 枚举。
## 5. Demo 曲目(可选)
仓库旁 `_demo_music/`:`tracks.json` + `01..10.mp3/png` + `upload_demo.py`。
背景图**可空**,demo **不强制**补背景;脚本勿删已有曲目(仅 POST 新建)。背景可用 upload_backgrounds.py 补传。
```bash
# 在新加坡机(或可访问 popadmin 登录与 spark admin API 的环境)
export SPARK_ADMIN_BASE=http://127.0.0.1:18080
export POPADMIN_LOGIN=http://127.0.0.1:8090/api/admin/auth/login
python3 upload_demo.py
curl -sS https://sparkapi.wyrs365.com/v1/music/playlist | jq '.data.items|length,.data.items[0]|{title,coverUrl,backgroundUrl,audioUrl}'
```