~/CodeBlog.at

Ein halbkreativer Entwickler über alles zwischen C# und TYPO3.

Staging-Datenbank in ddev importieren

Bei meinem aktuellen Projekt arbeiten die Redakteure parallel sehr fleißig am Content der Seite und ständig kommen Fragen oder Bugs zu neuen CEs, die ich auf meiner lokalen Umgebung noch gar nicht angelegt habe. Bisher hab‘ ich mir die Datenbank immer manuell geholt. Per SSH auf den Server, mysqldump, downloaden und in ddev einspielen. Aber das muss doch einfacher gehen, vor allem wenn man das alle paar Stunden einmal machen muss.

Auf Twitter habe ich einige Anregungen und Hilfen bekommen. An dieser Stelle danke an Geddo2k, Matthias, Stefan und Andreas.

Anfangs wollte ich es als externes Bash Script machen, aber ich hab mich dann doch für die ddev provider entschieden.

Das Skript unter .ddev/providers/staging.yaml dafür schaut nun so aus:

environment_variables:
  server: user@host

auth_command:
  command: |
    set -eu -o pipefail
    ssh-add -l > /dev/null || ( echo "Please 'ddev auth ssh' before running this command." && exit 1 )

db_pull_command:
  command: |
    set -x
    set -eu -o pipefail
    ssh -t ${server} -p 22222 'mysqldump --defaults-file=~/.mysql/db.cnf dbname' > .ddev/.downloads/db.sql
    gzip .ddev/.downloads/db.sql
  service: web

files_import_command:
  command: |
    set -eu -o pipefail
    echo $PATH
    echo "doing nothing ..."
  service: web

ddev providers erwarten den SQL-Dump gezippt, daher mache ich das noch. Wollte ich eigentlich am Server zippen und die Datei dann über rsync downloaden, aber das hat dann nicht auf Anhieb funktioniert und dann war meine Geduld dafür auch irgendwann am Ende. Schließlicht wollte ich eine 5-Minuten Arbeit automatisieren und nicht +3h an einem Script feilen.

Wichtig ist hierbei vor allem die Datei ~/.mysql/db.cnf im Home-Verzeichnis am Server. Ich wollte unbedingt vermeiden, dass ich lokal die Zugangsdaten für die Datenbank speichern muss oder diese womöglich irgendwie/irgendwann im Git landen. Daher wollte ich die Datenbank mit Hilfe der typo3console exportieren, aber diese läuft nur, wenn mein User im webroot Schreibrechte hat. Diese habe ich auf dem Server allerdings nicht. Daher fällt das weg. Also doch der bekannte Weg über den mysqldump.

Die Datei hat folgenden Inhalt:

[client]
user = "foo"
password = "bar"
host = "127.0.0.1"

Vielen Dank an Kay für das initiale Script und die Hilfe beim Anpassen an meine Bedürfnisse!


Für ein anderes Projekt auf meinem Server hab ich dann endlich die TYPO3-Console von Helmut verwenden können. An dieser Stelle ein Danke für diese großartige Extension!

environment_variables:
  server: foo@bar.at
  deploymentPath: /usr/home/foo/public_html/releases/current

auth_command:
  command: |
    set -eu -o pipefail
    ssh-add -l >/dev/null || ( echo "Please 'ddev auth ssh' before running this command." && exit 1 )

db_pull_command:
  service: host
  command: |
    set -x
    # You can enable bash debugging output by uncommenting
    set -eu -o pipefail
    ssh -t ${server} -p 222 "cd ${deploymentPath}; ./vendor/bin/typo3cms database:export -c Default -e 'cf_*' -e 'cache_*' -e '[bf]e_sessions' -e sys_log" > .ddev/.downloads/db.sql
    gzip .ddev/.downloads/db.sql

db_import_command:
  service: host
  command: |
    # set -x
    set -eu -o pipefail
    ddev import-db --src=".ddev/.downloads/db.sql.gz"
    ddev typo3cms database:updateschema

files_pull_command:
  service: host
  command: |
    set -eu -o pipefail
    rsync -rzv -e 'ssh -p 222' ${server}:${deploymentPath}/htdocs/fileadmin/ htdocs/fileadmin/ --max-size=1.5m --exclude=_processed_

files_import_command:
  service: host
  command: |
    set -eu -o pipefail
    echo "doing nothing ..."

Der große Vorteil ist hier, dass ich mich nicht um irgendwelche Credentials kümmern muss, weil die TYPO3 Console holt sich die Daten aus der LocalConfiguration.php bzw. in meinem Fall aus einer .env.

Im db_pull_command exportiere ich die Datenbank (exkl. der ganzen Cache Tabellen, die be_sessions/fe_sessions und die sys_log – was bei einem mysqldump so nicht möglich wäre!) und zippe den Dump anschließend wieder. (Anm.: das braucht ddev so!)

Zu dem Thema kann ich diesen Artikel im in2code Tech-Corner empfehlen: https://www.in2code.de/aktuelles/mysql-und-mysqldump-alles-was-ihr-wissen-muesst-ueber-import-und-export-von-datenbanken/.

Da ich nach dem Import einen DB-Compare laufen lassen wollte und vielleicht auch noch den Cache löschen, muss ich den db_import_command überschreiben und mich um das importieren der DB selber kümmern.

Was noch fehlt, wäre der Download des /fileadmin, aber das löse ich meistens über die Extension filefill.