Baustelle:Schnelles Backup unter Windows

Aus Joomla! Dokumentation
Wechseln zu: Navigation, Suche
Info.png
Dieses Skript ist ausschließlich für Entwickler und testfreudige Joomla!-Benutzer zur unkomplizierten Sicherung von Webseiten auf lokalen Testsysteme auf Windows-Webservern mit XAMPP geeignet.

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.

Hinweis.png Keinesfalls ist diese Backuplösung für produktive Webseiten geeignet!

[Bearbeiten] Windows

[Bearbeiten] Voraussetzungen

24px-Tip.png Es werden alle Windowsversionen ab XP unterstützt.

[Bearbeiten] Installation

  1. Backup-Skript herunterladen
  2. Einstellungen anpassen
  3. 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

Hinweis.png Zusätzliche Leerzeichen zur besseren Lesbarkeit zerstören das Skript.

Hinweis.png 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 File linux.png 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

  • Ein Webserver - z.B.XAMPP
  • tar - In den meisten distros enthalten
  • mind. eine Joomla-Installation

[Bearbeiten] Installation

  1. Backup-Skript herunterladen
  2. Verzeichnis für Backups anlegen und in diesem eine Textdatei mit dem Namen File white.png backupsites anlegen.
  3. In dieser Datei die absoluten Pfade aller zu sichernden Websites eintragen.
  4. Skript starten

[Bearbeiten] Beschreibung der Einstellungen

In den meisten Fällen dürften die Default-Einstellungen bereits ausreichend sein.

...

[Bearbeiten] Skript

Folder blue.png beliebiger_pfad/File php.png backup.php

<?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.

Folder blue.png beliebiger_pfad/Folder blue.png backups/File white.png 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:

Folder blue.png beliebiges_verzeichnis

File php.png backup.php
Folder blue.png backups
File white.png backupsites Enthält die Pfadangaben Ihrer Sites
Folder blue.png sitename_timestamp Für jedes Backup wird automatisch ein neuer Ordner angelegt.
File zip.png archive.tgz Erstellte Backupdatei

[Bearbeiten] Nachwort


Hinweis.png Das Ablegen von Backupdateien auf Ihrem Server ist ein hohes Sicherheitsrisiko. Sie sollten dies auf jeden Fall vermeiden !


Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Sonstiges
Team Navigation
Werkzeuge