Files
AWatch-rus/DISASTER_RECOVERY_PROOF.md
T

16 KiB

Disaster Recovery Proof

Date: 2026-07-01

Scope: evidence-backed disaster recovery validation for the current AWatch-rus / DetMir production deployment, based only on repository contents. This document does not introduce new recovery procedures and does not change production behavior.

Result

Current proof level: partially proven.

Recovery confidence: 48 / 100.

The repository contains deployable components, restart/health checks, Windows collector recovery automation, ActivityWatch DB merge support, retention guard rails, and validation scripts. The repository does not yet contain evidence of a completed separate-host restore for the primary repository/Gitea backup, and does not implement fully automated restore for all runtime data stores.

Production 1.0 release implication: DR is not blocked by missing documentation, but remains blocked by missing restore evidence for the repository/Gitea backup and by missing automated restore coverage for several runtime stores.

Status Definitions

  • Implemented: repository contains executable automation or a concrete validation script for the step.
  • Partially implemented: repository contains part of the mechanism, but not an end-to-end proven path.
  • Manual: repository documents the step, but operator execution and evidence capture are required.
  • Missing: repository evidence shows the step is not implemented.
  • Unsupported: repository code explicitly rejects or excludes the operation.

Evidence Inventory

Area Status Evidence
General backup/recovery model Manual docs/BACKUP_AND_RECOVERY_RU.md:59-71 defines the generic stop, preserve state, restore, start, health, smoke, and record-result sequence.
Production health endpoints Implemented docs/OPERATIONS_RUNBOOK_RU.md:5-13 defines /healthz, /readyz, and /metrics checks; docs/OPERATIONS_RUNBOOK_RU.md:18-47 defines expected semantics.
Post-recovery smoke Implemented docs/OPERATIONS_RUNBOOK_RU.md:49-64 lists smoke scripts and requires them after recovery.
Operational maturity validation Implemented docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md:49-59 requires scripts/public_secret_pattern_check.py, scripts/operational-maturity-check.mjs, and quality-gate.
Browser/operator validation Manual docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md:64-93 lists required operator pages and secret-handling rules.
DetMir production smoke Implemented docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md:95-119 defines check-aw-full.sh, check-aw-data.sh, and stable SHARKON2025 host id handling.
ActivityWatch service startup Implemented aw-server/activitywatch-server.service:6-14 defines env file, DB path, web path, restart policy, and restart delay.
ActivityWatch DB maintenance Implemented aw-server/aw-db-maintenance.service:29-32 and aw-server/aw-db-maintenance.timer:34-42 define guarded maintenance.
Readiness evidence bundle Implemented aw-server/detmir-readiness.service:48-59 and aw-server/detmir-readiness.timer:60-71 generate daily readiness bundles.
Server deploy and API startup validation Implemented ansible/deploy_aw_server.yml:2365-2380 restarts aw-server/activitywatch-server.service and waits for /api/0/info.
ActivityWatch DB merge backup Partially implemented ansible/deploy_aw_server.yml:2222-2350 checks/install merge binary, backs up target and legacy DBs, merges, and installs merged DB when enabled.
Rust restore planner Partially implemented scripts/prod_backup_restore.sh:14-29 requires the Rust planner; adk-rust/crates/prod-backup-restore/src/main.rs:100-105 explicitly rejects --apply.
Windows package rollback backup Implemented windows/ActivityWatch.Windows.Common.psm1:148-247 backs up install root before replacement and cleans old install backups.
Windows recovery loop Implemented windows/ActivityWatch.Windows.Common.psm1:1576-1597 writes recovery script; windows/ActivityWatch.Windows.Common.psm1:2114-2167 runs the recovery loop.
Windows recovery scheduled task Implemented windows/ActivityWatch.Windows.Common.psm1:2447-2495 registers ActivityWatch Recovery; windows/ActivityWatch.Windows.Common.psm1:2656-2672 starts launch tasks and recovery task.
Windows deployment validation Implemented ansible/deploy_aw_windows.yml:501-545 checks ActivityWatch API buckets; ansible/deploy_aw_windows.yml:547-565 runs and fetches endpoint validation.
Windows post-deploy validation Implemented ansible/post_validate_aw_windows.yml:55-120 starts recovery/launch tasks and waits for fresh worktime events.
Gitea backup Manual / partially implemented docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md:7-23 documents path, script, timer, format, checksum, retention, and restore-tested status.
Gitea restore proof Missing docs/registry/registry-evidence-manifest.json:26-40 records restore_tested=false and production_ready=false.
ClickHouse 1C runtime store Partially implemented clickhouse-1c/docker-compose.yml:1-19 defines the service and persistent Docker volume; no restore automation is present in the repository.
ClickHouse Workforce runtime store Partially implemented clickhouse-workforce/docker-compose.yml:1-17 defines the service and persistent Docker volume; no restore automation is present in the repository.
Grafana/Prometheus runtime store Partially implemented grafana-1c/docker-compose.yml:36-79 defines Prometheus/Grafana volumes and Prometheus retention; no Grafana data restore automation is present in the repository.
Retention boundaries Implemented for documented cleanup scopes docs/RETENTION_POLICY_RU.md:65-102 documents retention and recovery impact for persistent stores.

