FreeBSD + fcgiwrap + cgit: Git-Web-Frontend und Git-Server einrichten

7 min

language: ja bn de en es fr hi ko pt ru zh-cn zh-tw

Hallo, ich bin Munou.
Bis vor kurzem habe ich es mit GItea aufgebaut, aber es war zu umfangreich und verbrauchte unnötige Serverressourcen, daher wollte ich diesen Punkt verbessern.
Außerdem wollte ich grundlegende Repositories so weit wie möglich über die CLI erstellen. Bei GitHub gibt es zwar den gh-Befehl, aber ich wollte solche plattformabhängigen Befehle nicht persönlich übernehmen und habe sie daher nicht eingeführt.
Der Grund dafür ist, dass plattformabhängige Binärdateien nicht viel über Low-Level-Aspekte lehren.

Daher habe ich cgit als separates Web-Frontend für git verwendet und git über SSH auf einem Remote-Server gespeichert, wodurch ich die gewünschte Konfiguration erreichen konnte.

Git-Push ermöglichen

Das bedeutet einfach, dass ein Bare-Repository auf der Git-Serverseite erstellt und dorthin gepusht werden kann.
Es wird davon ausgegangen, dass Sie bereits über SSH auf den Remote-Server, in diesem Fall den Git-Server, zugreifen können.

Git-Benutzer erstellen

Im Falle von FreeBSD kann ein Benutzer interaktiv mit dem Befehl "adduser" erstellt werden.

adduser

Wechseln Sie nach der Erstellung des git-Benutzers und fügen Sie den öffentlichen Schlüssel des Clients zu .ssh/authorized_keys hinzu.

su - git
mkdir .ssh
chmod 700 .ssh
vim .ssh/authorized_keys
# Oder
echo "Öffentlicher Schlüssel des Clients" > ".ssh/authorized_keys"
chmod 600 .ssh/authorized_keys

Bestätigen Sie, dass Sie nun ssh verwenden können.
Erstellen Sie zusätzlich ein Verzeichnis zum Speichern von Repositories im Home-Verzeichnis dieses Git-Benutzers.

mkdir repos

Konfigurieren Sie dann den Standard-Branch mit git config.

git config --global init.defaultBranch main

Repository-Erstellung vom Client zum Server ermöglichen

Wenn es so bleibt, müssten Sie sich jedes Mal auf dem Git-Server anmelden, ein Repository erstellen und dann vom Client aus git push ausführen, was zu umständlich ist. Daher ermöglichen wir eine Reihe von Operationen vom Client aus.
Ich habe Folgendes zu .bashrc hinzugefügt.

mkr() {
  ssh git@bsd "git init --bare repos/$1.git"
  ssh git@bsd "cd repos/$1.git; git branch -m main"
  echo "remote add origin git@bsd:~/repos/$1.git"
}

Damit können Repositories auf der Client-Seite mit dem als Argument angegebenen Repository-Namen erstellt werden.
Schließlich kann die Remote-URL einfach durch die Ausgabe des Befehls zur Ausführung der Remote-URL auf der Standardausgabe festgelegt werden.

cgit-Installation

Um cgit zu verwenden, ist cgi erforderlich, daher werden die notwendigen Pakete installiert. Es wird davon ausgegangen, dass Nginx bereits installiert ist.

pkg install cgit fcgiwrap

Nginx muss über UNIX-Sockets mit den Benutzer- und Gruppenberechtigungen von www:www zugreifen können, und der Dienst muss aktiviert werden.

sysrc fcgiwrap_enable=YES
sysrc fcgiwrap_user=www
sysrc fcgiwrap_group=www
sysrc fcgiwrap_socket_owner=www
sysrc fcgiwrap_socket_group=www
service fcgiwrap start

cgit-Konfiguration

Die cgit-Konfiguration muss vorgenommen werden.
Da ich diesmal etwas vom Standard abweichend angepasst habe, sieht es wie folgt aus:

$ cat /usr/local/etc/cgitrc 
root-title=Git
root-desc=public repositories

virtual-root=/
scan-path=/home/git/repos/

css=/style.css
logo=/top.png

head-include=/usr/local/www/cgit/head.html
readme=:README.md
readme=:README.rst
enable-commit-graph=1

Die zu liefernden Dateien wurden zum Zeitpunkt der Paketinstallation unter /usr/local/www/cgit/ erstellt.

Nginx-Konfiguration

Nun, hier kommt Nginx.

server {
    if ($host = git.soulminingrig.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name git.soulminingrig.com;
    listen 80;
}

server {
    server_name git.soulminingrig.com;
    listen 443 ssl;

    root /usr/local/www/cgit;

    location / {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /usr/local/www/cgit/cgit.cgi;
        fastcgi_param PATH_INFO $uri;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock;
    }

    location ~* \.(css|png|ico)$ {
        root /usr/local/www/cgit;
    }

    ssl_certificate /usr/local/etc/letsencrypt/live/git.soulminingrig.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /usr/local/etc/letsencrypt/live/git.soulminingrig.com/privkey.pem; # managed by Certbot
}

Nachdem die obige conf-Datei erstellt wurde, führen Sie einen Syntax-Check mit nginx -t durch und starten Sie Nginx anschließend neu.

nginx -t
service nginx restart

Übrigens hatte ich die Zertifikate bereits mit certbot erhalten.

certbot --nginx -d git.soulminingrig.com

Damit ist der Zugriff nun möglich.

Fazit

Damit konnte ich ein sehr leichtgewichtiges Git-Web-Frontend aufbauen.
Da es mit sehr geringen Ressourcen aufgebaut werden kann, bin ich ziemlich zufrieden.

Bis zum nächsten Mal. Mit freundlichen Grüßen.