Backup-Lösung für FTP und MySQL in PHP

Dieser Beitrag ist eine Ergänzung bzw. Erweiterung des vorherigen Posts „FTP-Backup-Lösung mit PHP“. Die große Neuerung der Version 1.2 ist die Funktion MySQL Datenbanken sichern zu können. Auch hier wird ein Backup erstellt, überschüssige Backups (wenn mehr vorhanden sind als der gewünschte Maximalwert) werden gelöscht und neue Backups ggf. zu einem externen Server übertragen. Mit Version 1.2.1 gibt es zusätzlich die Möglichkeit, ALLE Ordner der Root-Ebene, mit Ausnahmen, zu sichern und Version 1.2.2 ermöglicht detailliertere Ausnahmen.

Features

Diese Lösung (v1.2.2) bietet nun folgenden Funktionsumfang:

  • beliebig viele Ordner des All-Inkl Accounts in einzelne .tar.gz Archive sichern
  • oder: alle Ordner der Root-Ebene, mit möglichen Ausnahmen, sichern
  • Detailliertere Ausnahmen mit Datei- und Ordnermasken wie z.B. „*.tar.gz“
  • Einschränkung der Anzahl aufgehobener Backups – älteste Backups werden automatisch gelöscht
  • detaillierte Ausgabe inklusive benötigter Zeit
  • E-Mail Benachrichtigung
  • Farbliche Hervorhebung
  • Verbesserungen des Backup Prozesses, zusätzliche Überprüfungen und Debug Infos bei Fehlern
  • Verbinden eines externen FTP Server und Kopieren aller neuen Backups
  • Angabe eines beliebigen FTP Ports
  • Verbindung über FTPs (SSL FTP) Port 21 wird verwendet, unsicheres FTP nur noch als Fallback
  • detailliertere Informationen über die Backups in der Benachrichtigungsmail
  • Backup von beliebig vielen MySQL Datenbanken von localhost, Aufräumen der Backups und Export an externen Server
  • E-Mail Anpassungen über Parameter möglich – Betreff, Anmerkungen, Details
  • ausführliche Ausgabe aller Backups im Skript und per Mail

Zwischen den Zeilen 37 und 82 findet ihr alle Variablen, die ihr anpassen müsst/könnt.

Zur Datenbanksicherung ist zu sagen, dass diese auf den Hoster All-Inkl optimiert ist. Sie sichert nur Datenbanken von localhost und benötigt den PHP Befehl „exec()“ sowie die Komponenten „mysqldump“ und „gzip“, die auf All-Inkl Servern erlaubt bzw. installiert sind. Auf anderen Hostern müssen daher ggf. diese Möglichkeiten geschaffen oder die MySQL Sicherung (Zeile 190-191) verändert werden.

Screenshot

Das Bild zeigt die Ausgaben des Backup Skripts und die versendete E-Mail Benachrichtigung

Code

Schaut für Code-Alternativen oder ein weniger komplexes System auch auf die Version 1.1 und 1.0

Update 03.2016: Update des Codes auf Version 1.2.2
Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

Zufälliger Artikel:  NetLimiter - Internet- und Netzwerktraffic kontrollieren

Sicherheit: Absicherung mit .htpasswd

Das Verzeichnis, in dem die backup.php und die Backups liegen, sollte natürlich mit einer .htpasswd abgesichert werden. Mit einer eingerichteten .htpasswd Datei ist zuerst ein Login nötig, eh man auf bestimmte Bereiche des Webspaces zugreifen darf:
Das Bild zeigt eine Login Datenabfrage beim Aufruf der Backup URL
Die Datei .htpasswd enthält hierbei die Login Daten und in der .htaccess des Backup Unterordners wird festgelegt, dass eine .htpasswd diesen Ordner schützt. Die .htpasswd generiert ihr euch am besten mit diesem Generator und baut sie dann folgendermaßen in die .htaccess dieses Ordners ein:

Sicherheit: Absicherung mit .htaccess

Da wir schonmal bei .htaccess sind, erhöhen wir die Sicherheit mit ein paar weiteren grundlegenden Zeilen:

Dadurch werden Zugriffe auf bestimmte Dateitypen (auch die Backup Dateien), Verzeichnisse und Zugriffe mit sicherheitskritischen Merkmalen unterbunden. Alle diese nicht validen Zugriffe bekommen die index.htm serviert, welches einfach nur eine leere HTML Datei ist. Somit wird den Abfragenden auch kein detaillierter Grund gegeben, warum der Zugriff fehlschlug.

Automatisierung mit All-Inkl Cronjobs

Zu guter Letzt hilft diese Sicherungslösung natürlich nur, wenn sie automatisiert wird. Auch dies ist stark abhängig von eurem Hoster, System, dem Anwendungsbereich usw.
Im Falle von All-Inkl als Webhoster, könnt ihr die Cronjob Funktionalität im KAS (KAS -> Tools -> Cronjobs) benutzen:
Das Bild zeigt die Cronjob Einrichtungsoberfläche von All-Inkl