End-to-End Recovery Chain

Step Status Current evidence Proof conclusion
Repository Partially implemented Primary self-hosted Gitea repository is recorded in docs/registry/registry-evidence-manifest.json:6-10; backup configuration is recorded in docs/registry/registry-evidence-manifest.json:26-40. Source repository is identified and backup metadata exists, but restore proof is missing.
Configuration Manual Git stores sanitized templates and explicitly excludes secrets/live DBs in docs/BACKUP_AND_RECOVERY_RU.md:29-46. Configuration can be reconstructed from repository templates plus customer secret store, but secrets are intentionally external.
Deployment Implemented Server deployment restarts ActivityWatch and waits for API readiness in ansible/deploy_aw_server.yml:2365-2380; Windows deployment runs package install, recovery tasks, and smoke checks in ansible/deploy_aw_windows.yml:279-565. Server and Windows deployment are executable from repository playbooks.
Restore Partially implemented AW DB merge path exists in ansible/deploy_aw_server.yml:2222-2350; Rust planner emits a plan but rejects --apply in adk-rust/crates/prod-backup-restore/src/main.rs:100-105; Gitea restore is manual and untested per docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md:42-100. Restore is only partially proven. Several runtime stores require manual or future automation.
Startup Implemented aw-server/activitywatch-server.service has restart policy in aw-server/activitywatch-server.service:6-14; Windows recovery task and loop are implemented in windows/ActivityWatch.Windows.Common.psm1:2114-2167 and :2447-2495. Repository supports service startup and collector recovery startup.
Health Implemented /healthz, /readyz, /metrics are documented in docs/OPERATIONS_RUNBOOK_RU.md:5-47; server deployment waits for /api/0/info in ansible/deploy_aw_server.yml:2372-2380. Health checks are present and part of deploy/recovery validation.
Operational validation Implemented Operational gates are documented in docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md:49-59; production smoke is documented in docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md:95-119. Repository has repeatable operational validation commands.
Pilot validation Implemented docs/OPERATIONS_RUNBOOK_RU.md:49-64 lists pilot/demo/deployment smoke scripts after recovery; scripts/pilot-validation-smoke.mjs and scripts/deployment-readiness-smoke.mjs exist. Pilot/deployment smoke validation is implemented as repository scripts.
Ready Manual / conditional General recovery procedure requires result recording in docs/BACKUP_AND_RECOVERY_RU.md:59-71; Gitea manifest still says production_ready=false in docs/registry/registry-evidence-manifest.json:37-40. Ready can only be claimed after external restore evidence is captured and manifest gaps are closed.

Current Recovery Capability

Server

Implemented:

  • ActivityWatch server restart and API readiness wait through Ansible.
  • Systemd restart-on-failure for aw-server/activitywatch-server.service.
  • Guarded SQLite maintenance and daily readiness bundle timers.
  • Limited AW DB merge/recovery-like flow with pre-merge backups.

Partially implemented:

  • Generic production restore planning through prod-backup-restore, because the Rust binary builds a plan but rejects apply mode.
  • ActivityWatch DB restore, because the repository implements legacy DB merge, but not a generic restore-selected-backup command.

Missing:

  • Evidence of a completed end-to-end AW DB restore drill.
  • Automated rollback from a failed DB merge to the pre-merge backup.

Windows/RDP

Implemented:

  • Package replacement with install-root backup.
  • Recovery script generation.
  • Scheduled ActivityWatch Recovery task.
  • Long-running recovery loop that restarts collectors/tasks for live sessions.
  • Post-deploy validation that waits for fresh ActivityWatch worktime events.

Partially implemented:

  • Full Windows state restore, because install backups exist but C:\ProgramData\AWatch-rus restore as a whole is not implemented.

Repository/Gitea

Manual / partially implemented:

  • Backup target, script name, systemd unit/timer names, format, checksum, and retention are documented.
  • Restore procedure is documented as an outline for a separate server.

Missing:

  • Actual separate-host restore evidence.
  • Manifest update proving restore_tested=true.
  • Offsite copy evidence.

ClickHouse, Grafana, Prometheus

Partially implemented:

  • Docker Compose files define persistent volumes and restart policies.
  • Prometheus retention is configurable through compose.
  • Retention policy documents recovery impact for ClickHouse, Grafana, and Prometheus stores.

Missing:

  • Automated backup and restore for ClickHouse 1C volume.
  • Automated backup and restore for ClickHouse Workforce volume.
  • Automated Grafana data restore.
  • End-to-end restore evidence for these stores.

