QinMgr

项目介绍

该项目是基于 Python 开发的后端管理工具,旨在将日常固定的操作简化为工作流,并内置日常需要使用的小工具:让内网设备间能够低成本的进行简易信息传递。项目当前使用 FastAPI 提供后端接口,前端为轻量原生页面,适合继续快速扩展新的本地运维工具。

功能

  • 文件服务器:在指定端口启动局域网文件上传/下载服务器,并在管理页面中以表格展示当前共享目录文件。
  • Blog管理:包含文章管理和 Blog 部署两个子页面。文章管理是博客运维面板,左侧文章目录树,右侧镜像图片树(每篇文章对应一个图片目录,可拖拽上传图片);部署页执行 Dev / Build / Deploy。
  • 聊天服务器:在指定端口启动一个局域网聊天室。管理页顶部是端口 / 启动 / 关闭设置,下方是聊天窗口;启动后其它设备访问局域网地址即可加入同一聊天室并看到相同历史消息。消息只保存在内存,服务关闭即清空,不落盘。
  • 系统信息:查看当前服务器状态。
  • 更多功能:可扩展项目菜单项和后端模块。

并发模型

  • QinMgr 后端维护一个全局线程池,用于执行阻塞型工作流,例如本地构建、SSH/SFTP 部署、文件服务器启停等。
  • 文件共享服务使用 ThreadingHTTPServer 独立运行,管理页面请求不会被文件下载或上传阻塞。
  • GET /api/system 会返回当前线程池 worker 数量。

前端结构

  • 前端使用原生 ES modules,无需 Node 构建步骤。
  • frontend/app.js 只负责启动应用壳层。
  • frontend/core/ 放通用能力,例如 API 请求、格式化、弹框和菜单壳层。
  • frontend/modules/ 放具体功能页面。新增功能时,创建模块并在 frontend/modules/index.js 注册即可。
  • 布局采用固定应用壳:左侧菜单栏固定在视口内,右侧内容区独立滚动。

运行方式

  1. 使用你的 conda 环境安装依赖:
pip install -r requirements.txt
  1. 启动后端服务:
python -m uvicorn backend.main:app --reload --host 0.0.0.0 --port 8000

绑定 0.0.0.0 后,局域网内其它设备才能访问本机服务,Blog 图片管理「复制图片访问地址」生成的 http://<本机IP>:<端口>/... 链接也才可直接打开。

  1. 打开浏览器访问:
http://localhost:8000

持久化数据目录

项目统一使用 data/ 保存持久化数据:

  • data/uploads/:文件服务器上传内容。
  • data/blog_posts/posts/:Blog 文章 Markdown 源(构建时再同步到博客项目)。
  • data/blog_posts/images/:文章图片镜像目录,结构与 posts/ 一致,每篇文章对应一个同名子目录。
  • data/config.json:Blog 部署与图床配置(分组结构 deploy / imageversion: 2)。

首次启动时会把旧的根目录 uploads/ 内容迁移到 data/uploads/,并复制旧的 config.jsdata/config.jsdata/config.json。旧的扁平 config.json 会在读取时自动转换为分组结构。

图床同步(腾讯云 COS)

图片管理页右上「图床配置」填写 COS 的 bucket / region / secret / CDN 域名 / 路径前缀(内网项目,密钥明文存于 data/config.json)。「图床同步」按钮:

  • 开启时把 data/blog_posts/images/ 下所有图片全量上传到 COS,远端 key = path_prefix + 镜像相对路径;开启状态持久化。
  • 开启期间每张新上传的图片自动增量同步到 COS。
  • 开启后,图片「复制图片访问地址」返回 COS 公开地址(cdn_base + key);关闭后恢复为本机局域网地址。

依赖 cos-python-sdk-v5(见 requirements.txt)。

管理页面中的上传、下载、删除操作均作用于 data/uploads/。管理页面上传会自动使用分片上传,适合 ISO、qcow2 等大文件;上传中的临时分片会保存在 data/uploads/.partial/,最后一个分片完成后再替换为目标文件。

局域网文件服务器启动后,可通过页面展示的局域网地址直接访问独立文件共享页。

Blog 项目目录

Blog 部署页只填写项目名称,默认 QinBlog。后端会在项目根目录下解析为:

project/{项目名称}

例如项目名称为 QinBlog 时,pnpm devpnpm builddeploy 都会在 project/QinBlog/ 中执行。