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>
14 lines
523 B
Django/Jinja
Executable file
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
|