EMStool LLC — Cadence EMS Scheduler

Business Continuity & Disaster Recovery Plan

Document #: BCP-2026-01 Version: 1.2 Effective: June 29, 2026 (rev. July 16, 2026) Owner: Jacob Russell, Security Officer
This plan defines how EMStool LLC will maintain or restore Cadence operations in the event of a major system failure, data loss event, or prolonged outage. It establishes recovery objectives, procedures, and responsibilities.

1. Recovery Objectives

MetricTargetNotes
Recovery Time Objective (RTO)4 hoursMaximum time to restore service from outage declaration
Recovery Point Objective (RPO)24 hoursMaximum acceptable data loss; daily backups provide this guarantee
Maximum Tolerable Downtime (MTD)48 hoursBeyond this, customer SLA breach and HIPAA notification required

2. System Architecture Overview

Each client runs Cadence on its own dedicated hardware — an EMStool-provided appliance or the client's own server, in the client's own facility — fully isolated from every other client. There is no shared multi-tenant database.

EMStool also operates its own non-client host (Bender, 192.168.0.13) for software development and a public demo/trial instance (scheduler.emstool.com, seed/dummy data only). The scenarios below apply identically to any Cadence deployment, client or EMStool's own.

3. Backup Procedures

Database Backups

Code Backups

4. Disaster Scenarios and Response Procedures

Scenario A: Database Corruption or Loss

  1. Stop SWAG container to prevent further writes
  2. Download latest encrypted backup from Backblaze B2
  3. Decrypt: gpg --decrypt backup.sql.gpg | mysql -u root -p cadence_db
  4. Start MariaDB container and verify data integrity
  5. Run any pending migrations: ./deploy.sh migrate
  6. Restart SWAG container; verify application operational
  7. Notify affected customers of data recovery and any data loss window

Scenario B: Server Hardware Failure

Applies to Bender (EMStool's own dev/demo host) or any single client's own hardware — each deployment is independent, so a hardware failure on one never affects another.

  1. Provision a replacement Unraid server or Docker host
  2. Install SWAG and the MariaDB container with same configuration
  3. Restore the database from the configured backup (Backblaze B2, local NAS, or whatever destination that deployment uses — see Scenario A)
  4. Clone code from GitHub and run deploy.sh
  5. Update Cloudflare tunnel connector to point to new server
  6. Verify DNS and SSL function correctly

Scenario C: Cloudflare Tunnel Failure

  1. SSH to Bender (192.168.0.13) and check cloudflared container status
  2. Restart tunnel container: docker restart Unraid-Cloudflared-Cadence
  3. If tunnel token expired, regenerate at Cloudflare dashboard and update container env
  4. If tunnel service is globally degraded, monitor Cloudflare status page and wait

Scenario D: Security Incident (Breach/Ransomware)

  1. Immediately disconnect affected systems from network
  2. Follow Incident Response Runbook (IRP-2026-01)
  3. Restore from last known-clean backup
  4. Rebuild compromised containers from scratch
  5. Rotate all credentials before bringing systems back online

5. Communication During Outage

StakeholderWhenHow
Cadence customersOutage > 30 minutesEmail to account admins
InternalImmediately on detectionDirect communication
Customers (data loss)If RPO exceededFormal written notification with scope of loss

6. Recovery Test Schedule

7. Restore Test Log

DateInstanceMethodResult
July 16, 2026 scheduler.emstool.com Decrypted the day's live encrypted backup (GPG), restored into a fresh, isolated, throwaway MariaDB container — not the production database or any existing container — then dropped the container entirely. Encryption-at-rest clause stripped from the dump for this data-integrity test only; the encryption keyfile itself is backed up and recoverable separately (see Risk Analysis, Asset 5). Pass. 77/77 tables restored (matches backup manifest); spot-checked row counts against the live database at time of test — patients 262/262, sched_users 22/22, appointments 2349/2349. Full data integrity confirmed.
Security Officer Signature
Jacob Russell — Security Officer, EMStool LLC
Date Reviewed
June 29, 2026