Baustelle:Schnelles Backup unter Windows
ToDo Verbesserungsvorschläge prüfen, Verlinken
Dieses Skript bietet eine mögliche Lösung zur schnellen Sicherung von Webseiten.
Inhaltsverzeichnis |
[Bearbeiten] Abstrakt
Jeder kennt das Problem dass eben mal schnell was ausprobiert oder installiert wird, was dann doch nicht den Erwartungen entspricht und ein vorheriger umfangreich zu konfigurierender Zustand wieder herzustellen ist. Dieses Skript ermöglicht es einfache Snapshots von kompletten Website-Installationen zu erstellen.
Keinesfalls ist diese Backuplösung für produktive Webseiten geeignet!
[Bearbeiten] Windows
[Bearbeiten] Voraussetzungen
- XAMPP-Installation unter Windows.
- 7zip-Installation [1]
- mind. eine Joomla-Installation
Es werden alle Windowsversionen ab XP unterstützt.
[Bearbeiten] Installation
- Backup-Skript herunterladen
- Einstellungen anpassen
- Skript starten
[Bearbeiten] Beschreibung der Einstellungen
In den meisten Fällen dürften die Default-Einstellungen bereits ausreichend sein.
singlesite
Je nach dem ob mehrere Joomla-Installationen gesichert werden sollen ist hier
- 1 = für eine Installation
- 0 = für mehrere Installationen
anzugeben.
Bei mehreren Installationen wird automatisch ein Menü mit den zu sichernden Installationen angeboten.
websites
Pfad in dem die Webseite liegt. Bei einer XAMPP-Installation: c:\xampp\htdocs
Falls mehrere Webseiten gesichert werden sollen (Stichwort vHosts), dann ist das Verzeichnis anzugeben in dem alle Verzeichnisse der Installationen liegen.
Bsp: c:\xampp\htdocs
- mit WebsiteA in c:\xampp\htdocs\WebA
- und WebsiteB in c:\xampp\htdocs\WebB
destdir
Verzeichnis in das die Backups erstellt werden sollen. Das Verzeichnis muss existieren - sonst schlägt das Backup fehl.
path
Such-Pfad für Programme.
- MySql-Dump befindet sich bei einer Standard-XAMPP-Installation in "c:\xampp\mysql\bin"
- 7-Zip ist bei einer Standard-Installation in: "%ProgramFiles%\7-Zip"
[Bearbeiten] Hinweise
Zusätzliche Leerzeichen zur besseren Lesbarkeit zerstören das Skript.
Pfadnamen mit Leerzeichen müssen in doppelte Hochkommata eingeschlossen werden z.B.: "c:\pfad\mit Leerzeichen\"
[Bearbeiten] Skript
REM ============================================================================ REM | | REM |Created by Joskar for wiki.joomla-nafu.de | REM |Last change: 20.3.2010 | REM |Inspired by: http://www.dostips.com/ (Menu System) | REM | | REM ============================================================================ @ECHO off REM /!\ EINSTELLUNGEN ANPASSEN /!\ REM Eine Webseite: 0 REM Mehrere Webseiten zur Auswahl: 1 SET singlesite=1 REM Pfad an dem sich die Webseite bzw die Ordner der Webseiten befinden REM Bei einer Standard-XAMPP Installation ist dies: "c:\xampp\htdocs" SET websites=c:\xampp\htdocs REM Wo sollen die Backups hin ?? REM Das Verzeichnis muss existieren !! SET destdir=c:\backup\ REM Pfad für Programme REM MySql-Dump befindet sich bei einer Standard-XAMPP-Installation REM in "c:\xampp\mysql\bin" REM 7-Zip ist bei einer Standard-Installation in: "%ProgramFiles%\7-Zip" SET PATH=%path%;c:\xampp\mysql\bin;"%ProgramFiles%\7-Zip" REM ============================================================================ REM REM DO NOT EDIT BELOW - UNLESS YOU KNOW WHAT YOU ARE DOING REM REM ============================================================================ cls SETLOCAL ENABLEEXTENSIONS SETLOCAL ENABLEDELAYEDEXPANSION set sourcedir=%websites% pushd %websites% IF %singlesite%==1 GOTO backup :start SET count=1 FOR /F %%a IN (' dir /AD /B /ON * ') do ( ECHO. ECHO !count! - %%~nxa SET mis!count!=%%~nxa SET /A count=!count!+1 ) SET /A count=%count%-1 ECHO. SET /P input=Bitte waehlen (0=Beenden): REM [1-%count%]: IF %input% == 0 mainmenu.bat&GOTO:eof IF %input% LEQ %count% GOTO run GOTO return :run SET runmis=mis%input% CALL SET settings=%%%runmis%%% SET sourcedir=%websites%\%settings% cd %settings% GOTO backup :return ECHO Falsche Eingabe. pause GOTO start :backup IF NOT EXIST configuration.php ( ECHO Dies ist keine Joomla!-Installation. ECHO Backup wird abgebrochen. GOTO exit ) FOR /F "tokens=2 delims=' eol=;" %%a IN ('"findstr /V \"^//\" configuration.php |findstr $sitename"') do (SET name=%%a) FOR /F "tokens=2 delims=' eol=;" %%a IN ('"findstr /V \"^//\" configuration.php |findstr $host"') do (SET dbserver=%%a) FOR /F "tokens=2 delims=' eol=;" %%a IN ('"findstr /V \"^//\" configuration.php |findstr $user"') do (SET user=%%a) FOR /F "tokens=2 delims=' eol=;" %%a IN ('"findstr /V \"^//\" configuration.php |findstr $password"') do (SET pass=%%a) FOR /F "tokens=2 delims=' eol=;" %%a IN ('"findstr /V \"^//\" configuration.php |findstr /V $dbtype | findstr /V $dbprefix | findstr $db"') do (SET database=%%a) SET port=3306 ECHO Backup beginnen ECHO %date% - %time% ECHO. FOR /f "tokens=1,2,3 delims=. " %%i IN ('date /t')DO SET datum=%%k_%%j_%%i FOR /f "tokens=1,2,3 delims=: " %%i IN ('ECHO %time%') DO SET zeit=%%i_%%j_%%k SET destdir=%destdir%\%name%-%datum%-%zeit%.zip SET dbfile=%TEMP%\DB_%name%-%datum%-%zeit%.sql ECHO MySQL-Dump... mysqldump --host=%dbserver% --port=%port% --user=%user% --password=%pass% --result-file=%dbfile% %database% >NUL 2>&1 IF NOT %ERRORLEVEL%==0 ECHO Es ist ein Problem mit der Datenbank aufgetreten!! Fehler: %ERRORLEVEL% &GOTO exit ECHO MySQL-Dump beendet. ECHO. pushd %sourcedir% ECHO Dateien zu zippen: dir /s /B |find /c ":" popd 7z a -r -tzip %destdir% %sourcedir% %dbfile% >NUL 2>&1 IF NOT %ERRORLEVEL%==0 ECHO Es ist ein Problem beim Zippen aufgetreten!! Fehler: %ERRORLEVEL% &GOTO exit ECHO Dateien gesichert. ECHO. ECHO Temporaere Dateien löeschen... del %dbfile% ECHO Backup ohne Fehler beendet. ECHO. GOTO exit :exit pause
[Bearbeiten] Linux
Für alle
Pinguine gibt es auch noch eine Version für Linux Betriebssysteme.
Das Skript wurde der Einfachheit halber in PHP geschrieben. Dadurch wird es (vielleicht) besser portier- und anpassbar.
Es kann sowohl im Browser als auch auf der Kommandozeile (z.B. als cronjob) ausgeführt werden.
[Bearbeiten] Voraussetzungen
[Bearbeiten] Installation
- Backup-Skript herunterladen
- Verzeichnis für Backups anlegen und in diesem eine Textdatei mit dem Namen
backupsites anlegen.
- In dieser Datei die absoluten Pfade aller zu sichernden Websites eintragen.
- Skript starten
[Bearbeiten] Beschreibung der Einstellungen
In den meisten Fällen dürften die Default-Einstellungen bereits ausreichend sein.
...
[Bearbeiten] Skript
<?php defined('DS') or define('DS', DIRECTORY_SEPARATOR); define('BACKUP_DIR', dirname(__FILE__).DS.'backups'); $CLI =(substr(php_sapi_name(), 0, 3) == 'cli') ? true : false; if($CLI) { define('BR', "\n"); } else { define('BR', "<br />\n"); } NafuBackup::run($CLI); /** * Makes backups. * @return boolean */ class NafuBackup { public static function run($CLI) { $verbose = false; echo 'Welcome =;)'.BR; echo 'Starting on: '.BACKUP_DIR.BR; if( ! file_exists(BACKUP_DIR.DS.'backupsites')) { echo 'File not found: '.BR; echo BACKUP_DIR.DS.'backupsites'.BR; echo 'ABORT...'; return false; } $lines = file(BACKUP_DIR.DS.'backupsites'); foreach ($lines as $siteToBackup) { $siteToBackup = trim($siteToBackup); if( ! $siteToBackup) continue; echo str_repeat('*', 70).BR; echo 'Processing...'.$siteToBackup.BR; $configPath = $siteToBackup.DS.'configuration.php'; if( ! file_exists($configPath)) { echo 'Joomla! config file not found: '; echo $configPath.BR; echo 'ABORT...'.BR; continue; } $configLines = file($configPath); $config = new stdClass(); foreach ($configLines as $cLine) { $cLine = trim($cLine); if( ! $cLine) continue; if(preg_match("%var\s\\$([A-z0-9]+) = '([A-z0-9/.:@-]*)';%i", $cLine, $matches)) { $config->$matches[1] = $matches[2]; } }//foreach $backupDir = BACKUP_DIR.DS.$config->sitename.'_'.date('Ymd_His'); echo 'Created dir: '.$backupDir.BR.BR; if( ! is_dir($backupDir)) mkdir($backupDir); mkdir($backupDir.DS.'files'); echo 'Starting MySqlDump...'; $cmd = 'mysqldump'; $cmd .=($verbose) ? ' -v' : ''; $cmd .= ' -h'.$config->host; $cmd .= ' -u'.$config->user; $cmd .=($config->password) ? ' -p'.$config->password : ''; $cmd .= ' '.$config->db.' 2>&1 > '.$backupDir.DS.'backup.sql'; $ret = shell_exec($cmd); echo 'OK'.BR; echo ($CLI) ? '' : '<pre>'.$ret.'</pre>'; echo 'Copying files...'; $cmd = 'cp -R '.$siteToBackup.' '.$backupDir.DS.'files 2>&1'; $ret = shell_exec($cmd); echo 'OK'.BR; echo ($CLI) ? '' : '<pre>'.$ret.'</pre>'; echo 'Creating archive...'; $cmd = 'tar czf'; $cmd .=($verbose) ? 'v' : ''; $cmd .= ' '.$backupDir.DS.'archive.tgz'; $cmd .= ' -C '.$backupDir.' '.'files'; $cmd .= ' backup.sql 2>&1'; $ret = shell_exec($cmd); echo 'OK'.BR; echo ($CLI) ? '' : '<pre>'.$ret.'</pre>'; echo 'Cleaning up...'; unlink($backupDir.DS.'backup.sql'); $cmd = 'rm -Rf '.$backupDir.DS.'files'; $ret = shell_exec($cmd); echo 'OK'.BR; echo ($CLI) ? '' : '<pre>'.$ret.'</pre>'; }//foreach echo str_repeat('*', 70).BR; echo '***** F I N I S H E D =;)'.BR; echo str_repeat('*', 70).BR; return true; }//function }//class
[Bearbeiten] backupsites
Die Pfade der zu sichernden Website(s) werden in einer Textdatei gespeichert. Ein Pfad pro Zeile.
beliebiger_pfad/
backups/
backupsites
Beispiel
/home/nafu/joomla /home/erika/htdocs/wichtig/joomla
[Bearbeiten] Beispielausgabe
$ php backup.php Welcome =;) Starting on: /home/nafu/backuptest/backups ********************************************************************** Processing.../home/nafu/joomla Created dir: /home/nafu/backuptest/backups/joomla-test.de_20100331_154403 Starting MySqlDump...OK Copying files...OK Creating archive...OK Cleaning up...OK ********************************************************************** Processing.../home/erika/htdocs/wichtig/joomla Created dir: /home/nafu/backuptest/backups/erikas-joomla-test.de_20100331_154405 Starting MySqlDump...OK Copying files...OK Creating archive...OK Cleaning up...OK ********************************************************************** ***** F I N I S H E D =;) **********************************************************************
Die Verzeichnisstruktur ist also wie folgt:
[Bearbeiten] Nachwort
Das Ablegen von Backupdateien auf Ihrem Server ist ein hohes Sicherheitsrisiko. Sie sollten dies auf jeden Fall vermeiden !