Die letzten Wochen arbeite ich recht intensiv an einem aktuellen Projekt und habe daher wenig Zeit aufs Bloggen verwendet. Dazu werde ich später sicherlich nochmal was schreiben. In diesem Zusammenhang kam ich aber an eine Aufgabenstellung, die mir immer mal wieder über den Weg läuft:
“Wie holt man eigentlich am besten einen Datenbankstand vom Webserver, wenn man kein SSH zur Verfügung hat?”
David
Bisher habe ich dafür oft Tools wie Adminer genutzt. Das klappt gut, aber da ich ein Freund von Automatisierung bin, habe ich diesmal ein Tool gesucht, welches sich in ein Makefile einbinden lässt. Meine Internet-Recherche hierzu stellte mich nicht unbedingt zufrieden, daher entschied ich mich das Ganze einfach selbst umzusetzen.
Die Grundidee war dabei möglichst ein Script zu haben, welches ohne große Abhängigkeiten funktioniert und sich automatisch zum FTP verbindet, dort dann ein Script hochlädt, dieses ausführt und direkt danach wieder löscht.
Sicherheit geht vor
Ein Datenbankabbild ist in aller Regel sehr sensibel zu behandeln, da es üblicherweise personenbezogene Daten enthält und man nicht möchte, dass diese ohne weitere Absicherung im Internet abrufbar sind. Aus diesem Grund ist m.E. schon die Installation von Tools wie Adminer ein potenzielles Risiko.
In der Praxis löse ich das dadurch, dass das Script nur so lange auf dem Server liegt, wie ich es dort brauche, keinesfalls mehrere Stunden oder gar Tage. Zudem schütze ich das beinhaltende Verzeichnis durch htaccess oder wähle einen einmaligen kryptischen Namen hierfür.
Einen ähnlichen Schutz sollte auch mein neues Script erhalten, weswegen ich dafür zwei Anforderungen hinsichtlich Sicherheit aufgestellt habe:
- einmaliger kryptischer Namensanteil
- minimale Verweildauer auf dem Server
Zudem bin ich kein Freund davon Passwörter im Klartext zu speichern, also sollte das Script die Möglichkeit haben, die Zugangsdaten teilweise abzufragen, statt zu speichern.
Weitere Anforderungen
Daneben war mir noch wichtig, dass das Script möglicht übersichtlich bleibt und möglichst nur aus einer Datei besteht, damit man es leicht irgendwo in die Pfadangabe einbinden kann und so nicht in alle Projekte kopieren muss.
Damit geht für mich auch einher, dass es nur wenige Anforderungen stellen sollte und auch wenig Optionen bieten sollte. Je weniger komplex, desto besser.
Implementierung
Diese Einfachheit habe ich dann direkt auch auf den Namen angewendet und das Script einfach ftp-mysql-dump
genannt.
Dabei wird allerdings ein nicht unwesentlicher Teil des Prozesses verschwiegen, der über PHP realisiert wurde. Konkret gibt es folgenden Ablauf:
- Einlesen der Konfigurationsdatei (sofern vorhanden)
- Abfrage fehlender Konfigurationsparameter
- Erstellung eines PHP-Scripts mit zufälligem Namen
- Upload des PHP-Scripts auf dem FTP-Server
- Ausführung des PHP-Scripts über
wget
(speichern des Dumps) - Löschen des PHP-Scripts vom FTP-Server und lokal
Das ganze hat aktuell nur 170 Zeilen, wobei der spannende Teil mit dem PHP-Code direkt im Bash-Script zusammengebaut wird:
PHP_SCRIPT=`cat <<EOF <?php # create dump exec("mysqldump --user='${DB_USER}' --password='${DB_PASS}' --host='${DB_HOST}' '${DB_NAME}' --result-file='${DUMP_NAME}' 2>&1", \\$output); # create zipfile \\$zip = new ZipArchive(); \\$zip->open('${ZIP_NAME}', ZipArchive::CREATE); \\$zip->addFile('${DUMP_NAME}'); \\$zip->close(); # send zipfile echo file_get_contents('${ZIP_NAME}'); # delete dump and zip file unlink('${DUMP_NAME}'); unlink('${ZIP_NAME}'); EOF` echo "${PHP_SCRIPT}" > ${FILE_NAME}
Hierbei kombiniere ich die Heredoc-Syntax mit Backticks und kann so erreichen, dass der Heredoc-Block mit den Variablen ausgewertet wird und gleich in eine neue Variable $PHP_SCRIPT
übernommen wird. Nach zwei anderen Schreibweisen, erschien mir das als die eleganteste Notation.
Der Rest des Scripts ist eher lapidar und kann hier eingesehen werden: https://gitlab.com/gruniversal/ftp-mysql-dump/-/blob/master/ftp-mysql-dump.sh
Fazit
Mit meinem Ansatz bin ich sehr zufrieden. In nicht einmal zwei Sekunden wird über das Script der Dump abgeholt und alle Spuren sowohl auf dem Server als auch lokal werden automatisch beseitigt. So schnell ist man mit keinem Webtool und die Anforderungen an Sicherheit werden ideal erfüllt. Zudem eignet sich das Script somit sehr gut für automatische Datenbank-Backups.
Natürlich handelt es sich nur um eine frühe Version des Scripts. Mögliche sinnvolle Erweiterungen wären zum Beispiel die Vergabe eines Passworts für den Dump oder eine bessere Behandlung des Namings des Dumps. Mal schauen, wie sich das ganze entwickeln wird.
Ich fand es auf jeden Fall so interessant, dass ich es gleich mal auf GitLab geworfen habe, wo die Entwicklung bei Interesse verfolgt werden kann: https://gitlab.com/gruniversal/ftp-mysql-dump
Schreibe einen Kommentar