Inhaltsverzeichnis
Letzte Aktualisierung am 01.01.2023, 14:01:09 Uhr
Es gibt durch aus Skripte und Quellcode von Programmen, die auch heute noch nicht in der Cloud bei GitHub & Co. gespeichert werden sollen bzw. dürfen. Es gibt viele Git-Server, die man selbst betreiben kann. Einer der bekanntesten Vertreter ist sicherlich GitLab in der Community Edition (CE).
Vorwort
Für ein berufliches Vorhaben habe ich mir verschiedene Lösungen und Anbieter im Bereich Code-Hosting angeschaut. Schlussendlich bin ich bei Gitea hängen geblieben. Es ist ein schlankes Produkt, dass in Go geschrieben ist. Zudem handelt es sich um einen Fork von Gogs und wird unter der MIT Lizenz veröffentlicht.
Es ist einfach ohne Container Technik (z.B. Docker) zu installieren, die Aktualisierung ist einfach gehalten, Unterstützung von verschiedenen Datenbanken und benötigt wenig Ressourcen im Betrieb.
Nachstehend eine Beispiel Installation auf einem virtuellen Server der Hetzner Cloud.
Servername & Internetadresse
Bevor es an die eigentliche Arbeit geht, muss ein Servername festgelegt werden. Damit verbunden auch ein Internetadresse, über die später Gitea erreichbar sein soll. Diese ist auch relevant für den Abruf des SSL-Zertifikats bei Let’s Encrypt.
Internetadresse des Servers in Variable speichern.
export serverFqdn=static.30.177.47.78.clients.your-server.de echo $serverFqdn
Firewall konfigurieren
Bevor die eigentliche Installation und Konfiguration durchgeführt wird, ist es sinnvoll die Firewall mit einem Regelset zu füttern und anschließend zu aktivieren. Dafür greife ich auf ufw zurück.
Regel für OpenSSH Server anlegen.
ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp
Firewall aktivieren.
echo y | ufw enable
Status prüfen.
ufw status
Installation von Gitea
Installation der Anwendung git.
apt install -y git
Dedizierten Benutzer anlegen.
adduser --system --shell /bin/bash --gecos 'Gitea user' --group --disabled-password --home /home/git git
Verzeichnisse anlegen.
mkdir -p /home/git/gitea/{custom,data,indexers,public,log}
Berechtigungen und Besitzer anpassen.
chmod 750 /home/git/gitea/{custom,data,indexers,public,log} chown git:git /home/git/gitea/{custom,data,indexers,public,log} chown git:git /home/git/gitea
Anwendung herunterladen.
cd /home/git/gitea wget -O gitea-1.14.3-linux-amd64 https://dl.gitea.io/gitea/1.14.3/gitea-1.14.3-linux-amd64
Berechtigungen anpassen.
chmod +x gitea-1.14.3-linux-amd64
Symbolischen Link auf neue Programmversion setzen.
ln -s gitea-1.14.3-linux-amd64 gitea
Download der systemd Vorlage.
cd /home/git/gitea wget https://raw.githubusercontent.com/go-gitea/gitea/master/contrib/systemd/gitea.service
Konfiguration der systemd Vorlage anpassen.
cp gitea.service gitea.service.original sed -i 's/WorkingDirectory=\/var\/lib\/gitea\//WorkingDirectory=\/home\/git\/gitea\//g' gitea.service sed -i 's/ExecStart=\/usr\/local\/bin\/gitea web --config \/etc\/gitea\/app.ini/ExecStart=\/home\/git\/gitea\/gitea web -c \/home\/git\/gitea\/custom\/conf\/app.ini/g' gitea.service sed -i 's/Environment=USER=git HOME=\/home\/git GITEA_WORK_DIR=\/var\/lib\/gitea/Environment=USER=git HOME=\/home\/git GITEA_WORK_DIR=\/home\/git\/gitea/g' gitea.service ln -s /home/git/gitea/gitea.service /lib/systemd/system/gitea.service systemctl daemon-reload
Anwendung starten.
systemctl start gitea
Status der Anwendung prüfen.
systemctl status gitea
Automatischer Start aktivieren.
systemctl enable gitea systemctl is-enabled gitea
Datenbank installieren
Grundsätzlich bin ich ein Fan davon klein zu beginnen. Das gilt sowohl für die Ressourcen des virtuellen Servers als auch für die eingesetzte Applikationen.
SQLite3
Da auf dem Gitea Server später kein Quellcode von Applikationen abgelegt wird, sondern erst einmal nur Skripte reicht auch eine schlanke Datenbank wie SQLite3.
apt install -y sqlite3
Aktualisierung von Gitea
Gitea ist in der Programmiersprache Go geschrieben. Zudem besteht die Anwendung aus einer binären Datei. Somit ist die Aktualisierung sehr einfach gestaltet.
Dienst anhalten
systemctl stop gitea
In das Anwendungsverzeichnis wechseln
cd /home/git/gitea
Download der aktuellen/neuen Programmversion.
wget -O gitea-1.14.4-linux-amd64 https://dl.gitea.io/gitea/1.14.4/gitea-1.14.4-linux-amd64
Berechtigungen anpassen.
chmod +x gitea-1.14.4-linux-amd64
Symbolischen Link auf neue Programmversion setzen.
ln -s -f gitea-1.14.4-linux-amd64 gitea
Dienst starten.
systemctl start gitea
Installation Reverse Proxy
Ich habe mich für die Nutzung des schlanken und schnellen NGINX entschieden.
Installation des NGINX mit Certbot.
apt install -y python3-certbot-nginx
SSL Zertifikat abrufen.
certbot --nginx -d $serverFqdn --register-unsafely-without-email --agree-tos --rsa-key-size 4096 --non-interactive --no-redirect
Generieren von DH-Parametern.
openssl dhparam -out /etc/ssl/dhparams4096.pem 4096
Neue Konfiguration anlegen.
touch /etc/nginx/sites-available/$serverFqdn.conf cat << EOF > /etc/nginx/sites-available/$serverFqdn.conf server { listen 80; listen [::]:80; server_name $serverFqdn; return 301 https://\$server_name$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name $serverFqdn.de; ssl_certificate /etc/letsencrypt/live/$serverFqdn/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/$serverFqdn/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA"; ssl_prefer_server_ciphers on; ssl_ecdh_curve secp521r1:secp384r1:prime256v1; ssl_dhparam /etc/ssl/dhparams4096.pem; resolver_timeout 5s; ssl_stapling on; ssl_stapling_verify on; #ssl_session_cache shared:SSL:50m; ssl_session_timeout 10m; ssl_session_cache off; ssl_session_tickets off; add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"; add_header X-Frame-Options DENY; client_max_body_size 20m; location / { proxy_pass http://127.0.0.1:3000/; } } EOF
Neue Konfiguration verlinken/aktivieren.
ln -s /etc/nginx/sites-available/$serverFqdn.conf /etc/nginx/sites-enabled/$serverFqdn.conf
Nginx Standard Konfiguration deaktivieren.
rm /etc/nginx/sites-enabled/default
Dienst Nginx neu starten
service nginx restart service nginx status
Erstkonfiguration von Gitea
Einen Browser starten und die oben definierte Internetadresse des Servers eingeben. In meinem Fall ist es die https://static.30.177.47.78.clients.your-server.de. Gitea sollte den Erstinstallationsdialog anzeigen.
Zuerst muss ein Datenbanktyp ausgewählt werden. Wie ich oben beschrieben habe, habe ich SQLite3 auf dem Server installiert.
Anschließend können in den Allgemeinen Einstellungen der Seitentitel angepasst werden.
Wer neben HTTPS auch SSH für Kommunikation nutzen möchte, muss den Parameter SSH-Server-Domain ändern.
Auf jeden Fall muss beim Parameter Gitea-Basis-URL die definierte Internetadresse eingetragen werden.
Wer für den E-Mail Versand einen dedizierten Service oder ein bestehendes E-Mail-Konto nutzen möchte, kann die Parameter unter E-Mail-Einstellungen konfigurieren.
Im Bereich Sonstige Server- und Drittserviceeinstellungen habe ich für meine Instanz folgende Einstellungen (de)aktiviert.
Zu guter Letzt muss natürlich noch ein administratives Konto für Gitea eingerichtet werden. Dazu den Bereich Administratoreinstellungen aufklappen.
Sind alle Pflichtfelder ausgefüllt kann Gitea initialisiert werden. Dieser Vorgang dauert wenige Sekunden und ist abgeschlossen sobald die Startseite angezeigt wird.
Datensicherung
Natürlich darf eigene Datensicherung auf Anwendungsebene nicht fehlen. Gitea selbst bietet eine integrierte Dump- und Wiederherstellungsfunktion.
Diese legt man in der Regel außerhalb des Anwendungs- bzw. Benutzerbereich ab. So dass der Benutzer git keinen Zugriff auf diese Dateien hat.
Neue Verzeichnis anlegen.
mkdir -p /backup/gitea
Datensicherung als täglichen Cron erzeugen.
touch /etc/cron.daily/gitea chmod 755 /etc/cron.daily/gitea
cat << EOF > /etc/cron.daily/gitea #!/bin/bash # skip in favour of systemd timer #if [ -d /run/systemd/system ]; then # exit 0 #fi # this cronjob persists removals (but not purges) if [ ! -x /home/git/gitea/gitea ]; then exit 0 fi cd /home/git/ sudo -u git /home/git/gitea/gitea dump --config /home/git/gitea/custom/conf/app.ini chown -R root:root /home/git/gitea-dump-*.zip mv /home/git/gitea-dump-*.zip /backup/gitea/ EOF
Das Skript kann natürlich auch manuell ausgeführt werden.
Viel Spaß beim Ausprobieren. 🙂