From 59fd36f8959faa2b3545d115efa2ec46eb65c5c3 Mon Sep 17 00:00:00 2001 From: poiuy Date: Sun, 12 Jul 2026 20:20:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- my-daily/QUICKSTART.md | 25 ++++++ my-daily/README.md | 184 ++++++++++++++++++++++++++++++----------- 2 files changed, 161 insertions(+), 48 deletions(-) diff --git a/my-daily/QUICKSTART.md b/my-daily/QUICKSTART.md index c7e656d..537545d 100644 --- a/my-daily/QUICKSTART.md +++ b/my-daily/QUICKSTART.md @@ -61,6 +61,31 @@ python start.py Get-Content logs\*.log -Tail 50 ``` +## 代码同步(Gitea) + +```powershell +# 修改代码后,同步到 Gitea 代码库 +git add . +git commit -m "修改说明" +git push +``` + +## Docker 部署 + +```bash +# 1. 准备配置 +mkdir -p docker/prompts docker/data docker/logs +cp .env docker/.env +cp config.json docker/config.json +cp -r prompts/* docker/prompts/ + +# 2. 构建并启动 +docker compose up -d --build + +# 3. 查看日志 +docker compose logs -f +``` + ## 配置要点 - **抓取间隔**:`.env` 中 `FETCH_INTERVAL_MINUTES=30`(每 30 分钟) diff --git a/my-daily/README.md b/my-daily/README.md index a7484df..a307c91 100644 --- a/my-daily/README.md +++ b/my-daily/README.md @@ -1,6 +1,6 @@ # 军事科技每日资讯推送系统 -基于大模型的军事/科技新闻采集、评分、整合与推送系统。自动抓取 RSS 订阅源,经 LLM 评分筛选与实体聚类后,生成日报并推送到飞书群。 +基于大模型的军事/科技新闻采集、评分、整合与推送系统。自动抓取 RSS 订阅源,经 LLM 评分筛选与实体聚类后,生成日报并推送到飞书群,同时提供 Web 归档站点浏览历史推送。 ## 系统架构 @@ -10,6 +10,7 @@ │ RSS 抓取 → 中英翻译 → LLM 评分 → 硬约束过滤 → 动态阈值 │ │ → 实体提取 + 角度分类 → 实体归一化 → 实体聚类 │ │ → 广告过滤 → 缓存 → 簇热度计算 → 即时推送(≥90 分) │ +│ → 自动清理过期缓存(60 天) │ └──────────────────┬────────────────────────────────────────────┘ ↓ ┌───────────────────────────────────────────────────────────────┐ @@ -19,6 +20,12 @@ │ 推送 2: 📰 军事科技每日精选(单篇视图) │ │ 网摘 Top3 + 分类概览(5 类 × 5 条) │ │ 推送 3: 🖼️ 网摘图片(PNG 合并长图,图床上传后推送) │ +└──────────────────┬────────────────────────────────────────────┘ + ↓ +┌───────────────────────────────────────────────────────────────┐ +│ Web 归档站点(http://0.0.0.0:8080) │ +│ 按日期浏览历史推送:簇视图 + 单篇视图 + 网摘图片 │ +│ 支持分类筛选、全文搜索、评分排序 │ └───────────────────────────────────────────────────────────────┘ ``` @@ -32,8 +39,10 @@ | 簇热度 | 四维评分(最高分 + 传播 + 角度 + 优先)+ LLM 精评融合,热度簇提升为热点 | | 簇记忆 | SQLite 持久化已推送簇 ID,24h 内同簇不重复推送 | | 广告过滤 | 四层防御纵深(tag 黑名单 → 动态阈值 → 空角度 → 空实体) | -| 增量缓存 | SQLite 三级缓存(文章/网摘/分类摘要),二次运行几乎零 token 消耗 | +| 增量缓存 | SQLite 三级缓存(文章/网摘/分类摘要),60 天自动清理,二次运行几乎零 token 消耗 | | 飞书推送 | 即时热点推送(≥90 分)+ 每日早报三波(热点速览 + 每日精选 + 网摘图片) | +| Web 归档 | Flask 站点,按日期浏览历史推送,支持分类筛选和全文搜索 | +| 日志系统 | 终端输出实时写入 `logs/YYYYMMDD-HHmmSS.log`,`[管线]`/`[Web]` 前缀区分来源 | | 双视角洞察 | LLM 一次调用输出精炼摘要 + 结构化洞察(事件脉络/多角度分析/影响与展望) | | 分类概览 | 5 类军事新闻分类(装备技术/地区安全/军事改革/产业观察/其他热点),每类 top 5 | | 网摘图片 | PIL 渲染网摘为 PNG 合并长图,自适应高度 + 动态文本换行,图床 API 上传后推送飞书 | @@ -42,12 +51,30 @@ ## 快速开始 +> 详细指南见 [QUICKSTART.md](QUICKSTART.md) + ### 环境要求 -- Python 3.10+ +- Python 3.10+(或 Docker) - 能访问 OpenAI 兼容 API(DeepSeek / 火山引擎 / OpenAI 等) -### 安装 +### Docker 部署(推荐) + +```bash +# 1. 准备配置 +mkdir -p docker/prompts docker/data docker/logs +cp .env docker/.env +cp config.json docker/config.json +cp -r prompts/* docker/prompts/ + +# 2. 构建并启动 +docker compose up -d --build + +# 3. 访问 Web 归档站点 +# http://localhost:8080 +``` + +### 本地安装 ```bash # 1. 进入项目目录 @@ -159,6 +186,48 @@ python main.py [options] ## 部署 +### Docker(推荐,适用于绿联云 NAS / 任何 Linux 主机) + +```bash +# 1. 准备配置目录 +mkdir -p docker/prompts docker/data docker/logs +cp .env docker/.env +cp config.json docker/config.json +cp -r prompts/* docker/prompts/ + +# 2. 构建并启动 +docker compose up -d --build + +# ── 运维 ────────────────────────────────────── +docker compose logs -f # 查看实时日志 +docker compose restart # 重启 +docker compose down # 停止并删除容器 +docker compose up -d --build # 更新代码后重建并启动 +``` + +#### 镜像导出(本地打包 → NAS 导入) + +```bash +# 本地构建并导出 +docker compose build +docker save -o military-digest.tar my-daily-military-digest:latest + +# NAS 上导入 +docker load -i military-digest.tar +# 使用 docker-compose.nas.yml 启动 +docker compose -f docker-compose.nas.yml up -d +``` + +#### 文件映射 + +| NAS 目录 | 容器内路径 | 用途 | +|----------|-----------|------| +| `docker/.env` | `/app/.env` | API Key、Webhook | +| `docker/config.json` | `/app/config.json` | 调度、评分参数 | +| `docker/prompts/` | `/app/prompts/` | LLM 提示词 | +| `docker/data/` | `/app/data/` | 运行时数据 | +| `docker/logs/` | `/app/logs/` | 运行日志 | + ### Linux(systemd) ```bash @@ -181,9 +250,11 @@ scripts\setup_service.bat uninstall # 卸载计划任务 ### Docker(推荐,适用于绿联云 NAS / 任何 Linux 主机) ```bash -# 1. 准备目录和配置 -mkdir -p docker/data docker/cache +# 1. 准备配置目录 +mkdir -p docker/prompts docker/data docker/logs cp .env docker/.env +cp config.json docker/config.json +cp -r prompts/* docker/prompts/ # 2. 构建并启动 docker compose up -d --build @@ -195,40 +266,29 @@ docker compose down # 停止并删除容器 docker compose up -d --build # 更新代码后重建并启动 ``` -#### 目录结构(Docker 部署) - -``` -my-daily/ -├── docker/ # Docker 持久化目录 -│ ├── .env # 配置文件(API Key, Webhook 等) -│ ├── data/ # 运行时数据(fetch/push/image 文件) -│ └── cache/ # SQLite 缓存(避免重复消费 API) -├── Dockerfile # 镜像构建文件 -├── docker-compose.yml # Docker Compose 配置 -└── .dockerignore # 构建忽略文件 -``` - -#### 在绿联云 NAS 上的操作 +#### 镜像导出(本地打包 → NAS 导入) ```bash -# 方案 A:SSH 直接操作(NAS 开启 SSH 后) -# 将 my-daily 目录上传到 NAS,进入目录执行: -docker compose up -d --build +# 本地构建并导出 +docker compose build +docker save -o military-digest.tar my-daily-military-digest:latest -# 方案 B:绿联云 Docker 管理器(图形界面) -# 1. 在本机构建镜像并导出: -docker save -o military-digest.tar military-digest:latest - -# 2. 将 tar 文件上传到 NAS -# 3. 在绿联云 Docker > 镜像管理 > 导入镜像 -# 4. 创建容器时挂载卷: -# - /path/to/docker/.env → /app/.env(只读) -# - /path/to/docker/data → /app/data -# - /path/to/docker/cache → /app/cache -# 5. 设置重启策略:always -# 6. 启动容器 +# NAS 上导入 +docker load -i military-digest.tar +# 使用 NAS 专用配置启动 +docker compose -f docker-compose.nas.yml up -d ``` +#### 文件映射 + +| NAS 目录 | 容器内路径 | 用途 | +|----------|-----------|------| +| `docker/.env` | `/app/.env` | API Key、Webhook | +| `docker/config.json` | `/app/config.json` | 调度、评分参数 | +| `docker/prompts/` | `/app/prompts/` | LLM 提示词 | +| `docker/data/` | `/app/data/` | 运行时数据 | +| `docker/logs/` | `/app/logs/` | 运行日志 | + ## 运维工具 | 脚本 | 平台 | 功能 | @@ -253,15 +313,28 @@ python scripts/check_sources.py --concurrency 20 # 自定义并发数 ## 数据与输出 +``` +data/ +├── fetch/ # fetch-YYYY-MM-DD.json(当日抓取结果) +├── hotalert/ # hotalert-YYYYMMDD-HHmmSS.md(即时推送快讯) +├── cluster/ # cluster-YYYYMMDD-HHmmSS.md(热点速览) +├── digest/ # digest-YYYYMMDD-HHmmSS.md(每日精选) +├── images/ # 网摘 PNG 图片 +│ └── YYYYMMDD/ +│ ├── webzine_{N}_{timestamp}.png +│ └── webzine_combined_{timestamp}.png +└── cache/ # article_cache.db(SQLite) +``` + | 目录/文件 | 说明 | 保留策略 | |-----------|------|:---:| -| `data/fetch-YYYY-MM-DD.json` | 当日 Fetch 结果(含评分、摘要) | 7 天 | -| `data/hotalert-YYYYMMDD-HHmmSS.md` | 军事科技快讯(即时推送) | 7 天 | -| `data/cluster-YYYYMMDD-HHmmSS.md` | 热点速览(簇视图推送) | 7 天 | -| `data/digest-YYYYMMDD-HHmmSS.md` | 军事科技每日精选(单篇视图推送) | 7 天 | -| `data/images/YYYYMMDD/` | 网摘 PNG 图片 | 7 天 | -| `data/article_cache.db` | SQLite 三级缓存(文章/网摘/分类摘要) | 7 天自动清理 | -| `logs/YYYYMMDD-HHmmSS.log` | 运行日志(终端输出完整记录) | 手动清理 | +| `data/fetch/` | 当日 Fetch 结果(含评分、摘要) | 7 天 | +| `data/hotalert/` | 军事科技快讯(即时推送) | 7 天 | +| `data/cluster/` | 热点速览(簇视图推送) | 7 天 | +| `data/digest/` | 军事科技每日精选(单篇视图推送) | 7 天 | +| `data/images/` | 网摘 PNG 图片 | 7 天 | +| `data/cache/` | SQLite 缓存(文章/簇记忆/反馈) | 60 天自动清理 | +| `logs/` | 运行日志(YYYYMMDD-HHmmSS.log) | 手动清理 | ## 评价管线详解 @@ -424,17 +497,18 @@ clamp[clamp_min, clamp_max] ```text my-daily/ ├── main.py # 入口 + 双循环架构 -├── start.py # 一键启动(含日志记录) +├── start.py # 一键启动(管线 + Web + 日志) ├── config.json # 用户配置(不入库) ├── .env # API 密钥(不入库) ├── config.json.example # 配置模板 ├── .env.example # 环境变量模板 ├── requirements.txt # Python 依赖 +├── QUICKSTART.md # 快速上手指南 ├── CONFIG.md # 配置参数完整说明 ├── Dockerfile # Docker 镜像构建 -├── docker-compose.yml # Docker Compose 配置 +├── docker-compose.yml # Docker Compose 配置(本地) +├── docker-compose.nas.yml # Docker Compose 配置(NAS 部署) ├── .dockerignore # Docker 构建忽略 -├── logs/ # 运行日志(YYYYMMDD-HHmmSS.log) ├── prompts/ # LLM 提示词(10 个) │ ├── score_batch.md # 批量评分 │ ├── digest.md # RSS Digest 生成 @@ -497,13 +571,24 @@ my-daily/ │ └── sections/ # 内容板块 │ ├── rss/section.py # RSS Digest 板块 │ └── webzine/section.py # 网摘生成板块 -├── CHANGELOG.md # 更新日志 -├── PROGRESS.md # 开发进展追踪 -└── README.md # 本文件 +├── web_archive/ # Web 归档站点 +│ ├── server.py # Flask 应用 +│ ├── data_parser.py # 数据解析 +│ ├── static/ # 静态资源 +│ └── templates/ # HTML 模板 +├── templates/ # 推送模板 +│ ├── cluster_view.md # 簇视图模板 +│ ├── article_view.md # 单篇视图模板 +│ └── immediate_push.md # 即时推送模板 +├── CHANGELOG.md # 更新日志 +└── README.md # 本文件 ``` ## 常见问题 +**Q: 如何在 NAS 上部署?** +A: 推荐使用 Docker 部署。本地构建镜像导出 → 上传到 NAS 导入 → 使用 `docker-compose.nas.yml` 启动。详见上方「部署 → Docker」章节。 + **Q: 为什么英文源抓不到文章?** A: 英文军事源(如 The War Zone、Defense One)更新频率低,可能 2-3 天无新文章。中文微信公众号源更新频繁,扩大 `--lookback` 可覆盖更多时间窗口。 @@ -513,5 +598,8 @@ A: OPML 文件管理为主。临时追加用 `config.json` 的 `sources.add`, **Q: 如何修改定时计划?** A: 在 `.env` 中设置 `FETCH_INTERVAL_MINUTES`(拉取间隔)和 `PUSH_CRON`(推送定时,cron 表达式),重启服务即可生效。 +**Q: 如何查看运行日志?** +A: 本地运行:`logs/` 目录下按时间戳命名的日志文件。Docker 运行:`docker compose logs -f` 或查看 `docker/logs/` 目录。 + **Q: 内存/CPU 占用如何?** A: 异步抓取 + 并发控制(默认 10 并发),翻译/评分均分批处理。137 源全量抓取峰值内存约 200MB,日常运行稳定在 100MB 以内。 \ No newline at end of file