Der Code der eigenen Projekte

Permalink

Github als Tool zum Verwalten von Sourcecode und verschiedenen Dingen um diesen herum ist wirklich eine tolle Sache. Ich bin aber oft etwas unglücklich meinen eher persönlichen Kram dort hinzuschieben. Manche von den Sachen sind halt einfach so speziell und funktionieren nur für mich. Daher habe ich mich entschieden mich nach einer Alternative umzusehen die ich selbst betreiben kann. Meine Wahl viel auf Gitea. Optisch wirkt es ähnlich so das ich mich schnell einzufinden hoffe und es gibt eine Binary was die Installation einfach machen dürfte.

Vorbereitungen

Wie bei den meisten anderen Diensten die ich zu Hause betreibe gibt es ein paar Vorbereitungen zu treffen um die Umgebung herzurichten.

  1. IP-Adresse definieren — Schon mal beschrieben bei der Installation von Baïkal im Abschnitt „Netzwerk vorbereiten“.
  2. Domain-Namen konfigurieren — Das mach ich mit unbound und mir fällt auf das ich da noch keinen Artikel zu habe.
  3. TLS-Zertifikate erzeugen — Dafür habe ich eine kleine feine CA aber auch ein selbst signiertes Zertifikat (ebenfalls im Artikel zu Baïkal aber im Abschnitt „TLS“ beschrieben) würde den Zweck erfüllen.
  4. Datenbankmanagementsystem installieren — Dazu gleich mehr.
  5. Reverse-Proxy installieren — Als vorgelagerten Webserver nehme ich wie sonst Nginx. Für die grundlegende Installation und Einrichtung verweise ich auf den Artikel zu Seafile beschrieben.

PostgreSQL installieren

Damit Gitea die ganzen Daten von und über meinen Code speichern benötigt es eine Datenbank. Ich habe mich für PostgreSQL entschieden. Das Packet ist auch schnell installiert:

sudo apt-get update
sudo apt-get install -y postgresql postgresql-client

Anschließend empfehle ich noch eine Anpassung der Konfiguration um das völlig veraltete Hashverfahren MD5 durch was moderneres zu ersetzen. Dazu lege ich die Datei /etc/postgres/13/main/conf.d/ an und füge darin die Zeile password_encryption = scram-sha-256 ein.

Softwareinstallation

Die eigentliche Softwareinstallation von Gitea beginnt dann mit dem anlegen des Benutzers gitea:

sudo adduser --system --home /opt/gitea --disabled-login --disabled-password --group gitea

Gitea stellt zwar das Webinterface bereit, die eigentliche Verwaltung des Codes übernimmt aber Git. Daher muss Git natürlich auch installiert sein:

sudo apt-get install -y git

Anschließend komme ich schon zum Download. In diesem Schritt inkludiert, prüfe ich auch die Signatur damit ich keine korrupten oder manipulierten Binaries installiere:

sudo wget -P /opt/gitea/ https://dl.gitea.io/gitea/1.16.8/gitea-1.16.8-linux-amd64
sudo wget -P /opt/gitea/ https://dl.gitea.io/gitea/1.16.8/gitea-1.16.8-linux-amd64.asc
sudo gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2
sudo gpg --verify /opt/gitea/gitea-1.16.8-linux-amd64.asc /opt/gitea/gitea-1.16.8-linux-amd64

Wenn die Signaturprüfung ein positives Ergebnis hervorbringt kann es weitergehen mit dem anlegen von verschiedenen Ordnern und dem vergeben der passenden Berechtigungen:

sudo mkdir -p /etc/gitea /var/lib/gitea/{custom,data,log}
sudo chown -R gitea:gitea /var/lib/gitea/
sudo chmod -R 750 /var/lib/gitea/
sudo chown root:gitea /etc/gitea
sudo chmod 770 /etc/gitea

Datenbank erzeugen

Zu beginn habe ich zwar PostgreSQL installiert aber die eigentliche Datenbank innerhalb des Datenbankservers fehlt noch. Der folgende etwas längliche Befehl übernimmt mehrere Aufgaben auf einmal. Zuerst einmal meldet er sich mit dem Datenbankadmin an der Datenbank an. Im Anschluss wird dann der Datenbankbenutzer gitea erzeugt (bitte ein eigenes Passwort anstelle von $pwd einsetzen), eine Datenbank giteadb angelegt und dann der User aus dem vorherigen Schritt mit allen Rechten auf dieser Datenbank versehen.

sudo -u postgres psql -p 5432 --command "CREATE USER gitea WITH PASSWORD '$pwd';" --command "CREATE DATABASE giteadb OWNER gitea ENCODING UTF8 LC_COLLATE 'de_DE.UTF-8' LC_CTYPE 'de_DE.UTF-8';" --command "GRANT ALL PRIVILEGES ON DATABASE giteadb to gitea" postgres

Reverse Proxy und TLS

Gitea ist nach der Installation erreichbar unter http://localhost:3000. Das ist natürlich nicht so hilfreich um vom eigenen Arbeitsrechner aus zuzugreifen. Darum schalte ich Nginx als HTTP-Server davor, der kann dann auch gleich eine HTTPS-Verbindung ermöglichen. Dazu ist eine neu Datei /etc/nginx/sites-available/gitea.local mit dem folgenden Inhalt nötig:

