feat: switch config to JSONC + split secrets.json
Load business config as JSONC (comments + trailing commas) via an in-repo stripper then stdlib json — no new deps. Default path prefers config.jsonc, falls back to legacy config.json. Auth write-back targets only sibling secrets.json so JSONC comments are never wiped; secrets overlay merges on load. Examples, compose, Docker, docs, favsort and tools all share the same loader. Phase A only — no DB settings migration.
This commit was merged in pull request #4.
This commit is contained in:
1 parent
b4f0f45c4e
commit
8e7ead1669
21 files changed
+652
-182
No files matched your search
@@ -167,7 +167,7 @@ uv run python app.py
|
||||
|
||||
# 生成 7 天预览库并启动预览
|
||||
uv run python tools/seed_preview_db.py --days 7
|
||||
uv run python app.py serve --preview --config data/preview/config.json
|
||||
uv run python app.py serve --preview --config data/preview/config.jsonc
|
||||
```
|
||||
|
||||
- 首页默认“最新动态”:标题下显示「收录视频 N」,顶部四个数据卡片为「今日入库 / 播放增量 / 7 日粉丝变化 / 数据日期」(前三项可点击跳转);下方为最近发布、增长动态、热度速览三个区块,统一使用竖排卡片(封面 + 两行截断标题 + 作者/数据行 + 高亮数据行),并统一为响应式网格(移动端每行 2 个、PC 每行 3 个),每处各取前 6 条;采集状态等运行期信息只在登录后的「系统」页可见;有候选且已登录时,首页显示「N 条候选待确认」提示条(访客不显示);
|
||||
@@ -231,7 +231,7 @@ uv run python tools/import_fans_csv.py --csv E:\Downloads\history.csv --replace
|
||||
- 如果数据库里已有晚于 CSV 末尾的记录,`--replace` 会拒绝执行;确认要删除时才加 `--allow-lossy-replace`;只想补齐 CSV 日期并保留后续采集时用 `--force`;
|
||||
- 页面的“日增”只在存在前一天数据时计算,跨多天不会标成日增;
|
||||
- 写入前建议先备份 `data/app.db`,例如 `data/backup/app-pre-fans-YYYYMMDD.db`;
|
||||
- 容器内运行时用 `--db /data/app.db` 或 `--config /config/config.json`,避免默认去找 `/app/config.json`。
|
||||
- 容器内运行时用 `--db /data/app.db` 或 `--config /config/config.jsonc`,避免默认去找 `/app/config.jsonc`。
|
||||
|
||||
## 访问统计与真实来源 IP
|
||||
|
||||
@@ -251,17 +251,19 @@ uv run python tools/import_fans_csv.py --csv E:\Downloads\history.csv --replace
|
||||
- 三种来源(直连 EIP / Cloudflare / EdgeOne)的完整 nginx 配置、网段刷新脚本与
|
||||
配置项说明见 [`deploy/nginx/README.md`](deploy/nginx/README.md)。
|
||||
|
||||
`config.json` 中的 `web.track` 控制统计行为:`enabled` / `header_order` /
|
||||
`config.jsonc` 中的 `web.track` 控制统计行为:`enabled` / `header_order` /
|
||||
`trusted_proxies` / `count_bots` / `flush_seconds` / `keep_days` /
|
||||
`max_hits_per_ip_path_per_day`;默认过滤常见爬虫 UA、每分钟落库、保留 180 天。
|
||||
|
||||
## 快速部署(Docker)
|
||||
|
||||
仓库根目录已包含 `Dockerfile`、`compose.example.yml`、`.dockerignore` 和 `config.docker.example.json`。Compose 文件是示例,需要显式指定:
|
||||
仓库根目录已包含 `Dockerfile`、`compose.example.yml`、`.dockerignore`、`config.docker.example.jsonc` 与 `secrets.example.json`。Compose 文件是示例,需要显式指定:
|
||||
|
||||
```powershell
|
||||
# 1. 准备服务器配置;至少填写 B 站 Cookie / Telegram,并保留 /data 绝对路径
|
||||
Copy-Item config.docker.example.json config.json
|
||||
# 1. 准备服务器配置:业务 JSONC + 无注释凭据文件;保留 /data 绝对路径
|
||||
Copy-Item config.docker.example.jsonc config.jsonc
|
||||
Copy-Item secrets.example.json secrets.json
|
||||
# 编辑 secrets.json 填入 B 站 Cookie / Telegram / web.auth_token
|
||||
|
||||
# 2. 构建并后台启动
|
||||
docker compose -f compose.example.yml up -d --build
|
||||
@@ -278,11 +280,11 @@ Copy-Item compose.example.yml compose.yml
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
- 容器执行 `python app.py --config /config/config.json`,同时运行只读 Web、调度和 Telegram;
|
||||
- `config.json` 挂载到 `/config/config.json`,`data/` 挂载到 `/data/`;
|
||||
- 服务器配置需使用 `web.host = 0.0.0.0` 并设置 `web.auth_token`,否则服务拒绝启动;
|
||||
- 容器执行 `python app.py --config /config/config.jsonc`,同时运行只读 Web、调度和 Telegram;
|
||||
- `config.jsonc` 与 `secrets.json` 挂到 `/config/`,`data/` 挂到 `/data/`;
|
||||
- 服务器配置需使用 `web.host = 0.0.0.0`,并在 `secrets.json` 设置 `web.auth_token`,否则服务拒绝启动;
|
||||
- `storage.database_path` 使用 `/data/app.db`,`storage.backup_dir` 使用 `/data/backup`;
|
||||
- 首次部署可先在本地执行 `uv run python app.py auth --account read` 扫码,再把生成好的 `config.json` 放到服务器;
|
||||
- 首次部署可先在本地执行 `uv run python app.py auth --account read` 扫码(只回写 `secrets.json`),再把 `config.jsonc` + `secrets.json` 放到服务器;
|
||||
- 也可在容器内扫码:`docker compose -f compose.example.yml run --rm board python app.py auth --account read --no-browser`,终端会打印 ASCII 二维码;PNG 仍写在临时文件路径,可用 `docker cp` 取出;
|
||||
- 镜像包含 `tools/`,可直接在容器内执行 `python tools/import_fans_csv.py ...` 回填粉丝历史;
|
||||
- 数据卷包含数据库、备份与预览库,建议定期备份 `/data`。
|
||||
@@ -293,20 +295,26 @@ docker compose up -d --build
|
||||
docker build -t reaction-board .
|
||||
docker run -d --name reaction-board --restart unless-stopped `
|
||||
-p 8080:8080 `
|
||||
-v ${PWD}/config.json:/config/config.json `
|
||||
-v ${PWD}/config.jsonc:/config/config.jsonc `
|
||||
-v ${PWD}/secrets.json:/config/secrets.json `
|
||||
-v ${PWD}/data:/data `
|
||||
reaction-board
|
||||
```
|
||||
|
||||
## 配置
|
||||
|
||||
复制样例配置,并填写 B 站账号信息:
|
||||
复制样例:业务配置用 JSONC(支持 `//` / `/* */` 注释与尾逗号),凭据单独放无注释的 `secrets.json`:
|
||||
|
||||
```powershell
|
||||
Copy-Item config.example.json config.json
|
||||
Copy-Item config.example.jsonc config.jsonc
|
||||
Copy-Item secrets.example.json secrets.json
|
||||
```
|
||||
|
||||
`config.json` 已被 `.gitignore` 忽略,**不得提交**。配置必须使用双账号格式:
|
||||
`config.jsonc` / `secrets.json`(以及旧名 `config.json`)已被 `.gitignore` 忽略,**不得提交**。
|
||||
默认启动优先读 `config.jsonc`,若不存在则回落 `config.json`(旧单体文件仍可用)。
|
||||
`python app.py auth` **只回写** `secrets.json`,不会冲掉 JSONC 注释。
|
||||
|
||||
凭据文件双账号格式:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -338,7 +346,7 @@ Copy-Item config.example.json config.json
|
||||
所有命令建议通过 `uv run` 执行:
|
||||
|
||||
```powershell
|
||||
# 查看全部命令;无需 config.json
|
||||
# 查看全部命令;无需配置文件
|
||||
uv run bili-fav help
|
||||
|
||||
# 为写账号扫码登录与检查状态(认证入口统一在 app.py)
|
||||
@@ -386,7 +394,7 @@ uv run python app.py auth-check --account all
|
||||
- 更新 `SESSDATA`、`bili_jct`、`DedeUserID`、`sid` 等身份字段;
|
||||
- 保留 `buvid3`、`buvid4`、`_uuid`、`buvid_fp` 等设备指纹;
|
||||
- 将选中账号的 `csrf` 同步为新的 `bili_jct`,并从 `nav` 回写该账号实际 mid;
|
||||
- 原子写入 `config.json`,并保留 `config.json.bak`;
|
||||
- 原子写入 `secrets.json`,并保留 `secrets.json.bak`(主配置 JSONC 不被改写);
|
||||
- 通过 `x/web-interface/nav` 验证新登录态,失败时自动回滚;不会修改另一个账号。
|
||||
|
||||
常用选项:
|
||||
@@ -459,7 +467,7 @@ uv run python tests/test_cli.py # CLI 离线路径
|
||||
## 运行期文件
|
||||
|
||||
```text
|
||||
config.json.bak 最近一次 auth 更新前的配置备份
|
||||
secrets.json.bak 最近一次 auth 更新前的凭据备份
|
||||
data/plan-<media_id>.json 排序计划、顺序快照和元数据缓存
|
||||
data/journal-<media_id>.jsonl 排序执行日志
|
||||
data/app.db SQLite 数据库(视频、快照、粉丝、黑名单、历史收藏夹)
|
||||
@@ -467,7 +475,7 @@ data/backup/app-YYYYMMDD.db 每日快照后的 SQLite 备份
|
||||
data/backup/app-pre-v*.db 数据库迁移前的自动备份
|
||||
data/backup/app-pre-fans-*.db 粉丝历史回填前的手动备份
|
||||
data/preview/app.db 合成预览数据库(不提交)
|
||||
data/preview/config.json 无凭据的预览配置(不提交)
|
||||
data/preview/config.jsonc 无凭据的预览配置(不提交)
|
||||
```
|
||||
|
||||
## 文档索引
|
||||
|
||||
Reference in new issue
Block a user