Compare commits

5 Commits
Author SHA1 Message Date
Thore CimbalandClaude Opus 4.8 fc30ce83a4 docs: add group-rules pointer (CLAUDE.md) and repo-specific AGENTS.md
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>
2026-08-15 12:00:00 +00:00
sorbandClaude Opus 4.8 8d089e238a feat(traefik): switch ACME to DNS-01 via IONOS (CFGMON-01)
TLS-ALPN-01 needs 80/443 open to the whole internet for renewal, which fails
silently behind the user-IP firewall. Switch the letsencrypt resolver to
DNS-01 with the IONOS provider (token from host .env, git-ignored) and public
resolvers for the propagation check. acme.json is preserved; existing certs
renew via DNS-01 before 2026-10-28.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-14 12:00:00 +00:00
Thore CimbalandClaude Fable 5 2f4a15ce85 README: Verweise auf das umbenannte Backlog-Repo korrigiert
Drei Stellen zeigten noch auf 'sorb/Backlogs' auf Gitea. Das Repo heisst seit
dem Framework-Umbau 'management' und ist kanonisch auf git.lab (ADR-0001/0002);
der alte Pfad loest nur noch per 301 auf. Ausserdem verwies der Backlog-Eintrag
auf eine Datei, obwohl offene Punkte seit ADR-0005 Issues sind.

- CFGMON-09 -> management#10 (verlinkt, statt nur zitiert)
- 'Backlog: Repo sorb/Backlogs' -> Issues auf git.lab + hosts/cfgmon.md
- 'Backlogs CFGMON-11' -> als erledigt datiert; dafuer gibt es kein Issue,
  die Arbeit war beim Umzug schon abgeschlossen
- Nebenbei 'sorb/threadnet-operating' -> 'axion1337.chat/threadnet-operating'
  (Gitea-Pfad, kanonisch ist die Lab-Gruppe)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PKhFj1S3UdD6xL2fbWPeYj
