Adds a complete disaster-recovery story: CBM now backs up its own metadata, hands you a portable recovery file, and can restore your resources onto a fresh or different Coolify — even when the source Coolify is gone. The controller applies two new migrations automatically on start; no breaking changes.
Added
- Metadata self-backup. The controller keeps an always-current, encrypted
pg_dumpof its own database on an off-site destination (S3 or SSH) as a single overwritten artefact — change-driven and throttled, with a daily safety run and failure/overdue alerts. Configure it in Settings → Disaster recovery. - Portable recovery file. A reveal-once, password-gated download that carries the master key and the location of your latest self-backup. Import it on a fresh install to rebuild CBM: it fetches the latest metadata and re-encrypts every secret under the new master key. A Verify recovery path drill proves the backup is recoverable without a restore.
- Restore onto a fresh or different Coolify. Snapshots now capture the full resource definition (git/build pack, image, compose, domains, database credentials), so Restore → new works even when the source Coolify is gone: it recreates the missing projects/environments, remaps the target server, and re-injects the config. When several instances are connected, a Restore onto picker clones a backup onto another Coolify (migration).
- Re-point an instance in place (edit its URL + API token) to redirect every snapshot to a new Coolify, plus a per-instance multi-server restore map. See docs/disaster-recovery.md.
- Disaster recovery shortcut in the command palette.
Fixed / hardened
- The invitation signup gate now closes ~10 minutes after a link is opened (it was open for the invite's full 48h), so an intercepted-then-abandoned claim can't be used later.
- Documented the single-replica scheduler and added a Postgres advisory-lock backstop, so an accidental second controller replica doesn't double-fire schedules.
Upgrading
- The controller applies migrations
0016and0017automatically on start — no breaking changes. The controller image now bundles the PostgreSQL client used by the self-backup and recovery. Run exactly one controller replica. Pull the new images below (or:latest).
Images
Published to the GitHub Container Registry — also tagged :1.2 and :latest:
docker pull ghcr.io/holo795/cbm-controller:1.2.0
docker pull ghcr.io/holo795/cbm-agent:1.2.0