Current Limitations

  1. Gitea backup cannot be called production-ready until a separate-host restore is performed and recorded. Evidence: docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md:3-5, docs/registry/registry-evidence-manifest.json:37-40.
  2. prod-backup-restore --apply is unsupported by code. Evidence: adk-rust/crates/prod-backup-restore/src/main.rs:100-105.
  3. ActivityWatch DB recovery is limited to legacy-root merge and does not prove generic restore from a selected backup file. Evidence: ansible/deploy_aw_server.yml:2222-2350.
  4. ClickHouse/Grafana/Prometheus data volumes are declared, but repository restore automation is not present. Evidence: clickhouse-1c/docker-compose.yml:13-19, clickhouse-workforce/docker-compose.yml:11-17, grafana-1c/docker-compose.yml:36-79.
  5. Customer secrets are intentionally outside Git. Recovery therefore requires access to the customer secret store and cannot be proven from repository contents alone. Evidence: docs/BACKUP_AND_RECOVERY_RU.md:29-46.
  6. Evidence/customer data must not be placed in the public repository. Evidence: docs/BACKUP_AND_RECOVERY_RU.md:91-98.

Estimated Recovery Sequence

This sequence is the current evidence-backed chain. Steps marked manual require operator execution and external evidence capture.

  1. Repository availability: clone the primary Gitea repository or validated mirror. Status: partially implemented. Evidence: docs/registry/registry-evidence-manifest.json:6-10.
  2. Repository restore, if primary Gitea is lost: follow the Gitea restore outline on a separate host, verify checksum, run Gitea checks, and record evidence. Status: manual / missing proof. Evidence: docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md:42-100.
  3. Configuration recovery: restore sanitized templates from Git and secrets from the approved customer secret store. Status: manual. Evidence: docs/BACKUP_AND_RECOVERY_RU.md:29-46.
  4. Server deployment: run server deployment playbook and wait for /api/0/info. Status: implemented. Evidence: ansible/deploy_aw_server.yml:2365-2380.
  5. AW DB merge path, only when legacy-root merge is explicitly enabled: back up target and legacy DBs, merge, install merged DB. Status: partially implemented. Evidence: ansible/deploy_aw_server.yml:2222-2350.
  6. Windows/RDP deployment: run Windows deployment playbook, deploy package, configure recovery tasks, and validate bucket events. Status: implemented. Evidence: ansible/deploy_aw_windows.yml:279-565.
  7. Windows post-restore validation: start recovery/launch tasks and wait for worktime events. Status: implemented. Evidence: ansible/post_validate_aw_windows.yml:55-120.
  8. Service startup validation: check systemd status, /healthz, /readyz, /metrics, and /api/0/info. Status: implemented. Evidence: docs/OPERATIONS_RUNBOOK_RU.md:5-47, ansible/deploy_aw_server.yml:2372-2380.
  9. Production smoke: run check-aw-full.sh, check-aw-data.sh, and contour smoke with stable SHARKON2025 logical host id. Status: implemented. Evidence: docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md:95-119.
  10. Operational maturity validation: run secret scan, operational maturity check, and quality gate. Status: implemented. Evidence: docs/OPERATIONS_VALIDATION_RUNBOOK_RU.md:49-59.
  11. Pilot/deployment readiness validation: run pilot and deployment smoke scripts after recovery. Status: implemented. Evidence: docs/OPERATIONS_RUNBOOK_RU.md:49-64.
  12. Ready decision: record recovery result and do not claim production-ready DR until missing restore evidence is closed. Status: manual / conditional. Evidence: docs/BACKUP_AND_RECOVERY_RU.md:59-71, docs/registry/registry-evidence-manifest.json:37-40.

Evidence Gaps

Gap Status Required evidence before closing
Gitea separate-host restore Missing Backup filename, SHA256 verification output, Gitea version, restore duration, post-restore checks, clone/access proof, and manifest update.
Generic AW DB restore Missing Tested command or runbook restoring a selected backup into active DB with checksum and rollback evidence.
ClickHouse 1C restore Missing Tested volume/table backup and restore evidence for clickhouse_1c_data.
ClickHouse Workforce restore Missing Tested volume/table backup and restore evidence for clickhouse_workforce_data.
Grafana data restore Missing Tested restore evidence for grafana-data or explicit proof that provisioned dashboards plus documented credentials are sufficient.
Off-host backup copy Missing Repository evidence of destination, retention, checksum policy, access policy, and restore test.

These are future tasks, not implemented by this document:

  1. Add a non-destructive restore drill checklist artifact that records exact backup filename, checksum, host, duration, and post-restore checks.
  2. Add a separate-host Gitea restore evidence template and only then update restore_tested in docs/registry/registry-evidence-manifest.json.
  3. Add tested backup/restore automation for ClickHouse 1C and Workforce volumes or explicitly document that those stores are rebuilt from source exports.
  4. Add a generic ActivityWatch DB restore runbook with rollback command and checksum verification.
  5. Add a single post-restore validation command that runs health, operational maturity, pilot validation, and deployment readiness in the documented order.

Release Decision

DR proof is sufficient to show that the repository contains significant recoverability mechanisms and validation gates.

DR proof is not sufficient to claim full Production 1.0 disaster recovery until the missing separate-host restore evidence and runtime store restore gaps are closed.