BettaFish icon indicating copy to clipboard operation
BettaFish copied to clipboard

会混淆前次的报告,重启docker启动服务后后,也会继续前次报告

Open lowpair opened this issue 1 month ago • 11 comments

环境使用docker安装的; 前几个研究似乎正常,新的报告时,会混淆前次报告的内容,按 https://github.com/666ghj/BettaFish/issues/371 清空了各engine下面的报告,重新启动docker启动服务后,又继续上次的报告进行查询反思生成,无法停止无法重新进行新研究。

lowpair avatar Nov 18 '25 06:11 lowpair

你的问题是由于 Docker 挂载的宿主机目录(如 insight_engine_streamlit_reportsmedia_engine_streamlit_reportsquery_engine_streamlit_reportsfinal_reports 等)没有被彻底清理,导致 BettaFish 重启后依然会加载旧的报告文件作为输入,混淆新旧数据。Report Engine 的启动和报告生成流程会自动检测这些目录中的最新文件,并以此为基线判断是否有新报告要生成。如果这些目录里还留有旧的 .md 或 .json 文件,系统就会继续用它们做新报告,出现你描述的“无法停止、无法重新进行新研究”的现象相关代码实现

解决建议:

  1. 在宿主机上彻底清空以下目录的所有文件(不仅仅是 engine 目录,还包括 logs、final_reports 及所有挂载的报告目录):
    • insight_engine_streamlit_reports
    • media_engine_streamlit_reports
    • query_engine_streamlit_reports
    • final_reports
    • logs(如 logs/report_baseline.jsonlogs/report.log
  2. 清理后再重启 Docker 服务,确保所有引擎重新生成新的报告文件,Report Engine 才会以全新的输入开始分析。
  3. 如果有数据库挂载(如 Postgres),也要确认没有旧的任务或报告状态残留在数据库中。

代码层面优化建议:

  • 可以在 Report Engine 启动新任务时,增加自动清理或重置这些输入目录和基线文件的逻辑,确保不会用到旧数据。
  • 只有所有前置引擎的输出文件都已更新且状态为“完成”时,才允许 Report Engine 启动分析,避免提前用到旧报告相关讨论

如需进一步定位,可以查看 logs/report.log 是否有异常或加载失败的记录,辅助判断是否有未清理的旧文件或状态。

To reply, just mention @dosu.


How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other  Join Discord Share on X

dosubot[bot] avatar Nov 18 '25 07:11 dosubot[bot]

下载最新代码并 docker compose up -d 还是出现运行之前的分析,应该是数据库里面的旧数据。 如何确认没有旧的任务或报告状态残留在数据库中? 必须要把整个docker的bettafish全部删除再重新下载吗?

lowpair avatar Nov 18 '25 07:11 lowpair

你不需要删除整个 Docker 的 BettaFish 或重新下载,只需清理数据库里的旧任务和报告状态即可。

BettaFish 的任务和报告状态主要存储在数据库的 crawling_tasksdaily_topics 表中(还有 daily_newstopic_news_relation 等辅助表)相关表结构。项目自带数据库管理脚本,可以直接在容器里运行,支持预览和清理旧数据,无需重装 Docker:

  1. 进入 BettaFish 项目目录,找到 MindSpider/schema/db_manager.py

  2. 在 Docker 容器或宿主机(确保有 Python 环境和依赖)运行:

    python MindSpider/schema/db_manager.py --tables      # 查看所有表和记录数
    python MindSpider/schema/db_manager.py --recent 30   # 查看最近30天的数据
    python MindSpider/schema/db_manager.py --cleanup 30  # 预览将清理30天前的数据(不会实际删除)
    python MindSpider/schema/db_manager.py --cleanup 30 --execute  # 真正删除30天前的旧数据
    

    你可以根据实际需要调整天数,比如 --cleanup 1 --execute 表示只保留最近一天的数据。

  3. 清理后重启 Docker 服务即可,系统会以全新状态开始分析,无需重装或删除整个容器。

如果你只想彻底清空所有历史数据,也可以直接在数据库里执行 TRUNCATE 或 DELETE 操作,重点是 crawling_tasksdaily_topics 表,但推荐用项目自带脚本更安全脚本详情

这样可以精准清理旧任务和报告状态,不影响系统和代码本身。

To reply, just mention @dosu.


How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other  Join Discord Share on X

dosubot[bot] avatar Nov 18 '25 07:11 dosubot[bot]

python MindSpider/schema/db_manager.py --tables 会提示 : 数据库连接失败: No module named 'psycopg'

默认取得config不对?修改逻辑走mysql后,出现无法访问: "Can't connect to MySQL server on 'db' ([Errno 111] Connection refused)")

lowpair avatar Nov 18 '25 08:11 lowpair

