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
149 lines
3.7 KiB
Markdown
149 lines
3.7 KiB
Markdown
# 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 |
|