2026-08-02 14:46:42 +02:00
ClaudeandThore Cimbal 15c8f2d3a0 compose: verwaistes networks-Fragment des Runner-Rueckbaus entfernt
d904734 hat beim Entfernen des Runner-Services dessen networks-Liste
als Top-Level-Fragment stehen lassen (doppelter networks-Key, YAML
invalide). Fragment und das nur vom Runner genutzte default-Netz raus.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 23:13:41 +02:00
Thore CimbalandClaude Fable 5 d904734d2d stack: Actions-Runner zurueckgebaut (CFGMON-11) - CI laeuft im Lab-GitLab
builder-1 hat keine Konsumenten mehr (Workflows nach GitLab portiert bzw.
entfernt, Actions-Toggles deaktiviert). Deploy dieses Stands + Runner-
Deregistrierung in der Gitea-UI + Loeschen von runner-data/ sind manuelle
Host-Schritte, dokumentiert in Backlogs CFGMON-11.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 18:00:43 +02:00
6 changed files with 59 additions and 91 deletions
-5
View File
@@ -1,5 +0,0 @@
# Vorlage: nach .env kopieren und Wert setzen.
# Nur fuer die Runner-Erstregistrierung noetig, danach wieder leeren.
# Token erzeugen:
# docker exec -u git thread-net-git-gitea-1 gitea actions generate-runner-token
RUNNER_TOKEN='changeme'
+33
View File
@@ -0,0 +1,33 @@
# AGENTS.md — thread-net-git
> **Die Gruppenregeln sind kanonisch im `management`-Repo:**
> [`AGENTS.md`](https://git.lab/axion1337.chat/management/-/blob/main/AGENTS.md)
> — von außerhalb des Labs über den Gitea-Mirror lesbar:
> `https://rohana.axion1337.de/sorb/management`. Dort stehen Repo-Topologie und
> Mirror-Regeln, das Kanban-Framework (Status-Labels, WIP-Limit 2, ADR-Pflicht),
> Deploy-Übergabe und AAR-Verfahren, Secrets-Handhabung und die
> Karpathy-Leitlinien. Sie gelten für **jede** Session in diesem Repo.
> Hier steht nur, was zusätzlich für dieses Repository gilt.
## Was dieses Repo ist
Compose-Stack auf **CFGMON** (Operating-Host): **Traefik** (TLS für alles Öffentliche),
**Gitea** (`rohana.axion1337.de`) und **cAdvisor**.
⚠️ Dieser Stack wird **nicht** von Flux verwaltet — Deploy ist manuell auf dem Host
(`cd /opt/thread-net-git && docker compose up -d`).
## Unumstößliche Regeln (Details in `README.md`)
1. **Projektname `thread-net-git` nie ändern** — das Gitea-Volume ist `external` und hängt am
Namen; bei falschem Namen bricht der Deploy laut ab statt still ein leeres Volume anzulegen.
2. **Volumes `thread-net-git_gitea-data` und `thread-net-git_letsencrypt` nie löschen**
Produktivdaten bzw. `acme.json`.
3. **Gitea nie auf eine ältere Version pinnen** — die SQLite-DB kennt kein Downgrade.
4. **Diesen Stack nie über Portainer anfassen** — Portainer identifiziert über den
Projektnamen; ein „Stack löschen" dort entfernt die laufenden Container.
## Was hier besonders zählt
Gitea ist die **Flux-Quelle** des Matrix-Clusters und die Container-Registry. Ein Fehler hier
wirkt bis in die Produktion, obwohl das Repo klein aussieht.
+1
View File
@@ -0,0 +1 @@
Read AGENTS.md — the canonical instruction file for this repository. All rules live there.
+15 -25
View File
@@ -1,4 +1,4 @@
# thread-net-git — Traefik + Gitea + cAdvisor + Actions-Runner (CFGMON)
# 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
@@ -9,7 +9,6 @@ Infrastruktur-Repo für den Kern-Stack auf dem Operating-Host (CFGMON,
| 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
@@ -44,26 +43,13 @@ docker run --rm -v thread-net-git_letsencrypt:/dst -v /opt/backup:/src alpine \
docker compose up -d
```
## Runner
## Runner (entfernt 2026-08-01)
Erstregistrierung (einmalig, Identität landet danach in `runner-data/.runner`):
```bash
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.
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
@@ -71,8 +57,9 @@ 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
der letzte Dump vom 2026-07-30 liegen — siehe
[management#10](https://git.lab/axion1337.chat/management/-/issues/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
@@ -90,10 +77,13 @@ nicht vor Plattenverlust:
## Bezüge
- Monitoring-Stack (Grafana/Prometheus/Loki): Repo `sorb/threadnet-operating`,
- Monitoring-Stack (Grafana/Prometheus/Loki): Repo `axion1337.chat/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`).
- Offene Punkte: **Issues** im
[management-Projekt](https://git.lab/axion1337.chat/management/-/issues) auf
git.lab (ADR-0005); Bestand und Historie zum Host in
[`hosts/cfgmon.md`](https://git.lab/axion1337.chat/management/-/blob/main/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.
+10 -38
View File
@@ -1,4 +1,4 @@
# Stack "thread-net-git" (CFGMON): Traefik + Gitea + cAdvisor + Actions-Runner.
# Stack "thread-net-git" (CFGMON): Traefik + Gitea + cAdvisor.
# Abgeloest aus Portainer (Stack-ID 8) am 2026-07-30.
#
# WICHTIG: Der Compose-Projektname MUSS "thread-net-git" bleiben (siehe
@@ -20,7 +20,11 @@ services:
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
# DNS-01 statt TLS-ALPN-01 (CFGMON-01): keine oeffentlich offenen 80/443
# fuer die Validierung noetig; ermoeglicht Wildcards. Token via .env (Host).
- "--certificatesresolvers.letsencrypt.acme.dnschallenge=true"
- "--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=ionos"
- "--certificatesresolvers.letsencrypt.acme.dnschallenge.resolvers=1.1.1.1:53,8.8.8.8:53"
- "--certificatesresolvers.letsencrypt.acme.email=gamemaster@axion1337.de"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
@@ -31,6 +35,10 @@ services:
ports:
- "80:80"
- "443:443"
environment:
# IONOS Developer DNS-API-Key im Format <prefix>.<secret> — liegt in
# /opt/thread-net-git/.env (git-ignoriert), NICHT im Repo.
- "IONOS_API_KEY=${IONOS_API_KEY:?IONOS_API_KEY fehlt in .env}"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
# Named Volume statt frueherem Portainer-Bind ./letsencrypt: enthaelt
@@ -78,45 +86,9 @@ services:
networks:
- traefik
runner:
# Offizielles Image heisst gitea/act_runner (nicht gitea/runner).
image: gitea/act_runner:0.6.1
container_name: gitea-runner
restart: always
depends_on:
- gitea
environment:
GITEA_INSTANCE_URL: https://rohana.axion1337.de
# Nur fuer die Erstregistrierung noetig (aus .env); danach liegt die
# Runner-Identitaet in ./runner-data/.runner und .env kann geleert werden.
GITEA_RUNNER_REGISTRATION_TOKEN: ${RUNNER_TOKEN:-}
GITEA_RUNNER_NAME: builder-1
# ubuntu-latest: Standard-Label der chat-gitops-Workflows (leichtes Image);
# linux-build/win-wine: Electron-Builds (Linux nativ / Windows via Wine).
# Eine Zeile ohne Leerzeichen: der Entrypoint uebergibt den Wert
# unquoted, Spaces wuerden als zusaetzliche Argumente zerfallen.
GITEA_RUNNER_LABELS: "ubuntu-latest:docker://node:20-bookworm,linux-build:docker://electronuserland/builder:22,win-wine:docker://electronuserland/builder:wine"
CONFIG_FILE: /config.yaml
TZ: Europe/Berlin
extra_hosts:
# Hairpin ueber das Docker-Host-Gateway: umgeht die Cloud-Firewall,
# das Traefik-Zertifikat bleibt dabei gueltig.
- "rohana.axion1337.de:host-gateway"
ports:
# Actions-Cache: nur auf dem Docker-Gateway gebunden, damit ihn
# Job-Container erreichen, aber nichts von aussen.
- "172.17.0.1:8088:8088"
volumes:
- ./runner/config.yaml:/config.yaml:ro
- ./runner-data:/data
- /var/run/docker.sock:/var/run/docker.sock
networks:
- default
networks:
traefik:
external: true
default:
volumes:
# Produktivdaten (Repos, SQLite-DB, LFS, Packages, SSH-Hostkeys).
-23
View File
@@ -1,23 +0,0 @@
log:
level: info
runner:
# 2 parallele Electron-Builds auf 2 Kernen / 3.7 GiB ohne Swap enden im
# OOM -- bei Host-Upgrade hochsetzen.
capacity: 1
timeout: 3h
cache:
enabled: true
host: "172.17.0.1"
port: 8088
container:
network: bridge
privileged: false
# --add-host: Job-Container erreichen Gitea ueber das Host-Gateway
# (Firewall-Hairpin, siehe docker-compose.yml).
# --memory/--cpus: Limits fuer die Job-Container -- sie laufen als
# Siblings ueber docker.sock, Limits am Runner-Container selbst
# greifen fuer sie nicht.
options: "--add-host=rohana.axion1337.de:host-gateway --memory=2200m --memory-swap=2200m --cpus=1.5"