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 wink 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 init

cd /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

 

Links

https://git-scm.com/

https://git-fork.com/

https://tortoisegit.org/