Compare commits
5
Commits
rework/stack
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc30ce83a4 | ||
|
|
8d089e238a | ||
|
|
2f4a15ce85 | ||
|
|
15c8f2d3a0 | ||
|
|
d904734d2d |
@@ -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'
|
|
||||||
@@ -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.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Read AGENTS.md — the canonical instruction file for this repository. All rules live there.
|
||||||
@@ -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,
|
Infrastruktur-Repo für den Kern-Stack auf dem Operating-Host (CFGMON,
|
||||||
`rohana.axion1337.de`). Abgelöst aus dem unversionierten Portainer-Stack
|
`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) |
|
| 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` |
|
| gitea | gitea/gitea:1.27.0 | Git-Hosting, `rohana.axion1337.de` |
|
||||||
| cadvisor | cadvisor:v0.49.1 | Container-Metriken für Prometheus (monitoring-Stack) |
|
| 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
|
## 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
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
## Runner
|
## Runner (entfernt 2026-08-01)
|
||||||
|
|
||||||
Erstregistrierung (einmalig, Identität landet danach in `runner-data/.runner`):
|
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
|
||||||
```bash
|
Gitea-Actions-Toggles der Repos sind deaktiviert. Beim nächsten Deploy dieses Stacks
|
||||||
cp .env.example .env
|
verschwindet der Runner-Container; zusätzlich einmalig auf dem Host: `builder-1` in der
|
||||||
docker exec -u git thread-net-git-gitea-1 gitea actions generate-runner-token
|
Gitea-Admin-UI deregistrieren und `runner-data/` löschen.
|
||||||
# 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
|
## 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`).
|
(`backup/gitea-backup.sh`, Log: `/opt/backup/backup.log`).
|
||||||
**Derzeit pausiert** (Cron auskommentiert, seit 2026-07-30): die Backups
|
**Derzeit pausiert** (Cron auskommentiert, seit 2026-07-30): die Backups
|
||||||
sollen off-host in ein Borg-Repo auf einer Storage Box, bis dahin bleibt
|
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
|
der letzte Dump vom 2026-07-30 liegen — siehe
|
||||||
`sorb/Backlogs`. Das Skript
|
[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
|
stoppt kurz den Runner (SQLite-Journal-Race bei `gitea dump`), streamt
|
||||||
den Dump ohne Zwischenkopie (`gitea dump --type tar -f - | gzip`) und
|
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
|
behält **nur den neuesten Stand** auf dem Host — die 38-G-Platte trägt
|
||||||
@@ -90,10 +77,13 @@ nicht vor Plattenverlust:
|
|||||||
|
|
||||||
## Bezüge
|
## 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
|
Checkout `/opt/threadnet-operating`. Prometheus scrapt `cadvisor:8080` und
|
||||||
`traefik:8080` aus diesem Stack über das gemeinsame externe `traefik`-Netz.
|
`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,
|
- Gitea-Konfiguration (`app.ini` mit Secrets) liegt bewusst NICHT im Repo,
|
||||||
sondern nur im Datenvolumen; Änderungen via `GITEA__section__KEY`-Env-Vars
|
sondern nur im Datenvolumen; Änderungen via `GITEA__section__KEY`-Env-Vars
|
||||||
in der Compose.
|
in der Compose.
|
||||||
|
|||||||
+10
-38
@@ -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.
|
# Abgeloest aus Portainer (Stack-ID 8) am 2026-07-30.
|
||||||
#
|
#
|
||||||
# WICHTIG: Der Compose-Projektname MUSS "thread-net-git" bleiben (siehe
|
# WICHTIG: Der Compose-Projektname MUSS "thread-net-git" bleiben (siehe
|
||||||
@@ -20,7 +20,11 @@ services:
|
|||||||
- "--providers.docker.exposedbydefault=false"
|
- "--providers.docker.exposedbydefault=false"
|
||||||
- "--entrypoints.web.address=:80"
|
- "--entrypoints.web.address=:80"
|
||||||
- "--entrypoints.websecure.address=:443"
|
- "--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.email=gamemaster@axion1337.de"
|
||||||
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
|
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
|
||||||
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
|
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
|
||||||
@@ -31,6 +35,10 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "80:80"
|
||||||
- "443:443"
|
- "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:
|
volumes:
|
||||||
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
||||||
# Named Volume statt frueherem Portainer-Bind ./letsencrypt: enthaelt
|
# Named Volume statt frueherem Portainer-Bind ./letsencrypt: enthaelt
|
||||||
@@ -78,45 +86,9 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- traefik
|
- 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:
|
networks:
|
||||||
traefik:
|
traefik:
|
||||||
external: true
|
external: true
|
||||||
default:
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
# Produktivdaten (Repos, SQLite-DB, LFS, Packages, SSH-Hostkeys).
|
# Produktivdaten (Repos, SQLite-DB, LFS, Packages, SSH-Hostkeys).
|
||||||
|
|||||||
@@ -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"
|
|
||||||
Reference in New Issue
Block a user