Inhaltsverzeichnis

Aufsetzen eines Git-Servers mit Apache2

Wer einen reinen HTTP-Gitserver haben möchte, kann dies ohne weitere Tools mit einer normalen git-Installation plus Webserver Apache2 einrichten. Die Authentifizierung kann via HTTP-Basis-Authentifizierung erfolgen, Datenübertragung erfolgt über HTTPS.

Konfiguration

Der Apache2 wird wie folgt konfiguriert. In diesem Beispiel wird zusätzlich gitweb installiert, was ermöglich, eine Weboberfläche zum Browsen des Codes bereitzustellen. Mit dieser Konfiguration haben alle User aus der developmentusers.htpasswd Zugriff auf alle Git-Repos.

<VirtualHost 1.2.3.4:443>
        ServerName git.example.com:443
        ServerAdmin nobody@example.com
        SSLEngine on
        SSLCertificateFile /etc/apache2/ssl/example.com.crt
        SSLCertificateKeyFile /etc/apache2/ssl/example.com.key
        SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
        SSLProtocol All -SSLv2 -SSLv3
        SSLHonorCipherOrder On
        SetEnv GIT_PROJECT_ROOT /var/local/git/
        SetEnv GIT_HTTP_EXPORT_ALL
        SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
        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>
          AuthType Basic
          AuthName "Git Repositories"
          AuthUserFile /etc/apache2/developmentusers.htpasswd
          Require valid-user
        </Location>
        DocumentRoot /srv/httpd/dev/
        <Directory /srv/httpd/dev/>
                ErrorDocument 404 /404.html
                ErrorDocument 403 /403.html
                ErrorDocument 401 /403.html
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
                # Bugtracker and other dev stuff, e.g.
        </Directory>
        Alias /gitweb /usr/share/gitweb
        <Directory /usr/share/gitweb>
          Options FollowSymLinks +ExecCGI
          AddHandler cgi-script .cgi
          ErrorDocument 404 /404.html
          ErrorDocument 403 /403.html
          ErrorDocument 401 /403.html
        </Directory>
        <Location /gitweb>
          AuthType Basic
          AuthName "Git Repositories"
          AuthUserFile /etc/apache2/developmentusers.htpasswd
          Require valid-user
        </Location>
        ErrorLog /var/log/apache2/error.log
        LogLevel warn
        CustomLog /var/log/apache2/access.log combined
        ServerSignature On
</VirtualHost>

Zugriffsbeschränkung

Um Users separat Zugriff auf einzelne Repos zu gewähren oder zu verweigern kann mit der Location-Direktive gearbeitet werden:

<Location /git/myproj.git>
        AuthType Basic
        AuthName "myproj repository"
        AuthUserFile /etc/apache2/developmentusers.htpasswd
        Require user devuser01
</Location>

Einzufügen unter den bereits vorhandenen Location-Direktiven (siehe oben).

Hier hätte nurnoch devuser01 Zugriff. Achtung: Über gitweb ist weiterhin für alle User möglich, den Code zu sehen.

Repos und User anlegen

Git Repos lassen sich am besten mit einem dafür angelegten Skript anlegen, damit man nicht alle Befehle manuell ausführen muss.

mkproj.sh
#!/bin/sh
# Git-Repo-Creator-Skript by rkCSD - www.rkcsd.com
mkdir -p /var/local/git/$1.git
cd /var/local/git/$1.git
git init --bare
chown -R www-data:www-data /var/local/git/$1.git

Es ist wichtig, dass das Repo dem User und der Gruppe gehört, mit der Apache2 läuft, in unserem Fall www-data. Jetzt kann man ganz einfach Repos anlegen:

# ./mkproj projektname

Benutzer lassen sich mit dem Befehl htpasswd anlegen:

# htpasswd /etc/apache2/developmentusers.htpasswd devuser001

Das legt den Benutzer devuser001 an, das zu setzende Kennwort wird abgefragt.