Eine Webseite mit git deployen

Vor langer Zeit, so um 2014 herum lernte ich Git kennen.

In dieser Zeit hatte ich einige Programmierprojekte, kleine Apps als Webseiten, laufen.

Mein Workflow für diese Apps sah dann so aus:

  1. Dateien lokal bearbeiten
  2. Änderungen per SFTP auf den Server kopieren.

Das Problem hier war dann immer, die zuletzt geänderten Dateien und Ordner zu identifizieren und hochzuladen. Unter Windows half mir das Beyond Compare, unter OSX gab es ähnliche Hilfsprogramme.

Kompliziert wurde es, wenn man mit anderen auf einem Server arbeitete, die Konflikte zu lösen war nicht gerade einfach und erforderte viele Absprachen.

Mit Git wurde das viel einfacher.

Zuerst war das Versionierungsproblem gelöst und damit auch die gemeinsame Zusammenarbeit am Code. Ich konnte eine Kopie des Repositories auf dem Server schieben und diese Kopie via git push aktuell halten. Jeder andere mit Zugriff konnte ebenfalls auf das Repo pushen. Git sorgte für die Anzeige der Konflikte vor dem Aktualisieren und man konnte diese dann einfach oder kompliziert lösen.

Danach löste ich das Problem, eine Version meiner Apps oder Webseiten automatisch zu veröffentlichen.

Die Idee ist eigentlich einfach:

  1. Dateien lokal bearbeiten
  2. Anpassungen in das lokale git-repo committen
  3. Den branch per git push auf das git-repo kopieren
  4. Auf dem Server per post-receive hook die empfangenen Änderungen automatisch in das produktive Verzeichnis auschecken.

Hier eine kleine Anleitung für eine fiktive webseite, wie man es einrichten kann:

Zunächst meldest du dich per ssh auf dem Server an und prüfst, ob git installiert ist:

git --version

Wenn das nicht klappt, schade auch, das wars dann hier.

Wir benötigen einige Verzeichnisse:

VerzeichnisBeschreibung
~/webseiteProduktionsversion deiner Webseite
~/repositoriesBasis für alle git-repositories auf deinem Server
~/repositories/webseite.gitgit-repository für deine Webseite

Die kannst du so anlegen:

mkdir ~/webseite
mkdir -p ~/repositories/webseite.git

Dann initialisierst du das git-repository. Falls du bereits ein eigenes, lokales Git-Repository hast, musst dieses hier mit dem Parameter --bare anlegen. Dann kannst du später deine lokale Kopie hierher pushen.

cd ~/repositories/webseite.git
git --bare init

Auf deiner lokalen Maschine checkst du nun diese repository aus. Das geht mit den ssh-daten von deinem Hoster.

Von lokal pushst du nun den letzten Stand auf das Repository auf dem Server, so dass dort Dateien drin liegen.

Nun verhängen wir erst einmal das Webseite - Verzeichnis mit dem repository und schauen, ob dort die Dateien ankommen. Achtung, der Punkt hinten ist wichtig, damit clone in das aktuelle leere Verzeichnis kopiert. Ansonsten legt es ein neues Verzeichnis webseite an.

cd ~/webseite
git clone ~/repositories/webseite .

Mittels ls -la kannst du schauen, ob der aktuelle Stand vom master - branch angekommen ist.

Nun kannst du einen neuen commit von lokal auf dein server-repository pushen.

Und das Webseiten-Verzeichnis kannst du so aktualisieren:

cd ~/webseite
git pull origin master

Damit funktioniert der manuelle Weg. Zeit es zu automatisieren.

In jedem Git-Repository kann man so genannte Hooks hinterlegen, die bei bestimmten Aktionen ausgeführt werden. Auf deinem Server ist das ein Hook, der nach jedem receive einen bestimmten branch in ein anderes Verzeichnis ausscheckt. Der hook selbst kann ein shell-script sein.

So legst den hook an und machst ihn ausführbar:

touch ~/repositories/webseite.git/hooks/post-receive
chmod +x ~/repositories/webseite.git/hooks/post-receive

Anschliessend editierst du ihn, zum Beispiel mit nano:

nano ~/repositories/webseite.git/.git/hooks/post-receive

Der einfachste Inhalt ist dann das, was wir manuell gemacht haben.:

#!/bin/sh

cd ~/webseite || exit
unset GIT_DIR
git pull origin master

Es wechselt in das webseiten-Verzeichnis und ruft dort git pull auf den Branch main vom remote origin auf.

Jetzt kannst du wieder lokal eine Änderung vornehmen, diese committen und pushen.

Beim pushen müsstest du nun im Log nun die Ausgabe des hooks sehen.

Du kannst aber auch nachschauen, ob sich etwas verändert hat mit:

cd ~/webseite
ls -la

Sicherheitstechnisch ist das natürlich nicht so schlau, denn damit veröffentlichst du auch die ganze Git-Historie mit. Damit Git weiss, wie der Stand von den Dateien im webseite- Verzeichnis ist, gibt es das .git - Unterverzeichnis. Dort liegt alles, was du in das Git-Repository gespeichert hast. Falls du also jemals Zugangsdaten, Keys oder anderes aus Versehen gespeichert und committet hast, ist das öffentlich zugänglich.

Im Apache Webserver könntest du den Zugriff auf das .git- Verzeichnis mit einer .htaccess - Datei sperren:

<FilesMatch "^\.git">  
    Require all denied  
</FilesMatch>

Diese Datei committest du in das root von webseite-Projekt.


Wohin jetzt?

Du kannst gerne unten weiter stöbern. Manchmal habe ich auch etwas gelernt. Es gibt eine Slashes-Seite.