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
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
# 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
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
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`:
|
||||
|
||||
```ini
|
||||
[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
|
||||
```
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
```bash
|
||||
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`
|
||||
|
||||
```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:
|
||||
|
||||
```ini
|
||||
[service]
|
||||
DISABLE_REGISTRATION = true
|
||||
```
|
||||
|
||||
## 6. Sicherung
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
```bash
|
||||
sudo -u git gitea dump --config /etc/gitea/app.ini
|
||||
```
|
||||
|
||||
## Über die API arbeiten
|
||||
|
||||
Repository anlegen, ohne den Browser zu benutzen:
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
```bash
|
||||
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 |
|
||||
Reference in New Issue
Block a user