72 Kommentare

  1. Zwar alles sehr technisch für mich, aber mit dieser grandiosen Anleitung hab ich die Absicherung der .htacess hinbekommen.
  2. Ich danke viel viel mals, danach habe ich gesucht und lange gesucht. Endlich gefunden. Du erklärst sogar alles genau bei dem Anbieter bei dem ich auch bin All inkl.

    ich werde mir deinen Beitrag schnappen und ein Review drüber schreiben da ich dein tool bzw script genial finde thanks.

  3. Eigentlich das was ich gesucht habe, jedoch beim Testlauf bekomme ich eine Fehlermeldung:

    Parse error: syntax error, unexpected ‚[‚ in

    und komme daher nicht weiter.

    1. Vielen Dank für die Bereitstellung des Scripts, leider kommt es beim Aufruf zu folgender Fehlermeldung (Hoster: All-Inkl, PHP 7.014):

      Parse error: syntax error, unexpected ‚<', expecting end of file in /www/htdocs/xxxx/backup/backup.phpx on line 331

      Danke im Voraus für Deine Hilfe und LG.

      1. Hallo Peter,

        unerwartetes Dateiende. ich vermute, dass beim kopieren oder übertragen des Scripts etwas schief gelaufen ist.

         

        Prüfe mal mittels webftp-Zugang den Inhalt des hochgeladenen Scriptes und ersetze diesen ggf. mit dem kompletten Script-Inhalt von oben.

         

        Gruß Chrunchy

  4. Hallo Guido, das sollte natürlich nicht passieren. Ich kann mich voraussichtlich erst Ende der Woche darum kümmern, werde aber den Fehler versuchen nachzuvollziehen und zu beheben. Kannst du mir bitte nochmal die komplette Fehlermeldung inklusive Screenshot schicken und an welcher Stelle der Fehler aufgetreten ist?
    Danke
  5. Fehlermeldung:

    Parse error: syntax error, unexpected ‚[‚ in /www/htdocs/123456/backup/wert/backup.php on line 365

    Danke für Deine Mühen!

  6. Hallo Guido,

    ich habe bei mir das Backup nochmal seperat eingerichtet, um es zu testen. So der Ablauf:

    1. Neues FTP-Verzeichnis: [root]/backup/test/
    2. backup.phpx Datei erstellt und den Code aus diesem Artikel 1:1 reinkopiert
    3. Folgende Stellen im Code angepasst:
      $ftpFoldersToBackup = array(„dev___test“, „feed2___test 2″);
      $copyToExternalFtp = 0;
      $backupMysqlData = 0;
      $dir = $pfad.“backup/test/“;
    4. Gestartet…

    Ich kriege da also kein Fehler. Damit würde ich den Fehler bei deinem Code oder Hoster vermuten.
    1.) Zeig mir mal bitte deine Zeilen 360-370 mit 365 fett markiert.
    2.) Bei welchem Hoster bist du?

    LG

  7. Also schauen wir mal:

    Neues Verzeichnis im root – hab ich
    code original aus

    http://hannes-schurig.de/09/06/2015/backup-loesung-fuer-ftp-und-mysql-in-php/

    raus kopiert

    in eine leere phpx reinkopiert

    Code angepasst:

    // ########## EDIT HERE ###################
    // ### FTP Data
    // which root folders should get backed up? comment is optional
    // format: „foldername___comment“
    // or: „foldername“
    $ftpFoldersToBackup = array(„test“);
    $copyToExternalFtp = 0; // copy new backup files to external ftp server? should be 1/“yes“/“ja“ or 0/“no“/“nein“
    // external (ftp) servers to copy new backups to, format:
    // in general: ftp://username:password@url:port/path (port is required!)
    // ftp://user:pw@ftp.server.com:21/
    // ftp://user:pw@serverurl.com:21/optional/path
    $externalFtpUri = „ftp://admin:password@barketing.dns.com:21/Data/FTP-Backups“;
    // ### MySQL Data
    $backupMysqlData = 0;
    // one or more databases of the local mysql server to backup, multiple data combined with „___“, comment is optional
    // format: „dbName___dbUser___dbPassword___comment“
    // or: „dbName___dbUser___dbPassword“
    $databasesToBackup = array(
    „d01ce064___d01ce064___password___main website DB“,
    „d01d7131___d01d7131___password“
    );
    // ### Mailing Data
    $sendMail = 0; // send notification mail when all backups are done – should be 1/“yes“/“ja“ or 0/“no“/“nein“
    $mailTo = „schurigh@gmail.com“; // valid mail address to send the mail to
    $mailSubject = „Automatische FTP Sicherung abgeschlossen“; // mail subject
    // additional mail annotations that gets inserted after the main mail content
    $mailAdditionalNotes = „Hiermit kann – wenn gewünscht – zusätzlicher Text in die Mail eingebaut werden.“;
    $mailBackupDetails = 1; // send information about successful backup files? should be 1/“yes“/“ja“ or 0/“no“/“nein“
    // ### General Options
    $backupFileMaximum = 2; // how many archives should be stored?
    $dir = $pfad.“test/“; // in which subfolder is this backup php file? this would be: „root/backup/“
    // ######### STOP EDITING HERE ###################

    Gestartet…….

    Sofort Fehlermedung:

    Parse error: syntax error, unexpected ‚[‚ in /www/htdocs/w007d6c2/backup/backup.php on line 365

    Die Zeile 365 ist die Originalzeile aus Deinem Skript

    pathinfo($file)[„extension“] == $fileType &&

    Gehostet ist die Kiste bei all-inkl.de

    LG

  8. Hallo Hannes,
    erst mal vielen Dank für deine Scripte auf der Seite. So was habe ich gesucht und zum Glück bei dir gefunden. Mein Hoster ist auch all-inkl, daher kann ich die gut gebrauchen. Ich habe nur jetzt nur Probleme, das backup script läuft nicht ganz und bei der kompletten htaccess habe ich Probleme.

    Backscrip hat bei der Datenbank folgenden Fehler:

    Warning: exec() has been disabled for security reasons in

    Und bei der kompletten htaccess:

    AuthType BasicAuthName "Backups"AuthUserFile "/www/htdocs/mein account/backup/.htpasswd"Require valid-user#block access to certain file types<FilesMatch ".(htaccess|htpasswd|ini|phps|log|sh|tar.gz)$"> Order Allow,Deny Deny from all</FilesMatch># disable directory browsingOptions All -Indexes# prevent basic url hacking stuff# from: http://www.queness.com/post/5421/17-useful-htaccess-tricks-and-tipsRewriteEngine On# proc/self/environ? no way!RewriteCond %{QUERY_STRING} proc/self/environ [OR]# Block out any script trying to set a mosConfig value through the URLRewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]# Block out any script trying to base64_encode crap to send via URLRewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]# Block out any script that includes a <script> tag in URLRewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]# Block out any script trying to set a PHP GLOBALS variable via URLRewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]# Block out any script trying to modify a _REQUEST variable via URLRewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})# Send all blocked request to homepage with 403 Forbidden error!RewriteRule ^(.*)$ /index.htm [F,L]ErrorDocument 401 /backup/index.htmErrorDocument 403 /backup/index.htmErrorDocument 404 /backup/index.htmErrorDocument 500 /backup/index.htm

    habe ich immer folgenden Fehler:

    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator,

    Kannst du mir vielleicht weiter helfen?

    Danke dir

    LG

    Stingrays

  9. Hast du irgendwo einen eigenen Fehler entdeckt? Kannst du den Lesern hier irgendwelche Tipps, Hinweise oder Hilfen geben, die vielleicht in Zukunft Probleme wie deines vermeiden?

  10. Hallo,
    da bin ich dann noch mal. Hast recht vielleicht ist ja noch jemand blind und macht nicht alles genau nach Anweisung.

    In deinem Script habe ich keine Fehler gefunden, sondern ich habe den Fehler begangen und die Seite nicht backup.phpx genannt sondern backup.php und das ist bei allinkl falsch, wenn man exec() nutzen möchte. Sonst habe ich jetzt alles umgesetzt was in deinem Script steht und auch die .htaccess habe ich so eingerichtet und bis jetzt kommt keine Fehlermeldung. Klappt alles bestens auch das mit SyncBack. Bin begeistert denn das erspart mir eine Menge Arbeit und Zeit.

  11. Hallo Hannes,

    vielen Dank für Deine Backup-PHP Scripte.

    Ist es mit Version 1.2 Deines Scriptes auch möglich, den kompletten Webspace zu sichern?

    in Zeile 040 Deines Scriptes werden die einzelnen Folder $ftpFoldersToBackup definiert.
    Gerne möchte ich jedoch alle Folder „root/*“ auf meiner Seite sichern, mit Ausnahme der unter Zeile 105 $ignorieren definierten Folder.

    Wie/was muss ich hierzu anpassen?

    Da ich die Option $CopyToExternalFTP deaktiviert habe, ist es möglich, in Deiner Beachrichtigungsemail
    welche beim erfolgreichem erstellen der Backups per email versandt werden, die Dateinamen auf die tatsächlichen Backupdateien zu verlinken? So dass beim anklicken dieser Links ein Download dieser Files nach Authentifizierung erfolgen kann?

    Zu guter letzt: Werden die Datenbankdumps auch per FTP übertragen? Wenn die Option $CopyToExternalFTP aktiviert wurde?

    Viele Grüße
    Martin

  12. Also, ich hab mich mal kurz hingesetzt und zwei Ergänzungen programmiert: alle Root-Ordner sichern sowie Excludes ermöglichen.

    Hier nur die Änderungen, die du in deinem Script einbauen kannst; im Artikel ist der Code ebenfalls aktualisiert.

    Vor

    einbauen:

    Vor

    einbauen:

    Die Sachen mit dem verlinkten Text in der Mail hätte jetzt eine größere Umprogrammierung einer Funktion benötigt. Wenn du möchtest, kannst du dich gerne selber damit beschäftigen,
    function backupDetails($backups) enthält den Code, der dann sowohl in die Mail als auch in den HTML Bericht beim direkten Aufruf der .phpx eingefügt wird. Dort müsste man es bei

    irgendwie reinfriemeln aber dafür muss man die Schleifen ändern, die Spalten analysieren, die Datei-/Ordner-Pfade mit in das Array geben usw. – also einige Änderungen, die ne Weile dauern. Sorry.

    LG

  13. ich hoffe es klappt wäre geniale lösung

    eine frage zu diesem ftp external backup i habe einen qnap nas und die ddns ist myqnapcloud.com

    ich denke ich habe alles richtig wie kann ich das aber testen ob es funzt ???

    und ich möchte gerne die datenbanken sichern aber ich muss nirgends login oder so etwas eingeben macht das script das automatisch ? bin auch auf all inkl

    und bei ordner strutur die so lautet:
    root/backup1/backup2
    er sichert den ordner backup1 aber auch die unterordner mit datenbank ?

  14. irgend etwas stimmt mit dem zusatz für die htaccess nicht. wenn ich diesen einfüge beomme ich sofort einen 500 server error.

    wenn ich die htaccess via all inkl verzeichnis schutz erstelle funktioniert alles sofern ich den zusatz mit einbaue geht es nicht.

    außerdem backupt das script leider nur 2 datenbanken ich habe aber um die 20 datenbanken wo kann da der fehler sein?

  15. wenn man aus den kommentaren den code der htaccess nutzt geht es

    AuthType BasicAuthName "Backups"AuthUserFile "/www/htdocs/mein account/backup/.htpasswd"Require valid-user#block access to certain file typesOrder Allow,DenyDeny from all# disable directory browsingOptions All -Indexes# prevent basic url hacking stuff# from: http://www.queness.com/post/5421/17-useful-htaccess-tricks-and-tipsRewriteEngine On# proc/self/environ? no way!RewriteCond %{QUERY_STRING} proc/self/environ [OR]# Block out any script trying to set a mosConfig value through the URLRewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]# Block out any script trying to base64_encode crap to send via URLRewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]# Block out any script that includes a  tag in URLRewriteCond %{QUERY_STRING} (|%3E) [NC,OR]# Block out any script trying to set a PHP GLOBALS variable via URLRewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]# Block out any script trying to modify a _REQUEST variable via URLRewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})# Send all blocked request to homepage with 403 Forbidden error!RewriteRule ^(.*)$ /index.htm [F,L]ErrorDocument 401 /backup/index.htmErrorDocument 403 /backup/index.htmErrorDocument 404 /backup/index.htmErrorDocument 500 /backup/index.htm

  16. nach rumbasteln geht nun alles. einzig die datenbanken werden nicht gesichert. zwar werden 2 datenbanken gesichert ich finde diese aber weder in meinem kas.all… noch wo anders. und die datenbanken meiner webseiten werden nicht gesichert. warum ?
  17. war mein fehler also meine letzten koments können gelöscht werden

    aber ich habe dennoch einen fehler
    Stelle (FTPs über SSL - Port 21) Verbindung zu FTP Server hompii.myqnapcloud.com her...Verbindung hergestellt, Login erfolgreich, passiver Modus aktiviert, Verzeichniswechsel zu /Windows/backupweb/ erfolgreich.15 FTP Backups werden auf externen FTP kopiert...Kopiere FTP_adder_2016-03-20_211050.tar.gz (Größe: 68.9 MB MB) auf den FTP...Warning: ftp_put(): php_connect_nonb() failed: Operation now in progress (115) in /www/htdocs/sssb/backup/ftp-backup.phpx on line 545Warning: ftp_put(): Type set to A in /www/htdocs/ssssb/backup/ftp-backup.phpx on line 545Fehler beim Kopieren des Backups.Kopiere FTP_ansen_2016-03-20_211059.tar.gz (Größe: 73.7 MB MB) auf den FTP...Warning: ftp_put(): php_connect_nonb() failed: Operation now in progress (115) in /www/htdocs/sssb/backup/ftp-backup.phpx on line 545Warning: ftp_put(): Entering Passive Mode (192,168,1,122,219,152). in /www/htdocs/assb/backup/ftp-backup.phpx on line 545Fehler beim Kopieren des Backups.Kopiere FTP_comp_2016-03-20_211115.tar.gz (Größe: 21.1 MB MB) auf den FTP...

    was mag das sein ??

  18. Hallo bill,

    ich lösche für gewöhnlich keine solche Kommentare. Jeder Fehler, den ein Leser macht, kann auch von einem anderen Leser gemacht werden. Von daher wäre es hilfreicher, wenn du mir zu jedem deiner Kommentar kurz schreiben könntest, was das Problem war und wie du es dann gelöst hast. Irgendeine Codezeile nicht angepasst, eine Einstellung vergessen, was können die anderen Leser beachten, wenn sie die gleichen Fehler bekommen?

    Zu deinen letzten Fehlern: das scheint eher am FTP-Server, deiner Firewall oder der Server/NAS-Konfig zu liegen als am Code.
    Schau dir mal diese Artikel und diese Google Suche an. Vielleicht hilft dir das weiter.

  19. Also zu dem Fehler 1 mit den Datenbanken
    Lösung : die einzelnen Datenbanken müssen mit Name dB login dB password in den Code geschrieben werden. Sonst werden diese nicht gesichert die 2 Datenbanken die immer gesichert werden sind die Demo Datenbanken aus dem Script die existieren ja bei uns Usern nicht

    Fehler 2 htaccess
    Ich habe den Code der htaccess eines Kommentares genommen damit ging alles

    Außerdem cache löschen wenn man die htaccess erstellt hat Bülow inkognito Fenster aufmachen

    Fehler 3
    Ftp ich vermute auch das es an den Einstellungen meiner nas liegt weiß aber nicht wo ich dort was einstellen muss

    Fehler 4
    Unterordnen unterordnen
    Also Ordner in Ordner werden gesichert als der übergeordnetrn Ordner wäre toll wenn man dem Script sagen kann aus dem Ordner Tools sichere Ordner 1 aber nicht zwei oder 1 und 2 aber einzelne

    Das Script sichert bislang den gesamten Tools Ordner mit allem was drin ist

  20. Zu Problem 1:
    Ja natürlich müssen die 2 im Code enthaltenen Datenbanken gelöscht werden – das sollen ja nur Beispiele sein. Ich habe den Code im Artikel an der Stelle nochmal angepasst, damit das noch deutlicher wird.
    In den zwei Zeilen über diesen Datenbankangaben steht das Format aber extra nochmal als Gerüst:

    Noch einfacher kriege ich das nicht beschrieben, glaube ich.

    Problem 2:
    Das lag wohl am Encoding des Blogbeitrags – HTML Entities wurden leider umgewandelt und so wurde aus “ ein ".
    Ich habe das korrigiert und jetzt müsste man es 1:1 kopieren können.

    Problem 3:
    Das kann ich dir leider nicht sagen. Das Sichern der Backups auf mein NAS (Synology) funktioniert problemfrei. Dort habe ich am FTP Protokoll damals aber auch ne Menge gefummelt.

    Problem 4: Du meinst du willst Datei- oder Ordnerausschlüsse beim Backup? Die Möglichkeit gab es bereits, sie war jedoch etwas versteckt. Ich habe die entsprechende Zeile in den Config-Bereich nach oben gezogen. In Zeile 53 stehen jetzt Komma-seperiert Datei- und Ordnermasken zum Ausschließen.

    LG

  21. also ich bekomme es einfach nicht zum laufen also die ftp verbindung

    es kommt immer : Stelle (FTPs über SSL – Port 21) Verbindung zu FTP Server hdddcloud.com her…
    Verbindung hergestellt, Login erfolgreich, passiver Modus aktiviert, Verzeichniswechsel zu /Windows/backddeb/ erfolgreich.
    15 FTP Backups werden auf externen FTP kopiert…
    Kopiere FTP_addddentskdddder_2016-04-18_200934.tar.gz (Größe: 69.1 MB MB) auf den http://FTP...

    Warning: ftp_put(): php_connect_nonb() failed: Operation now in progress (115) in /www/htdocs/w01ddddb/backup/ftp-backup.phpx on line 545

    Warning: ftp_put(): Type set to A in /www/htdocs/w01ddddd6b/backup/ftp-backup.phpx on line 545

    weiß einfach nicht was ich machen soll 🙁

  22. Sorry, wie kann man die zuvor erstellten – alten Backups über das Script löschen lassen. Finde die Einstellung leider nicht, Danke.
  23. für alle die auch das problem haben wie ich, backupauf einen externen ftp ( mein QNAP NAS ) funktioniert nicht.

    Ich habe die funktion RTRR Zweiweg Synchronisierung des QNAP NAS genutzt.

    Dort wird direkt der FTP eingetragen von ALL INkl oder anderem FTP und die NAS zieht sich dann den Backup ordner.

    so schickt das script nicht auf den FTP sondern der NAS zieht sich den Ordner vom FTP

  24. ich noch einmal. was müsste geändert werden damit ich zwei backups anlegen kann. einmal wöchentlich undmonatlich.
    klar zwei cronjobs

    aber wie kann ich einen ordner erzeugen wo woche und einen monatliche backups drin sind?

    habe gerade im folder backup/backupmonatlich erstellt dort die phpx datei hinein kopiert. bekomme aber einen fehler das kein backup erstellt werden kann
    sicherlich wegen dem pfad wo trage ich den weiteren folder ein?

  25. Ich bekomme eine Fehlermeldung:

    Parse error: syntax error, unexpected ‚[‚ in /www/htdocs/backup/backup.phpx on line 384

  26. Hallo gamma, ist Zeile 384 bei dir auch
    pathinfo($file)["extension"] == $fileType &&
    so wie in meinem Originalcode oder um welche Zeile handelt es sich?
    Welche PHP Version läuft auf deinem Server?

  27. Hat jemand bemerkt das bei den Datenbanken keine Kommentare angehangen werden auch wenn man diese angibt?

    Meine dB haben alle nur die Nummer man findet schwer raus welche Seite es ist

  28. Hallo Bill,
    das stimmt, wenn du den Dateinamen meinst. Dieser wird nur aus dem Datum gebildet:
    $archivName = "FTP_$folder".date('_Y-m-d_His').".tar.gz";
    Das Kommentar wird nur in die „Berichterstattung“ (Feedbacktext, E-Mail) eingebaut. Wenn du das auch im Dateinamen haben willst, ginge das in etwa so:
    var comment = explode("___", $folderData, 2)[1];$archivName = "FTP_$folder".date('_Y-m-d_His')."_".$comment.".tar.gz";
    (nicht getestet)
    Mit dem Kommentar bei den Datenbanken geht es ähnlich – mit explode trennst du die Bestandteile am „___“ auf und holst es es in den Dateinamen.
    LG
  29. Bzgl. des nachfolgendes Fehler:
    Parse error: syntax error, unexpected ‚[‚ in /www/htdocs/backup/backup.phpx on line 384

    Bei mir habe ich die Zeile wie folgt ersetzt:
    pathinfo($file, PATHINFO_EXTENSION) == $fileType &&

    Damit funktioniert es.

  30. Ich habe aber auch noch ein Problem,

    bei mir gibt es Verzeichnisse, welche gesichert werden sollen, wo ich mit dem 10 Minuten Script-Timeout nicht klar komme.

    All-inkl-Support sagt, ich könne versuchen vorm Timeout Ausgaben des Scriptes zu generieren.

    Es stehen eine Menge flush(); Anweisungen im Script, bei mir erfolgt die Ausgabe aber erst wenn das Script komplett durchgelaufen ist.

    Hat hier jemand eine Idee, wie ich das ändern kann?

  31. @Bill,

    $sqlFile = „DB_$dbName“.date(‚_Y-m-d_His‘).“_“.$dbComment.“.sql“;

    das schreibt den Kommentar aus dem zu sichernden DB-Array auch in den Dateinamen.

    HTH

  32. kann man irgendwie auch das script so erstellen das ich zum einen jeden tag db sicherung mache aber nur jede woche ein ftp ??

    bzw kann ich irgendwie zwei der backup scripts ausführen ich habs probiert aber irgendwie klappt das nicht so

    da ich es echt satt habe mit den ganzen backup plugins für wordpress die so wie so bei all inkl nie richtig funzen

  33. @bill,

    du könntest z.B. den Wochentag abfragen ($tag=date(„w“)) und in Abhängigkeit des Ergebnisses die ftp-Backup-Parameter setzten.

    HTH

      1. Hi Billy, entschuldige die späte Antwort. Es ist eigentlich ziemlich einfach, aber Weihnachten, Silvester… ich kam nicht recht dazu.

        Also, mit PHP kann man relativ einfach den aktuellen Tag rausfiltern – du kannst also vor einer FTP-Sicherung erst den Wochentag abfragen und abhängig von diesem FTP sichern oder überspringen.

        Vor Zeile 86 wird jetzt folgender if-else-Part eingefügt:

        Nach dem else folgt die Zeile 86 im alten Code (die FTP Überschrift) und der FTP Bereich bleibt unverändert. Du brauchst dann noch eine geschlossene Klammer – im alten Code Zeile 175, mit den Zeilen oben drin Zeile 178. Die 3 im Code steht jetzt beispielhaft für Mittwoch, die Wochentage werden von Montag beginnend mit 1-7 nummeriert. Hier also die gewünschte Wochentag-Zahl eintragen und den Cronjob täglich ausführen, dann wird FTP 1x und SQL täglich gesichert. Auch FTP ließe sich mit den 3 Zeilen oben entsprechend anpassen.

        That’s it! 🙂

  34. hey das werde ich mal testen ^^.  und schickes neues template find ich gut. aber ungewohnt erstmal

     

    hab nur ein problem mit einem anderen backup plugin dort kann ich folgende archive auswählen zip
    tar
    tar gzip
    tar bzip2

    ich nutze zur zeit tar gzip leider wird im log oft angezeigt das der dateipfad zu lang ist und nicht gesichert werden kann.

    nun welches archiv kann man denn bei all inkl noch nutzen was einen längeren pfad zu lässt. ?  Du nimmst ja bei deinem script auch targzip da sollte ja dann der selbe fehler auftreten :(. das beduetet ja so viel ich habe nie ein 100% backup hmpf

     

  35. Hallo Bill, ich Blicke nicht ganz durch, du erwähnst noch ein zweites Backup Plugin und Probleme mit der Pfadlänge. Treten die Probleme bei meinem Script oder dem anderen Plugin auf?

    Ich habe bei all-incl bisher nur dieses Dateiformat genutzt, weil die von all-incl bereitgestellte Funktion, die das archivieren erledigt, das so anbietet. Ich weiß nicht, ob andere formate möglich sind. Aber vermutlich würde das das pfadproblem nicht lösen?

    Erkläre vielleicht nochmal etwas genauer.

    LG

  36. hey also leider geht das script seid einiger zeit gar nicht mehr bei mir und ich weiß nicht warum. es rödelt und rödelt doch nichts passiert. warte auf …. domainname

    also wegen zweitem backup ja ich nutze ein backup plugin in meinen wordpress installationen. dieses zeigt mir gerne mal ein fehler an das für gzip maximale länge der dateipfade erreicht wurde. meist sind das cache files. die dann in domain./plugins/namebackup/backupcache/sicherung/namebackupcache liegen und das ist mehr als 130 zeichen lang oder wie lang es maximal sien darf

    1. nun klappt es doch wieder dauert nur sehr lange.

      bekomme im log aber die folgende nachricht

      1. Hallo billy,

        Dieser Dateiname macht mich stutzig…

        Backup fertig: DB_d01xff33_20170305_125716_billywpmanagersql

        Das sieht nach einer falschen Definition der Variable $archivName aus.

        Diese steht im original-Script in Zeile 122.

        Dort scheint bei dir etwas mit der Verkettung zwischen Text und Variablen nicht zu stimmen.

        HTH

         

  37. Hallo billy,

    ich kann leider aktuell keine Probleme feststellen. Ich habe die Scripts mal sichtbar ausgeführt (normalerweise macht das ja mein cron) und sowohl über den Browser als auch per Mail positives Feedback bekommen, siehe Screenshot.

    Komisch ist auch: Meine Zeile 224 ist leer. Zwischen 223 und 225 ist eine leere Zeile, obwohl ich sowas eigentlich selten mache. Was steht da bei dir?
    Meine Zeilen 222-226 sehen so aus:

    LG, Hannes

  38. Hallo Hannes,

    nach langer Suche bin ich auf dein Script für ein FTP und DB Backup gestoßen und es wäre fast perfekt wenn ich wüsste wie ich folgende kleine Änderung vornehmen könnte.
    Ich habe mehrere Webseiten, die im Ordner „seiten“ im rootverzeichnis liegen, also „root->seiten->Verschiedene_Webseitenordner“
    Dein FTP Script liegt bei mir im Verzeichnis „root->tools->ftp.phpx“
    Folgendes habe ich in deinem Script (Version 1.2.2) für mich angepasst:

    $dir = $pfad.“tools/“; // in which subfolder is this backup php file? this would be: „root/backup/“

    $ftpFoldersToBackup = array(„seiten/Webseite1“, „seiten/Webseite2“);

    Als Fehler spuckt er folgendes aus:

    Warning: filesize(): stat failed for /www/htdocs/w0xxxxxx/tools/FTP_seiten/Webseite1_2017-03-14_154903.tar.gz in /www/htdocs/w0xxxxxx/tools/ftp.phpx on line 132
    Fehler bei der Backup Überprüfung. Die Backup-Datei ist fehlerhaft oder nicht vorhanden.
    Verzeichnis-Sicherung fehlgeschlagen. Erstelltes Archiv ist fehlerhaft.

    Was funktioniert ist den gesamten root Ordner „seiten“ zu sichern, was ich allerdings nicht möchte.

    Meine Frage also ist, was ich ändern muss damit ich die Unterordner von root->seiten einzeln sichern kann?

    Ich bin auch bei All-Inkl.

    Vielen Dank

    PS.: Das Datenbank-Backup funktioniert perfekt :).

    LG,
    Daniel

     

    1. Hallo Daniel,

      wie im Kommentar zu sehen (bei mir Zeile 57)

      // which root folders should get backed up? comment is optional

      Kannst du nur rootfolder übergeben, keine bestimmten Unterverzeichnisse.

      Eine mögliche Lösung für dich wäre z.B. die Variable $pfad direkt auf dein Unterverzeichnis „seiten“ zu legen und dann alle rootfolder sichern.

      Ist nicht getestet, wäre aber ein Ansatz.

      Dazu musst du an zwei Stellen den Text anpassen:

      Aus „preg_replace(‚/(\/www\/htdocs\/\w+\/)…“

      Wird „preg_replace(‚/(\/www\/htdocs\/\w+\/seiten\/)…“

      Das ganze einmal bei der Variable $pfad und einmal bei der Variable $ftpFoldersToBackup.

      Hoffe das hilft.

      Wie gesagt, es ist ungetestet. Rückmeldung wäre aber nett.

      1. Hallo Chrunchy,

        danke für die Antwort und deine Lösung hat bei mir tatsächlich funktioniert.
        Die Backups der einzelnen Seiten werden jetzt immer einzeln angelegt so wie ich es wollte. 
        Die Backups werden zwar im Ordner „root/seiten/backups/“ gespeichert, weil ich es nicht hinbekomme, dass sie im ordner „root/backups/“ gespeichert werden aber das stört mich nicht weiters.

        Vielen Dank nochmals!

  39. also hier meine zeile von 221 bis 229

    echo „<br>########################################<br>“;
    echo „<strong>Datenbank $dbName wird gesichert…</strong><br>“;
    flush();
    $sqlFile = „DB_$dbName“.date(‚_Y-m-d_His‘).“_“.$dbComment.“.sql“;
    exec(„mysqldump -u ‚$dbUser‘ -p’$dbPassword‘ –quick –allow-keywords –add-drop-table –complete-insert –quote-names ‚$dbName‘ >$sqlFile“);
    exec(„gzip $sqlFile“);
    $sqlFilePath = $dir.$sqlFile.“.gz“;
    $sqlSize = round(filesize($sqlFilePath)/1000000, 1);
    if(!validateBackup($sqlFilePath)) {

     

     

    in der zeile 224 steht bei mir name und dazu eben der commentar $dbComment

     

    das habe ich hier aus den komentaren genommen. ich wollte einen kommentar mit an die zip hängen. macht das vll den fehler ???

     

    ich wollte halt in meinen db namen noch mein kommentar der db haben um gleich zu sehen welche datenbank es ist.

    das scheint den

    Notice: Use of undefined constant_“ – assumed ‚“_“‘ in /www/htdocs/werecx6b/backup/ftpbackup.phpx on line 224

     

    auszulösen. gibt es eine lösung ???

     

    achja ich hab das gefühl mein script sichert nicht immer. kann es sein das es nur sichert wenn etwas neu ist die db oder ftp ???

    1. Hallo billy,

       

      die Zeichen werden hier entweder umgesetzt, oder sie sind in deinem Script schon falsch.

      Solltest du wirklich im Script die Anführungsstriche unten haben, sowohl einfach, wie doppelt, so klappt das nicht.

      Nachfolgendes sollte aber gehen:

      $sqlFile = „DB_$dbName“.date(‚_Y-m-d_His‘).“_“.$dbComment.“.sql“;

      Gruß Chrunchy

        1. Möglicherweise macht der „date“-Parameter mitten drin aber auch unkontrollierte Ding.

          Stell doch um…

          $sqlFile = „DB_$dbName“.“_“.$dbComment.“_“.date(‚_Y-m-d_His‘).“.sql“;

          o.g. funktioniert bei mir. Zumindest wenn alles im richtigen Editoreingegeben wurde.

  40. hab das mal geändert tatsächlich waren die anführungszeichen oben sehr merkwürdige formatierung. leider zeigt mir das script nichts an oder bricht bei der hälfte einfach ab

     

    kann es sein das ich was mit htaccess falsch gemacht habe ? bei mir speert er den ordner backup dort drinnen liegt das .phpx script.

  41. Eine Anzeige habe ich auch nicht, wenn ich das Script im Browser ausführe. Das hat zwei folgen. Zum einen sieht man nicht was gerade passiert, zum anderen läuft das Script je nach Servereinstellung nur x Sekunden.

    Normalerweise soll die flush(); eine Ausgabe auslösen, das funktioniert aber wohl nicht.

    Bei mir läuft das Script am Ende auch ur sauber durch, wenn im Webspace php als Apache-Mod eingerichtet ist. Sobald php im CGI-Mod ausgeführt wird, bricht mein Script nach 600 Sekunden ab.  Dies ist eine Voreinstellung auf meinem Server.

    Im Apache-Mod läuft das Script zumindest als Cronjob aufgerufen komplett durch.

    htaccess sichert ja nur das Backup-Script vor einem ungewolltem Aufruf. Wenn du das Script starten kannst, ist htaccess korrekt eingerichtet. In dem Moment, wo du die Daten eingibst, und das Script startet, ist der Verzeichnisschutz innerhalb der aktuellen Session aufgehoben.

  42. Hallo Leute,

    sorry für die Codeprobleme – aus mir nicht bekannten Gründen, zeigt der Kommentar-Editor hier nicht mein Code-Plugin an, ich kann hier Code auch nur über die Tags des Plugins manuell einfügen. Gehe ich irgendwann nochmal an.

    Auch wenn das jetzt vermutlich geklärt ist, hier nochmal der Code kopierbar, für andere:

    flush() spuckt eigentlich Ausgaben aus, das scheint aber vom Webhoster gesteuert zu werden. Es gab Zeiten, da hat das funktioniert. Das sollte eher kein Codeproblem sein.

    PHP execution time limits sind in der Tat problematisch, wenn man viel sichern will. Allerdings müsste das Problem verschwinden, wenn die Backups nichts manuell per URL-Aufruf gestartet werden, sondern automatisiert über einen cronjob des Webhosters, wie Chrunchy korrekt sagt.
    Im Gegensatz zum Aufruf durch einen Nutzer/via URL, hat PHP über CLI (Kommandozeile) meist keine Ausführungszeitlimits, also deaktiviert.
    Also testweise mal das Backupscript in All-Inkl als Cronjob eingerichtet, die Ausgaben per Mail schicken lassen und dann abwarten, vielleicht geht es dann von allein. Hier meine Einrichtung:
    All-Inklusive Backup Cronjob

    Ich denke auch nicht, dass htaccess da reinfunkt, wenn du da die Tipps im Beitrag soweit befolgt hast.

  43. bei mir funzt es leider immer noch mit cronjob. es schafft gerade mal 5 seiten die ftp dateien und das war es dann. es fehlen also ftp ordner und komplett die datenbanken :(. langsam weiß ich nicht mehr weiter.
    1. Hallo billy,

      ich kann dir anbieten mal einen Blick in das Script zu werfen, wenn du es zur Verfügung stellst.

      Vorher solltest du natürlich die Passwörter im Script entfernen.

      Bei all-inkl kannst du zu einem Cronjob eine Mailadresse angeben, wo die Ausgabe des Scripts hingesendet wird. Geht aus dieser Mail etwas hervor wworan es liegt?

      Gruß Chrunchy

    2. Hallo Billy,

      also bei mir läuft das Script sauber durch per cronjob. Laufzeit knapp 30 Minuten im Ergebnis sind es 3 Verzeichnisse mit knapp 14,8 GB Volumen in den Backup-Files.

      Ich fürchte, solange du hier keine Inhalte von den Mails bekannt gibst, wird es schwer die Ursache zu finden.

  44. wollte jetzt noch einmal alles neu erstellen  da stimmt aber was in deinem code nicht ^^.

    da sind irgendwie immer die 0 aus dem code raus zwei beispiel:

    $allFtpTime = ;
    $allSqlTime = ;

    dadurch bekomme ich immer syntax error

  45. wollte mich noch mal melden. nach neu laden der seite war alles korrekt

    das script läuft nun etwas weiter als früher aber immer noch nicht durch. sehr schade das ist merkwürdig das es nicht mehr richtig geht. früher ging alles.

    all inkl schreibt mir auf eine support mail. das das script hohe ausführzeit braucht, man aber nichts ändern kann

  46. kann mir jemand schreiben wie ich das script teile ?? also so das ich eben einmal 5 ftp und msql sichere und dann noch ein script habe was wieder 5 macht und immer so weiter?

    habe hier https://zoman.info/datenbank-und-webseitenbackup-mit-e-mail-benachrichtigung-und-downloadlink-bei-all-inkl-com eine möglichkeit gefunden nur 1ne db und 1 ftp zu sichern. das wäre mir aber zu wenig

  47. Billy, kriegen wir alles hin. Ich gucke mir nochmal den Code in meinem Artikel an, mein Code Plugin scheint keine gute Wahl zu sein. Notfalls lade ich das Script erstmal als Datei hoch, Download statt Code.

    Das Teilen ist doch auch recht easy. Du kopierst das Script, backup2.phpx, und packst dort die Projekte/Ordner rein, die in der backup1.phpx nicht drin stehen. Dann machst du ein cronjob für die erste und einen für die zweite Datei, mit ausreichend zeitlichem Abstand zwischen den Ausführungen. Bzw am 1. Des Monats Datei 1, am 2. Datei 2. Du kannst ja beliebig viele Backup Dateien haben, obwohl das natürlich Quatsch wäre, aber vom Prinzip.

  48. hallo billy,

    was hast du für eine Scriptlaufzeit bis zum „Abbruch“?

    Per Cron UND php im Apache-mod, gibt es bei all-inkl keine Beschränkung.

    Teilen geht am einfachsten, wenn du zwei Scripte mit hast, in denen du über den Verzeichnis-Ausschluß die zu sichernden Ordner angibst.

    Fehlende 0 im Script kann ich bestätigen, dabei ist mir aufgefallen…

    @ini_set(„max_execution_time“, 300);

    Den Wert hast du hoffentlich nach oben gesetzt, oder? Bei mir steht der auf 3600.

  49. Hey meine lieben wenn ich wieder nüchtern bin und zeit finde posten ich das Script mal als Datei. Ja Hannes mach es lieber als datei denke da kann man dann viele Fehler ausschließen. Code ist immer so eine Sache.

    In der Mail die ich bekomme steht nur welche verzeichnisse gesichert wurden. Das bricht manchmal sogar im Satz ab also sichere hack…. Ende.

     

    An die timeout habe ich auch schon gedacht hab mich aber nicht getraut das zu ändern. Werde also mal auf 3600 setzen

    Merkwürdig ist das es erst seid dem Umzug des Servers seitens all inkl nicht mehr funzt.

     

    Zur Not splitte ich das Script und lasse eben nur 3 4 Seiten sichern.

    Schön das hier noch so toll Menschen unterwegs sind. Wenn jetzt noch jemand bei ist der mir eine neue Idee für eine Website gibt dann wäre ich mehr als glücklich

  50. da bin ich mal wieder.

    hat sich leider nicht gebessert. selbst wenn ich weniger webseiten sicher, mal macht er 2 oder mal nur 1ne. aber nie die datenbanken so weit kommt es nicht.

    die ausführungszeit ist bei 3600 eingestellt. sehr merkwürdig das lief immer so gut und nun :(. werde da wohl eine andere backuplösung finden müssen

    1. Ich bin mir relativ sicher, dass es an der php-Version von deinem Hosting liegt.

      Sobald hier CGI/FPM im Spiel ist, läuft auch der Cronjob max. 10 Minuten.

      Abhilfe schafft hier nur eine Umstellung auf php im Apache Mod

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.