Field test F-011 found four of five components carried no pointer file, so a session landing here had no path to the group rules at all. CLAUDE.md is the one-line pointer the check looks for; AGENTS.md links the canonical rules in the management repo (with the Gitea mirror URL for readers outside the lab) and otherwise carries only what is specific and easy to get wrong here. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
thread-net-git — Traefik + Gitea + cAdvisor (CFGMON)
Infrastruktur-Repo für den Kern-Stack auf dem Operating-Host (CFGMON,
rohana.axion1337.de). Abgelöst aus dem unversionierten Portainer-Stack
(Stack-ID 8) am 2026-07-30 — siehe Backlog CFGMON-02.
| Dienst | Image | Zweck |
|---|---|---|
| reverse-proxy | traefik:v3.7.9 | TLS-Terminierung für ALLE Dienste des Hosts (auch Grafana aus dem monitoring-Stack) |
| gitea | gitea/gitea:1.27.0 | Git-Hosting, rohana.axion1337.de |
| cadvisor | cadvisor:v0.49.1 | Container-Metriken für Prometheus (monitoring-Stack) |
Unumstößliche Regeln
- Projektname
thread-net-gitnie ändern (name:in der Compose). Das Gitea-Datenvolumen heißtthread-net-git_gitea-dataund ist alsexternaldeklariert — bei falschem Namen bricht der Deploy laut ab. - Volumes
thread-net-git_gitea-dataundthread-net-git_letsencryptniemals löschen. Ersteres sind die Produktivdaten (Repos, SQLite-DB, LFS, SSH-Hostkeys), letzteres enthältacme.json— eine Zertifikats- Neuausstellung scheitert an der Firewall (80/443 nur für User-IP offen). - Gitea nie auf eine ältere Version pinnen — SQLite-Schema kennt kein Downgrade. Upgrades: Minor-Schritte, vorher Backup (s.u.).
- Diesen Stack nie wieder über Portainer anfassen. Portainer identifiziert Ressourcen über den Compose-Projektnamen; ein „Stack löschen" dort würde die laufenden Container entfernen.
Deploy
cd /opt/thread-net-git
docker network create traefik # falls noch nicht vorhanden
docker compose up -d
Erst-Deploy auf frischem Host (letsencrypt-Volume noch leer):
docker compose up --no-start # legt Volumes/Container an
# acme.json aus Backup einspielen (Rechte 600, root:root):
docker run --rm -v thread-net-git_letsencrypt:/dst -v /opt/backup:/src alpine \
sh -c 'cp /src/acme-<datum>.json /dst/acme.json && chmod 600 /dst/acme.json'
docker compose up -d
Runner (entfernt 2026-08-01)
Der Gitea-Actions-Runner builder-1 wurde im Zuge des CI-Umzugs ins Homelab-GitLab
zurückgebaut (CFGMON-11, erledigt 2026-08-01): alle Workflows laufen jetzt in der Lab-CI, die
Gitea-Actions-Toggles der Repos sind deaktiviert. Beim nächsten Deploy dieses Stacks
verschwindet der Runner-Container; zusätzlich einmalig auf dem Host: builder-1 in der
Gitea-Admin-UI deregistrieren und runner-data/ löschen.
Backup & Restore
Warm-Backup: nächtlich um 03:17 per Cron des Users rantanplan
(backup/gitea-backup.sh, Log: /opt/backup/backup.log).
Derzeit pausiert (Cron auskommentiert, seit 2026-07-30): die Backups
sollen off-host in ein Borg-Repo auf einer Storage Box, bis dahin bleibt
der letzte Dump vom 2026-07-30 liegen — siehe
management#10
(CFGMON-09). Das Skript
stoppt kurz den Runner (SQLite-Journal-Race bei gitea dump), streamt
den Dump ohne Zwischenkopie (gitea dump --type tar -f - | gzip) und
behält nur den neuesten Stand auf dem Host — die 38-G-Platte trägt
nicht mehr. Manuell: einfach das Skript ausführen.
Restore auf frischem Host: Volume thread-net-git_gitea-data anlegen,
Dump-Zip entpacken (gitea-repo.zip → /data/git/repositories,
gitea-db.sql importieren bzw. gitea.db aus data/ übernehmen,
app.ini nach /data/gitea/conf/), dann Stack deployen. Details:
https://docs.gitea.com/administration/backup-and-restore
Off-Host-Kopie nicht vergessen — ein Backup auf demselben Host schützt
nicht vor Plattenverlust:
scp -P 2248 rantanplan@188.245.193.243:/opt/backup/gitea-dump-<datum>.tar.gz .
Bezüge
- Monitoring-Stack (Grafana/Prometheus/Loki): Repo
axion1337.chat/threadnet-operating, Checkout/opt/threadnet-operating. Prometheus scraptcadvisor:8080undtraefik:8080aus diesem Stack über das gemeinsame externetraefik-Netz. - Offene Punkte: Issues im
management-Projekt auf
git.lab (ADR-0005); Bestand und Historie zum Host in
hosts/cfgmon.md. - Gitea-Konfiguration (
app.inimit Secrets) liegt bewusst NICHT im Repo, sondern nur im Datenvolumen; Änderungen viaGITEA__section__KEY-Env-Vars in der Compose.