322 lines
14 KiB
JSON
322 lines
14 KiB
JSON
{
|
||
"schema_version": "backup_dr_readiness_matrix_v1",
|
||
"generated_at": "2026-06-04T15:46:59+08:00",
|
||
"source_target_inventory_ref": "docs/evaluations/backup_dr_target_inventory_2026-06-04.json",
|
||
"source_refs": [
|
||
"docs/runbooks/BACKUP-STATUS.md",
|
||
"docs/evaluations/backup_dr_target_inventory_2026-06-04.json",
|
||
"scripts/backup/backup-status.sh",
|
||
"scripts/backup/verify-offsite-full-sync.sh"
|
||
],
|
||
"program_status": {
|
||
"overall_completion_percent": 91,
|
||
"current_priority": "P1",
|
||
"current_task_id": "P1-102",
|
||
"next_task_id": "P1-201",
|
||
"read_only_mode": true
|
||
},
|
||
"rollups": {
|
||
"total_rows": 17,
|
||
"by_overall_readiness": {
|
||
"ready": 12,
|
||
"action_required": 2,
|
||
"blocked": 2,
|
||
"deferred": 1
|
||
},
|
||
"by_restore_drill_status": {
|
||
"approval_required": 13,
|
||
"blocked": 2,
|
||
"deferred": 1,
|
||
"not_applicable": 1
|
||
},
|
||
"by_offsite_status": {
|
||
"verified": 13,
|
||
"needs_metric_binding": 1,
|
||
"blocked": 1,
|
||
"deferred": 1,
|
||
"not_applicable": 1
|
||
},
|
||
"blocked_row_ids": [
|
||
"configs_capture",
|
||
"credential_escrow_markers"
|
||
],
|
||
"action_required_row_ids": [
|
||
"signoz",
|
||
"velero_k8s_resources"
|
||
]
|
||
},
|
||
"readiness_rows": [
|
||
{
|
||
"target_id": "gitea",
|
||
"display_name": "Gitea DB + repository dump",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "success 不即時洗版;failure / action-required 才通知。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-gitea.sh"],
|
||
"blocker_summary": "無 target-level blocker;restore 仍需人工批准。",
|
||
"next_action": "P1-104 顯示 freshness / offsite ready 證據卡。"
|
||
},
|
||
{
|
||
"target_id": "momo_postgresql",
|
||
"display_name": "MOMO PostgreSQL",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "failure-only escalation;success 由每日摘要承載。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-momo.sh"],
|
||
"blocker_summary": "無 target-level blocker;restore 仍需人工批准。",
|
||
"next_action": "P1-104 顯示 188 pull freshness 與 SSH reachability。"
|
||
},
|
||
{
|
||
"target_id": "harbor",
|
||
"display_name": "Harbor registry + DB",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "failure-only escalation;success 由每日摘要承載。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-harbor.sh"],
|
||
"blocker_summary": "無 target-level blocker;restore 仍需人工批准。",
|
||
"next_action": "P1-104 顯示 registry readiness。"
|
||
},
|
||
{
|
||
"target_id": "awoooi_postgresql_daily",
|
||
"display_name": "AWOOOI PostgreSQL daily full",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "critical failure must alert;success 不即時洗版。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-awoooi.sh"],
|
||
"blocker_summary": "無 target-level blocker;restore 仍需人工批准。",
|
||
"next_action": "P1-104 顯示 24h full backup 與 6h frequent backup。"
|
||
},
|
||
{
|
||
"target_id": "awoooi_postgresql_frequent",
|
||
"display_name": "AWOOOI PostgreSQL frequent core",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "critical failure must alert;success 不即時洗版。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-awoooi-frequent.sh"],
|
||
"blocker_summary": "無 target-level blocker;restore 仍需人工批准。",
|
||
"next_action": "P1-104 顯示 6h RPO。"
|
||
},
|
||
{
|
||
"target_id": "langfuse",
|
||
"display_name": "Langfuse AI trace DB",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "failure-only escalation;success 由每日摘要承載。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-langfuse.sh"],
|
||
"blocker_summary": "無 target-level blocker;restore 仍需人工批准。",
|
||
"next_action": "P1-104 顯示 AI trace backup freshness。"
|
||
},
|
||
{
|
||
"target_id": "monitoring",
|
||
"display_name": "Prometheus / Grafana / Alertmanager",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "failure-only escalation;success 由每日摘要承載。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-monitoring.sh"],
|
||
"blocker_summary": "無 target-level blocker;restore 仍需人工批准。",
|
||
"next_action": "P1-104 顯示 monitoring backup 與 alert-rule coverage。"
|
||
},
|
||
{
|
||
"target_id": "signoz",
|
||
"display_name": "SignOz ClickHouse + SQLite",
|
||
"overall_readiness": "action_required",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "failure-only escalation;success 由每日摘要承載。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "committed_script",
|
||
"evidence_refs": ["scripts/backup/backup-signoz.sh", "docs/runbooks/BACKUP-STATUS.md"],
|
||
"blocker_summary": "備份腳本會短暫停止 collector;Agent 不得任意觸發,UI 需標示 disruptive backup guard。",
|
||
"next_action": "P1-104 顯示 disruptive backup guard。"
|
||
},
|
||
{
|
||
"target_id": "open_webui",
|
||
"display_name": "Open-WebUI volume",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "failure-only escalation;success 由每日摘要承載。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-open-webui.sh"],
|
||
"blocker_summary": "無 target-level blocker;restore 仍需人工批准。",
|
||
"next_action": "P1-104 顯示 Open-WebUI readiness。"
|
||
},
|
||
{
|
||
"target_id": "clawbot_redis",
|
||
"display_name": "ClawBot Redis volume",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "failure-only escalation;success 由每日摘要承載。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-clawbot.sh"],
|
||
"blocker_summary": "無 target-level blocker;restore 仍需人工批准。",
|
||
"next_action": "P1-104 顯示 Redis backup readiness。"
|
||
},
|
||
{
|
||
"target_id": "configs_capture",
|
||
"display_name": "Host / service / K8s configuration capture",
|
||
"overall_readiness": "blocked",
|
||
"freshness_status": "blocked",
|
||
"integrity_status": "blocked",
|
||
"restore_drill_status": "blocked",
|
||
"offsite_status": "blocked",
|
||
"notification_policy": "action-required 必須告警;成功不即時洗版。",
|
||
"gate_status": "blocked_by_live_evidence",
|
||
"evidence_level": "blocked_live_evidence",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-configs.sh"],
|
||
"blocker_summary": "`120-k3s-host-configs` live evidence blocked;不得宣稱 full DR green。",
|
||
"next_action": "P1-104 顯示 config capture blocked;P1-105 才產生修復 / restore 批准包。"
|
||
},
|
||
{
|
||
"target_id": "ai_artifacts",
|
||
"display_name": "AI artifacts / Ollama manifests",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "failure-only escalation;success 由每日摘要承載。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-ai-artifacts.sh"],
|
||
"blocker_summary": "manifest-only policy;大型 model blobs 不預設備份。",
|
||
"next_action": "P1-104 顯示 manifest-only backup policy。"
|
||
},
|
||
{
|
||
"target_id": "public_routes",
|
||
"display_name": "Public routes / DNS / TLS evidence",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "failure-only escalation;success 由每日摘要承載。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-public-routes.sh"],
|
||
"blocker_summary": "provider token / TLS private key 不在此目標輸出。",
|
||
"next_action": "P1-104 顯示 public route reconstruction evidence。"
|
||
},
|
||
{
|
||
"target_id": "sentry",
|
||
"display_name": "Sentry backup repo",
|
||
"overall_readiness": "deferred",
|
||
"freshness_status": "deferred",
|
||
"integrity_status": "deferred",
|
||
"restore_drill_status": "deferred",
|
||
"offsite_status": "deferred",
|
||
"notification_policy": "deferred until service active。",
|
||
"gate_status": "deferred_until_service_active",
|
||
"evidence_level": "deferred",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/backup-sentry.sh"],
|
||
"blocker_summary": "Sentry 目前未 active;重新部署後再評估。",
|
||
"next_action": "服務 active 後重新納入 P1-102 readiness。"
|
||
},
|
||
{
|
||
"target_id": "offsite_rclone_full_sync",
|
||
"display_name": "Google Drive / rclone offsite mirror",
|
||
"overall_readiness": "ready",
|
||
"freshness_status": "verified",
|
||
"integrity_status": "verified",
|
||
"restore_drill_status": "not_applicable",
|
||
"offsite_status": "verified",
|
||
"notification_policy": "offsite success 不即時洗版;verify failure 必須 action-required。",
|
||
"gate_status": "read_only_allowed",
|
||
"evidence_level": "runbook_live_refresh",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/sync-offsite-backups.sh", "scripts/backup/verify-offsite-full-sync.sh"],
|
||
"blocker_summary": "無 target-level blocker;sync execution 仍不可由 Agent 自動觸發。",
|
||
"next_action": "P1-104 顯示 latest-only remote verify。"
|
||
},
|
||
{
|
||
"target_id": "credential_escrow_markers",
|
||
"display_name": "Credential escrow evidence markers",
|
||
"overall_readiness": "blocked",
|
||
"freshness_status": "blocked",
|
||
"integrity_status": "not_applicable",
|
||
"restore_drill_status": "blocked",
|
||
"offsite_status": "not_applicable",
|
||
"notification_policy": "missing markers must stay action-required;不得成功洗版。",
|
||
"gate_status": "credential_approval_required",
|
||
"evidence_level": "blocked_live_evidence",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "scripts/backup/mark-credential-escrow-verified.sh", "scripts/backup/offsite-escrow-evidence-report.sh"],
|
||
"blocker_summary": "Five evidence markers missing;不得自動寫 marker 或暴露 credential。",
|
||
"next_action": "P1-105 起草人工 escrow review 批准包。"
|
||
},
|
||
{
|
||
"target_id": "velero_k8s_resources",
|
||
"display_name": "Velero K8s resource snapshots",
|
||
"overall_readiness": "action_required",
|
||
"freshness_status": "needs_metric_binding",
|
||
"integrity_status": "needs_metric_binding",
|
||
"restore_drill_status": "approval_required",
|
||
"offsite_status": "needs_metric_binding",
|
||
"notification_policy": "restore drill / Velero failure 必須 action-required。",
|
||
"gate_status": "restore_approval_required",
|
||
"evidence_level": "committed_script",
|
||
"evidence_refs": ["docs/runbooks/BACKUP-STATUS.md", "k8s/awoooi-prod/16-cronjob-backup-restore-test.yaml"],
|
||
"blocker_summary": "Velero / MinIO freshness 與 independent offsite 仍需 metric binding;restore drill 需人工批准。",
|
||
"next_action": "P1-104 顯示 Velero metric gap;P1-105 產生 restore drill 批准包。"
|
||
}
|
||
],
|
||
"operation_boundaries": {
|
||
"read_only_api_allowed": true,
|
||
"backup_execution_allowed": false,
|
||
"restore_execution_allowed": false,
|
||
"offsite_sync_execution_allowed": false,
|
||
"credential_marker_write_allowed": false,
|
||
"schedule_change_allowed": false,
|
||
"destructive_prune_allowed": false
|
||
},
|
||
"approval_boundaries": {
|
||
"sdk_installation_allowed": false,
|
||
"paid_api_call_allowed": false,
|
||
"shadow_or_canary_allowed": false,
|
||
"production_routing_allowed": false,
|
||
"destructive_operation_allowed": false
|
||
}
|
||
}
|