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,
|
||||
`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
@@ -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).
|
||||
|
||||
@@ -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