这是一个基于 Funboost 开发的 Python 任务管理程序。前后端分离架构,后端使用 FastAPI,前端使用 Vue.js。项目依赖 MySQL 和 Redis 作为中间件,用于任务队列管理和数据存储。
项目启动时,会启动子进程主动发现环境变量配置的 /app/tasks 目录下定义的 booster 并启动消费。examleTask 目录提供了示例任务代码,可作为开发自定义任务的参考。
backend/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI应用实例和路由注册
│ ├── routers/
│ │ ├── __init__.py
│ │ ├── auth.py # 认证相关路由(登录接口)
│ │ ├── funboost.py # Funboost路由
│ │ └── system.py # 系统管理路由
│ ├── models/
│ │ ├── __init__.py
│ │ ├── funboost_result.py # Funboost结果模型
│ │ └── user.py # 用户相关Pydantic模型
│ ├── schemas/
│ │ ├── __init__.py
│ │ └── funboost_result.py # Funboost结果schema
│ ├── responses/
│ │ ├── __init__.py
│ │ └── base_response.py # 基础响应类
│ ├── crud/
│ │ └── __init__.py # CRUD操作(预留)
│ ├── database/
│ │ └── __init__.py # 数据库连接配置(预留)
│ └── dependencies/
│ ├── __init__.py
│ └── auth.py # 认证依赖(JWT验证)
├── main.py # 入口点,导入app.main
├── funboost_cli_user.py
├── funboost_config.py
├── nb_log_config.py
├── requirements.txt # Python依赖包列表
├── taskrunner.py # 任务运行器
examleTask/ # 示例任务目录,对应容器内 /app/tasks 路径下的代码示例
├── __init__.py
├── public.py # 公共函数或配置
├── task1.py # 示例任务1
└── task2.py # 示例任务2
frontend/
├── commitlint.config.cjs
├── eslint.config.mjs
├── index.html
├── LICENSE
├── package.json
├── pnpm-lock.yaml
├── tsconfig.json
├── vite.config.ts
├── public/
├── src/
│ ├── api # API 接口相关代码
│ │ ├── auth.ts # 认证相关的 API 接口定义(如登录、注册、用户信息)
│ │ ├── funboost.ts # Funboost 相关的 API 接口定义
│ │ └── system-manage.ts # 系统管理相关的 API 接口定义(如菜单、用户、角色管理)
│ ├── App.vue # Vue 根组件,定义应用的全局结构和入口
│ ├── assets # 静态资源目录
│ │ ├── images # 图片资源目录
│ │ │ ├── avatar/ # 头像图片
│ │ │ ├── ceremony/ # 仪式/活动图片
│ │ │ ├── common/ # 通用图片
│ │ │ ├── draw/ # 绘制图片
│ │ │ ├── lock/ # 锁定图片
│ │ │ ├── login/ # 登录图片
│ │ │ ├── settings/ # 设置图片
│ │ │ ├── svg/ # SVG 图片
│ │ │ └── user/ # 用户图片
│ │ ├── styles # 全局样式文件
│ │ │ ├── core # 核心样式(系统级样式)
│ │ │ ├── custom # 自定义样式(业务级样式)
│ │ │ └── index.scss # 样式入口文件
│ │ └── svg # SVG 相关资源
│ │ └── loading.ts # 加载动画 SVG 定义
│ ├── components # 组件目录
│ │ ├── business # 业务组件(业务相关的自定义组件)
│ │ └── core # 核心组件(系统级通用组件库)
│ │ ├── banners # 横幅组件
│ │ ├── base # 基础组件
│ │ ├── cards # 卡片组件
│ │ ├── charts # 图表组件
│ │ ├── forms # 表单组件
│ │ ├── layouts # 布局组件
│ │ └── ... # 其他组件
│ ├── config # 项目配置目录
│ │ ├── assets # 静态资源配置
│ │ ├── modules # 模块化配置
│ │ │ ├── component.ts # 组件配置
│ │ │ ├── fastEnter.ts # 快捷入口配置
│ │ │ └── headerBar.ts # 顶部栏配置
│ │ ├── index.ts # 配置入口文件
│ │ └── setting.ts # 系统设置配置
│ ├── directives # Vue 自定义指令
│ │ ├── business # 业务指令
│ │ ├── core # 核心指令
│ │ └── index.ts # 指令入口文件
│ ├── enums # 枚举定义
│ │ ├── appEnum.ts # 应用级枚举(如主题类型、语言类型)
│ │ └── formEnum.ts # 表单相关枚举(如表单状态、验证规则)
│ ├── env.d.ts # TypeScript 环境声明文件
│ ├── hooks # Vue 3 Composable 函数(可复用逻辑)
│ │ ├── core # 核心 Hooks
│ │ └── index.ts # Hooks 入口文件
│ ├── locales # 国际化(i18n)资源
│ │ ├── index.ts # 国际化入口文件
│ │ └── langs # 多语言文件
│ ├── main.ts # 项目主入口文件
│ ├── mock # Mock 数据目录
│ │ ├── temp # 临时 Mock 数据
│ │ └── upgrade # 更新日志数据
│ ├── plugins # 插件配置
│ │ ├── echarts.ts # ECharts 图表库配置
│ │ └── index.ts # 插件入口文件
│ ├── router # Vue Router 路由相关代码
│ │ ├── core # 路由核心功能
│ │ ├── guards # 路由守卫
│ │ ├── modules # 路由模块定义
│ │ ├── routes # 路由配置
│ │ ├── index.ts # 路由主入口
│ │ └── routesAlias.ts # 路由别名定义
│ ├── store # Pinia 状态管理
│ │ ├── modules # 状态管理模块
│ │ └── index.ts # Pinia 入口文件
│ ├── types # TypeScript 类型定义
│ │ ├── api # API 相关类型
│ │ ├── common # 通用类型定义
│ │ ├── component # 组件相关类型
│ │ ├── config # 配置相关类型
│ │ ├── import # 自动导入类型声明
│ │ ├── router # 路由相关类型
│ │ ├── store # 状态管理相关类型
│ │ └── index.ts # 类型定义总入口
│ ├── utils # 工具函数目录
│ │ ├── constants # 常量定义
│ │ ├── form # 表单相关工具
│ │ ├── http # HTTP 请求工具
│ │ ├── navigation # 导航相关工具
│ │ ├── storage # 存储相关工具
│ │ ├── sys # 系统相关工具
│ │ ├── table # 表格相关工具
│ │ ├── ui # UI 相关工具
│ │ ├── index.ts # 工具函数总入口
│ │ └── router.ts # 路由工具函数
│ └── views # 页面组件目录
│ ├── auth/ # 认证页面
│ ├── dashboard/ # 仪表盘页面
│ ├── exception/ # 异常页面
│ ├── index/ # 首页
│ ├── outside/ # 外部页面
│ ├── result/ # 结果页面
│ ├── system/ # 系统管理页面
│ └── taskmanager/ # 任务管理页面
这是一个基于funboost开发的python任务管理程序。项目依赖 MySQL 和 Redis 作为中间件。
首先,从 GitHub Container Registry(GHCR) 拉取最新的镜像(由 CI/CD 自动构建和推送):
docker pull ghcr.io/eventhorizonsky/taskrun:latest如果不使用 docker-compose,可以直接运行容器,但需要手动启动 MySQL 和 Redis,并设置所有环境变量。以下是示例命令(假设 MySQL 和 Redis 已运行在本地或容器中):
docker run -d \
--name taskrun-app \
-p 8000:8000 \
-e SECRET_KEY="your-custom-secret-key" \
-e ADMIN_USERNAME="admin" \
-e ADMIN_PASSWORD="admin123" \
-e REDIS_HOST="127.0.0.1" \
-e REDIS_USERNAME="" \
-e REDIS_PASSWORD="" \
-e REDIS_PORT=6379 \
-e REDIS_DB=7 \
-e REDIS_DB_FILTER_AND_RPC_RESULT=8 \
-e REDIS_SSL=False \
-e SQLACHEMY_ENGINE_URL="mysql://root:xyztxdys@127.0.0.1:3306/test" \
-e TASKS_DIR="/app/tasks" \
-e LOGS_DIR="/app/logs" \
-v /host/path/to/tasks:/app/tasks \
-v /host/path/to/logs:/app/logs \
ghcr.io/eventhorizonsky/taskrun:latest- 说明:
-d: 后台运行。-p 8000:8000: 映射端口(应用在容器内监听 8000)。-e: 设置环境变量(见下文变量含义)。-v: 挂载卷(tasks 和 logs 目录,用于持久化数据)。- 容器启动后,应用将在 http://localhost:8000 运行。
- 健康检查会每 30 秒检查
/api/system/health端点。
注意:这种方式需要单独管理 MySQL 和 Redis(例如,使用 docker run 启动它们)。推荐使用 docker-compose 以简化依赖管理。
在线编辑器
任务看板
进程日志跟踪
依赖安装演示
任务管理页面

