Git
Chapters ▾ 2nd Edition

4.5 Git op de server - Git Daemon

Git Daemon

Nu gaan we een daemon opzetten die repositories verspreid via het “Git” protocol. Dit is een gebruikelijke keuze voor snelle, ongeauthenticerde toegang tot je Git data. Onthoud dat omdat dit geen geauthenticeerde service is, alles wat je verspreid publiek is in het netwerk.

Als je deze server buiten je firewall draait, zou het alleen gebruikt moeten worden voor projecten die publiekelijk zichtbaar zijn naar de wereld. Als de server die je draait binnen je firewall staat, zou je het kunnen gebruiken voor projecten met een groot aantal mensen of computers (continue integratie of build servers) die alleen-lees-toegang hebben, waarvoor je niet een SSH sleutel wilt toevoegen voor elk van deze.

In elk geval, het Git protocol is relatief simpel om op te zetten. Het enige wat je hoeft te doen is dit commando in de achtergrond (daemonize) draaien:

$ git daemon --reuseaddr --base-path=/srv/git/ /srv/git/

De --reuseaddr optie staat de server toe om te herstarten zonder te wachten tot oude connecties een time-out krijgen, de --base-path optie staat mensen toe om projecten te clonen zonder het volledige pad te specificeren, en het pad aan het einde vertelt de Git daemon waar hij moet kijken voor de te exporteren repositories. Als je een firewall draait, zul je er poort 9418 open moeten zetten op de machine waar je dit op gaat doen.

Je kunt dit proces op een aantal manieren daemoniseren, afhankelijk van het besturingssystem waarop je draait.

Omdat systemd het meest gebruikte init systeem is onder de moderne Linux distributies, kan je dat gebruiken voor dat doel. Simpelweg een bestand in /etc/systemd/system/git-daemon.service zetten met deze inhoud:

[Unit]
Description=Start Git Daemon

[Service]
ExecStart=/usr/bin/git daemon --reuseaddr --base-path=/srv/git/ /srv/git/

Restart=always
RestartSec=500ms

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=git-daemon

User=git
Group=git

[Install]
WantedBy=multi-user.target

Het zal je op zijn gevallen dat de Git daemon hier wordt gestart met git als zowel de group als user. Pas het aan aan jouw standaard en org ervoor dat de gebruiker bestaat op het systeem. Controleer ook dat de Git binary inderdaad op /usr/bin/git staat en wijzig het pad indien noodzakelijk.

Als laatste roep je systemctl enable git-daemon aan om de service automatisch te starten op boot-tijd, en je kunt de service starten en stoppen met respectievelijk systemctl start git-daemon en systemctl stop git-daemon.

Tot LTS 14.04, gebruikte Ubuntu upstart service unit configuraties. Daarom gebruik je op Ubuntu ⇐ 14.04 een Upstart script. Dus, in het volgende bestand:

/etc/init/local-git-daemon.conf

zet je dit script:

start on startup
stop on shutdown
exec /usr/bin/git daemon \
    --user=git --group=git \
    --reuseaddr \
    --base-path=/srv/git/ \
    /srv/git/
respawn

Om veiligheidsredenen, wordt het sterk aangeraden om deze daemon te draaien als een gebruiker met alleen lees rechten op de repositories — je kunt dit simpelweg doen door een nieuwe geburiker git-ro aan te maken en de daemon als deze te draaien. Om het simpel te houden draaien we het onderd de zelfde git-user waar de git-shell onder draait.

Als je de machine herstart, zal de Git daemon automatisch opstarten en herstarten als de server onderuit gaat. Om het te laten draaien zonder te herstarten, kun je dit uitvoeren:

initctl start local-git-daemon

Op andere systemen zul je misschien xinetd willen gebruiken, een script in je sysvinit systeem, of iets anders — zolang je dat commando maar ge-daemoniseerd krijgt en deze op een of andere manier in de gaten gehouden wordt.

Vervolgens zul je Git moeten vertellen op welke repositories je onauthenticeerde Gitserver gebaseerde toegang toestaat. Je kunt dit doen voor elke repository door een bestand genaamd git-deamon-export-ok te maken.

$ cd /path/to/project.git
$ touch git-daemon-export-ok

Het feit dat dit bestand er is geeft aan dat Git dat project zonder authenticatie kan verspreiden.