LMonitor 是一个基于 Django 的监控/采集平台,主要包含两类运行形态:
- Web 服务:提供 Dashboard 页面、认证、以及若干 API 与 Webhook 接口。
- 后台守护进程:从数据库读取监控任务,按任务类型分发到插件执行扫描/采集逻辑。
核心入口:
- Django 管理入口:manage.py
- Django 配置:settings.py(可选本地覆盖:settings_local.py.example)
- 路由定义:urls.py
LMonitor/:Django project 配置层- settings.py:数据库、静态资源、外部服务配置、线程配置(会尝试导入
settings_local.py做覆盖) - settings_local.py.example:本地覆盖示例(通常只放数据库等环境差异配置)
- urls.py:Web、API、Webhook 路由
wsgi.py/asgi.py:部署入口
- settings.py:数据库、静态资源、外部服务配置、线程配置(会尝试导入
botend/:核心业务 App(模型、后台任务、插件、Dashboard)- models.py:监控任务/采集结果/SimC 等数据模型
controller/:扫描插件体系(各类 monitor/scan)dashboard/:Dashboard 页面与 API(CRUD、SimC 相关)portal/:Portal 页面与 API(面向只读展示)webhook/:对外回调入口(如 gewechat、卦象等)management/commands/:自定义 Django 命令(后台守护进程、第三方初始化)
core/:通用能力(线程池、Chrome headless、单次 LLM 请求)- threadingpool.py
- glm.py
utils/:基础工具(日志、HTTP/浏览器请求封装等)- LReq.py
templates/、static/:Web 模板与静态资源- 脚本:
- webstart.sh:启动 Web(runserver 0.0.0.0:18000)
- start.sh、stop.sh:Linux 后台守护
- winstart.ps1:Windows 后台守护
路由集中在 urls.py:
- Dashboard 页面:
/dashboard/(入口视图在 dashboard.py) - 认证:
/auth/login/、/auth/register/、/auth/logout/、/auth/change-password/(视图在botend/dashboard/auth_views.py) - API:
/api/...(主要在 api.py) - Webhook:
/webhook/...(在botend/webhook/)
Web 服务以数据库为中心:Dashboard 展示与管理表数据;API 对部分业务能力提供程序化入口(例如 SimC 相关能力)。
后台入口为自定义 Django command:LMonitorCoreBackend.py,会调用 LMonitorCoreBackend。
核心调度逻辑位于 botend/views.py:
LMonitorCoreBackend:负责创建线程池并启动多个LMonitorCore.scan线程循环。LMonitorCore.scan:- 使用数据库表 MonitorTask 作为任务队列/配置源;
- 按
wait_time做最小间隔控制; - 根据
type映射到对应插件类并执行scan(target); - 请求能力通过 LReq 提供(可选 Chrome headless)。
并发控制:
- 线程池封装在 ThreadPool;
- 最大线程数、线程限制等参数来自 settings.py 的
THREADPOOL_MAX_THREAD_NUM、THREAD_LIMIT_NUM。
任务类型的映射定义在 config.py:
Monitor_Type_BaseObject_List[task.type]返回对应的扫描类- 插件实现位于
botend/controller/plugins/*
典型扩展方式:
- 在
botend/controller/plugins/<domain>/下新增扫描类(保持与既有插件一致的初始化签名与scan()行为)。 - 在 config.py 中导入并追加到
Monitor_Type_BaseObject_List(注意顺序决定type值)。 - 在数据库中创建/更新
MonitorTask,将type设置为对应索引。
核心表集中在 models.py,按用途可粗分为:
- 监控任务与认证:
MonitorTask:监控任务定义(目标、类型、扫描间隔、启用状态)TargetAuth:目标站点认证信息(Cookie 等)MonitorWebhook:任务相关 webhook 配置
- 采集内容存储:
WechatArticle、RssArticle、WowArticle:内容类数据VulnData:漏洞信息存储
- SimC 相关:
SimcTask:任务执行记录(结果文件、状态等)SimcProfile:配置档案SimcAplKeywordPair:关键字对照SimcTemplate:模板存储
- 浏览器/采集:
utils/LReq.py+core/chromeheadless.py(插件可选使用真实浏览器渲染) - 消息/机器人接口:
botend/interface/(如企业微信、gewechat、dify 等) - 单次 LLM 请求封装:core/glm.py(当前设计为“初始化一次、每次调用独立 messages”的单轮请求)
本节提供“从零到可跑”的最小路径。仓库当前未提供 requirements.txt/pyproject.toml,建议以既有运行环境为准(或在可运行环境中执行 pip freeze > requirements.txt 固化依赖)。
- Python:建议 Python 3.8+(项目最初基于 Django 3.0.1,见 settings.py)
- 数据库:默认 MySQL;本地快速验证可切到 SQLite(见下文)
- 配置覆盖:项目会尝试导入
LMonitor/settings_local.py覆盖配置(参考 settings_local.py.example)
- 设置环境变量:
LMONITOR_USE_SQLITE=1 - 初始化数据库:
python manage.py migrate - 创建管理员:
python manage.py createsuperuser - 启动 Web:
python manage.py runserver 0.0.0.0:18000(见 webstart.sh) - 启动后台:
python manage.py LMonitorCoreBackend(见 start.sh、winstart.ps1)
- 准备数据库:创建
LMonitor(或自定义库名),并确保账号/权限可用 - 配置连接:在
LMonitor/settings_local.py中覆盖DATABASES(示例见 settings_local.py.example) - 初始化数据库:
python manage.py migrate - 创建管理员:
python manage.py createsuperuser - 启动 Web 与后台:同 7.2
自定义命令位于 botend/management/commands/,常用的包括:
python manage.py SyncMonitorTasksFromPlugins:按插件同步任务类型/默认任务python manage.py SyncPortalToolsFromKuangBaoZhan、python manage.py SyncPortalFavicons:同步 Portal 工具与图标python manage.py GewechatInit:gewechat 初始化
路由汇总见 urls.py:
- Portal 首页:
/ - Dashboard:
/dashboard/ - 认证:
/auth/login/、/auth/register/、/auth/logout/、/auth/change-password/ - Portal API:
/portal/api/... - 业务 API:
/api/... - Webhook:
/webhook/gethexagram、/webhook/gewechat
- 项目结构说明(本文档):README.md
- SimC 专项研发记录:
- 规划:task_plan.md
- 过程记录:progress.md
- 阶段结论:findings.md
- 本地预览:
preview/(包含静态预览 HTML 与 serve_preview.ps1) - 调试与一次性脚本:
scripts/(包含 wago/技能差异等相关脚本)
settings.py 涉及数据库、Webhook、外部 API、存储等配置项;为避免密钥泄露与环境串用,建议:
- 不在仓库中保存任何真实 Token/密钥/AK(优先放在
LMonitor/settings_local.py或环境变量中) - 本地与线上环境分别维护配置,避免将测试配置误用于生产
- 对外回调(Webhook)地址、机器人回调地址优先通过环境变量配置并在发布前复核