Dockerfile 中定义的环境变量用于配置应用。以下是每个变量的含义和默认值(如果未设置):
- SECRET_KEY: JWT 令牌的密钥,用于加密/解密认证令牌。默认值:
your-secret-key-here。必须设置为强随机字符串(例如,使用openssl rand -hex 32生成)。 - ADMIN_USERNAME: 默认管理员用户名,用于登录。默认值:
admin。 - ADMIN_PASSWORD: 默认管理员密码,用于登录。默认值:
admin。 - TASKS_DIR: 任务文件存储目录(容器内路径)。默认值:
/app/tasks。用于挂载卷以持久化任务数据。 - LOGS_DIR: 日志文件存储目录(容器内路径)。默认值:
/app/logs。用于挂载卷以持久化日志。 - REDIS_HOST: Redis 服务器主机地址。默认值:
127.0.0.1。 - REDIS_USERNAME: Redis 用户名(如果有认证)。默认值: 空字符串。
- REDIS_PASSWORD: Redis 密码(如果有认证)。默认值: 空字符串。
- REDIS_PORT: Redis 端口。默认值:
6379。 - REDIS_DB: Redis 默认数据库编号。默认值:
7。 - REDIS_DB_FILTER_AND_RPC_RESULT: Redis 用于过滤和 RPC 结果的数据库编号。默认值:
8。 - REDIS_SSL: 是否启用 Redis SSL 连接。默认值:
False(布尔值)。 - SQLACHEMY_ENGINE_URL: SQLAlchemy 数据库连接 URL(用于 MySQL)。默认值:
mysql://root:xyztxdys@172.17.0.1:3306/test。格式:mysql://user:password@host:port/database。 - PIP_INDEX_URL: Pip 安装源地址(构建/镜像构建阶段使用)。默认值:
https://pypi.tuna.tsinghua.edu.cn/simple。
请根据部署场景替换敏感变量,生产环境建议使用 Docker secrets 或 .env 文件管理。
安全建议:
- 不要使用默认的
SECRET_KEY、ADMIN_USERNAME和ADMIN_PASSWORD在生产环境中。 - 使用环境变量或 Docker secrets 来传递敏感信息。
为了简化部署,推荐使用 Docker Compose。它会自动管理应用、MySQL 和 Redis 的依赖关系。创建一个 docker-compose.yml 文件(放在项目根目录),内容如下:
version: '3.8'
services:
app:
image: ghcr.io/eventhorizonsky/taskrun:latest
ports:
- "8000:8000"
environment:
- SECRET_KEY=your-custom-secret-key # 替换为强密钥
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=admin123 # 替换为强密码
- REDIS_HOST=redis
- REDIS_USERNAME=
- REDIS_PASSWORD=
- REDIS_PORT=6379
- REDIS_DB=7
- REDIS_DB_FILTER_AND_RPC_RESULT=8
- REDIS_SSL=False
- SQLACHEMY_ENGINE_URL=mysql://root:xyztxdys@mysql:3306/test # 注意:host 改为服务名 'mysql'
- TASKS_DIR=/app/tasks
- LOGS_DIR=/app/logs
depends_on:
- mysql
- redis
volumes:
- ./tasks:/app/tasks # 本地 tasks 目录挂载到容器
- ./logs:/app/logs # 本地 logs 目录挂载到容器
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/api/system/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: xyztxdys # 根密码,与 Dockerfile 默认匹配
MYSQL_DATABASE: test # 默认数据库名
ports:
- "3306:3306" # 可选:暴露端口用于外部访问
volumes:
- mysql_data:/var/lib/mysql # 持久化数据卷
command: --default-authentication-plugin=mysql_native_password # 兼容性设置
redis:
image: redis:alpine
ports:
- "6379:6379" # 可选:暴露端口用于外部访问
volumes:
- redis_data:/data # 持久化数据卷
volumes:
mysql_data: # MySQL 数据持久化
redis_data: # Redis 数据持久化使用步骤:
- 确保本地有
docker-compose.yml文件。 - 创建本地目录:
mkdir tasks logs(用于挂载卷)。 - 运行:
docker-compose up -d(后台启动所有服务)。 - 停止:
docker-compose down。 - 查看日志:
docker-compose logs app。
说明:
- app 服务: 基于项目镜像,设置环境变量,挂载卷。
- mysql 服务: 使用 MySQL 8.0 镜像,预创建数据库
test,密码匹配 Dockerfile 默认。 - redis 服务: 使用 Redis Alpine 镜像,轻量级。
- volumes: 定义命名卷,用于数据持久化(避免容器重启时数据丢失)。
- depends_on: 确保 MySQL 和 Redis 先启动。
- healthcheck: 继承 Dockerfile 的健康检查。
如果需要自定义(如更改端口或添加更多配置),修改 docker-compose.yml 即可。生产环境建议使用 .env 文件管理敏感变量(Docker Compose 支持 env_file)。
本项目使用了以下开源框架和库:
- FastAPI - 现代化的 Python Web 框架,用于构建 API
- ArtDesignPro - 前端设计框架
- Funboost - Python 任务队列框架,用于分布式任务管理
- Shiki - 代码高亮器,用于文档/前端代码渲染
- Monaco Editor - 浏览器端代码编辑器,用于在线编辑器界面