make local-converge-down, which ran on 2026-11-13 after the phase 16 drills
(local-converge.md section 2).
Before you start
-
Data. Destroying the servers destroys both databases (Umami and platform), the NATS
streams with anything still queued, and every Caddy certificate. The destroy targets keep the
backup storage account, the core identity and the environment’s resource group
(
-exclude, see the Makefile), so backups survive, encrypted withpgbackrest_cipher_passfrom the SOPS file. Keep that file and at least one recipient’s identity as long as you keep backups. The OpenTofu state account is never touched by a destroy. -
Queues. If tenants send data, drain first: stop sending is not in your hands, so announce
the shutdown, wait until
WEB_EVENTSandAPI_METRICSare empty (../runbooks/queue-backlog-and-dlq.md), and take a last backup:
Staging
-
Destroy:
OpenTofu lists what it will destroy and asks for
yes. Expected:Destroy complete! Resources: <n> destroyed. -
Remove the generated inventory, which now points at nothing:
rm infra/ansible/inventories/staging/hosts.json. -
What stays, on purpose: the state account, the backup storage account with its identity and
resource group, the SOPS files,
terraform.tfvarsandgroup_vars/all.yml. A latermake staging-planandmake staging-applyrebuild the same environment (bootstrap.md). To remove the backups as well, once they are no longer wanted:make staging-destroy TEARDOWN_ALL=1. Azure refuses to delete the storage account while a version is still within its immutability period (7 days after it was written), so run it when no backup was written for 7 days, or after deleting the blobs whose period ended.
Production
-
make production-destroyrefuses unlessCONFIRM=productionis set (set CONFIRM=production to destroy production), and even then Azure refuses while the delete locks exist. -
To really remove production: set
protectto false ininfra/tofu/envs/production/env.tf, review it,make production-planandmake production-apply(expected: only the locks are removed), then: -
Then as staging steps 2 and 3. For a handover rather than a shutdown, follow the handover plan
instead (
docs/handover/): the repository, the domain and the data move, nothing is destroyed.