server {
	listen 192.0.2.10:80;
	listen [fc00::10]:80;
	return 301 https://$host$request_uri;
}

server {
	listen 192.0.2.10:443 ssl http2;
	listen [fc00::10]:443 ssl http2;

	ssl_certificate /etc/nginx/ssl/gitea.local.cert.chain.pem;
	ssl_certificate_key /etc/nginx/ssl/gitea.local.key.pem;
	ssl_session_timeout 1d;
	ssl_session_cache shared:MozSSL:10m;
	ssl_session_tickets off;
	ssl_protocols TLSv1.3;
	ssl_prefer_server_ciphers off;

	add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
	server_tokens off;
	client_max_body_size 200M;

	location / {
		proxy_pass http://localhost:3000;
	}

        error_log /var/log/nginx/gitea_error.log;
        access_log /var/log/nginx/gitea_access.log;
}

Die IPv4- und IPv6-Adressen, genauso wie die SSL-Zertifikatsdateien müssen natürlich zu den eigenen Gegebenheiten passend ersetzt werden.

Anschließend muss ich die Seite noch aktivieren:

sudo ln -s /etc/nginx/sites-available/gitea.local /etc/nginx/sites-enabled/gitea.local

Upload-Limit

Eine Sache, die dabei besonders wichtig ist, versteckt sich in der Zeile die mit client_max_body_size beginnt. Dort wird nämlich festgelegt wie groß die Dateien in eurem Code maximal sein dürfen damit Nginx sie nicht ablehnt. In meinem Beispiel sind es großzügig dimensionierte 200 Megabyte.

Dienst einrichten

Um Gitea bei jedem Neustart des Computers nicht wieder manuell starten zu müssen bietet es sich an, einen Dienst einzurichten. Dazu braucht es wiederum eine neue Datei /etc/systemd/system/gitea.service mit folgendem Inhalt:

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
After=postgresql.service

[Service]
LimitMEMLOCK=infinity
LimitNOFILE=65535
RestartSec=2s
Type=simple
User=gitea
Group=gitea
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web -c /etc/gitea/app.ini
Restart=always
Environment=USER=gitea HOME=/opt/gitea GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target

Aktivieren muss ich auch diese Datei dann wieder und kann bei der Gelegenheit auch alles andere einmal durchstarten:

sudo systemctl daemon-reload
sudo systemctl enable --now gitea
sudo systemctl restart networking
sudo systemctl restart nginx.service

Erster Aufruf

Wenn alles gut gelaufen ist sollte Gitea jetzt unter dem Hostnamen oder der IP aufrufbar sein. Aufrufbar ist aber nicht gleich nutzbar, zu erst muss noch die Grundkonfiguration auf der geöffneten Webseite vorgenommen werden. Insbesondere ist es nötig die Datenbankverbindungsparameter anzugeben. Anschließend können Benutzer und Repositories angelegt werden.

Ich beschränke dann noch die Schreibrechte auf die jetzt entstandene Konfigurationsdatei auf ein Minimum. Sicher ist sicher.

sudo chmod 750 /etc/gitea
sudo chmod 640 /etc/gitea/app.ini

Wartung

Backup

Für das Backup ist es wichtig die Datenbank zu sichern. Das erreiche ich über ein kleines Script:

#!/bin/bash
echo "Init target folder..."
if [ ! -d "/backup/postgres" ]; then
   mkdir /backup/postgres
   chown postgres:postgres /backup/postgres
   chmod 770 /backup/postgres
fi
echo "Create a dump of the database giteadb"
cd /var/lib/postgresql
sudo -u postgres pg_dump --file /backup/postgres/gitea.dump giteadb

Dieses Script rufe ich dann in meinem eigentlich Backup mit Dirvish auf.

Das wiederherstellen der Datenbank aus dem zuvor erstellten Dump ist auch mit wenigen Befehlen getan:

sudo -u postgres psql --command "DROP DATABASE IF EXISTS giteadb;" --command "CREATE DATABASE giteadb OWNER gitea;" --command "GRANT ALL PRIVILEGES ON DATABASE giteadb to gitea;" postgres
sudo -u postgres psql --set ON_ERROR_STOP=on giteadb < /backup/postgres/giteadb.dump

Update

Ich musste noch kein Update machen aber es sollte sich auf den Austausch der Binärdatei beschränken. Aber die Lektüre der Dokumentation ist sicher angebracht.

Auf dem Client

Bevor man jetzt auf dem Entwicklungsrechner loslegen kann… Ich sagte ja oben das ich selbst ausgestellte Zertifikate nutzte. Damit die von der Git-Client akzeptiert werden muss man sie natürlich in eine Vertrauensstellung bringen.

Debian

Unter Debian hat mir der Artikel von Grumpy Techie dabei geholfen.

Windows

Unter Windows ist es etwas irritierend. Git benutzt standardmäßig nicht den Zertifikatsspeicher von Windows sondern einen Eigenen. Dabei handelt es sich um eine Textdatei deren Pfad man mit dem Befehl git config --list herausfinden kann. Die Zeile die mit http.sslcainfo beginnt gibt den Speicherort an. In diese Datei kann man die eigenen Zertifikate einfach anfügen. Anschließend kann der Spaß beginnen.