Marcel Krüger

Grav Deploy-Script

Ein 1-Klick Grav deploy Script mit Rsync und SSH

22. Feb. 2020

Der Deploy einer Grav-Webseite ist recht einfach. Lediglich zwei Schritte sind nötig:

  1. Dateien Hochladen
  2. Cache löschen

Dies mit einem FTP-Client zu erledigen nervt. In der GUI rumklicken ist ineffizient für Kommandozeilenmenschen wie mich. Weiterhin kann FTP keine anständigen Diff-Uploads durchführen. Es dauert also länger bis die Dateien oben sind bzw. es ist weniger zuverlässig. Sich in einem zweiten Schritt per SSH einzuloggen und den Cache zu leeren ist mindestens ebenso nervig.

Weiterhin muss auf dem Server natürlich ein FTP-Server laufen. Auf diesem Server ist das nicht der Fall. Der SSH Daemon hingegen ist natürlich unabdingbar und läuft daher.

Die Lösung: Rsync und SSH

Folgendes Bash-Scripts erledigt die zwei oben genannten Schritte. Alle für den betrieb relevanten Dateien werden per rsync sunchronisiert. Anschließend werden per SSH die Dateirechte angepasst und der Cache gelöscht. Fertig.

Ist auf dem Server Public-Key-Authentication eingerichtet, muss kein Passwort eingegeben werden beim Ausführen des Scripts.

Das Skript wird als deploy.sh im Wurzelverzeichnis der grav Installation abgelegt. Dei am Anfang der Datei stehenden Variablen müssen natürlich auf die jeweilige Situation angepasst werden.

#!/bin/bash

SERVER_DIR=/var/www/dermarcel
SERVER_USER=www-data
SSH_USER=root
SSH_HOST=dermarcel.de

rsync -rlptD --progress --delete \
    --exclude '/deploy.sh' \
    --exclude '.git' \
    --exclude '/cache/*' \
    --exclude '/logs/*' \
    --exclude '/images/*' \
    --exclude '/backup/*' \
    --exclude '/assets/*' \
    --exclude '/tmp/*' \
    . $SSH_USER@$SSH_HOST:$SERVER_DIR

ssh $SSH_USER@$SSH_HOST "cd $SERVER_DIR && chown -R $SERVER_USER:$SERVER_USER . && sudo -u $SERVER_USER php bin/grav clearcache"

Das Skript muss nun ausführbar gemacht werden: chmod +x deploy.sh. Ab sofort erfolgt der Deploy durch ein einfaches Ausführen von ./deploy.sh aus dem grav Wurzelverzeichnis.

Keine Ahnung wir rsync --exclude genau funktioniert? Schau hier vorbei.