Files

📘 Kapitel 13: Git (Self-Hosted mit Gitea)

Logische Position: 13 (nach 12: Backup (Basis, privat) · vor 14: Wiki)

Ziel: Ein eigenes Git-System mit Gitea im LXC via Docker aufsetzen, vollständig konfigurieren, erstes Repository anlegen (Web-UI + Terminal) und GitHub-Mirroring nutzen für Datenhoheit und Hybridbetrieb (Self-Hosted + GitHub).


Voraussetzungen

  • LXC: Debian 12 (Bookworm)
  • Empfohlen: 1 vCPU, 512 MB1 GB RAM, ≥ 5 GB Speicher
  • Netzwerk: IPv4/IPv6
  • Optional für externen Zugriff: Nginx Proxy Manager + DynDNS (siehe eigene Kapitel)

🧩 Was wir aufbauen

  • Container: gitea/gitea:latest
  • Ports: 3000:3000 (Web), 222:22 (SSH in Container → Host nutzt 222)
  • Persistenz: Volume ./gitea:/data → Daten liegen auf dem Host unter /gitea/gitea
  • Rechte: USER_UID=1000, USER_GID=1000 (Dateien gehören deinem Standard-User)

🗺️ Kapitelablauf (Kurzüberblick)

  1. System vorbereiten (Update, Tools)
  2. Docker & Compose installieren
  3. Arbeitsverzeichnis /gitea anlegen, docker-compose.yml schreiben
  4. Container starten & prüfen (docker compose up -d, docker ps)
  5. Erstkonfiguration im Browser alle Felder, inkl. SSH-Port 222 & LFS leer
  6. Repository in der Web-UI anlegen (mit README, Lizenz = CC BY für Content)
  7. Lokales Repo initialisieren & pushen (Terminal)
  8. GitHub-Mirroring (Pull- & Push-Mirror)

🔧 Kerneinstellungen (wichtig!)

  • SSH-Port: In Gitea 222 eintragen

    Hintergrund: In Compose ist 222:22 gemappt → Container lauscht auf 22, von außen nutzt du 222. So stimmen die Clone-URLs.

  • LFS: leer lassen (Large File Storage nur für große Binärdateien nötig)
  • UID/GID: USER_UID=1000, USER_GID=1000 → korrekte Dateirechte auf dem Host

🌐 Erstkonfiguration (Setup-Formular)

Datenbank

  • Typ: SQLite3 · Pfad: /data/gitea/gitea.db

Allgemein

  • Seitentitel: frei (z. B. Bratonien Git)
  • Repo-Verzeichnis: /data/git/repositories
  • Git-LFS-Wurzelpfad: leer lassen
  • Ausführen als: git
  • Server-Domain: vorerst IP, später Subdomain (NPM + DynDNS)
  • SSH-Server-Port: 222

Netzwerk

  • HTTP-Port: 3000
  • Basis-URL: http://<IP>:3000/ (später https://git.deine-domain.tld via NPM)

Logs

  • Pfad: /data/gitea/log

Optionen (Homelab-Empfehlung)

  • Offline-Modus · Gravatar aus · Föderation aus
  • 🔒 Registrierung deaktivieren (Admin lädt Nutzer ein) optional
  • OpenID nach Bedarf

E-Mail

  • Für Homelab meist leer (kein SMTP nötig)
  • Admin-E-Mail: Dummy (z. B. admin@localhost) reicht ohne Mailserver

Sicherheit

  • Passwort-Hash: pbkdf2 (Standard)

Admin-Benutzer

  • Benutzername/Passwort setzen · Installieren

🆕 Repository über die Web-UI anlegen (mit Substanz)

Pflichtfelder

  • Besitzer: dein User (z. B. admin) oder eine Organisation
  • Repo-Name: kurz, kleinschreibung-mit-bindestrich (z. B. testprojekt)
  • Sichtbarkeit: privat (Homelab) oder öffentlich (Beispiel/Sharing)

Initialdateien wann sinnvoll?

  • README: erzeugen → Startseite hat sofort Inhalt (empfohlen)
  • .gitignore: bei Codeprojekten sinnvoll (Build/Cache raus) · bei reinen Markdown/Configs optional
  • Lizenz:
    • Content/Leitfaden: CC BY (freie Nutzung mit Namensnennung „Bratonien Tech“)
    • (Bei echtem Software-Code wäre z. B. MIT üblich)

Erweitert

  • Standardbranch: main · Objektformat: sha1 (beides belassen)

💻 Lokales Repo pushen (HTTP & SSH)

# Beispiel HTTP
mkdir testprojekt && cd testprojekt
git init
git remote add origin http://<IP>:3000/admin/testprojekt.git
echo "# Hallo Gitea" > README.md
git add .
git commit -m "Erster Commit"
git push -u origin master

SSH statt HTTP:

git remote set-url origin ssh://git@<domain-oder-ip>:222/admin/testprojekt.git
# SSH-Key vorher in Gitea: Settings → SSH Keys

🔁 GitHub-Mirroring wann & warum?

  • Pull-Mirror (GitHub → Gitea): Externe Repos sichern/weiterarbeiten.
  • Push-Mirror (Gitea → GitHub): Intern arbeiten, öffentlich zeigen.
    Einrichtung im Repo: Settings → Mirroring (Token/URL angeben).

⚠️ Stolperfallen

  • SSH-Port ≠ 222 → falsche Clone-URLs
  • UID/GID falsch → Schreibrechte fehlen
  • SMTP erwartet → für Homelab nicht nötig (Dummy-Mail reicht)
  • LFS aktiviert ohne Bedarf → Speicherfrass

🔗 Siehe auch

  • Kap.3 Nginx Proxy Manager (Domain/HTTPS)
  • Kap.4 DynDNS (Erreichbarkeit von außen)
  • Kap.14 Backup (Basis, privat) (Sicherung des /gitea-Volumes)
  • Kap.16 Wiki (Dokumentation passend zu Repos)

📜 Lizenz für dieses Kapitel

Creative Commons Attribution (CC BY) Nutzung/Weitergabe/Anpassung erlaubt, mit Namensnennung „Bratonien Tech“.