Octoate.de – Sinnvolles könnt ihr woanders lesen Konkrete Themen – Fehlanzeige, was mich gerade beschäftigt, wird aufs Korn genommen.

26Nov/080

Backup Skript für Cyrus-IMAP Server auf NSLU2

Da bei mir endlich mal wieder ein Emailserver-Backup her sollte, habe ich nach Lösungen gesucht, um eine Sicherung meines Cyrus-IMAP Servers auf meinem Linksys NSLU2 durchzuführen. Dabei ist ein Skript entstanden, das automatisch die benötigten Schritte durchführt. Ihr findet es auf der rechten Seite unter "Themen".

26Nov/080

Cyrus-IMAP: Sicherung mit dem NSLU2

Da einem Bekannten vor ein paar Tagen seine Mails komplett abhanden gekommen sind, bin ich mal wieder aus meinem Winterschlaf hochgeschreckt und bemerkt, dass meine letzte Datensicherung des IMAP-Servers auch mittlerweile schon fast ein Jahr her ist. Nach ein wenig Sucherei habe ich auch ein Skript bei Hetzner gefunden, das ein Backup des Cyrus-IMAP Servers erstellt (allerdings ohne Kompression) und es für meinen kleinen SLUG angepasst. Es setzt vorraus, dass auf der angeschlossenen Festplatte genug Speicherplatz für das Backup vorhanden ist.
Die Daten werden auf meinem NSLU2 im Public Verzeichnis unter einem Unterverzeichnis namens /backup angelegt. Möchtet ihr das Backup gerne woanders speichern, so müsst ihr das Skript entsprechend anpassen. Das Backup erfolgt in zwei Schritten, um die Zeit, in dem Cyrus nicht läuft, minimal zu halten. Zuerst wird mittels Rsync ein Backup des laufenden Servers gemacht, bei dem allerdings nicht alle Dateien mitkopiert werden können. Danach wird der Server abgeschaltet und die restlichen, evtl. geänderten Dateien werden kopiert und der Server dann wieder gestartet.

Ich hoffe, dass es dem ein oder anderen Linksys NSLU2 Benutzer auch weiterhelfen kann.

#!/bin/sh
# This script creates a hot copy of the cyrus data files.
# We use a trick from the cyrus wiki. First, we use rsync to copy the spool
# and the cyrus dbs to the preliminary backup directory. Then, we shut down
# cyrus, rsync again and start cyrus again. This way, we reduce cyrus' downtime
# to a minimum.

echo "creating Cyrus backup"

echo "   creating directories"
rm -rf /share/flash/data/public/backup/cyrus
rm -rf /share/flash/data/public/backup/sieve
mkdir -p /share/flash/data/public/backup/cyrus/lib
mkdir -p /share/flash/data/public/backup/cyrus/spool
mkdir -p /share/flash/data/public/backup/sieve/spool

echo "   first rsync pass"
rsync -r /opt/var/lib/imap /share/flash/data/public/backup/cyrus/lib
rsync -r /opt/var/spool/imap /share/flash/data/public/backup/cyrus/spool
rsync -r /opt/var/spool/sieve /share/flash/data/public/backup/sieve/spool

echo "   halting cyrus"
/opt/etc/init.d/S59cyrus-imapd stop

echo "   second rsync pass"
rsync -r /opt/var/lib/imap /share/flash/data/public/backup/cyrus/lib
rsync -r /opt/var/spool/imap /share/flash/data/public/backup/cyrus/spool
rsync -r /opt/var/spool/sieve /share/flash/data/public/backup/sieve/spool

echo "   starting cyrus again"
/opt/etc/init.d/S59cyrus-imapd start

9Nov/070

Gelöschten Benutzer aus Backupdaten in PhpBB wiederherstellen

Ach ja, mittlerweile ist es mir schon zum zweiten Mal passiert, dass ein Benutzer, der aus dem Forum unbedingt gelöscht werden wollte, dann doch gerne wieder an den Foren teilnehmen möchte. Problem dabei ist, dass der Benutzer aber in PhpBB gelöscht wurde und seine Postings als Benutzer "Gast" markiert werden. Eine Wiederherstellung funktioniert deshalb nur, wenn man ein Backup der Datenbank vor dem Löschen angelegt hat. Da es sicherlich dem ein oder anderen Admin eines PhpBB Forums auch schonmal so gegangen ist, möchte ich hier eine kurze Anleitung dafür geben.

