platform/platform-infra/ansible/roles/backup/templates/heleos-zfs-offsite.sh.j2
Bart Van Geyt 0ade1c740f Phase 5: backup/DR automation (backup Ansible role)
Implements the two decoupled backup streams from docs/06 as an idempotent
Ansible role wired into the host playbook:

- Files: sanoid takes/prunes ZFS snapshots per policy (sanoid_datasets) on
  its packaged timer; syncoid replicates offsite (heleos-zfs-offsite),
  enabled only when zfs_offsite_target is set.
- DB: heleos-db-backup (nightly systemd timer) walks the deployments dir and
  dumps each DB-backed site via `docker exec mariadb-dump` into
  db-backups/<customer>/<site>/{daily,weekly,monthly} with rotation
  (automysqlbackup-style, adapted for the containerized DB; MYSQL_PWD keeps
  the password out of the process list). heleos-db-offsite rsyncs offsite
  when db_offsite_target is set.

Streams and schedules are configured in group_vars/all.yml; offsite is
opt-in via the two target vars. Updates doc 06 (implementation note), the
ansible README, and CLAUDE.md status. YAML + templates validated by render.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 18:04:41 +02:00

14 lines
523 B
Django/Jinja
Executable file

#!/usr/bin/env bash
# heleos offsite ZFS replication via syncoid (incremental zfs send). Managed by
# Ansible. Only installed/enabled when zfs_offsite_target is set.
set -euo pipefail
TARGET="{{ zfs_offsite_target }}"
for ds in {{ zfs_offsite_datasets | join(' ') }}; do
# DEST mirrors the last path component under the offsite base, e.g.
# tank/customers -> <target>/customers
dest="${TARGET}/${ds##*/}"
echo "==> syncoid ${ds} -> ${dest}"
syncoid --recursive --no-sync-snap "${ds}" "${dest}"
done