Aktivieren der Müllabfuhr in Cyrus

Jeden Tag bringt man den Müll raus, aber irgendwie stapelt er sich nur neben der Mülltonne. - Die Müllabfuhr kommt nicht.
So in etwa ging es mir mit unserem Cyrus-IMAP "Mailserver"… die Benutzer leerten ihre Papierkörbe, aber der Speicherbedarf der Mails stieg immer weiter an, 2 mal mussten größere Platten gebucht werden beim Provider.
Nach einigem Untersuchen stellte ich fest das Mails die eigentlich gelöscht waren zwar aus Sicht der Benutzer weg waren, im Dateisystem waren sie aber noch vorhanden.

Tatsächlich markiert Cyrus Mails und Mailboxen nur als gelöscht, löscht sie aber nicht.
Das liegt daran das dazu die Datenbanken neu aufgebaut werden müssen, was mit hoher CPU-Last und I/O-Operationen einhergeht.

Die Müllabfuhr manuell bestellen

Um Mails zu endgültig zu löschen kann man folgenden Befehl nutzen:

cyr_expire -E 3 -D 30 -X 30
  • -E Zeit nach der als gelöschte markierte Mails aus der Duplicate-Datenbank entfernt werden

    • nein, ich weiß nicht genau was das heißt ;)

  • -D Zeit nach der als gelöscht markierte Mailboxen tatsächlich aus dem Dateisystem gelöscht werden

    • Mailboxen meint hier auch (Unter-)"Ordner" in "Mailboxen" → z.B. Inbox → Spesen; Spesen wäre eine Mailbox

  • -X Zeit nach der als gelöschte Mails tatsächlich aus dem Dateisystem gelöscht werden

Alle Optionen können unabhängig voneinander genutzt werden.
Die Zeit beginnt zu laufen ab dem Zeitpunkt wo die Objekte als gelöscht markiert wurden (also in der Regel wann der Benutzer seinen "Papierkorb"/"Trash" in seinem Mailprogramm geleert hat). Werden also 30 Tage angegeben, werden alle Mails gelöscht die bereits seit mind. 30 Tagen als gelöscht markiert sind.
Per Default ist die Zeitangabe in Tagen, kann aber per Endung in in Tage (d), Stunden (h), Minuten (m) oder Sekunden (s) geändert werden.

Important
Gelöscht im Sinne von IMAP ist nicht gleichbedeutend mit in den Papierkorb/Trash-Ordner verschoben, der Ordner "Papierkorb"/"Trash" ist aus Sicht von IMAP ein normaler Ordner.
In der Regel löscht ein IMAP-Client/Mailprogramm eine Mail wenn sie im Papierkorb war und von dort gelöscht wird/der Papierkorb geleert wird. Der Benutzer hat dann keinen Zugriff mehr darauf.
Erst ab diesem Zeitpunkt beginnt die Zeit zu laufen.
Mit diesem Befehl werden keine Mails aus dem Ordner "Papierkorb"/"Trash" gelöscht die älter als X sind!

Die Müllabfuhr regelmäßig kommen lassen

In /etc/cyrus.conf:

1
2
3
4
5
6
EVENTS {
	# this is required
	checkpoint	cmd="/usr/sbin/ctl_cyrusdb -c" period=30

	# this is only necessary if using duplicate delivery suppression
	delprune	cmd="/usr/sbin/cyr_expire -E 3" at=0401

Zeile 6 entsprechend ändern

	delprune	cmd="/usr/sbin/cyr_expire -E 3 -D 30 -X 30" at=0401

Das at am Ende gibt an wann der Befehl ausgeführt wird. Es empfiehlt sich eine Zeit mit wenig Verkehr, da es etwas Last (vor allem bei größeren Systemen) erzeugen kann.
Bei mir mit einer Hand voll Benutzern und knapp 40 GB Mails und 7 GB die frei gegeben wurden hat es geschätzt 10-20 Sekunden gedauert.