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.
- IP-Adresse definieren — Schon mal beschrieben bei der Installation von Baïkal im Abschnitt „Netzwerk vorbereiten“.
- Domain-Namen konfigurieren — Das mach ich mit unbound und mir fällt auf das ich da noch keinen Artikel zu habe.
- 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.
- Datenbankmanagementsystem installieren — Dazu gleich mehr.
- 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.