Wer kennt es nicht: Man muss auf einem günstigen Shared-Hosting-Paket (z.B. bei IONOS) schnell mal git pull ausführen oder eine Datenbank nutzen, aber der Hoster gewährt keinen SSH-Zugang – oder nur in teureren Tarifen. Oft bleibt einem dann nur der mühsame Weg, Dateien manuell via FTP hochzuladen, was Deployments unnötig kompliziert und fehleranfällig macht.
Ein möglicher Workaround ist das Mounten des Dateisystems via sshfs. Das klingt in der Theorie gut: Man bindet den Remote-Ordner lokal ein und arbeitet so, als lägen die Dateien auf dem eigenen Rechner. Dafür erstellt man lediglich ein lokales Verzeichnis und verbindet dieses über den FTP/SSH-User mit dem Server. Die notwendigen Befehle, um die Verbindung herzustellen und Git für diesen Ordner vorzubereiten, sehen unter Linux wie folgt aus:
sudo apt-get install sshfs
mkdir /var/www/remote
cd /var/www/remote
sshfs username@your.host:/ -p 22 /var/www/remote
git config --global --add safe.directory /var/www/remote
git status
...
umount /var/www/remote
Das Problem: Die Performance ist unterirdisch. Da Git für Befehle wie git status tausende kleine Dateioperationen durchführt und jede davon über das Netzwerk muss, wartet man oft minutenlang auf einfache Rückmeldungen. Produktives Arbeiten ist so kaum möglich. Gerade bei Projekten mit vielen Dependencies friert das Terminal dabei oft komplett ein, sodass man den Prozess entnervt abbrechen muss.
Genau für dieses Szenario gibt es Libraries wie ftpsh. Die Library ermöglicht es, Shell-Befehle auf einem Remote-Server auszuführen, der nur (S)FTP- und HTTP-Zugang bietet. Der Trick dabei: Es wird temporär ein PHP-Skript hochgeladen, das gegebene Befehle ausführt und den Output zurückliefert. Das passiert alles im Hintergrund, fühlt sich aber an wie eine echte Shell.
Die Installation geht schnell von der Hand:
mkdir ftpsh
cd ftpsh
wget -O ftpsh.sh https://raw.githubusercontent.com/vielhuber/ftpsh/main/ftpsh.sh
chmod +x ftpsh.sh
Danach legen wir eine .env an mit den (S)FTP-Zugangsdaten an:
HOST=your-server.com
PORT=22
USERNAME=your-username
PASSWORD=your-password
REMOTE_PATH="/"
WEB_URL="https://your-server.com"
Nun können wir beliebige Befehle auf dem Server ausführen, sofern die Tools remote verfügbar sind:
ftpsh git status
ftpsh "mysqldump -h xxx --port 3306 -u xxx -p\"xxx\" --routines xxx" > dump.sql
Das Skript lädt im Hintergrund einen Worker hoch, führt den Befehl lokal auf dem Server aus (wo er schnell ist) und liefert das Ergebnis zurück. Damit lassen sich Deployments, Datenbank-Dumps oder Git-Operationen auch auf eingeschränkten Hosting-Umgebungen performant automatisieren. Es spielt beispielsweise auch perfekt mit syncdb zum Synchronisieren von Datenbanken zusammen.