Laravel mit Git auf Uberspace deployen
Michal Jacko • 7. February, 2016
web-development laravelIm letzten Artikel habe ich beschrieben, wie man Laravel auf Uberspace installieren kann. Dieses mal möchte ich darauf eingehen, wie man denn nun sauber und komfortabel seine Änderungen in einem Laravel Projekt auf seinen Uberspace hochladen kann.
Üblicherweise nutze ich Git als Versionsverwaltung. Dieses kann auch Server-Repositories über SSH einbinden und synchronisieren. Geplant ist, dass sich nach jedem Push auf den Master-Branch das Repository auf dem Uberspace den aktuellsten Stand auscheckt und in einen separaten Ordner packt. Diesen können wir dann mit einem einfachen Symlink erreichbar machen.
Dafür schauen wir uns kurz die Ordnerstruktur auf Uberspace an. Wenn man sich per SSH auf seinem Uberspace einloggt, dann findet man sein Webroot üblicherweise unter:
/var/www/{Username}/html/
Bei Laravel Projekten sind alle Dateien, die öffentlich erreichbar sein sollen im Public Ordner. Das ist jetzt ein Problem, denn wenn wir einfach direkt im html Ordner auf Uberspace ein Laravel Projekt hosten würden, dann würden alle anderen Dateien und Ordner von Laravel auch erreichbar sein. Außerdem müsste man dann immer an seiner URL noch ein /public anhängen, um auf den Unterodner Public zu navigieren.
Dieses Problem lösen wir, indem wir das komplette Laravel Projekt eine Ordnerstufe über dem html Ordner verlagern und einfach einen Link vom html Ordner auf den Public Ordner von Laravel erstellen.
1. Git Workfolder für Master-Branch
Üblicherweise nutze ich für die Ordner immer den Domain-Namen, um auch die Möglichkeit zu haben, Subdomains übersichtlich zu verwalten. Für diesen Artikel geh ich jetzt mal von der Domain jackomo.net aus.
Das bedeutet wir legen als erstes den Ordner jackomo.net an:
mkdir /var/www/{Username}/jackomo.net.master/
Außerdem legen wir einen Symlink an, der den Webserver anweist, Anfragen aufs Webroot im html Ordner auf den Public Ordner im Laravel Projekt weiter zu leiten.
ln -s /var/www/virtual/{Username}/jackomo.net.master/public/ /var/www/virtual/{Username}/jackomo.net
Das bedeutet, wenn jemand die URL jackomo.net vom Uberspace anfordert, wird er weitergeleitet auf den Public Ordner im Laravel Verzeichnis. Dieses haben wir aber noch nicht.
Außerdem ist bestimmt aufgefallen, dass ich den Ordner nicht jackomo.net genannt habe, sondern jackomo.net.master. Das liegt daran, dass wir in Git später einen Hook einrichten werden, der immer nur den Master-Branch auscheckt. Somit haben wir die Möglichkeit auch einen Dev-Ordner anzulegen, in dem Git immer den Dev-Branch auscheckt welchen man dann z.B. über eine Subdomain (dev.jackomo.net) erreichbar machen kann.
2. Git-Repository
Für Git brauchen wir jetzt auch noch einen Ordner, in dem wir ein Server-Repository anlegen:
mkdir /var/www/virtual/{Username}/jackomo.net.git
und mit dem folgenden Befehl initialisieren wir das Repository:
git init - -bare /var/www/virtual/{Username}/jackomo.net.git
3. Git-Hook
Damit Git bei einem neuen Push auch jedesmal den aktuellen Stand auscheckt, braucht es noch einen sogenannten Hook. Dafür erstellen wir die Datei post-receive im Hooks Ordner von Git und befüllen sie mit der Anweisung, den Master-Branch auszuchecken:
nano /var/www/virtual/{Username}/jackomo.net.git/hooks/post-receive
Inhalt:
#!/bin/bash
path="/var/www/virtual/{Username}/jackomo.net.master"
echo "=============== GIT CHECKOUT ==============="
GIT_WORK_TREE=$path git checkout -f master
echo "================== DONE ==================="
Diese Datei müssen wir noch ausführbar machen:
chmod u+x /var/www/virtual/{Username}/jackomo.net.git/hooks/post-receive
4. Repository Origin über SSH
Das wars!
Wenn wir nun im lokalen Repository Uberspace mittels ssh als Origin hinzufügen, dann sollten nach einem Push die Änderung sichtbar sein:
ssh://{Username}@{UberspaceServer}/var/www/virtual/{Username}/jackomo.net.git