你的两个报错分别说明了依赖和配置问题:

  1. No module named 'psycopg' 是因为你当前 Python 环境没有安装 PostgreSQL 驱动 psycopg(或 psycopg2),而 db_manager.py 默认用的是 PostgreSQL 连接方式。解决方法:在你运行 db_manager.py 的环境里执行 pip install psycopg(或 pip install psycopg2 也可)即可相关说明

  2. 如果你切换到 MySQL,出现 "Can't connect to MySQL server on 'db' ([Errno 111] Connection refused)",通常是 MySQL 服务没启动、端口没映射、服务名写错,或网络不通。请检查:

    • Docker Compose 里的 db 服务是否用的是 mysql:8.0 镜像,并且已启动(docker compose ps 查看状态)。
    • .env 或环境变量里的 DB_HOST 是否为 dbDB_PORT 是否为 3306DB_DIALECT 是否为 mysql,用户名、密码、库名与 MySQL 服务一致配置参考
    • 运行 pip install pymysql,确保 Python 环境有 MySQL 驱动。
    • 如果端口被占用或宿主机端口没映射,检查 docker-compose.yml 里的端口映射(如 3306:3306)。

项目目前推荐用 MySQL,记得 .envdocker-compose.yml 里的数据库配置要完全对应,且相关依赖(pymysql/psycopg)要在你运行脚本的 Python 环境里安装详细说明

如还有问题,可以贴下你的 .envdocker-compose.yml 配置,便于进一步定位。

To reply, just mention @dosu.


How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other  Join Discord Share on X

dosubot[bot] avatar Nov 18 '25 08:11 dosubot[bot]

关于 数据库连接失败: No module named 'psycopg'
可docker环境中执行 pip install "psycopg[binary]" 即可。

后续出现如下问题:

python MindSpider/schema/db_manager.py --tables

2025-11-18 08:47:47.123 | INFO | main:connect:45 - 成功连接到数据库: bettafish 2025-11-18 08:47:47.123 | INFO | main:show_tables:61 - ============================================================数据库表列表============================================================ Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 146, in init self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 449, in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 1263, in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 712, in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/impl.py", line 179, in _do_get with util.safe_reraise(): File "/usr/local/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py", line 146, in exit raise exc_value.with_traceback(exc_tb) File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/impl.py", line 177, in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 390, in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 674, in init self.__connect() File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 900, in __connect with util.safe_reraise(): File "/usr/local/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py", line 146, in exit raise exc_value.with_traceback(exc_tb) File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 896, in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/create.py", line 643, in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 621, in connect return self.loaded_dbapi.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psycopg/connection.py", line 120, in connect raise last_ex.with_traceback(None) psycopg.OperationalError: connection failed: connection to server at "172.19.0.2", port 3306 failed: Connection refused Is the server running on that host and accepting TCP/IP connections?

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/app/MindSpider/schema/db_manager.py", line 299, in main() File "/app/MindSpider/schema/db_manager.py", line 284, in main db_manager.show_tables() File "/app/MindSpider/schema/db_manager.py", line 63, in show_tables inspector = inspect(self.engine) ^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/inspection.py", line 140, in inspect ret = reg(subject) ^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py", line 312, in _engine_insp return Inspector._construct(Inspector._init_engine, bind) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py", line 245, in _construct init(self, bind) File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py", line 256, in _init_engine engine.connect().close() ^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 3278, in connect return self._connection_cls(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 148, in init Connection._handle_dbapi_exception_noconnection( File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 2442, in _handle_dbapi_exception_noconnection raise sqlalchemy_exception.with_traceback(exc_info[2]) from e File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 146, in init self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 449, in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 1263, in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 712, in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/impl.py", line 179, in _do_get with util.safe_reraise(): File "/usr/local/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py", line 146, in exit raise exc_value.with_traceback(exc_tb) File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/impl.py", line 177, in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 390, in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 674, in init self.__connect() File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 900, in __connect with util.safe_reraise(): File "/usr/local/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py", line 146, in exit raise exc_value.with_traceback(exc_tb) File "/usr/local/lib/python3.11/site-packages/sqlalchemy/pool/base.py", line 896, in __connect self.dbapi_connection = connection = pool._invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/create.py", line 643, in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 621, in connect return self.loaded_dbapi.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psycopg/connection.py", line 120, in connect raise last_ex.with_traceback(None) sqlalchemy.exc.OperationalError: (psycopg.OperationalError) connection failed: connection to server at "172.19.0.2", port 3306 failed: Connection refused Is the server running on that host and accepting TCP/IP connections? (Background on this error at: https://sqlalche.me/e/20/e3q8)

lowpair avatar Nov 18 '25 08:11 lowpair

