TYPO3 Extension Synchronisation (mmsynchro)
Um eine sichtbare, einfache Datensicherung einer TYPO3 Web Präsens zu erreichen, bietet sich die Extension Synchronisation an. Die Verbindung soll über eine SSH2 gesicherte Verbindung laufen, damit sie auch über das Internet eingesetzt werden kann.
Da die offizielle Beschreibung leider nur sehr allgemein gehalten ist, versuche ich an Hand eines praktischen Beispiels Randinformationen zu geben, so dass man diese Extension produktiv einsetzen kann. Da der Programmcode auf mich einen professionellen Eindruck macht, denke ich, dass es das Wert ist.
Die Benutzerführung geht über 5 Reiter im rechten Fenster. Dazu muss man erst links im Bedienbaum ganz unten auf /Synchronisation/Synchronisation klicken.
Im Test der Extension Synchronisation war folgende Konstellation im lokalen Netzwerk vorhanden:
Server A: http://www.rudiswiki.de/flugis 192.168.17.72 (Ubuntu 10.04.1, TYPO3 ver. 4.3.3) Server B: http://localhost/cms 192.168.17.148 (Ubuntu 10.10, TYPO3 ver. 4.3.3)
Konfiguration
Bei der Konfiguration muss zuerst mit Klick auf den Knopf Neu anlegen ein Profil angelegt werden. Es sind mehrere Profile möglich.
Bei jedem angelegten Profil gibt es die Funktionen Bearbeiten, Auswählen oder Löschen
Mit Klick auf Bearbeiten wird die Konfiguration eingegeben.
Mit Klick auf Auswählen wird das jeweilige Profil zum aktiven erklärt.
Mit Klick auf Löschen wird das jeweilige Profil gelöscht.
Mit Klick auf Auswahl aufheben wird die aktuelle Profil-Auswahl gelöscht.
Mit Klick auf Datenbankverbindung testen kann man die konfigurierte Verbindung testen. Im Erfolgsfall kommen die Meldungen:
connect to 192.168.17.72 disconnected Verbindung möglich
Wenn die Meldung kommt please use function init first wurde hoechstwahrscheinlich das Paket libssh2-php nicht installiert. Das prüft man mit:
$ php -m | grep ssh2 # It should return: 'ssh2'
Basics - Hier werden die grundsätzlichen Daten der Synchronisation eingetragen. Bei der Angabe zum Log-File Ordner empfiehlt es sich den Temporär-Ordner von mmsynchro zu verwenden, um ein Problem mit Filesystem Rechten zu vermeiden.
Konfigurations-Name: rudisflugis72 Pfad des Log-Ordners: /var/lib/typo3-dummy/typo3temp/mmsynchro/ Pfad zum externen Ordner: /var/lib/typo3-dummy/
MySQL-Server für externen Zugriff konfigurieren.
Auf dem Ziel Server muss MySQL der Benutzer der Quellen Datenbank bekannt gemacht werden. Dazu gibt es eine gute Anleitung, mit Hilfe von PHPmyAdmin: http://wiki.uniformserver.com/index.php/MySQL_phpMyAdmin#Setting_up_a_new_user_-_with_global_privileges
1. Externen Zugriff freigeben. Im File /etc/mysql/my.cnf "bind-address" auskommentieren: #bind_address = 127.0.0.1 2. Externen Admin-Benutzer "root" freigeben, auf dem MySQL-Server, mit PHPMyAdmin. http://192.168.17.72/phpmyadmin Datenbank: mysql Tabelle: user Passwort: passwort Freigaben: Alle MySQL daemon neu starten: $ sudo service mysql restart # Ubuntu 10.10 oder $ sudo /etc/init.d/mysql restart prüfen vom MySQL-Client aus: $ mysql -u root -p<passwort> -D rudisflugis -h 192.168.17.72 # ACHTUNG: bei der -p Option darf zum Passwort KEIN Zwischenraum sein. $ mysql -u root -D rudisflugis -h 192.168.17.72 3. Prüfen, ob der MySQL TCP/IP Port 3306 offen ist: $ nmap 192.168.17.148 ... 3306/tcp open mysql
Database - Hier werden die grundsätzlichen Daten zur lokalen Datenbank eingetragen. Bei dem Benutzername sollte der Admin Benutzer eingetragen werden. Damit die Verbindung zu einer "remote" Datenbank auf einem anderen Rechner funktionieren kann, im Server die MySQL Konfiguration angepasst werden.
Datenbank synchronisieren? - Haken setzen Datenbank-Benutzername: root Datenbank-Passwort: <passwort> # oder leer mit "Schlüsselbund" Verwendung Datenbank-Host: 192.168.17.72 Datenbankname: rudisflugis
Remote - Hier werden Verbindungsdaten zu dem SSH2 Host Rechner eingetragen. In diesem Beispiel werden die Verbindungsdaten im lokalen Netzwerk zu einem Testrechner aufgeführt.
Benötigt SSH - Haken setzen SSH Username: rudi SSH Passwort: <passwort> SSH Host: 192.168.17.72 SSH Port: 22
Tabellen (tables)
Man kann einzelne Felder mit Haken versehen, oder an Alles auswählen ein Haken setzen. Damit die Auswahl gespeichert wird, muss man oben auf den Knopf Auswählen klicken.
Dateien (files)
Bei Dateien werden die Ordner fileadmin, uploads und typo3conf in Baumstruktur erfasst. Mit einem Klick auf die einzelnen Elemente wählt man aus, was man synchronisiert haben möchte. Zum speichern der Auswahl klickt man den Knopf Auswählen.
Seitenbaum (pagetree)
Bei Seitenbaum werden die Web Seiten mit dem Text und Strukturinhalt in Baumstruktur erfasst. Mit einem Klick auf die einzelnen Elemente wählt man aus, was man synchronisiert haben möchte. Zum speichern der Auswahl klickt man den Knopf Auswählen.
Synchronisation
Ablauf allgemein
Die 3 Strukturen Tabellen, Dateien und Seitenbaum kann man einzeln anklicken, und dann mit Klick auf den Knopf Auswählen den Synchronisation-Vorgang starten.
Wenn man den Seitebaum (pagetree) synchronisiert, wird temporär ein .t3d File erzeugt:
/var/lib/typo3-dummy/typo3temp/mmsynchro/<linux_time>.t3d Beispiel: 1298708441.t3d
Die 3 Strukturen werden durch einzelne Funktionen abgearbeitet:
in file: /var/lib/typo3-dummy/typo3conf/ext/mmsynchro/lib/class.tx_mmsynchro_synchro.php Tabellen (Z.651): $this->synchroDB($tables); // Daten aus der DB auslesen bevor DB switch // Nur SQL result speichern. Sonst zu grosser Speicher Bedarf // Tabellen loeschen // Ueberpruefung der Datenbank und eventuelle Anpassungen // Wenn Tabellen zum Sync vorhanden sind // Alle Daten in die DB schreiben // Datenbank zurueck setzen Dateien (Z.780): $this->synchroFiles($files); // Überprüfung ob Dateien zum Sync vorhanden sind // Ordner anlegen // Überprüfen ob Remote // sonst lokal // Copy Data Seitenbaum (Z.329): $this->synchroPage($pages); // Daten aus der DB auslesen bevor DB switch // Wenn pages zum Sync vorhanden sind // export T3d // import T3d danach wird der Cache geleert: $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pages',''); $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_pagesection',''); $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_hash',''); // sync upload folder
Ablauf Beispiel Seitenbaum
Auf der Webseite http://www.rudiswiki.de/flugis/neuigkeiten.html haben sich Änderungen ergeben.
Die Page ID der Web-Seite ist auf beiden Seiten pid=147.
Log file Erklärung
Der Log-file Name beinhaltet auch Parameter:
Beispiel: mmsynchro_log_rudisflugis72_1298708441.txt rudisflugis72 # Profil (title) name 1298708441 # Linux time()
Log-file Details:
connect to 192.168.17.72 Sync Tables to rudisflugis DB Drop table "be_groups" ... Database operations CREATE TABLE be_groups ... Data operations INSERT INTO be_groups all Data ... ----------------------------------------- Synchro Data to /var/lib/typo3-dummy/ Make new Directories : directory exists: /var/lib/typo3-dummy/fileadmin/ ... Copy : copy /var/lib/typo3-dummy/fileadmin//css/rudisflugis-sitemap.css ----------------------------------------- Sync Pages to rudisflugis DB Export start export add pages:147 to t3d add tt_content:84 to t3d add tt_content:848 to t3d ... add pages:211 to t3d add tt_content:358 to t3d add tt_content:359 to t3d add sys_template:114 to t3d writing temporary t3d stop export Import t3d start import end import Synchro Data to /var/lib/typo3-dummy/ Make new Directories : directory exists: /var/lib/typo3-dummy/uploads ... Copy : disconnected ----------------------------------------- Time: 65926 ms
Fehler werden im Log-file folgendermaßen dargestellt:
von file: /var/lib/typo3-dummy/typo3conf/ext/mmsynchro/lib/class.tx_mmsynchro_synchro.php ab Zeile 137 $this->log .= "\n".'######## ERROR BEGINN ########'."\n"; $this->log .= $error[$fehlercode].': '.$fehlertext."\n"; $this->log .= "\t".$fehlerdatei.': '.$fehlerzeile; $this->log .= "\n".'######## ERROR END ########'."\n"; Beispiel: ######## ERROR BEGINN ######## PHP Warning: file_get_contents(http://www.rudiswiki.de/flugis/index.php?eID=pagepath&data=YToxOntzOjI6ImlkIjtpOjE0NTt9) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed! HTTP/1.0 403 Access denied /usr/share/typo3/typo3_src-4.3.3/t3lib/class.t3lib_div.php: 2873 ######## ERROR END ########
Fehlersuche
Wenn man ein MySQL Passwort im Schlüsselbund hinterlegt hat, und man es bei einem connect trotzden angibt erscheint folgende Fehlermeldung:
ERROR 1045 (28000): Access denied for user 'root'@'rudiswiki.fritz.box' (using password: YES) dann muss man nur bei dem "connect" den Passwort Parameter weglassen.
Leider funktioniert die Synchronisation nur vom Server B zu A aus. Bei der Synchronisation von Server A aus zu B gibt es bei der Struktur Seitenbaum mehrere Fehlermeldung, wie oben gezeigt mit der Funktion file_get_contents(). Es handelt sich um die Web-Seite Neues (neuigkeiten.html).
Im Log-file kann man sehen, dass die pid 147 für den update vorbereitet wird, aber bei dem import gibt es Fehler. Die Ursache war, dass dem MySQL Benutzer auf dem Ziel-Server die Freigaben (Rechte) gefehlt haben. Siehe Punkt externer Zugriff auf MySQL.
----------------------------------------- Sync Pages to rudisflugis DB Export start export add pages:145 to t3d # rudisflugis root add tt_content:23 to t3d add tt_content:25 to t3d add tt_content:24 to t3d add sys_domain:5 to t3d add sys_template:32 to t3d add pages:147 to t3d # Neues (neuigkeiten.html) ... stop export Import t3d start import Fehler: failed to open stream: HTTP request failed! HTTP/1.0 403 Access denied file_get_contents(http://www.rudiswiki.de/flugis/index.php?eID=pagepath&data=YToxOntzOjI6ImlkIjtpOjE0NTt9) /usr/share/typo3/typo3_src-4.3.3/t3lib/class.t3lib_div.php: 2873 http://php.net/manual/de/function.file-get-contents.php Das prüfen der records geht über (Z. 431): ($import->doesRecordExist($test[0],$test[1],'')){ von /usr/share/typo3/typo3_src-4.3.3/typo3/sysext/impexp/class.tx_impexp.php function doesRecordExist($table,$uid,$fields='') # Zeile 3140 return t3lib_BEfunc::getRecord($table, $uid, $fields ? $fields : 'uid,pid'); /usr/share/typo3/typo3_src-4.3.3/t3lib/class.t3lib_befunc.php public static function getRecord() # Z. 229 Der Import geht über den Befehl (Z. 443): $import->importData(''); $import = t3lib_div::makeInstance('tx_impexp'); # Zeile 406 von /usr/share/typo3/typo3_src-4.3.3/typo3/sysext/impexp/class.tx_impexp.php function importData() Z. 1161
Liste der Seiten in dieser Category:
-- RudolfReuter 2011-02-26 18:54:32
Go back to CategoryTypo3 or StartSeite ; KontaktEmail (ContactEmail)