Ich betreibe ja eine eigene Friendica-Instanz und habe mich in letzter Zeit intensiv mit den Lösch-Einstellungen beschäftigt. Denn nichts ist ärgerlicher als eine Datenbank, die immer weiter wächst, obwohl man eigentlich konfiguriert hat, dass alte Beiträge gelöscht werden sollen. In diesem Artikel zeige ich dir, wie du die Lösch-Einstellungen richtig setzt, prüfst und welche Fallstricke es gibt.
Die richtige Reihenfolge
Bevor ich in die Details gehe, hier die Reihenfolge, in der du vorgehen solltest.
Zuerst prüfst du die aktuellen Einstellungen in der Datenbank. Dann setzt du die globalen Werte in der local.config.php. Danach kümmerst du dich um die benutzerspezifischen Einstellungen in der pconfig-Tabelle. Zum Schluss stößt du den Worker manuell an und überprüfst das Ergebnis.
Aktuelle Einstellungen prüfen
Bevor du etwas änderst, solltest du wissen, was aktuell konfiguriert ist. Dafür gibt es drei Abfragen.
Den uid des benutzers ilsebilse bekommen. Das Ergebnis ist die uid (nummer)
SELECT `uid`, `username`, `nickname`
FROM `user`
WHERE `nickname` = 'ilsebilse' OR `username` = 'ilsebilse';
Der globale Ablaufwert des Benutzers steht in der user-Tabelle.
SELECT uid, username, expire AS user_expire_days
FROM `user`
WHERE uid = 42;
Ein Wert von 0 bedeutet, dass der Ablauf für diesen Benutzer komplett deaktiviert ist. Erst mit einem Wert größer 0 verarbeitet der ExpirePosts-Worker diesen Benutzer überhaupt.
Die benutzerspezifischen Lösch-Einstellungen stehen in der pconfig-Tabelle.
SELECT uid, cat, k, v
FROM `pconfig`
WHERE uid = 42
AND cat = 'expire'
ORDER BY k;
Die wichtigsten Schlüssel sind items, starred, notes, photos und network_only. Der Schlüssel photos steht standardmäßig auf false. Das bedeutet, dass Fotos normalerweise nicht ablaufen.
Das globale Limit für externe Beiträge steht in der config-Tabelle.
SELECT `k`, `v`
FROM `config`
WHERE `cat` = 'system'
AND `k` = 'expire_limit';
Ein Wert von 0 bedeutet, dass diese Funktion deaktiviert ist.
Globale Einstellungen in der local.config.php setzen
Die local.config.php ist die zentrale Konfigurationsdatei für instanzspezifische Overrides. Sie wird nach den Standardwerten geladen und überschreibt diese.
Die wichtigsten Einstellungen für die Ablaufsteuerung sind diese.
<?php
return [
'system' => [
...
...
'expire_limit' => 365,
'dbclean' => true,
'dbclean-expire-limit' => 10000,
'dbclean-expire-days' => 90,
'dbclean_expire_conversation' => 90,
'optimize_tables' => true,
...
...
],
];
Der Wert expire_limit steuert, wie viele Tage externe Beiträge aufbewahrt werden. Ein Wert von 0 deaktiviert die Funktion.
Der Wert dbclean aktiviert den automatischen Datenbank-Cleanup. Ohne diesen Wert läuft der ExpirePosts-Worker nicht automatisch bei jedem Cron-Durchlauf.
Der Wert dbclean-expire-limit begrenzt, wie viele Datensätze pro Cron-Lauf gelöscht werden. Der Standardwert ist 1000. Bei aktiven Instanzen ist das zu niedrig. Die Datenbank wächst schneller, als der Worker aufräumen kann. Für mittlere bis große Instanzen empfehle ich einen Wert zwischen 5000 und 10000.
Der Wert dbclean-expire-days steuert, wie viele Tage Remote-Beiträge aufbewahrt werden.
Der Wert optimize_tables aktiviert die automatische Optimierung häufig genutzter Tabellen. Aber Vorsicht. Diese Option optimiert nur eine Teilmenge der Tabellen. Andere Tabellen mit gelöschten Daten werden nicht automatisch optimiert. Der Speicherplatz wird erst nach manueller Optimierung freigegeben.
Benutzerspezifische Einstellungen setzen
Jetzt kümmerst du dich um die benutzerspezifischen Einstellungen. Zuerst setzt du die Ablaufdauer in Tagen.
UPDATE `user`
SET `expire` = 365
WHERE uid = 42;
Dann aktivierst du die gewünschten Inhaltstypen in der pconfig-Tabelle.
INSERT INTO `pconfig` (`uid`, `cat`, `k`, `v`) VALUES
(42, 'expire', 'items', '1'),
(42, 'expire', 'starred', '1'),
(42, 'expire', 'notes', '1'),
(42, 'expire', 'photos', '1'),
(42, 'expire', 'network_only', '0')
ON DUPLICATE KEY UPDATE `v` = VALUES(`v`);
Ein Wert von 1 aktiviert den jeweiligen Typ, ein Wert von 0 deaktiviert ihn. Wenn du photos auf 1 setzt, laufen auch Fotos ab.
Überprüfen und Worker anstoßen
Nachdem du alle Einstellungen gesetzt hast, überprüfst du sie mit einer kombinierten Abfrage.
SELECT
u.uid,
u.username,
u.expire AS user_expire_days,
MAX(CASE WHEN p.k = 'items' THEN p.v END) AS expire_items,
MAX(CASE WHEN p.k = 'starred' THEN p.v END) AS expire_starred,
MAX(CASE WHEN p.k = 'notes' THEN p.v END) AS expire_notes,
MAX(CASE WHEN p.k = 'photos' THEN p.v END) AS expire_photos,
MAX(CASE WHEN p.k = 'network_only' THEN p.v END) AS expire_network_only
FROM `user` u
LEFT JOIN `pconfig` p ON u.uid = p.uid AND p.cat = 'expire'
WHERE u.uid = 42
GROUP BY u.uid;
Dann stößt du den Worker manuell im root Verzeichnis von Friendica an. Der läuft normalerweise nachts zwischen 00:00 und 03:00 Uhr.
php ./bin/console.php worker
Der ExpirePosts-Worker ist Teil der Worker-Kette und wird bei jedem Cron-Lauf ausgeführt.
Zusammenfassung: Die Fallstricke
Es gab einen bekannten Bug in Friendica. Die benutzerspezifischen Lösch-Einstellungen haben in vielen Versionen keine Wirkung. Beiträge werden trotz korrekter Werte nicht gelöscht. Das war ein Fehler in Friendica und kein Konfigurationsproblem. - The expiry settings of posts have no effect · Issue #14413 · friendica/friendica
Der Standardwert für dbclean-expire-limit ist 1000. Bei aktiven Instanzen ist dieser Wert zu niedrig. Die Datenbank wächst schneller, als der Worker aufräumen kann. Der Eindruck entsteht, das Aufräumen funktioniere nicht.
Das Löschen von Beiträgen gibt den Speicherplatz in der Datenbank nicht automatisch frei. Dazu muss die Tabelle optimiert werden. Bei großen Datenbanken kann das Aufräumen so lange dauern, dass Tabellen gesperrt werden und die Instanz nicht mehr reagiert. Ein manuelles optimize im Wartungsmodus ist in solchen Fällen die bessere Option.
mysqlcheck -u root -p --optimize dein_datenbankname # mit Passwortabfrage
Die Werte in der local.config.php überschreiben die Standardwerte aus static/defaults.config.php. Sie werden aber selbst von Werten in der config-Datenbanktabelle überschrieben.
Download
Friendica ist als Open-Source-Software verfügbar.
- Webseite: https://friendi.ca/
- GitHub: https://github.com/friendica/friendica
- Dokumentation: https://wiki.friendi.ca/