Files
duffyduckandClaude Opus 5.5 74be5aee59 Platz vor jedem Snapshot pruefen, bei Mangel alte loeschen, per Mail warnen
Volle Ceph-Pools legen alle VMs darauf lahm. Vor jedem Snapshot gilt jetzt
je Storage des Gastes: frei >= sofortiger Verbrauch + space_min_free
(Vorgabe 20 %). Die Reserve bleibt also auch nach dem Snapshot frei.

Reicht es nicht, wird der aelteste pvesnap-Snapshot des Gastes geloescht und
neu geprueft, bis es reicht. Sind nur noch die neuesten space_keep (Vorgabe
7) uebrig, entfaellt der Snapshot und der naechste Gast kommt dran.

Gezaehlt wird je Gast ueber alle Gruppen, anders als bei der Vorhaltezeit.
Auf dem Testhost haette eine Grenze je Gruppe nie gegriffen: keep_count = 5
liegt unter 7, und 13 GiB steckten in einer Gruppe, die es nicht mehr gibt.

Sofortiger Verbrauch: Dicke ZFS-Zvols muessen ihre Reservierung auch nach
dem Snapshot garantieren, das kostet alles seit dem letzten Snapshot
Geschriebene. Exakt ist das refreservation - usedbyrefreservation; die Werte
kommen per zfs get, bei anderen Nodes per ssh ueber die IP aus dem
Clusterstatus, weil Node-Namen nicht ueberall aufloesen. Dazu kommt der RAM
bei vmstate. --dry-run zeigt die Rechnung je Storage.

Ceph und ZFS geben Platz erst im Hintergrund frei. Deshalb wird nach jedem
Loeschen gewartet, solange der Platz waechst, und erst nach space_settle
(Vorgabe 30s) ohne Zuwachs weitergemacht. Ohne das wurde auf Ceph ein Snapshot
zu viel geloescht. Laesst sich der Platz nicht feststellen, wird nichts
geloescht und der Snapshot trotzdem versucht.

Neu ist [mail]: eine Alarm-Mail je Gruppe und Lauf, wenn ein Snapshot wegen
Platzmangels ausfaellt. STARTTLS oder SSL/TLS mit Zertifikatspruefung, ohne
Rueckfall auf Klartext. Einzurichten im Editor (Taste m) oder von Hand, Test
mit pvesnap mail-test. Liegt ein Passwort in der Datei, setzt der Editor die
Rechte auf 600, auch fuer die .bak.

Das Handbuch beschreibt, wie man Ceph (Ratios) und ZFS (Notreserve) frueher
"voll" sagen laesst und was im Notfall zu tun ist. Ausserdem war
"pvesnap run --dry-run" ueberall falsch: Die Option ist global und muss vor
dem Unterbefehl stehen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 10:27:21 +01:00

171 lines
6.3 KiB
Plaintext

