Claude 02b32248b7 backup: Dump als Stream mit Runner-Stopp und Retries, README nachziehen
Script-Ueberarbeitung aus dem Live-Betrieb nachcommittet: Runner-Stopp
gegen das SQLite-Journal-Race, Dump als Stream (tar.gz statt zip),
3 Versuche mit Retry. README dokumentiert das neue Verfahren und den
aktuellen Pausen-Zustand des Crons (Backlogs CFGMON-09).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:16:17 +02:00
2026-07-30 15:56:36 +02:00

thread-net-git — Traefik + Gitea + cAdvisor + Actions-Runner (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)
runner gitea/act_runner:0.6.1 Gitea-Actions-Runner builder-1 (Labels: linux-build, win-wine)

Unumstößliche Regeln

  1. Projektname thread-net-git nie ändern (name: in der Compose). Das Gitea-Datenvolumen heißt thread-net-git_gitea-data und ist als external deklariert — bei falschem Namen bricht der Deploy laut ab.
  2. Volumes thread-net-git_gitea-data und thread-net-git_letsencrypt niemals löschen. Ersteres sind die Produktivdaten (Repos, SQLite-DB, LFS, SSH-Hostkeys), letzteres enthält acme.json — eine Zertifikats- Neuausstellung scheitert an der Firewall (80/443 nur für User-IP offen).
  3. Gitea nie auf eine ältere Version pinnen — SQLite-Schema kennt kein Downgrade. Upgrades: Minor-Schritte, vorher Backup (s.u.).
  4. 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

Erstregistrierung (einmalig, Identität landet danach in runner-data/.runner):

cp .env.example .env
docker exec -u git thread-net-git-gitea-1 gitea actions generate-runner-token
# Token in .env als RUNNER_TOKEN eintragen, dann:
docker compose up -d runner
# Registrierung prüfen (Admin-UI → Actions → Runners), danach .env leeren.

Job-Labels: linux-build (electronuserland/builder:22) und win-wine (electronuserland/builder:wine, Windows-Cross-Builds). Kapazität 1, Job-Container limitiert auf 2,2 GiB / 1,5 CPUs (runner/config.yaml) — der Host hat nur 2 Kerne / 3,7 GiB ohne Swap.

Job-Container erreichen rohana.axion1337.de über das Docker-Host-Gateway (extra_hosts + --add-host in den Container-Options) — das umgeht die Cloud-Firewall, ohne die Zertifikatsprüfung zu brechen.

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 CFGMON-09 im Repo sorb/Backlogs. 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 sorb/threadnet-operating, Checkout /opt/threadnet-operating. Prometheus scrapt cadvisor:8080 und traefik:8080 aus diesem Stack über das gemeinsame externe traefik-Netz.
  • Backlog: Repo sorb/Backlogs (hosts/cfgmon.md).
  • Gitea-Konfiguration (app.ini mit Secrets) liegt bewusst NICHT im Repo, sondern nur im Datenvolumen; Änderungen via GITEA__section__KEY-Env-Vars in der Compose.
S
Description
IaC: Traefik + Gitea + cAdvisor + act_runner Stack (CFGMON)
Readme
61 KiB
Languages
Shell 100%