2026-08-11 17:01:53 +08:00
|
|
|
|
# Bell 事件、规则与预警处置纵切
|
2026-08-10 23:53:11 +08:00
|
|
|
|
|
2026-08-11 17:01:53 +08:00
|
|
|
|
Bell 当前实现 M3 的事件域基础、Sense 审计 relay、默认关闭的 Brain 事件 ingress,以及默认关闭的规则→Alert→ack/close 工程纵切:
|
2026-08-10 23:53:11 +08:00
|
|
|
|
|
|
|
|
|
|
- Bell 在可信 ingress 内为不含 `id` 的候选事实生成 `evt_` ULID。
|
|
|
|
|
|
- 最终事件同时通过冻结 v0.1 JSON Schema 与六项代码级断言。
|
|
|
|
|
|
- PostgreSQL `bell.events` 保存不可变事实;后续 outcome 追加到 `bell.event_outcomes`。
|
2026-08-11 15:41:07 +08:00
|
|
|
|
- `bell_runtime` 对事件、outcome、全局审计和 Brain 来源收据只有 `SELECT/INSERT`,没有 `UPDATE/DELETE/TRUNCATE` 或 migration owner 权限;只可清理两张短期 nonce 收据表。
|
2026-08-11 00:24:32 +08:00
|
|
|
|
- `cmd/bell-api` 默认只监听 `127.0.0.1:8081`,接收 HMAC 签名的 `/internal/v1/audit-events:batch`,把脱敏设备操作事实追加到 `bell.audit_events`。
|
|
|
|
|
|
- `(key_id, nonce)` 收据保存 10 分钟;相同摘要重放原结果,不同摘要返回冲突。非回环监听必须配置 TLS 证书和私钥。
|
2026-08-11 15:41:07 +08:00
|
|
|
|
- T-019 可选 `/internal/v1/event-candidates` 把 HMAC key 绑定到一个 `producer_id`,通过 `event_ingress_bindings` 解析数字事件身份并复查当前 Site/Area/Sense Device;缺失、删除、Area 不一致或 `non_imaging_only` 均失败关闭。
|
|
|
|
|
|
- `(producer_id, source_event_id)` 永久收据、最终事件和成功 nonce 响应同事务提交;相同 canonical candidate 返回原 Bell ID,不同 candidate 返回 `source_event_conflict`。
|
2026-08-11 17:01:53 +08:00
|
|
|
|
- 规则配置按 canonical hash 幂等发布不可变版本;worker 为每个 Event 写 durable sweep/evaluation,命中时由 Bell 生成 `alt_` ULID 并关联 Event。
|
|
|
|
|
|
- Alert 的 `open → acknowledged → closed` 状态从 append-only transition 推导;8 路并发 ack 只有首个成功,后到者得到实际首位处置人/时间,同一幂等键跨重启重放原响应。
|
|
|
|
|
|
- `/bell-console/` 是自包含、无 CDN 的回环工程值班台,显示真实规则版本、关联 Event 和处置时间线;证据与升级/通知未实现时明确显示不可用,不伪造成功事实。
|
2026-08-10 23:53:11 +08:00
|
|
|
|
|
2026-08-11 17:01:53 +08:00
|
|
|
|
公共认证/事件 API、正式规则管理、证据对象存储、升级/通知和正式前端框架仍需后续任务冻结。两条 HMAC ingress 与回环控制台都是工程适配器,不得当成 Bell 公共协议或共用 key/token。
|
2026-08-11 00:24:32 +08:00
|
|
|
|
|
|
|
|
|
|
启动内部 receiver 前必须私下设置 `BELL_DB_DSN` 和仓库外绝对路径 `BELL_AUDIT_KEYS_FILE`。远端监听还必须设置 `BELL_TLS_CERT_FILE`、`BELL_TLS_KEY_FILE`;仓库不保存 DSN、key 或证书:
|
|
|
|
|
|
|
|
|
|
|
|
```powershell
|
|
|
|
|
|
go -C Bell run ./cmd/bell-api
|
|
|
|
|
|
```
|
2026-08-10 23:53:11 +08:00
|
|
|
|
|
2026-08-11 17:01:53 +08:00
|
|
|
|
事件 ingress 默认关闭。启用前,管理员先在专用数据库执行 `001`~`019` migration,并用受控 SQL 创建与现有 Bell Site/Area、Sense Device 一致的绑定;运行角色不能写绑定。然后私下设置:
|
2026-08-11 15:41:07 +08:00
|
|
|
|
|
|
|
|
|
|
```powershell
|
|
|
|
|
|
$env:BELL_EVENT_INGRESS_ENABLED = 'true'
|
|
|
|
|
|
$env:BELL_EVENT_INGRESS_KEYS_FILE = 'D:\private\brain-event-keys.json'
|
|
|
|
|
|
$env:BELL_EVIDENCE_FORBIDDEN_NAMES_FILE = 'D:\private\forbidden-evidence-names.txt'
|
|
|
|
|
|
go -C Bell run ./cmd/bell-api
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
forbidden-names 文件每行一个不得出现在证据 URI 的租户/客户标记,至少一行、最多 256 行。key 文件格式见 `docs/contracts/README.md`。仓库不提供真实 secret、DSN、绑定或客户名称;绑定只能引用已经存在且同 Area/modality 的设备。
|
|
|
|
|
|
|
|
|
|
|
|
管理员在事务中核对逻辑资源后,可按下列列签名配置一条视频绑定;数字 ID 是冻结事件契约使用的稳定正整数,不是把文本 ID 强转为数字:
|
|
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
|
INSERT INTO bell.event_ingress_bindings(
|
|
|
|
|
|
producer_id, tenant_id, site_id, device_id,
|
|
|
|
|
|
logical_tenant_id, logical_site_id, logical_device_id, logical_area_id,
|
|
|
|
|
|
modality, enabled
|
|
|
|
|
|
) VALUES (
|
|
|
|
|
|
'brain-main', 1, 1, 1,
|
|
|
|
|
|
'tenant-logical-id', 'site-logical-id', 'device-logical-id', 'area-logical-id',
|
|
|
|
|
|
'video', true
|
|
|
|
|
|
);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
外键只负责资源存在;runtime 还会复查 Area 属于同 Site、设备当前 Area/modality 一致、Site/Area 未删除且策略允许成像。换绑或停用由管理员显式更新/删除 binding,不能修改永久来源收据。
|
|
|
|
|
|
|
2026-08-11 17:01:53 +08:00
|
|
|
|
规则 worker 和工程值班台分别由 feature flag 开启;启用值班台必须同时启用规则 worker,整个 Bell 监听地址必须为显式回环。规则和 token 文件均在仓库外,规则文件结构如下(示例值不是客户配置):
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{"version":1,"rules":[{"tenant_id":1,"site_id":1,"rule_key":"zone-entry","display_name":"区域闯入","event_kind":"zone_entry","minimum_severity":"medium","enabled":true,"effective_from":"2026-08-11T00:00:00Z"}]}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```powershell
|
|
|
|
|
|
$env:BELL_ALERTS_ENABLED = 'true'
|
|
|
|
|
|
$env:BELL_ALERT_RULES_FILE = 'D:\private\bell-alert-rules.json'
|
|
|
|
|
|
$env:BELL_ALERT_CONSOLE_ENABLED = 'true'
|
|
|
|
|
|
$env:BELL_ALERT_CONSOLE_TOKEN_FILE = 'D:\private\bell-console.token'
|
|
|
|
|
|
$env:BELL_ALERT_CONSOLE_TENANT_ID = '1'
|
|
|
|
|
|
$env:BELL_ALERT_CONSOLE_SITE_ID = '1'
|
|
|
|
|
|
$env:BELL_ALERT_CONSOLE_ACTOR_REF = 'operator:local'
|
|
|
|
|
|
go -C Bell run ./cmd/bell-api
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
token 文件去除首尾换行后必须为 32~256 个非空白字符。浏览器访问 `http://127.0.0.1:8081/bell-console/` 后手动输入 token;页面只保存在内存,刷新即丢失。工程 API 冻结在 `docs/contracts/bell-alert-console-v1.openapi.json`,tenant/Site/actor 只来自启动上下文。
|
|
|
|
|
|
|
2026-08-10 23:53:11 +08:00
|
|
|
|
## 验证
|
|
|
|
|
|
|
|
|
|
|
|
```powershell
|
|
|
|
|
|
go -C Bell mod download
|
|
|
|
|
|
go -C Bell test ./...
|
|
|
|
|
|
go -C Bell vet ./...
|
|
|
|
|
|
go -C Bell build ./...
|
|
|
|
|
|
./scripts/test_postgres.ps1 -PgRoot D:\pgsql17
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
隔离 PostgreSQL harness 会创建临时 `bell_runtime` 登录成员,运行真实 repository、幂等冲突和不可变权限测试,然后停止并删除临时集群;不会读取或修改现有 `D:\pgsql17\data` 或 5432 服务。
|