Start DISCTL-WP-0002: policies, registers, runbooks, playbooks

Expand AssetRegister and DataRegister with T0/T4 stack assets.
Add ResiliencePolicy, PanicSheet, full-server-loss runbook, and five
incident playbooks. Update README with mirror status. Mark T02-T05,
T07-T08 done; T01 and T06 in progress.
This commit is contained in:
tegwick 2026-07-07 20:04:54 +02:00
parent 4288ad21a9
commit d011073e16
13 changed files with 814 additions and 29 deletions

View file

@ -1,10 +1,10 @@
# Resilience Control Plane — asset register (initial seed)
# DISCTL-WP-0003-T01 — railiance-backup tool family and backup lanes
# Broader T0/T4 inventory (domains, Stripe, Bubble, etc.) follows in DISCTL-WP-0002-T02.
# Backup lanes: DISCTL-WP-0003-T01. Stack assets (T0/T4): DISCTL-WP-0002-T02.
schema_version: "0.1"
schema_version: "0.2"
updated: "2026-07-07"
register_scope: backup_lanes
register_scope: backup_lanes_and_stack
tier_definitions:
T0: "Identity / trust / money — recoverable even after breach"
@ -216,6 +216,246 @@ backup_streams:
- history/2026-07-04-forgejo-backup-strategy-assessment.md
- specs/ResilienceControlSetup.md
assets:
# ── T0 Identity / trust / money ──────────────────────────────────────────────
- id: asset-dns-coulomb-social
name: coulomb.social DNS zone
tier: T0
owner: Bernd
provider: IONOS
hosts:
- gitea.coulomb.social
- forgejo.coulomb.social
- hub.coulomb.social
- reuse.coulomb.social
production_ips:
coulombcore_legacy: "92.205.130.254"
railiance01: "92.205.62.239"
recovery_path:
method: IONOS control panel + zone record export
backup_admin: unknown
mfa_recovery: unknown
break_glass: unknown
backup: manual export after changes
status: at_risk
gaps:
- "Registrar lock status not inventoried"
- "MFA recovery codes not recorded here"
- "No automated zone export"
- id: asset-registrar-ionos
name: Domain registrar (IONOS)
tier: T0
owner: Bernd
recovery_path:
method: IONOS account login
backup_admin: unknown
mfa_recovery: unknown
break_glass: unknown
status: unknown
gaps:
- "Backup admin contact not recorded"
- "Account lock + MFA recovery not evidenced"
- id: asset-email-ionos
name: coulomb.social email (IONOS SMTP)
tier: T0
owner: Bernd
mailboxes:
- forgejo@coulomb.social
recovery_path:
method: IONOS mail control panel
backup_admin: unknown
mfa_recovery: unknown
status: operational
gaps:
- "Recovery path not fully documented"
- id: asset-stripe-admin
name: Stripe account (payments / subscriptions)
tier: T0
owner: Bernd
recovery_path:
method: Stripe dashboard login
backup_admin: unknown
mfa_recovery: unknown
break_glass: unknown
backup: scheduled CSV export (not established)
status: at_risk
gaps:
- "No scheduled export evidenced"
- "Recovery contacts not inventoried"
- id: asset-openbao-recovery
name: OpenBao sealed recovery material
tier: T0
owner: Bernd
host: railiance01
recovery_path:
method: OpenBao unseal keys + root token recovery procedure
backup_admin: Bernd
break_glass: ops-warden / railiance-platform runbooks
backup: SOPS/age sealed vault (not fully evidenced for cold disaster)
status: at_risk
gaps:
- "Cold disaster recovery of unseal material not drill-tested"
references:
- railiance-platform/docs/openbao-*.md
- id: asset-age-backup-keys
name: age encryption keys (backup artifacts)
tier: T0
owner: Bernd
recovery_path:
method: Password manager recovery copy
operational: ~/.config/age/railiance-backup.key, ~/.config/sops/age/keys.txt
backup: password manager (mandatory)
status: operational
gaps:
- "Password manager copy not verified in register drill"
- id: asset-backup-offsite-lane
name: Nextcloud backup file drop
tier: T0
owner: Bernd
recovery_path:
method: Nextcloud admin read access for restore; upload via filesdrop token
credentials: OpenBao platform/workloads/railiance/backup/offsite-lane
backup: N/A (this is the backup destination)
status: operational
references:
- BackupPolicy.md §4
- railiance-cluster/docs/backup-restore.md
- id: asset-ssh-warden
name: SSH certificate access (ops-warden)
tier: T0
owner: Bernd
recovery_path:
method: warden sign / cert_command
break_glass: ops-warden wiki
status: operational
references:
- AGENTS.md credential routing
# ── T1 Irreplaceable source of truth ─────────────────────────────────────────
- id: asset-gitea-canonical
name: Gitea instance (canonical forge until cutover)
tier: T1
owner: Bernd
host: coulombcore
url: https://gitea.coulomb.social
backup_stream: backup-gitea-canonical
recovery_path:
method: gitea dump restore; git mirror
status: at_risk
- id: asset-forgejo-production
name: Forgejo instance (production forge)
tier: T1
owner: Bernd
host: railiance01
url: https://forgejo.coulomb.social
backup_stream: backup-forgejo-production
recovery_path:
method: forgejo-restore-drill.sh
status: not_wired
- id: asset-git-repos
name: Git repositories (all coulomb/* repos)
tier: T1
owner: Bernd
source_of_truth: Gitea (migrating to Forgejo)
backup: git push to remote; forgejo/gitea dump for full fidelity
recovery_path:
method: git clone from mirror or dump restore
status: operational
gaps:
- "disaster-control not mirrored off primary Gitea (DISCTL-WP-0002-T01)"
- id: asset-state-hub
name: Custodian State Hub
tier: T1
owner: Bernd
host: bnt-lap001 (dev workstation)
backup_stream: backup-dev-workstation
recovery_path:
method: PostgreSQL restore from age-decrypted dump
status: operational
- id: asset-disaster-control
name: disaster-control repo (this control plane)
tier: T1
owner: Bernd
host: gitea.coulomb.social
backup: git push only
recovery_path:
method: git clone from mirror (not yet configured)
status: at_risk
gaps:
- "No off-Gitea mirror (DISCTL-WP-0002-T01)"
# ── T2 Runtime platforms ─────────────────────────────────────────────────────
- id: asset-coulombcore
name: CoulombCore server
tier: T2
owner: Bernd
host: coulombcore
ip: "92.205.130.254"
recovery_path:
method: Rebuild from Ansible + restore data; do not resurrect compromised host
backup_stream: backup-gitea-canonical
status: operational
- id: asset-railiance01
name: railiance01 k3s cluster
tier: T2
owner: Bernd
host: railiance01
ip: "92.205.62.239"
recovery_path:
method: Ansible baseline + Helm redeploy + data restore from backups
backup_streams:
- backup-s1-os-config
- backup-s2-k8s-runtime
status: operational
gaps:
- "S1/S2 backups on-node only"
# ── T4 External dependencies ─────────────────────────────────────────────────
- id: asset-bubble-io
name: Bubble.io legacy application
tier: T4
owner: Bernd
recovery_path:
method: Bubble database export + documented restore workflow
limits: Platform-controlled; export cadence not established
backup: none automated
rpo: 24h
rto: 24h
status: at_risk
gaps:
- "No scheduled export evidenced"
- "Member data on platform we do not control"
- id: asset-openrouter
name: OpenRouter API (LLM inference)
tier: T4
owner: Bernd
recovery_path:
method: Alternate LLM provider; API key rotation via OpenBao
limits: No data RPO unless storing prompts/results
backup: API keys in OpenBao
rpo: N/A
rto: 1-4h
status: operational
gaps:
- "Alternate provider path not documented in runbook"
related_streams:
# Operational on cluster but outside T01 minimum table — tracked for completeness.
- id: backup-adjacent-sso