Kleine correcties bovenop ab87c0f, gevonden tijdens de eerste install
op scrum4me-srv (zie docs/runbooks/server-backup.md addendum):
- restic-backup.env.example: NAS-pad → /mnt/nas/backups/restic/scrum4me-srv,
Forgejo-container → scrum4me-forgejo (waren placeholders die niet matchten
met de actuele server-state).
- server-backup.service: ReadWritePaths uitgebreid met /mnt/nas/backups —
ProtectSystem=strict blokkeerde anders schrijven naar de NAS-repo.
RequiresMountsFor=/mnt/nas/backups toegevoegd om cifs-automount te triggeren
bij timer-fire. Documentation=-URL gecorrigeerd naar /srv/scrum4me/.
- server-backup.sh: --skip-db verwijderd uit forgejo dump (Forgejo 11.x heeft
die flag niet meer; DB komt nu mee in de zip, redundant met de aparte
forgejo_db_dump-fase maar onschuldig).
- server-backup.sh: subshell-bug in determine_exit_code gefixt — werd
aangeroepen via $(...), dus OVERALL_STATUS lekte niet naar de parent
en write_status_json schreef altijd "unknown".
- restore-test.sh: --include filter toegevoegd op de assertion-paden — een
full restore (~476 GiB logical) liep direct vol op /tmp (7.6 GB tmpfs)
met 3.3M ENOSPC-errors. Nu 59 MiB in 10s.
- runbook: paden /srv/ops/repos/... → /srv/scrum4me/ops-dashboard/...,
<forgejo>-placeholders → scrum4me-forgejo, concrete cifs-prefixpath
fstab-regel in Deel A3, en een gevuld addendum met alle bevindingen
van de eerste install (B2-bucket-naam ScrumForMeSrvBackup, sudo -E quirk,
storage-cap incident, dedup-cijfers).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
38 lines
1.3 KiB
Desktop File
38 lines
1.3 KiB
Desktop File
[Unit]
|
|
Description=Server-wide backup (pg_dumpall + restic to NAS + B2)
|
|
Documentation=file:///srv/scrum4me/ops-dashboard/docs/runbooks/server-backup.md
|
|
After=network-online.target docker.service
|
|
Wants=network-online.target
|
|
# NAS-mount moet beschikbaar zijn voordat restic naar de NAS-repo schrijft;
|
|
# triggert de cifs automount voor /mnt/nas/backups als die nog niet actief is.
|
|
RequiresMountsFor=/mnt/nas/backups
|
|
|
|
[Service]
|
|
Type=oneshot
|
|
EnvironmentFile=/etc/restic-backup.env
|
|
ExecStart=/srv/backups/scripts/server-backup.sh
|
|
TimeoutStartSec=4h
|
|
RuntimeMaxSec=6h
|
|
Nice=10
|
|
IOSchedulingClass=best-effort
|
|
IOSchedulingPriority=7
|
|
# Sandboxing — backup needs root for /etc + docker exec, but limit the rest.
|
|
# /mnt/nas/backups MOET in ReadWritePaths anders kan restic niet naar de
|
|
# NAS-repo schrijven door ProtectSystem=strict.
|
|
ProtectSystem=strict
|
|
ReadWritePaths=/var/backups /srv/backups /run /tmp /mnt/nas/backups
|
|
ProtectHome=read-only
|
|
NoNewPrivileges=yes
|
|
PrivateTmp=yes
|
|
ProtectKernelTunables=yes
|
|
ProtectKernelModules=yes
|
|
ProtectControlGroups=yes
|
|
StandardOutput=journal
|
|
StandardError=journal
|
|
SyslogIdentifier=server-backup
|
|
|
|
# Exit code semantics from server-backup.sh:
|
|
# 0 = success (all phases ok)
|
|
# 75 = partial_failure (some non-critical phase failed/degraded)
|
|
# 1 = failed (a critical dump phase failed or both restic repos failed)
|
|
SuccessExitStatus=75
|