feat: implement full-stack TaskPilot scheduler
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
# TaskPilot Windows 本地版
|
||||
|
||||
## 启动
|
||||
|
||||
```powershell
|
||||
.\start.ps1
|
||||
```
|
||||
|
||||
然后访问 <http://127.0.0.1:3000>。
|
||||
|
||||
需要自动打开浏览器时:
|
||||
|
||||
```powershell
|
||||
.\start.ps1 -OpenBrowser
|
||||
```
|
||||
|
||||
## 数据目录
|
||||
|
||||
- SQLite 数据库:`data/task_pilot.db`
|
||||
- 运行日志:`logs/{task_id}/{run_id}.log`
|
||||
|
||||
## 配置
|
||||
|
||||
```powershell
|
||||
$env:TASK_PILOT_PORT = "3000"
|
||||
$env:TASK_PILOT_DATABASE_URL = "sqlite://data/task_pilot.db"
|
||||
$env:TASK_PILOT_LOG_DIR = "logs"
|
||||
$env:TASK_PILOT_LOG_RETENTION_DAYS = "30"
|
||||
$env:TASK_PILOT_LOG_MAX_TOTAL_MB = "512"
|
||||
$env:TASK_PILOT_STATIC_DIR = "web"
|
||||
```
|
||||
|
||||
## 安全边界
|
||||
|
||||
- 服务只监听 `127.0.0.1`。
|
||||
- 浏览器跨站 Origin 会被拒绝。
|
||||
- 写操作需要运行期随机管理令牌。
|
||||
- 管理令牌在进程重启后自动更换。
|
||||
|
||||
## 故障排查
|
||||
|
||||
- 3000 端口被占用时,通过 `TASK_PILOT_PORT` 修改端口;打包版前端使用同源 API,无需重新构建。
|
||||
- 页面无法打开时,确认 `web/index.html` 存在。
|
||||
- 任务未执行时,确认任务已启用、Action 配置有效,并在日志抽屉查看错误。
|
||||
- 进程无法启动时,检查解释器或可执行文件路径、工作目录和执行权限。
|
||||
@@ -0,0 +1,34 @@
|
||||
# ADR-0001:Cron 解析与任务调度
|
||||
|
||||
- 状态:已接受
|
||||
- 日期:2026-10-18
|
||||
|
||||
## 背景
|
||||
|
||||
TaskPilot 需要校验 5 位和 6 位 Cron 表达式、计算未来执行时间,并支持在任务创建、编辑、启停后动态调整调度。
|
||||
|
||||
## 决策
|
||||
|
||||
使用 `croner` 负责 Cron 表达式解析和下次执行时间计算,使用 Tokio 定时循环负责任务注册、等待和触发。
|
||||
|
||||
第一阶段验证结果:
|
||||
|
||||
- 支持 5 位分钟级和 6 位秒级表达式。
|
||||
- 支持 `@hourly` 等别名。
|
||||
- 支持月份和星期名称,星期 `7` 与 `0` 均表示星期日。
|
||||
- 默认按 POSIX 语义处理日和星期的组合。
|
||||
- 非法的 `*/0` 会被拒绝,不会形成无限循环。
|
||||
- 可从指定时间计算下一次及连续多次执行时间。
|
||||
|
||||
## 原因
|
||||
|
||||
- `croner` 专注解析和日期计算,不绑定调度运行时。
|
||||
- 自建 Tokio 循环可以按 SQLite 中的任务状态动态注册和取消任务。
|
||||
- 避免将持久化任务 ID 和外部调度器 ID 做双重状态映射。
|
||||
- 后续可以替换触发层而无需更换 Cron 表达式语义。
|
||||
|
||||
## 影响
|
||||
|
||||
- 调度器需要自行维护任务句柄、取消信号和执行并发策略。
|
||||
- 必须用可控时间测试覆盖等待逻辑、任务更新和进程关闭。
|
||||
- 时区支持继续使用 Chrono 的时区能力,Phase 2 引入 `chrono-tz` 存储 IANA 时区。
|
||||
@@ -0,0 +1,21 @@
|
||||
# ADR-0002:前后端开发与生产托管
|
||||
|
||||
- 状态:已接受
|
||||
- 日期:2026-10-18
|
||||
|
||||
## 决策
|
||||
|
||||
开发环境由 Vite 提供 React 页面,并将 `/api` 代理到 `http://127.0.0.1:3000` 的 Axum 服务。
|
||||
|
||||
生产环境先构建 React 静态资源,再由 Axum 托管构建产物。未知的非 `/api` 路由回退到 `index.html`,以支持 React Router。
|
||||
|
||||
## 原因
|
||||
|
||||
- 开发时保留 Vite HMR 和快速反馈。
|
||||
- 生产时只发布一个后端可执行程序及静态资源目录,降低 Windows 本地部署复杂度。
|
||||
- 同源访问可以减少 CORS 和 Cookie/令牌配置的复杂度。
|
||||
|
||||
## 影响
|
||||
|
||||
- 后端必须明确区分 API 404 和前端路由回退。
|
||||
- 静态资源托管将在 Phase 6 交付时接入,Phase 1 只完成开发代理。
|
||||
Reference in New Issue
Block a user