giammbo/incident-commander

GitHub: giammbo/incident-commander

一个开源自托管的故障指挥管理系统,帮助团队一键宣告故障、自动拉通沟通渠道并完整记录事件生命周期。

Stars: 0 | Forks: 0

# 事件指挥官 开源、自托管的故障管理系统。一键宣告故障,配置完成后,它会自动开启一个 Slack 频道和 Google Meet,记录所有的历史操作,并为你提供一个从容应对的指挥中心。专为你的团队和你的基础设施而构建。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/8f63c58aa5044535.svg)](https://github.com/giammbo/incident-commander/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![Python](https://img.shields.io/badge/python-3.12-blue.svg)](pyproject.toml) ![Incident Commander 仪表盘](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/6cbced04a1044542.png) ## 功能 现已提供: - **自托管,一条命令即可启动** — FastAPI + HTMX 封装在单个容器中,并通过 Docker Compose 结合 Postgres 运行。 - **本地账户** — 邮箱 + 密码 (argon2)。首次启动时会创建一个受保护的 `admin` 账户,其生成的密码将打印到日志中 (Grafana 风格);首次登录时你需要强制修改它。 - **基于组的 RBAC** — 三种角色 (Admin、Incident Commander、Read-only);用户的有效角色是其所在组中拥有的最高角色。 - **用户与组管理** — 提供管理员 UI 以邀请/创建用户、组织组并分配角色。 - **故障生命周期** — 宣告故障 (包括标题、严重程度 SEV1–SEV3、公开/私有)、浏览历史记录、打开详情视图以及关闭故障。 - **加密设置** — 集成凭据在静态存储时加密 (Fernet);密钥绝不会在 UI 中渲染或写入日志。 - **专为任务设计的 UI** — 黑暗风格的“作战室”,颜色直接代表严重程度,让你一眼就能看到哪里出了问题。 计划中 (参见 [路线图](#roadmap)): - Slack:自动开启故障频道。 - Google:SSO 登录及自动创建 Google Meet 桥接。 - 通过 SMTP 发送电子邮件邀请。 ## 快速开始 (Docker Compose) 需要 Docker。 ``` git clone https://github.com/giammbo/incident-commander.git cd incident-commander cp .env.example .env ``` 生成两个必需的密钥并将其放入 `.env` 中: ``` # SESSION_SECRET python -c "import secrets; print(secrets.token_urlsafe(48))" # FERNET_KEYS python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" ``` 然后启动它: ``` docker compose up --build ``` 打开 。**初始管理员密码会在首次启动时** 在应用日志中打印一次 — 请使用 `IC_ADMIN_EMAIL` (默认为 `admin@localhost`) 登录,并立即修改密码。 ``` docker compose logs app | grep "Generated password" ``` ## 配置 引导密钥存在于环境变量 (`.env`) 中;集成设置 (Slack/Google/SMTP) 在运行时通过管理员 UI 配置,并加密存储在数据库中。 | 变量 | 用途 | 必需 | 默认值 | |---|---|---|---| | `DATABASE_URL` | Postgres 连接 (`postgresql+psycopg://…`) | 是 | 在 Compose 中由 `POSTGRES_*` 构建 | | `SESSION_SECRET` | 签名 session cookie | 是 | — (需自行生成) | | `FERNET_KEYS` | 用于加密静态密钥的逗号分隔 Fernet 密钥 (第一个用于加密;其余用于密钥轮换) | 是 | — (需自行生成) | | `BASE_URL` | 公共基础 URL (稍后用于 OAuth 重定向) | 是 | `http://localhost:8000` | | `IC_ADMIN_EMAIL` | 初始管理员的邮箱 | 否 | `admin@localhost` | | `SESSION_HTTPS_ONLY` | 标记 session cookie 为 `Secure` — **在生产环境的 HTTPS 后请设置为 `true`** | 否 | `true` (Compose 中为 localhost 默认提供 `false`) | | `POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB` | Compose Postgres 凭据 | 否 | `ic` / `ic` / `incident_commander` | ## 开发说明 ``` uv sync # install deps (Python 3.12) cp .env.example .env # fill SESSION_SECRET and FERNET_KEYS uv run pytest # run the test suite — Docker required (testcontainers spins up Postgres) uv run ruff check . # lint uv run ruff format . # format ``` 完整的贡献者指南请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 架构 一个单一的服务器端渲染 FastAPI 服务:使用 Jinja2 模板与 HTMX (无需 JavaScript 构建步骤),通过同步 SQLAlchemy 2.0 + psycopg3 连接 Postgres,启动时应用 Alembic 迁移。密钥通过 Fernet 进行静态加密;引导密钥来自环境变量。Slack 和 Google 将是**可选的**集成 — 故障始终会作为一条记录被创建,只有在选择了连接时才会添加频道或 Meet。 ## 路线图 - **阶段 1 — 核心平台与认证** ✅ (当前版本) - **阶段 2 — SMTP 与邮件邀请** - **阶段 3 — Slack 集成** (自动创建故障频道) - **阶段 4 — Google** (SSO 登录 + 自动创建 Google Meet) ## 安全性 集成凭据和 token 在静态存储时加密 (Fernet),密码使用 argon2 进行哈希处理,session 使用签名 cookie。请私下报告漏洞 — 参见 [SECURITY.md](SECURITY.md)。在生产环境中,请运行在 HTTPS 之后并设置 `SESSION_HTTPS_ONLY=true`。 ## 贡献 欢迎贡献 — 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 和我们的[行为准则](CODE_OF_CONDUCT.md)。 ## 许可证 Apache License 2.0 — 参见 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。 依赖项均为宽松许可 (MIT / BSD / Apache-2.0),但有一个例外:Postgres 驱动 [`psycopg`](https://www.psycopg.org/) 是 LGPL-3.0。它作为一个未经修改的、独立安装的库使用,这与在 Apache-2.0 下发布本项目是兼容的;其 LGPL 声明已予保留。
标签:AV绕过, FastAPI, HTMX, RBAC, 事故管理, 测试用例, 自托管, 请求拦截, 运维管理, 逆向工具