Der Gogs Git-Server ist ein zentrales Repository für eure Git-Projekte. Git-Server setzt man üblicherweise gar nicht oder mit GitLab auf. Da GitLab aber aufwendig ist, habe ich mir nach einer Alternative umgeschaut. Andere bekannte Vertreter sind etwa Atlassian Bitbucket, Gitblit und GitList.
Aber von all diesen hat Gogs als einziger die Eigenschaft, frei und schnell zu sein. Kein Wunder: Gogs ist in der Programmiersprache Google Go geschrieben und daher sehr schnell.
Wahl des Git-Servers: Kriterien
Wichtigstes Kriterium war die Wahl der Laufzeitumgebung, also der benötigten Infrastruktur. Dort spielen Kriterien wie Softwarestack, Speicherbedarf etc. mit hinein.
Web-Infrastruktur für GitLab
GitLab ist sicherlich das komplexe Monster unter den genannten Lösungen: Ohne grundlegende Kenntnisse zu Rubys Paketmanager kommt man nicht weit. GitList ist eine PHP-Variante, von der ich mir nicht viel Performance versprach -- außerdem wollte ich nicht zwingend einen Webserver aufsetzen, zumal mit PHP noch weiterer Konfigurations- und Wartungsaufwand anfällt.
Java-Standalone und Perl für Bitbucket
Die kommerzielle Lösung heißt Bitbucket und ist nicht kostenlos zu haben. Der Stack ist zwar einfach, aber auch nicht zwingend schnell installiert: Ein Java 1.8 und ein Perl 5.8.8 sind doch recht moderne Anforderungen, die -- vor allem im Corporate-Umfeld -- nicht immer verfügbar sind.
Java-Web-Applikationsserver Gitblit
Gitblit ist eine Java-Webanwendung und wird als .war -Datei oder kombiniert mit einem integrierten Java-Webapplikationsserver (hier: Jetty) bereitgestellt. Java-Webapplikationsserver können (müssen aber nicht) schwergewichte sein und sind eine potentiell eigene Fehlerquelle und verbraucht weitere Ressourcen. Da ich mich mit Tomcat, Jetty und dergleichen gut auskenne, wäre es sicher (bei ausreichend RAM/Speicher) eine gute Lösung gewesen. Wäre da nicht das eher unschöne Webinterface.
Gogs Git-Server (Go Git Service)
Der Go Git Service (kurzform: Gogs) ist ein Git-Server, der -- wie der Name schon sagt -- komplett in Go geschrieben ist und daher sehr ressourcenschonend ist. Gogs startet seinen eigenen, integrierten und optimierten Webserver. Da statische Resourcen in einem eigenen Verzeichnis liegen, lässt sich dennoch ein beliebiger Webserver vorschalten -- entweder Apache mit mod_proxy, oder nginx mit try_files. Zudem hat es ein schönes Webinterface -- GitHub lässt grüßen. Es ist zwar noch nicht vollständig, aber bereits sehr funktional. Man kann gogs sogar ohne Datenbank nutzen - eine SQLite-Unterstützung ist vorhanden.
Daher habe ich mich bei meinem aktuellen Fall für Gogs entschieden.
gogs auf Uberspace
Für mich interessant war auch die Frage, ob sich gogs auf Uberspace installieren lässt.
Apache als für statische Resourcen und als Proxy für Gogs nutzen
Die meisten Serverkonfigurationen, die ich gesehen habe, leiten alle Anfragen direkt an Gogs weiter. Dabei ist Apache für statische Resourcen die bessere Wahl, da sich nur so Komprimierung und Expire-Kopfzeilen nutzen lassen. In dem Beispiel bei Geeklabor und in diesem Blog wird leider einfach direkt auf den anderen Port umgeleitet, was ich für unschön halte.
Schöner ist da sicherlich eine Proxy-Anweisung, da so der Apache etwa das SSL-Zertifikat liefern kann, die statischen Resourcen direkt bedient, Daten komprimiert und Expire-Header setzt. Eine komplette Konfiguration (ohne Rücksicht auf Uberspace) sieht wie folgt aus:
<VirtualHost *:80>
ServerName gogs.example.invalid:80
DocumentRoot "/var/www/vhost/gogs.example.invalid/public"
# Aliases for gogs
Alias /js "/var/www/vhost/gogs.example.invalid/public/js"
Alias /img "/var/www/vhost/gogs.example.invalid/public/img"
Alias /css "/var/www/vhost/gogs.example.invalid/public/css"
Alias /assets "/var/www/vhost/gogs.example.invalid/public/assets"
Alias /fonts "/var/www/vhost/gogs.example.invalid/public/fonts"
Alias /less "/var/www/vhost/gogs.example.invalid/public/less"
# No indexes by default
<Directory />
Order Allow,Deny
Allow From All
Options -Indexes
</Directory>
# because Alias can be used to reference resources outside docroot, you
# must reference the directory with an absolute path
<Directory /var/www/vhost/gogs.example.invalid/public>
# directives to effect the static directory
Require all granted
Options +Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
# Do not pass these aliases to the proxy.
ProxyPass /assets !
ProxyPass /img !
ProxyPass /css !
ProxyPass /js !
ProxyPass /fonts !
ProxyPass /less !
ProxyPass /config.codekit !
# Pass everything else.
ProxyPass / http://example.invalid:3000/
ProxyPassReverse / http://12140:3000/
<Proxy http://example.invalid:3000/*>
Require all granted
Allow from all
</Proxy>
</VirtualHost>
Weiterhin sollten noch Direktiven für z.B. Caching eingefügt werden. Beispiele finden sich bei h5bp. Für Uberspace müssten natürlich noch die passenden Direktiven in die .htacces -Datei gelegt werden. Die Alias- und Directory-Anweisung werden entsprechend relativ umgeschrieben.
Uberspace: Port reservieren
Da bei shared hosting ein Port ein teures Gemeingut ist, sollte man den Port vorher mit den Jungs von Uberspace absprechen. Generell sollte die Verwendung eines High-Ports kein Problem sein. Vorteil ist, dass dieser nicht nach außen sichtbar ist, und die Besucher über den Apache zugreifen müssen.
gogs unter Windows
Gogs bringt seine eigene SSH-Keyverwaltung mit, genauso wie bei GitHub. Unter Windows muss lediglich eine Bash nachinstalliert werden, etwa per cygwin. Damit ist Gogs als eine der wenigen Lösungen, die auch unter Windows lauffähig sind: GitLab als wohl beliebteste Lösung ist es nicht. Bei Gitblit ist es zwar offiziell supported, aber dürfte durch die Java-Laufzeitumgebung gerade unter Windows die Performance leiden (Stichwörter: Dateisystem, Multithreading, fehlende CGroups, Speicherverwaltung, etc.).
In der englischen Installationsanleitung für Windows ist sogar beschrieben, wie ein Windows-Dienst mit nssm (non-sucking service manager) eingerichtet werden kann. Im Beispielbildschirmfoto oben ist zu sehen, wie der Dienst mit nssm gestartet und gestoppt wird, und mit einem Apache-httpd-Proxy und MySQL über XAMPP getestet wird.
Fazit
Gogs ist ein toller, schneller Server. Er ist noch jung, erfüllt aber schon mehr als die wichtigsten Wünsche und sollte für die allermeisten Belange ausreichen.
Das Projekt ist in Google Go verfasst und daher ungeheuer schnell und Resourcensparsam.