From bc110ce69e0d578f67cc38e5d7ebb25eb48db36e Mon Sep 17 00:00:00 2001 From: Bastian de Byl Date: Thu, 30 Jul 2026 18:08:47 -0400 Subject: [PATCH] back up Gitea + Skudak app data; drop PartKeepr and Pi-hole Extends the Nextcloud backup machinery rather than adding a second mechanism. cloud-backup.sh.j2 gains three guarded options, all no-ops for the existing callers: backup_podman_user Gitea runs rootless under `git`, not `podman` backup_db_type postgres (Gitea) and mysql (BookStack) alongside mariadb; each engine's completion trailer differs, and grepping for the wrong one fails every run backup_sqlite_dbs `sqlite3 .backup` for live WAL-mode SQLite, gated on `pragma integrity_check` before promotion -- rsync is either stale (no -wal) or torn (with it) New instances: gitea-debyl, skudak-gitea, bookstack, partsy-skudak. The alert handler is rendered once and shared, so its wording is now generic rather than per-product; TAG stays nextcloud-backup because an external Graylog rule matches on it. `apply:` on the includes is load-bearing -- tags on a dynamic include_tasks do not reach the tasks inside it. Business data (skudak-gitea, bookstack, partsy-skudak) goes to TrueNAS and on to Skudak's own iDrive account; the personal bucket's /skudak*/** excludes are permanent, not a stopgap. Removals: PartKeepr is superseded by Partsy, and its teardown never finished -- it targeted /etc/systemd/system/podman-partkeepr*.service, wrong prefix and wrong scope, leaving enabled user units in failed state. Pi-hole's role was already orphaned (absent from deploy_home.yml); its port 53 rule went with it after confirming nothing listens there. Co-Authored-By: Claude Opus 5 (1M context) --- ansible/roles/pihole/defaults/main.yml | 5 - ansible/roles/pihole/meta/main.yml | 3 - ansible/roles/pihole/tasks/deps.yml | 11 -- ansible/roles/pihole/tasks/main.yml | 3 - ansible/roles/pihole/tasks/php.yml | 12 -- ansible/roles/podman/defaults/main.yml | 2 - .../tasks/containers/home/partkeepr.yml | 59 -------- .../podman/tasks/containers/skudak/cloud.yml | 26 ++++ ansible/roles/podman/tasks/firewall.yml | 5 +- ansible/roles/podman/tasks/main.yml | 129 +++++++++++++++++- .../nextcloud/cloud-backup.service.j2 | 2 +- .../templates/nextcloud/cloud-backup.sh.j2 | 92 ++++++++++--- .../templates/nextcloud/cloud-backup.timer.j2 | 2 +- .../nextcloud/nextcloud-backup-alert.sh.j2 | 14 +- ansible/vars/vault.yml | Bin 28629 -> 34202 bytes 15 files changed, 236 insertions(+), 129 deletions(-) delete mode 100644 ansible/roles/pihole/defaults/main.yml delete mode 100644 ansible/roles/pihole/meta/main.yml delete mode 100644 ansible/roles/pihole/tasks/deps.yml delete mode 100644 ansible/roles/pihole/tasks/main.yml delete mode 100644 ansible/roles/pihole/tasks/php.yml delete mode 100644 ansible/roles/podman/tasks/containers/home/partkeepr.yml diff --git a/ansible/roles/pihole/defaults/main.yml b/ansible/roles/pihole/defaults/main.yml deleted file mode 100644 index 26a6ab1..0000000 --- a/ansible/roles/pihole/defaults/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -deps: [ - php-sqlite, - php-fpm -] diff --git a/ansible/roles/pihole/meta/main.yml b/ansible/roles/pihole/meta/main.yml deleted file mode 100644 index 3f81c4b..0000000 --- a/ansible/roles/pihole/meta/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -dependencies: - - role: http diff --git a/ansible/roles/pihole/tasks/deps.yml b/ansible/roles/pihole/tasks/deps.yml deleted file mode 100644 index f2fe91d..0000000 --- a/ansible/roles/pihole/tasks/deps.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: install pi-hole-server - ansible.builtin.command: yay -S --noconfirm pi-hole-server - args: - creates: /bin/pihole - -- name: install pi-hole-server dependencies - become: true - ansible.builtin.package: - name: "{{ deps }}" - state: present diff --git a/ansible/roles/pihole/tasks/main.yml b/ansible/roles/pihole/tasks/main.yml deleted file mode 100644 index 736d254..0000000 --- a/ansible/roles/pihole/tasks/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -- import_tasks: deps.yml -- import_tasks: php.yml diff --git a/ansible/roles/pihole/tasks/php.yml b/ansible/roles/pihole/tasks/php.yml deleted file mode 100644 index 4a93a0c..0000000 --- a/ansible/roles/pihole/tasks/php.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: replace pi.hole hostname - become: true - ansible.builtin.replace: - path: "{{ item }}" - regexp: "pi\\.hole" - replace: "pi.bdebyl.net" - loop: - - /srv/http/pihole/admin/scripts/pi-hole/php/auth.php - - /srv/http/pihole/pihole/index.php - tags: - - pihole diff --git a/ansible/roles/podman/defaults/main.yml b/ansible/roles/podman/defaults/main.yml index 7204e2d..c82e10e 100644 --- a/ansible/roles/podman/defaults/main.yml +++ b/ansible/roles/podman/defaults/main.yml @@ -24,7 +24,6 @@ gregtime_path: "{{ podman_volumes }}/gregtime" hass_path: "{{ podman_volumes }}/hass" # nginx_path: removed - nginx no longer used # nosql_path: removed - nosql/redis no longer used -partkeepr_path: "{{ podman_volumes }}/partkeepr" partsy_path: "{{ podman_volumes }}/partsy" partsy_skudak_path: "{{ podman_volumes }}/partsy-skudak" photos_path: "{{ podman_volumes }}/photos" @@ -75,7 +74,6 @@ zomboid_maps: modded: "Muldraugh, KY" b42revamp: "AnruisiTown;Asakusa lake town;BananaBeachHouse;Blackstone;Cathaya Valley2.0;Cathaya Valley2.0 highway;Daisy County;DawnTown;Estate 39;Fort Waterfront B42;Greenleaf;GreenRiver;IrisEyot;Louisville_Quarantine_Zone;Louisville_River_Marina;Louisville_Riverboat;Maplewood;Meiya'sTown;Muldraugh_FireDept;muldraughmilitarybaseas24;PeaceTown;RaccoonCity;Raven Creek B42;map_distanciado;rvupdate;rv2;serenitybunker;Tikitown;Uncle Red's Bunker B42;Uncle Red's Bunker Redux B42;WestPoint-MilitaryTugBoat;Muldraugh, KY" -pihole_path: "{{ podman_volumes }}/pihole" sshpass_cron_path: "{{ podman_volumes }}/sshpass_cron" caddy_path: "{{ podman_volumes }}/caddy" diff --git a/ansible/roles/podman/tasks/containers/home/partkeepr.yml b/ansible/roles/podman/tasks/containers/home/partkeepr.yml deleted file mode 100644 index a2b28ce..0000000 --- a/ansible/roles/podman/tasks/containers/home/partkeepr.yml +++ /dev/null @@ -1,59 +0,0 @@ ---- -# PartKeepr has been replaced by Partsy -# This playbook removes PartKeepr containers and services -# Keeping MySQL data volume for historical reference only - -- name: stop and remove partkeepr container - become: true - become_user: "{{ podman_user }}" - containers.podman.podman_container: - name: partkeepr - state: absent - -- name: stop and remove partkeepr-db container - become: true - become_user: "{{ podman_user }}" - containers.podman.podman_container: - name: partkeepr-db - state: absent - -- name: remove systemd service for partkeepr - become: true - ansible.builtin.systemd: - name: "podman-partkeepr.service" - state: stopped - enabled: false - daemon_reload: true - ignore_errors: true - -- name: remove systemd service for partkeepr-db - become: true - ansible.builtin.systemd: - name: "podman-partkeepr-db.service" - state: stopped - enabled: false - daemon_reload: true - ignore_errors: true - -- name: remove systemd service files for partkeepr - become: true - ansible.builtin.file: - path: "{{ item }}" - state: absent - loop: - - "/etc/systemd/system/podman-partkeepr.service" - - "/etc/systemd/system/podman-partkeepr-db.service" - notify: systemd daemon-reload - -- name: preserve partkeepr mysql data volume for history - become: true - ansible.builtin.file: - path: "{{ partkeepr_path }}/mysql" - state: directory - owner: "{{ podman_subuid.stdout }}" - group: "{{ podman_user }}" - mode: 0755 - notify: restorecon podman - -- name: flush handlers - ansible.builtin.meta: flush_handlers diff --git a/ansible/roles/podman/tasks/containers/skudak/cloud.yml b/ansible/roles/podman/tasks/containers/skudak/cloud.yml index 9fe2d2f..318fe32 100644 --- a/ansible/roles/podman/tasks/containers/skudak/cloud.yml +++ b/ansible/roles/podman/tasks/containers/skudak/cloud.yml @@ -161,6 +161,32 @@ cron_container: skudak-cloud cron_script_path: /usr/local/bin/skudak-cloud-cron.sh +# This instance is BUSINESS data and deliberately backs up to TrueNAS ONLY. +# +# It used to reach personal cloud storage too: the TrueNAS "iDrive E2 Backup" +# cloud-sync task pushes /mnt/glacier to a personal iDrive e2 bucket, which +# swept skudakcloud/ along with it. That task now carries an explicit +# `/skudakcloud/**` exclude, and on 2026-07-30 the stranded copy was purged +# from the bucket -- business data does not belong in personal storage. +# +# The copy was also worthless as a backup: 30 objects against 20,802 files on +# TrueNAS (0.14%), stale since 2026-05-20. Worse, the bucket is VERSIONED and +# the sync runs in COPY mode (never deletes), so every daily run retained +# another ~60 GB version of the pre-cap nextcloud.log -- 56 of them, 3.46 TB, +# 99.3% of a 3.49 TB footprint. Deleting current objects alone reclaims +# nothing on a versioned bucket; the versions must be purged explicitly. +# +# Offsite is now BUSINESS-OWNED: Skudak's own iDrive e2 account, bucket +# `backup-all`, pushed by TrueNAS cloud-sync task "Skudak iDrive - Nextcloud" +# (id 8, /mnt/glacier/skudakcloud -> /skudakcloud, daily 06:00). That bucket +# has a 90-day NoncurrentVersionExpiration policy so the version bloat above +# cannot repeat. The personal task's `/skudakcloud/**` exclude is PERMANENT -- +# it is what keeps business data out of personal storage, not a stopgap. +# +# Still outstanding: the data itself lives on personal TrueNAS hardware. To +# finish separating, add an S3 stage to cloud-backup.sh.j2 guarded by a +# `backup_s3_*` var so only this instance opts in -- awscli2 is already +# installed on the host -- and then drop the TrueNAS rsync below. - include_tasks: containers/cloud-backup.yml vars: backup_name: skudak-cloud diff --git a/ansible/roles/podman/tasks/firewall.yml b/ansible/roles/podman/tasks/firewall.yml index d6f8225..f90db4c 100644 --- a/ansible/roles/podman/tasks/firewall.yml +++ b/ansible/roles/podman/tasks/firewall.yml @@ -15,12 +15,9 @@ - 443/tcp # Gitea Skudak SSH - 2222/tcp - # pihole (unused?) - - 53/tcp - - 53/udp # nosql/redis - 6379/tcp - # ??? + # BookStack (wiki.skudak.com) -- container publishes 6875:8080 - 6875/tcp # Satisfactory - 7777/tcp diff --git a/ansible/roles/podman/tasks/main.yml b/ansible/roles/podman/tasks/main.yml index cca4d9b..aaddf64 100644 --- a/ansible/roles/podman/tasks/main.yml +++ b/ansible/roles/podman/tasks/main.yml @@ -34,12 +34,6 @@ image: ghcr.io/home-assistant/home-assistant:2026.5.1 tags: hass -- import_tasks: containers/home/partkeepr.yml - vars: - db_image: docker.io/library/mariadb:10.0 - image: docker.io/bdebyl/partkeepr:0.1.10 - tags: partkeepr - - import_tasks: containers/home/partsy.yml vars: image: "git.debyl.io/debyltech/partsy:latest" @@ -117,3 +111,126 @@ image: docker.io/cm2network/steamcmd:root tags: zomboid +# ---------------------------------------------------------- Gitea backups +# The Gitea pods themselves are owned by roles/git, but the backup machinery +# (containers/cloud-backup.yml plus templates/nextcloud/*) lives here, and an +# include_tasks reaching across roles would need a path outside the role. So +# the two Gitea backup instances are wired here alongside the container ones. +# +# Both run as ROOTLESS podman under "{{ git_user }}", not "{{ podman_user }}" +# -- hence backup_podman_user -- and use PostgreSQL rather than MariaDB. +# +# Scheduled ahead of the 04:00/04:30 Nextcloud runs so everything lands before +# the 05:00 TrueNAS snapshot. +# `apply` is required: tags on a dynamic include_tasks select whether the +# include runs, but do NOT propagate to the tasks inside it, so without this +# `make deploy TAGS=gitea-backup` includes the file and then filters out every +# task in it. The Nextcloud instances avoid this only because they are reached +# through a static import_tasks chain that tags their children at parse time. +- include_tasks: + file: containers/cloud-backup.yml + apply: + tags: gitea-backup + vars: + backup_name: gitea-debyl + backup_product: Gitea + backup_podman_user: "{{ git_user }}" + data_path: "{{ git_home }}/volumes/gitea/data" + db_container: gitea-debyl-postgres + backup_db_type: postgres + ssh_key_path: /etc/ssh/backup_keys/gitea + ssh_key_content: "{{ gitea_backup_ssh_key }}" + ssh_user: gitea + remote_path: /mnt/glacier/gitea + script_path: /usr/local/bin/gitea-backup.sh + # actions_log/artifacts are CI churn (510 MB and growing) and rebuildable; + # indexers/queues/tmp are derived state Gitea recreates on start. Note the + # default excludes are Nextcloud-specific, so this must be set explicitly. + backup_rsync_excludes: >- + --exclude '/gitea/actions_log' --exclude '/gitea/actions_artifacts' + --exclude '/gitea/tmp' --exclude '/gitea/indexers' --exclude '/gitea/queues' + backup_oncalendar: "*-*-* 03:30:00" + tags: gitea-backup + +# ------------------------------------------------- Skudak app-data backups +# BookStack (wiki.skudak.com) and partsy-skudak are BUSINESS data. Both share +# one TrueNAS dataset (/mnt/glacier/skudakapps) so they need only one backup +# user, key and cloud-sync task between them; the personal "iDrive E2 Backup" +# task excludes /skudakapps/** and Skudak's own task pushes it to backup-all. +# +# Scheduled ahead of the 03:30+ Gitea/Nextcloud jobs and the 05:00 snapshot. +- include_tasks: + file: containers/cloud-backup.yml + apply: + tags: [skudak, skudak-apps-backup] + vars: + backup_name: bookstack + backup_product: BookStack + data_path: "{{ bookstack_path }}" + db_container: bookstack-db + # mysql:5.7 predates the mariadb-dump alias -- see cloud-backup.sh.j2. + backup_db_type: mysql + ssh_key_path: /etc/ssh/backup_keys/skudakapps + ssh_key_content: "{{ skudakapps_backup_ssh_key }}" + ssh_user: skudakapps + remote_path: /mnt/glacier/skudakapps/bookstack + script_path: /usr/local/bin/bookstack-backup.sh + # The wiki content is the DATABASE; /mysql is its raw datadir, which must + # not be rsynced live -- the dump above is the consistent copy. public/ + # and storage/ hold the uploads and are the only file trees worth shipping. + backup_rsync_excludes: "--exclude '/mysql'" + backup_oncalendar: "*-*-* 03:00:00" + tags: skudak, skudak-apps-backup + +- include_tasks: + file: containers/cloud-backup.yml + apply: + tags: [skudak, skudak-apps-backup] + vars: + backup_name: partsy-skudak + backup_product: Partsy + data_path: "{{ partsy_skudak_path }}" + # Live WAL-mode SQLite: snapshotted via `sqlite3 .backup` rather than + # rsynced, so the -wal/-shm sidecars are deliberately excluded from the + # file tree -- shipping them alongside a separately-taken snapshot would + # only invite a confusing restore. + backup_sqlite_dbs: + - "{{ partsy_skudak_path }}/data/partsy.db" + backup_rsync_excludes: "--exclude '*-wal' --exclude '*-shm'" + ssh_key_path: /etc/ssh/backup_keys/skudakapps + ssh_key_content: "{{ skudakapps_backup_ssh_key }}" + ssh_user: skudakapps + remote_path: /mnt/glacier/skudakapps/partsy-skudak + script_path: /usr/local/bin/partsy-skudak-backup.sh + backup_oncalendar: "*-*-* 03:10:00" + tags: skudak, skudak-apps-backup + +# BUSINESS data. Rsynced to TrueNAS here, then pushed offsite to SKUDAK'S OWN +# iDrive e2 account (bucket `backup-all`) by TrueNAS cloud-sync task "Skudak +# iDrive - Gitea" (id 9, /mnt/glacier/skudakgit -> /skudakgit, daily 06:30). +# +# The personal "iDrive E2 Backup" task's /skudakgit/** exclude is PERMANENT: +# it is what keeps business data out of personal storage. Do not remove it -- +# Skudak has its own task and bucket instead. +- include_tasks: + file: containers/cloud-backup.yml + apply: + tags: [skudak, gitea-backup-skudak] + vars: + backup_name: skudak-gitea + backup_product: Gitea + backup_podman_user: "{{ git_user }}" + data_path: "{{ git_home }}/volumes/gitea-skudak/data" + db_container: gitea-skudak-postgres + backup_db_type: postgres + ssh_key_path: /etc/ssh/backup_keys/skudak-gitea + ssh_key_content: "{{ skudakgit_backup_ssh_key }}" + ssh_user: skudakgit + remote_path: /mnt/glacier/skudakgit + script_path: /usr/local/bin/skudak-gitea-backup.sh + backup_rsync_excludes: >- + --exclude '/gitea/actions_log' --exclude '/gitea/actions_artifacts' + --exclude '/gitea/tmp' --exclude '/gitea/indexers' --exclude '/gitea/queues' + backup_oncalendar: "*-*-* 03:45:00" + tags: skudak, gitea-backup-skudak + diff --git a/ansible/roles/podman/templates/nextcloud/cloud-backup.service.j2 b/ansible/roles/podman/templates/nextcloud/cloud-backup.service.j2 index 4183855..eb0836c 100644 --- a/ansible/roles/podman/templates/nextcloud/cloud-backup.service.j2 +++ b/ansible/roles/podman/templates/nextcloud/cloud-backup.service.j2 @@ -1,5 +1,5 @@ [Unit] -Description=Nextcloud {{ instance_name }} backup to TrueNAS +Description={{ backup_product | default('Nextcloud') }} {{ instance_name }} backup to TrueNAS After=network-online.target Wants=network-online.target OnFailure=nextcloud-backup-failed@%n.service diff --git a/ansible/roles/podman/templates/nextcloud/cloud-backup.sh.j2 b/ansible/roles/podman/templates/nextcloud/cloud-backup.sh.j2 index 7ad1ed5..2987e8c 100644 --- a/ansible/roles/podman/templates/nextcloud/cloud-backup.sh.j2 +++ b/ansible/roles/podman/templates/nextcloud/cloud-backup.sh.j2 @@ -1,14 +1,17 @@ #!/bin/bash # {{ ansible_managed }} -# Nextcloud "{{ backup_name }}" -> truenas.localdomain. +# {{ backup_product | default('Nextcloud') }} "{{ backup_name }}" -> truenas.localdomain. # # Ordering is deliberate: the database is dumped BEFORE the file tree is # synced. A DB snapshot slightly OLDER than the files degrades to "files -# Nextcloud has not indexed yet" and is repaired with `occ files:scan`. A DB -# snapshot NEWER than the files references blobs that never made it into the -# backup, which surfaces as broken shares and dead file entries on restore. +# the app has not indexed yet" and is repaired with a rescan. A DB snapshot +# NEWER than the files references blobs that never made it into the backup, +# which surfaces as broken shares and dead file entries on restore. set -euo pipefail +# Tag stays "nextcloud-backup" for EVERY instance, Gitea included: an external +# Graylog rule matches status=failed on this tag, and renaming it here would +# silently stop alerting for all of them. Misnomer retained deliberately. TAG=nextcloud-backup INSTANCE={{ backup_name }} STAGE={{ backup_stage_path | default('/var/backups/nextcloud/' ~ backup_name) }} @@ -26,9 +29,10 @@ log "status=start" {% if db_container | default('') %} # ------------------------------------------------------------ 1. database -# The Nextcloud containers are ROOTLESS podman owned by "{{ podman_user }}", -# but this script runs as root under systemd. Every podman call therefore -# goes through sudo: +# The containers are ROOTLESS podman owned by +# "{{ backup_podman_user | default(podman_user) }}" -- Nextcloud runs under +# {{ podman_user }}, Gitea under its own git user -- but this script runs as +# root under systemd. Every podman call therefore goes through sudo: # -H HOME becomes the podman user's home, so podman finds its rootless # graph root under ~/.local/share/containers # cd; required preamble (see CLAUDE.md) so the shell starts in that home @@ -37,9 +41,12 @@ log "status=start" # guarded anyway so podman falls back cleanly if it ever does not. # # No credential is stored in this file or placed on a host command line: -# $MYSQL_ROOT_PASSWORD and $MYSQL_DATABASE are expanded by the shell INSIDE -# the database container, which already carries them in its environment. +# $MYSQL_ROOT_PASSWORD / $MYSQL_DATABASE (or $POSTGRES_* for postgres) are +# expanded by the shell INSIDE the database container, which already carries +# them in its environment. +{% if backup_db_type | default('mariadb') != 'postgres' %} # +# MariaDB-specific history, for the flag set below: # --routines and --events initially aborted the dump here: mysql.proc read as # corrupted (error 1728) and the event scheduler reported disabled (1577), # both artefacts of an image bump without mariadb-upgrade. `mariadb-upgrade @@ -51,8 +58,14 @@ log "status=start" # by daemon rather than mysql, so mysqld may not create new top-level # databases. `sys` is purely diagnostic and unused by Nextcloud, so this is # cosmetic -- but it does mean creating a NEW database would fail too. +{% else %} +# +# --clean --if-exists makes the dump replayable into an existing database +# (`psql -U gitea gitea < dump.sql`) rather than only into an empty one, and +# --no-owner keeps it restorable when the target role names differ. +{% endif %} pexec() { - sudo -H -u {{ podman_user }} bash -c \ + sudo -H -u {{ backup_podman_user | default(podman_user) }} bash -c \ 'cd; d=/run/user/$(id -u); [ -d "$d" ] && export XDG_RUNTIME_DIR="$d" exec podman "$@"' _ "$@" } @@ -63,21 +76,40 @@ rm -f "$tmp" log "dumping {{ db_container }}" set +e +{% if backup_db_type | default('mariadb') == 'postgres' %} +pexec exec {{ db_container }} sh -c ' + exec env PGPASSWORD="$POSTGRES_PASSWORD" pg_dump -U "$POSTGRES_USER" \ + --no-owner --clean --if-exists "$POSTGRES_DB" +' | gzip -6 > "$tmp" +{% elif backup_db_type | default('mariadb') == 'mysql' %} +{# Upstream mysql:5.7 ships mysqldump, NOT the mariadb-dump alias that only + appears in MariaDB 10.5+. Flags and completion trailer are identical to the + MariaDB branch; 5.7.21 was verified to accept --no-tablespaces. #} +pexec exec {{ db_container }} sh -c ' + exec env MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysqldump -u root \ + --single-transaction --quick --routines --events --triggers \ + --no-tablespaces --default-character-set=utf8mb4 "$MYSQL_DATABASE" +' | gzip -6 > "$tmp" +{% else %} pexec exec {{ db_container }} sh -c ' exec env MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mariadb-dump -u root \ --single-transaction --quick --routines --events --triggers \ --no-tablespaces --default-character-set=utf8mb4 "$MYSQL_DATABASE" ' | gzip -6 > "$tmp" +{% endif %} dump_rc=${PIPESTATUS[0]} set -e -[ "$dump_rc" -eq 0 ] || fail "mariadb-dump {{ db_container }} exited $dump_rc" +[ "$dump_rc" -eq 0 ] || fail "{% if backup_db_type | default('mariadb') == 'postgres' %}pg_dump{% elif backup_db_type | default('mariadb') == 'mysql' %}mysqldump{% else %}mariadb-dump{% endif %} {{ db_container }} exited $dump_rc" -# A new dump is promoted over yesterday's only after it proves complete: -# a valid gzip stream AND the "-- Dump completed" trailer that mariadb-dump -# writes only on a clean finish. `mv` is atomic within the staging -# filesystem, so a failed or truncated run can never replace a good dump. +# A new dump is promoted over yesterday's only after it proves complete: a +# valid gzip stream AND the trailer the dump tool writes only on a clean +# finish. The two engines word it differently, so the string is per-type -- +# grepping for the MariaDB one against a pg_dump would fail every run. +# `mv` is atomic within the staging filesystem, so a failed or truncated run +# can never replace a good dump. gzip -t "$tmp" || fail "dump is not a valid gzip stream" -gunzip -c "$tmp" | tail -c 512 | grep -q 'Dump completed' \ +gunzip -c "$tmp" | tail -c 512 \ + | grep -q '{{ "PostgreSQL database dump complete" if backup_db_type | default("mariadb") == "postgres" else "Dump completed" }}' \ || fail "dump is truncated (no completion trailer)" mv -f "$tmp" "$DUMP" log "db_dump=ok bytes=$(stat -c %s "$DUMP")" @@ -87,6 +119,32 @@ log "db_dump=ok bytes=$(stat -c %s "$DUMP")" # periodic ZFS snapshots (see roles/podman/README.md). ls -1t "$STAGE"/db/"$INSTANCE"-*.sql.gz | tail -n +$((KEEP + 1)) | xargs -r rm -f {% endif %} +{% if backup_sqlite_dbs | default([]) %} +# ----------------------------------------------------- 1b. sqlite snapshots +# These databases are WAL-mode SQLite written by a LIVE process, so neither +# rsync option is correct: skipping the -wal loses committed transactions, +# and copying .db + -wal together can catch a checkpoint mid-write. Only +# `.backup` takes a consistent snapshot of a database that is being written. +# +# Run on the HOST, not in the container: the files live on the host +# filesystem and sqlite3 is installed there, so this needs no podman at all +# and works even when the owning container is stopped. +install -d -m 0700 "$STAGE" "$STAGE/db" +{% for db in backup_sqlite_dbs %} +sqlite_out="$STAGE/db/{{ db | basename | regex_replace('\\.db$', '') }}.sqlite" +if [ ! -f "{{ db }}" ]; then + fail "sqlite source missing: {{ db }}" +fi +sqlite3 "{{ db }}" ".backup '$sqlite_out.tmp'" \ + || fail "sqlite3 .backup failed for {{ db }}" +# Prove the snapshot is a loadable database before it replaces yesterday's, +# mirroring the gzip/trailer gate the SQL dumps get above. +sqlite3 "$sqlite_out.tmp" 'pragma integrity_check;' | grep -qx ok \ + || fail "sqlite snapshot failed integrity_check: {{ db }}" +mv -f "$sqlite_out.tmp" "$sqlite_out" +log "sqlite_dump=ok db={{ db | basename }} bytes=$(stat -c %s "$sqlite_out")" +{% endfor %} +{% endif %} # ----------------------------------------------------------- 2. file tree # --exclude .ssh is load-bearing: {{ remote_path }} IS {{ ssh_user }}'s home @@ -108,7 +166,7 @@ log "syncing config" rsync -az --timeout=600 --delete --mkpath {{ backup_rsync_extra_args | default('') }} \ -e "$SSH" {{ config_path }}/ "$DEST:{{ remote_path }}/_backup/config/" {% endif %} -{% if db_container | default('') %} +{% if db_container | default('') or backup_sqlite_dbs | default([]) %} log "syncing db dumps" rsync -az --timeout=600 --delete --mkpath {{ backup_rsync_extra_args | default('') }} \ -e "$SSH" "$STAGE/db/" "$DEST:{{ remote_path }}/_backup/db/" diff --git a/ansible/roles/podman/templates/nextcloud/cloud-backup.timer.j2 b/ansible/roles/podman/templates/nextcloud/cloud-backup.timer.j2 index 0982d9f..282cb93 100644 --- a/ansible/roles/podman/templates/nextcloud/cloud-backup.timer.j2 +++ b/ansible/roles/podman/templates/nextcloud/cloud-backup.timer.j2 @@ -1,5 +1,5 @@ [Unit] -Description=Daily Nextcloud {{ instance_name }} backup +Description=Daily {{ backup_product | default('Nextcloud') }} {{ instance_name }} backup [Timer] OnCalendar={{ backup_oncalendar | default('*-*-* 04:00:00') }} diff --git a/ansible/roles/podman/templates/nextcloud/nextcloud-backup-alert.sh.j2 b/ansible/roles/podman/templates/nextcloud/nextcloud-backup-alert.sh.j2 index 9598b8e..e802c55 100644 --- a/ansible/roles/podman/templates/nextcloud/nextcloud-backup-alert.sh.j2 +++ b/ansible/roles/podman/templates/nextcloud/nextcloud-backup-alert.sh.j2 @@ -1,8 +1,12 @@ #!/bin/bash # {{ ansible_managed }} -# OnFailure= handler for the Nextcloud backup units. Invoked as: +# OnFailure= handler for every backup unit (Nextcloud and Gitea). Invoked as: # nextcloud-backup-alert.sh # +# One shared copy serves all instances -- cloud-backup.yml renders it once and +# later includes are no-ops -- so the wording here must not name one product. +# The failing UNIT name is what identifies the instance. +# # Deliberately NOT `set -e`: an alert handler that dies partway through # reports nothing, which is worse than a partial report. Same reasoning as # roles/ups/templates/ups-restore.sh.j2. @@ -23,13 +27,13 @@ code="$(systemctl show -p ExecMainStatus --value "$UNIT" 2>/dev/null)" if [ "${result:-success}" = "success" ]; then state=spurious prio=daemon.warning - headline="$(printf 'Nextcloud backup alert handler was invoked on %s, but %s reports SUCCESS.\nThis is not a backup failure -- most likely the handler was started manually.' "$HOST" "$UNIT")" - subject="[$HOST] Nextcloud backup alert (spurious, unit OK): $UNIT" + headline="$(printf 'Backup alert handler was invoked on %s, but %s reports SUCCESS.\nThis is not a backup failure -- most likely the handler was started manually.' "$HOST" "$UNIT")" + subject="[$HOST] Backup alert (spurious, unit OK): $UNIT" else state=failed prio=daemon.err - headline="Nextcloud backup FAILED on $HOST" - subject="[$HOST] Nextcloud backup FAILED: $UNIT" + headline="Backup FAILED on $HOST" + subject="[$HOST] Backup FAILED: $UNIT" fi # One machine-parseable line for Graylog, then the context. diff --git a/ansible/vars/vault.yml b/ansible/vars/vault.yml index 9c9d8746da439a228717b78c34810be77a1a57ef..80f7f8ab833143b006dde0d13de727fbb2bb9898 100644 GIT binary patch literal 34202 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 GeHfNM{)UhM literal 28629 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