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:
bot-ci committed 2026-11-02 12:58:20 +08:00
1 parent b4f0f45c4e
commit 8e7ead1669
21 files changed
+652 -182

No files matched your search

+26 -18
View File
@@ -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 无凭据的预览配置(不提交)
```
## 文档索引