Vorher aber noch eine kleine Warnung: Ihr arbeitet auf eurer aktiven Datenbank, deshalb macht auf jeden Fall vorher ein Backup!!! Sollte etwas schief gehen, bin ich nicht dafür verantwortlich :-) !

So, das wäre geklärt, also dann mal los:

  1. Als Vorraussetzung für die Wiederherstellung benötigt ihr auf jeden Fall erstmal eine Möglichkeit SQL Befehle in eure Datenbank einzugeben. Das kann zum einen über die Mysql Konsole geschehen oder über Datenbankfrontends wie phpMyAdmin.
  2. Ihr habt beim vorigen Datenbankbackup eine Datei erhalten, die alle Daten als SQL Befehle beinhaltet. Öffnet diese Datei in einem Texteditor (z.B. Notepad++ - Wordpad sollte aber auch ausreichen).
  3. In der alten Datenbankdatei sucht ihr erstmal den Ausdruck "phpbb_users" (das ist die Datenbanktabelle, die das Benutzerprofil beinhaltet). Normalerweise stehen diese Daten relativ weit am Ende eurer Datenbankdatei.
  4. Als ersten Eintrag solltet ihr sowas wie ein "CREATE TABLE 'phpbb_users'" finden. In diesem Eintrag wird die Struktur der Tabelle in der Datenbank beschrieben. Ihr erkennt hier auch, was für Werte in den einzelnen Feldern gespeichert werden.
  5. Nach der Struktur findet ihr jede Menge "INSERT" Befehle, mit denen die Benutzer in die Datenbank geschrieben werden. Sucht jetzt den Benutzer heraus, der wiederhergestellt werden soll. Ich nehme als Beispiel mal folgende Zeite:
    INSERT INTO `phpbb_users` VALUES (3, 1, 'Mustermann', '12345678901234567891234567890', 1194374869, 0, 1194343956, 1174780185, 1, 512, 1.00, 4, 'german', 'd.m.Y, H:i', 0, 0, 1194204104, 0, 0, NULL, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, '395954734460c36ec386a4.jpg', 1, 'max@mustermann.de, '', 'http://www.mustermann.de', 'NRW', 'Muster Signatur', '2391bc361d', '', '', '', '', '', '', NULL);
  6. Diesen Befehl führt ihr jetzt in eurer Datenbankkonsole aus (in phpMyAdmin geht das unter dem Menüpunkt "SQL"). Ihr solltet dann eine Bestätigung erhalten.
  7. Der Benutzer ist jetzt wieder in der Datenbank vorhanden, als nächstes müssen aber noch seine alten Postings wieder zugeordnet werden. Das geht mit einem "UPDATE" Befehl. Für diesen Updatebefehl benötigt ihr noch die Benutzer-ID und das Login. Die ID steht immer ganz am Anfang von dem "INSERT", der Benutzerlogin steht an der dritten Stelle. In meinem Fall ist das die "3" und als Benutzerlogin "Mustermann".
    Der Updatebefehl lautet dann:
    UPDATE phpbb_posts SET poster_id='3' WHERE post_username = 'Mustermann'

Diese Befehle reichen aus, um den Benutzer wieder hinzuzufügen und seine Postings zuzuordnen. Verloren sind allerdings sein Avatarbild und durch die Einträge in post_username sind die Profile nicht direkt anklickbar. Man könnte jetzt mit dem Befehl "UPDATE phpbb_posts SET post_username = '' WHERE post_username = 'Mustermann'" noch den Benutzernamen löschen, aber ich wollte bei mir nicht so viel an der Datenbank herumschrauben und habe das dann entsprechend gelassen.
Solltet ihr diese Anleitung auch mal benötigen, gebt doch mal Bescheid, ob bei euch alles funktioniert hat :-) !