Files
homelab/services/gitea
x3 4a55944aa8 Homelab-Dokumentation und Konfigurationsvorlagen
Dokumentation aus dem Wiki uebernommen und um die Dienste auf dem Server
erweitert. Alle Anleitungen sind so geschrieben, dass sich der jeweilige
Dienst allein daraus neu aufsetzen laesst.

docs/      Dienste im Heimnetz (aus dem Wiki, anonymisiert)
services/  Dienste auf dem Server mit Konfigurationsvorlagen
           - matrix-synapse: Homeserver, Postgres, Well-Known-Delegation
           - coturn:         TURN-Relay fuer Anrufe
           - element-web:    Web-Client
           - wikijs, gitea, nginx

Durchgehend anonymisiert: echte Domain durch example.com ersetzt, IP-Adressen
und E-Mail-Adressen durch Platzhalter. Konfigurationsdateien liegen nur als
.example mit Platzhaltern statt echter Secrets vor.

Die Anleitungen halten die Stolpersteine fest, die beim Aufbau tatsaechlich
aufgetreten sind, unter anderem:
- Synapse verlangt LC_COLLATE=C, sonst startet es nicht
- server_name ist nachtraeglich nicht aenderbar -> Delegation noetig
- register_new_matrix_user liest conf.d nicht, Secret muss per -k kommen
- coturn braucht external-ip, sonst kommen keine Medien durch
- Gruppenmitgliedschaft fuer den Zertifikatszugriff wirkt erst beim Neustart
- nginx vererbt add_header nicht in location-Bloecke mit eigenen Direktiven
2026-08-31 17:56:02 +00:00
..

Gitea

Selbstgehostetes Git-Hosting.

Punkt Wert
Software Gitea (Binary nach /usr/local/bin/gitea)
Öffentlich https://git.example.com
Interner Port 127.0.0.1:3001
Datenbank SQLite (/var/lib/gitea/data/gitea.db)
Dienstbenutzer git

1. Benutzer und Verzeichnisse

sudo adduser --system --shell /bin/bash --gecos 'Gitea' \
     --group --disabled-password --home /home/git git

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

# Waehrend der Ersteinrichtung muss Gitea in /etc/gitea schreiben duerfen.
sudo chown root:git /etc/gitea
sudo chmod 770 /etc/gitea

2. Binary installieren

VER=$(curl -s https://api.github.com/repos/go-gitea/gitea/releases/latest \
      | python3 -c "import json,sys; print(json.load(sys.stdin)['tag_name'].lstrip('v'))")
curl -fLo /tmp/gitea "https://dl.gitea.com/gitea/${VER}/gitea-${VER}-linux-amd64"
sudo install -m 755 /tmp/gitea /usr/local/bin/gitea
gitea --version

3. systemd-Unit

Nach /etc/systemd/system/gitea.service:

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

[Service]
User=git
Group=git
WorkingDirectory=/var/lib/gitea
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
RestartSec=5
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now gitea

4. Ersteinrichtung

Gitea zunächst über nginx erreichbar machen (siehe services/nginx/), dann https://git.example.com im Browser öffnen und den Installationsdialog ausfüllen. Danach die Rechte auf /etc/gitea wieder einschränken:

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

Das ist wichtig: app.ini enthält den SECRET_KEY und den INTERNAL_TOKEN. Bleibt die Datei für alle lesbar, kann jeder lokale Benutzer Sitzungen fälschen.

5. Wichtige Werte in app.ini

[server]
HTTP_PORT = 3001
ROOT_URL  = https://git.example.com/
DOMAIN    = git.example.com
SSH_PORT  = 22

[database]
DB_TYPE = sqlite3
PATH    = /var/lib/gitea/data/gitea.db

ROOT_URL muss stimmen, sonst erzeugt Gitea Klon-URLs und Weiterleitungen mit falschem Hostnamen.

Nach der Ersteinrichtung sollte die offene Registrierung geschlossen werden:

[service]
DISABLE_REGISTRATION = true

6. Sicherung

sudo systemctl stop gitea
sudo tar czf gitea-$(date +%F).tar.gz /var/lib/gitea /etc/gitea/app.ini
sudo systemctl start gitea

Die SQLite-Datenbank sollte nicht im laufenden Betrieb kopiert werden. Alternativ Giteas eigener Dump:

sudo -u git gitea dump --config /etc/gitea/app.ini

Über die API arbeiten

Repository anlegen, ohne den Browser zu benutzen:

curl -u '<benutzer>:<passwort-oder-token>' \
  -H "Content-Type: application/json" \
  -X POST -d '{"name":"projekt","private":true,"default_branch":"main"}' \
  https://git.example.com/api/v1/user/repos

Issue anlegen:

curl -u '<benutzer>:<token>' -H "Content-Type: application/json" \
  -X POST -d '{"title":"Titel","body":"Beschreibung"}' \
  https://git.example.com/api/v1/repos/<benutzer>/<repo>/issues

Besser ein Zugriffstoken (Einstellungen → Anwendungen) statt des Passworts verwenden und den Geltungsbereich einschränken.

Stolpersteine

Symptom Ursache
Falsche Klon-URLs ROOT_URL/DOMAIN stimmen nicht
Ersteinrichtung schlägt fehl /etc/gitea für den Benutzer git nicht schreibbar
app.ini weltlesbar Rechte nach der Einrichtung nicht zurückgesetzt
Beschädigte Sicherung SQLite im laufenden Betrieb kopiert