你的数据库连接被拒绝,是因为配置文件中的数据库类型(DB_DIALECT)和端口(DB_PORT)不匹配,导致 psycopg(PostgreSQL 驱动)去连了 3306(MySQL 默认端口),而 3306 上没有 PostgreSQL 服务,所以报错 相关源码分析

请按以下步骤排查和修正:

  1. 检查 .env 文件(或环境变量),确保 DB_DIALECT 和 DB_PORT 配置与实际数据库一致:
    • 如果用 PostgreSQL,应该是:DB_DIALECT=postgresqlDB_PORT=5432
    • 如果用 MySQL,应该是:DB_DIALECT=mysqlDB_PORT=3306
  2. 检查 docker-compose.yml,确认 db 服务用的是哪个镜像(postgres 还是 mysql),以及端口映射是否正确。
  3. 确认数据库容器已启动并健康:docker compose ps,如未启动用 docker compose up -d
  4. .env 里的 DB_HOST 必须写成 db,不能用 127.0.0.1localhost,否则容器间无法通信 官方说明
  5. 如果你用的是 MySQL,务必安装 pymysql,如果用 PostgreSQL,务必安装 psycopg

只要保证数据库类型、端口、驱动、服务名完全一致,连接就会正常。如果还有问题,可以贴出你的 .envdocker-compose.yml 配置,便于进一步定位。详细配置参考

To reply, just mention @dosu.


How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other  Join Discord Share on X

dosubot[bot] avatar Nov 18 '25 08:11 dosubot[bot]

1,数据库的问题的确是配置的问题,建议文档中多放整套配置默认配置,例如整套的pg,整套的mysql,中间配置串了就出各种问题了 ~~

2,执行 python MindSpider/schema/db_manager.py --tables 看到数据库里面所有的表记录都是0,这就奇怪了,新下载的最新代码,docker里面也检查了数据库 的 crawling_tasks 和 daily_topics 表中(还有 daily_news、topic_news_relation 等辅助表) 都没有数据:

Image

那重启docker里面后,自动执行的上一次的 研究 的任务,从哪里来的呢??? 这数据总是串,是否ui页面上出一个操作按钮,来停止 当前任务/清空当前任务/新任务的方式会更好?

lowpair avatar Nov 18 '25 09:11 lowpair

启动后,循环一直停不下来~

lowpair avatar Nov 18 '25 09:11 lowpair

你遇到的“循环停不下来”问题,结合代码和社区讨论,主要原因是 BettaFish 的 Report Engine/Forum Engine 会自动检测日志和中间报告文件,只要检测到有“新内容”或日志持续增长,就会不断尝试生成报告或进入分析流程。如果前置引擎(如 Insight/Media/Query)有残留的日志、未清理的中间文件,或者某个引擎异常反复写日志,系统就会陷入循环,哪怕数据库和报告目录都是空的,也可能因为日志机制或状态未正确重置导致循环相关分析

排查和解决建议:

  1. 再次彻底清空所有 logs 目录(尤其是 insight.log、media.log、query.log、forum.log),以及所有 engine 的中间报告目录,确保没有任何旧的 .json/.md/.log 文件残留。
  2. 重启 Docker 服务前,确认所有容器都已完全停止(可用 docker compose down),并且宿主机挂载目录下的文件已清空。
  3. 启动后,观察 logs 目录下是否有日志持续增长,或某个引擎反复写入。如果有,说明有引擎未正常退出或有异常循环。
  4. 可以通过 API /api/stop/<app_name> 停止单个引擎(如 forum、insight、media、query),或直接在 UI/管理后台尝试“停止”操作(如果有按钮)。
  5. 如果循环依然存在,建议查看 logs 目录下的日志内容,定位是哪个引擎在反复触发任务或写入日志。

新版代码已优化了任务状态管理和报告生成流程,支持任务取消(如 /cancel/<task_id>),并在每次新任务时重置状态,避免旧状态串用相关PR。如果你用的是旧版,建议升级到最新代码。

如需彻底“重置”,可尝试:

  • 清空所有挂载目录(logs、engine_reports、final_reports 等)
  • 清空数据库(truncate 主要表)
  • 重启所有容器

这样系统会完全回到初始状态,不会再自动循环。如果还有问题,可以贴出 logs 目录下的关键日志片段,便于进一步定位。

To reply, just mention @dosu.


How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other  Join Discord Share on X

dosubot[bot] avatar Nov 18 '25 09:11 dosubot[bot]

无效,清空挂载目录,清空数据库,重启容器,均无效,不知道这个历史数据从哪里来的。

查看logs里面的日志,清空重启后,日志里面还是早上的历史记录,是从数据库里面恢复过来的信息? 但是数据库里面 python MindSpider/schema/db_manager.py --tables 显示的0记录。 @DoiiarX

lowpair avatar Nov 18 '25 10:11 lowpair