
STRIDE:可自托管的团队协作工作区,集成看板、聊天、白板与任务调度
来源标题:Stride
STRIDE 是一个可自托管的团队工作区,把项目看板、实时聊天、共享白板和基于约束求解器的任务分配整合在同一个 Docker Compose 栈中,用一条命令即可完成部署。所有改动会在打开的各浏览器中实时同步;调度器根据技能、工作时间和截止时间推荐任务负责人,由团队负责人审核后才应用。该项目源自维也纳工业大学的软件工程课程项目。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
可自托管的团队工作空间:Kanban 任务、实时聊天、共享白板和约束求解器任务调度器,全部打包在一个 Docker Compose 栈中。 快速开始 · 功能 · 架构 · 文档 · 团队 STRIDE 是一个由你自己托管的软件团队工作空间。项目、Kanban 看板、聊天和共享白板集中在一处,任何变更都会实时同步到所有打开的浏览器中。约束求解器会根据技能、工作时间和截止日期,建议谁应该处理哪个任务。每一条建议都由团队负责人审核后才会被应用。整个栈只需一条命令即可安装到服务器上。 STRIDE 是作为维也纳工业大学(TU Wien)的高级软件工程项目构建的。 项目与角色 创建、归档和删除项目。以 Owner 或 Member 身份邀请成员。归档项目在任务、聊天和白板中均变为只读。 基于 dnd-kit 的拖拽式看板。状态机强制实施 Backlog → In Progress → Review → Done 的流转。任务包含估时、截止日期、所需技能和多名指派人员。 每个项目都有聊天,以侧边面板形式在每一页均可使用。已读回执基于每位成员的送达/已读游标。 一个 Excalidraw 画布,支持元素实时同步、实时光标、协作者列表、模板,以及任务 ↔ 区域关联。编辑操作经防抖后写入 Redis,由后台 worker 刷入 PostgreSQL。 Google OR-Tools CP-SAT 求解器根据技能、工作时间、估时和截止日期分配任务。优化目标可以叠加。在人工审核并确认提案之前,不会应用任何变更。 基于 Redis Streams 的每用户通知,重连时回放快照。完整的英文和德文界面、深色模式以及响应式布局。 环境要求:Docker 及 Compose v2。宿主机上无需运行其他任何东西。 git clone https://github.com/advxolltm/stride.git && cd stride cp .env.example .env ./stride devrun 打开 http://localhost:8080 并使用开发超级用户登录: docker compose -f compose.dev.yml up -d --build curl -s http://localhost:8080/api/v1/health stride CLI ./stride start 交互式生产环境设置并启动 ./stride devrun 启动开发版 Docker Compose 栈 ./stride down [prod|dev] 停止栈,默认为 prod ./stride restart [prod|dev] 重启容器,默认为 prod ./stride certificate 配置生产环境 TLS 证书 ./stride test 运行前端和后端测试流程 生产环境 ./stride start 交互式设置: 仅 nginx 对外暴露(端口 80/443)。PostgreSQL、Redis、API 和求解器均留在内部 Docker 网络中。持久化数据存放在 ./data/{db,redis,media}。 STRIDE 是一个模块化单体(ADR-0006)。一个 Go API 承载所有业务模块。PostgreSQL 是唯一的事实来源,Redis 承载所有实时数据。CP-SAT 求解器作为一个小型 Python sidecar 运行。 flowchart LR browser(["Browser"]) -->|HTTPS / WSS| nginx["nginx<br/>反向代理 · TLS"] subgraph compose["Docker Compose"] nginx -->|/| spa["React SPA<br/>Vite · RTK Query"] nginx -->|/api/v1| api["Go API<br/>Echo v5"] api -->|SQL · 迁移| pg[("PostgreSQL 16<br/>事实来源")] api -->|pub/sub · streams · 待处理操作| redis[("Redis 8<br/>实时骨干")] api -->|HTTP JSON| solver["调度器<br/>Python · OR-Tools CP-SAT"] end 加载中 实时路径 每一次变更都经过同一条流水线:验证 → 持久化 → 发布 → 分发。由于数据库写入先发生,重新连接的客户端只需重新获取已保存的状态。套接字断开时不会丢失任何数据。 sequenceDiagram participant A as 客户端 A participant API as Go API participant DB as PostgreSQL participant R as Redis pub/sub participant H as WebSocket hub participant B as 客户端 B A->>API: 移动任务 / 发送消息 / 编辑画布 API->>DB: 写入权威状态 API->>R: PUBLISH 项目事件 R-->>H: 事件 H-->>B: 推送更新(RTK Query 缓存补丁) 加载中 通道 传输方式 用途 /ws/project/:id/tasks · /chat gorilla/websocket + Redis pub/sub 每个项目的任务、Kanban 和聊天事件 /ws/project/:id/whiteboard WebSocket + Redis 待处理操作 实时元素操作。一个 flusher goroutine 将其写入 PostgreSQL /ws/project/:id/whiteboard/cursor 进程内光标 hub 白板光标在线状态 /ws/notifications Redis Streams(XRANGE 快照 → XREAD BLOCK) 每用户通知,支持回放 客户端以带抖动的指数退避方式重连。每个套接字的 hub owner、reader、pinger 和 flusher 分别在独立的 goroutine 中运行(ADR-0008)。 sequenceDiagram participant L as 团队负责人 participant API as Go 适配器 participant S as CP-SAT 求解器 L->>API: POST /projects/:id/scheduler API->>S: 任务、技能、工作时间、截止日期、目标 S-->>API: 超时内的最优分配 API-->>L: 可审核的提案 L->>API: POST /projects/:id/scheduler/confirm 加载中 求解器将每个任务建模为每位合格成员的一个可选区间。缺少所需技能的成员会被硬约束排除。你手动设置的分配会尽可能保留。之后,按顺序逐个优化这些目标: min-makespan · distribute-evenly(相对于每周工时) · max-tasks-scheduled · max-hours-scheduled 。 ├── backend/ Go 1.26 · Echo v5 · GORM/pgx │ ├── cmd/ server、create-user、seed-demo │ ├── routes/ HTTP handler + websocket/ hub │ ├── services/ 领域逻辑(auth、project、task、chat、whiteboard、notification、scheduler) │ │ └── scheduler/ Go 适配器 + scheduler.service.py(OR-Tools) │ ├── db/ 各聚合的存储 + SQL 迁移 │ ├── models/ 持久化模型 │ └── docs/ 生成的 OpenAPI(swaggo v2) ├── frontend/ React 19 · TypeScript · Vite 8 · HeroUI · Tailwind 4 │ ├── src/store/features/ RTK Query slice + 各功能的套接字生命周期 │ ├── src/components/ account、auth、project(overview/settings/space)、notification │ ├── src/i18n/locales/ en、de │ └── e2e/ Playwright 测试用例 ├── nginx/ 开发 + 生产配置 ├── docs/architecture/ arc42 文档 + ADR ├── compose.dev.yml 带热重载的完整开发栈
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。