# =====================================================================
# pvesnap - Konfiguration
# =====================================================================
#
# Nach jeder Aenderung: systemctl reload pvesnap
# Pruefen: pvesnap check
# Komfortabel bearbeiten: pvesnap config (ncurses-Editor)
#
# Zeitangaben ueberall: 30m 1h 6h 2d12h 1w (0 = unbegrenzt)
# ---------------------------------------------------------------------
[global]
# Praefix aller von pvesnap angelegten Snapshots. Nur Snapshots, die mit
# diesem Praefix beginnen, werden jemals automatisch geloescht - von Hand
# angelegte Snapshots bleiben also garantiert unangetastet.
# Namensschema: <prefix>-<gruppe>-<JJJJMMTT>-<HHMMSS>
prefix = auto
# Wie oft der Dienst prueft, ob eine Gruppe faellig ist.
check_interval = 60s
# Merkt sich, wann welche Gruppe zuletzt gelaufen ist.
state_file = /var/lib/pvesnap/state.json
log_level = INFO
# log_file = /var/log/pvesnap.log
# Maximale Wartezeit auf einen einzelnen Snapshot-Task in Proxmox.
task_timeout = 15m
# Proxmox sperrt beim Anlegen eines Snapshots kurz das Storage
# ("cfs-lock 'storage-NAME'"). Ist es gerade belegt, laeuft der Task nach 60s
# in "got lock request timeout". Solche Faelle sind voruebergehend - pvesnap
# versucht es dann noch einmal:
retries = 2 # zusaetzliche Versuche je Snapshot
retry_delay = 60s # Wartezeit vor dem naechsten Versuch
# Pause zwischen zwei Gaesten. Bei vielen VMs auf demselben Storage nimmt das
# Druck vom Storage-Lock; 0 = ohne Pause.
pause_between = 0s
# Wie lange nach dem Loeschen bei Platzmangel auf den frei werdenden Platz
# gewartet wird. Ceph und ZFS geben ihn erst im Hintergrund frei; solange der
# freie Platz noch waechst, wird weiter gewartet.
space_settle = 30s
# yes = beim Dienststart sofort einen Durchlauf machen,
# no = auf den naechsten regulaeren Termin warten.
run_on_start = no
# yes = nichts wirklich anlegen/loeschen, nur protokollieren.
dry_run = no
# Hinweis: Hinter jedem Wert darf ein Kommentar stehen ("keep_time = 7d # …").
# Einzige Ausnahme ist "description" - dort bleibt die Zeile unveraendert
# stehen, damit ein '#' in der Beschreibung erhalten bleibt.
#
# Beschreibung, die an jedem Snapshot haengt (in der Proxmox-Oberflaeche
# sichtbar). Platzhalter:
# {group} {group_slug} {vmid} {name} {node} {type} {pool} {tags}
# {date} {time} {datetime} {timestamp} {keep_time} {keep_count} {schedule}
description = pvesnap | Gruppe: {group} | erstellt: {datetime} | Vorhaltezeit: {keep_time} | max: {keep_count}
# ---------------------------------------------------------------------
# [mail] meldet per Mail, wenn wegen Platzmangels ein Snapshot ausfaellt.
# Bequemer im Editor: "pvesnap config", Taste m. Testen: pvesnap mail-test
#
# security = starttls TLS nach dem Verbinden (Vorgabe, Port 587)
# security = ssl SSL/TLS von Anfang an (Port 465)
# security = none unverschluesselt, nur ohne Anmeldung
#
# Steht hier ein Passwort, sollte nur root die Datei lesen duerfen
# (chmod 600); der Editor stellt das beim Speichern selbst ein.
# ---------------------------------------------------------------------
# [mail]
# enabled = yes
# server = mail.example.org
# security = starttls
# port = 587
# tls_verify = yes # no nur bei selbstsignierten Zertifikaten
# user = pvesnap@example.org
# password = geheim
# sender = pvesnap@example.org
# recipients = admin@example.org, technik@example.org
# ---------------------------------------------------------------------
# [defaults] gilt als Vorgabe fuer *alle* Gruppen und kann in jeder
# Gruppe einzeln ueberschrieben werden.
# ---------------------------------------------------------------------
[defaults]
enabled = yes
skip_stopped = no
vmstate = no
# Platz vor jedem Snapshot - Erklaerung weiter unten bei den Gruppen.
space_min_free = 20%
space_keep = 7
# ---------------------------------------------------------------------
# Gruppen - beliebig viele, Abschnittsname: [group:NAME]
# ---------------------------------------------------------------------
#
# Zeitplan (entweder ... oder):
# interval = 30m alle 30 Minuten
# align = yes an der Uhr ausrichten (00:00, 00:30, 01:00 ...)
# oder
# schedule = hourly + minute = 15
# schedule = daily + at = 02:30
# schedule = weekly + at = 03:00, day_of_week = so
# schedule = monthly + at = 04:00, day_of_month = 1
# schedule = yearly + at = 04:00, day_of_month = 1, month = 1
#
# Vorhaltezeit (beides kombinierbar, 0 = unbegrenzt):
# keep_count = 24 hoechstens 24 Snapshots je VM
# keep_time = 7d nichts aelter als 7 Tage
# keep_min = 1 so viele bleiben immer stehen
#
# Platz vor jedem Snapshot, je VM geprueft:
# space_min_free = 20% so viel muss auf jedem Storage der VM auch nach dem
# Snapshot noch frei sein. Was der Snapshot sofort
# belegt (dicke ZFS-Zvols, RAM), kommt dazu.
# Vorschau: pvesnap --dry-run run --force
# (auch absolut, z.B. 20G; 0 = keine Pruefung)
# space_keep = 7 reicht es nicht, wird vom aeltesten pvesnap-Snapshot
# der VM an geloescht, gruppenuebergreifend, bis es
# reicht - die neuesten 7 bleiben aber stehen.
# Reicht es dann immer noch nicht: kein Snapshot fuer
# diese VM, weiter mit der naechsten.
#
# Auswahl der Gaeste (alles kombinierbar, wirkt als ODER):
# all = yes
# vmids = 100,101,105-110
# names = web-*, db-*
# tags = prod, wichtig
# pools = Kunden
# types = qemu (oder lxc; leer = beides)
# exclude_vmids = 999
# exclude_names = *-test
# exclude_tags = nosnap
# ---------------------------------------------------------------------
[group:stuendlich]
enabled = no
interval = 1h
align = yes
keep_count = 24
keep_time = 2d
tags = stuendlich
skip_stopped = yes
[group:taeglich]
enabled = no
schedule = daily
at = 02:30
keep_count = 14
keep_time = 21d
names = web-*, db-*
[group:monatlich]
enabled = no
schedule = monthly
day_of_month = 1
at = 04:00
keep_count = 6
keep_time = 400d
all = yes
exclude_tags = nosnap
description = Monatssicherung {name} ({vmid}) vom {date}