Git auf dem Raspberry Pi einrichten
Einleitung
Hier möchte ich eine kurze Anleitung für die Einrichtung von Git auf dem Raspberry Pi mit so genannten Smart HTTP-Zugriff schreiben.
Beim Einrichten von Smart HTTP wird im Grunde nur ein CGI-Skript mit dem Namen git-http-backend
auf dem Server aktiviert, das mit Git bereitgestellt wird. Dieses CGI liest den Pfad und die Header, die von einem git fetch
oder einem git push
an eine HTTP-URL gesendet wurden, und ermittelt, ob der Client über HTTP kommunizieren kann (was für jeden Client seit Version 1.6.6 gilt). Wenn das CGI erkennt, dass der Client intelligent ist, kommuniziert es intelligent mit ihm. Andernfalls wird auf das dumme Verhalten zurückgegriffen (daher ist es für Lesevorgänge mit älteren Clients abwärtskompatibel).
Die Anleitung ist noch nicht vollständig!
Betriebssystem
Als Betriebssystem habe ich auf dem Raspi "Raspbian" eingerichtet. Aus dem Grund, dass dieses auf dem Debian-System basiert, sollte die folgende Anleitung auch für alle Debian-Systeme gelten.
Für meine Zwecke habe ich eine MicroSD-Karte mit der Größe von 128GB gewählt. Diese soll dafür ausreichen und ist halbwegs preiswert.
Bevor es mit der Installation und Einrichtung von Git weiter geht, sollte das Betriebssystem auf den neusten Stand gebracht werden. Dafür müssen folgende Befehle in der Shell ausgeführt werden:
sudo apt-get update
sudo apt-get upgrade
Software
Für die Einrichtung von Git werden folgende Softwarepakete benötigt:
Paketname | Beschreibung |
apache2 | Webserver |
apache2-utils | |
git-core | Git |
vim | Erweiterter vi-Editor für die Shell |
Mit dem folgenden Befehl werden die Pakete installiert:
sudo apt-get install apache2 apache2-utils git-core vim
Das Betriebssystem installiert alle ausgewählten Pakete mit den automatisch ermittelten Abhängigkeiten.
Bbenötigte Apache-Module werden mit dem folgenden Befehl aktiviert:
sudo a2enmod cgi alias env
Sicherheit
Um meinen Quellcode bei der Übertragung übers Internet vor fremden Augen zu schützen, möchte
ich gerne den Datenverkehr verschlüsseln. Dafür muss das SSL-Protokoll für den Apache-Webserver mit folgenden Befehlen aktiviert werden:
sudo a2enmod ssl
sudo a2ensite default-ssl
Für die Verschlusselung wird ein Zertifikat benötigt. Für mich reicht auch ein selbst erzeugter Zertifikat. Diesen erzeuge ich mit dem folgenden Befehl:
sudo openssl req -new -x509 -newkey rsa:2048 -nodes -out /etc/ssl/certs/server.crt -keyout /etc/ssl/private/server.key -days 3650
Dabei müssen Sie noch ein paar Fragen beantworten, um z.B. Land, Name, usw. festzulegen. Wichtig ist die COMMON-Eingabe. Hier muss die Adresse des Servers angegeben werden:
z.B. www.test.com.
Aus Faulheit habe ich die Gültigkeit des Zertifikates auf 3650 Tage (ca. 10 Jahre) gesetzt. Ihr könnt aber die Dauer nach Belieben selbst anpassen.
Jetzt muss ich dem Apache noch mitteilen, welcher Zertifikat benutzt werden soll. Dafür muss ich mit dem Texteditor in der Datei "/etc/apache2/sites-available/default-ssl.conf" folgende 2 Zeilen finden
SSLCertificateFile /etc/ssl/certs /ssl-cert-snackoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snackoil.key
und diese so anpassen:
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
Zum Schluss muss ich den Web-Server neu starten, um die Konfiguration zu aktivieren:
sudo /etc/init.d/apache2 restart
oder
sudo systemctl reload apache2
Beim Aufruf der Seite im Browser muss ich das Zertifikat akzeptieren und dafür eine Ausnahme hinzufügen, da dieses nicht öffentlich signiert ist.
Git einrichten
Jetzt bin ich an einem Punkt angekommen, an dem die Einrichtung der Versionsverwaltung beginnt.
Zuerst lege ich ein Verzeichnis für die Repositories an, in dem dann weiteres Unterverzeichnis je Projekt angelegt wird:
sudo mkdir /var/gitrepos
sudo mkdir /var/gitrepos/projekt1.git
sudo mkdir /var/gitrepos/projekt2.git
Jetzt initialisiere ich je Projekt ein Repository, in dem folgende Befehle benutzt werden:
cd /var/gitrepos/projekt1.git
sudo git --bare initcd /var/gitrepos/projekt2.git
sudo git --bare init
Da die Verzeichnisse und Repositories von dem Benutzer „root“ angelegt wurden, müssen dem Webserver die Zugriffsrechte (Benutzer und Gruppe) erteilt werden, damit dieser die Repositories
lesen und beschreiben kann:
sudo chown -vR www-data:www-data /var/gitrepos/*
Benutzer einrichten
Für den Zugriff auf Git möchte ich eine Anmeldung verlangen, um das ganze noch mal abzusichern. Mit folgendem Befehl wird die Datei erstellt, in der die Benutzer inkl. Kennwörter abgelegt werden,
wobei der Parameter "-c" die Datei neu erstellen lässt und nur beim ersten Aufruf benutzt werden darf:
sudo htpasswd –cm /etc/apache2/git.passwd user1
sudo htpasswd –m /etc/apache2/git.passwd user2
Beim Ausführen des Befehls gebe ich für jeden Benutzer ein Kennwort ein.
Repositories dem Webserver bekanntmachen
Um auf die Repositories zugreifen zu können, muss ich diese dem Webserver bekanntmachen.
Die Konfiguration erfolgt in der Datei "/etc/apache2/sites-available/default-ssl.conf".
Ich erstelle die Datei
sudo vim /etc/apache2/sites-available/default-ssl.conf
und füge folgenden Inhalt vor "</Virtualhost>" hinzu, wobei die Zeilenversetzung beachtet werden muss:
SetEnv GIT_PROJECT_ROOT /var/gitrepos
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /var/gitrepos/$1
AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /var/gitrepos/$1
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
<Directory "/usr/lib/git-core/">
AllowOverride None
Options +ExecCGI -Includes
Order allow,deny
Allow from all
</Directory>
<Location /git/project1.git>
AuthType Basic
AuthName "Git Repos"
AuthUserFile /etc/apache2/git.passwd
Require valid-user
</Location>
Die Einstellung SetEnv GIT_HTTP_EXPORT_ALL
kann ausgelassen werden, wobei dann in jedem Repositorie-Verzeichnis, dass für den Web-Zugriff freigegeben werden soll, eine Datei "git-daemon-export-ok" erstellt werden muss.
Falls auf mehrere Repos zugegriffen und nicht jedes mal die Konfiguration angepasst werden soll, dann muss anstatt "<Location..."-Blocks folgender Block eingefügt werden:
<LocationMatch "^/git/.*$">
AuthType Basic
AuthName "Git Repos"
AuthUserFile /etc/apache2/git.passwd
Require valid-user
</LocationMatch>
Jetzt muss ich nur noch den Apache-Server neu starten, um die Konfiguration zu aktivieren:
sudo /etc/init.d/apache2 restart
Verbindung zu den Repositories
Nach der Einrichtung der Repositories und des Webservers kann ich schon auf diese zugreifen. Der einfachste Zugriff zum Testen ist ein Aufruf der Repository-Adressen im Browser, z.B.
https://192.168.0.2/git/projekt1.git
https://192.168.0.2/git/projekt2.git
Die IP-Adresse ist durch die richtige von dem Raspi bzw. durch eine externe Adresse zu ersetzen. Jetzt muss noch die Weiterleitung für den Port 443 in dem Router für den Zugriff aus dem Internet eingerichtet werden.
Der Browser-Zugriff ist aber nicht für die Arbeit eines Entwicklers geeignet, weswegen ich mir TortoiseGit installiert habe. Es gibt auch noch SourceTree- und Fork-Programme, die auch Git-Flow unterstützen und die Arbeit deutlich vereinfachen.
Für den Zugriff auf die Repositories aus den Programmen werden die gleichen https-Adressen benutzt.
Falls ihr beim Verbinden mit dem Server die Fehlermeldung "SSL certificate problem: self signed certificate" bekommt, könnt ihr es mit dem folgenden Befehl in der Git-Console lösen:
git config --global http.sslVerify false