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
3.7 KiB
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 |