gitea/act_runner:0.6.1, Labels linux-build (electronuserland/builder:22) und win-wine (Wine-Cross-Builds fuer Windows). Kapazitaet 1 und Job-Limits 2200m/1.5cpu wegen knapper Host-Ressourcen (2 Kerne, 3.7 GiB, kein Swap). Gitea-Zugriff der Jobs via Host-Gateway-Hairpin, Actions- Cache auf 172.17.0.1:8088. Registrierungs-Token kommt aus .env (gitignored), Vorlage .env.example. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
128 lines
4.6 KiB
YAML
128 lines
4.6 KiB
YAML
# Stack "thread-net-git" (CFGMON): Traefik + Gitea + cAdvisor + Actions-Runner.
|
|
# Abgeloest aus Portainer (Stack-ID 8) am 2026-07-30.
|
|
#
|
|
# WICHTIG: Der Compose-Projektname MUSS "thread-net-git" bleiben (siehe
|
|
# "name:" unten), sonst findet Compose das bestehende Gitea-Datenvolumen
|
|
# nicht und die Traefik/Portainer-Historie bricht. Deploy immer aus diesem
|
|
# Verzeichnis: docker compose up -d
|
|
name: thread-net-git
|
|
|
|
services:
|
|
reverse-proxy: #lol
|
|
image: traefik:v3.7.9
|
|
container_name: traefik
|
|
restart: always
|
|
command:
|
|
- "--api.dashboard=true"
|
|
- "--api.insecure=false"
|
|
- "--log.level=INFO"
|
|
- "--providers.docker=true"
|
|
- "--providers.docker.exposedbydefault=false"
|
|
- "--entrypoints.web.address=:80"
|
|
- "--entrypoints.websecure.address=:443"
|
|
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
|
|
- "--certificatesresolvers.letsencrypt.acme.email=gamemaster@axion1337.de"
|
|
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
|
|
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
|
|
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
|
|
- "--metrics.prometheus=true"
|
|
- "--metrics.prometheus.addEntryPointsLabels=true"
|
|
- "--metrics.prometheus.addServicesLabels=true"
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
volumes:
|
|
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
|
# Named Volume statt frueherem Portainer-Bind ./letsencrypt: enthaelt
|
|
# acme.json (LE-Account + Zertifikate rohana/selendis). Verlust erzwingt
|
|
# eine Neuausstellung, die an der Firewall scheitert (80/443 nur fuer
|
|
# die User-IP offen) -- Volume niemals loeschen. Befuellung beim
|
|
# Erst-Deploy: siehe README.
|
|
- letsencrypt:/letsencrypt
|
|
networks:
|
|
- traefik
|
|
|
|
gitea:
|
|
# Gepinnt statt :latest (Ist-Stand der Migration). NIEMALS auf eine
|
|
# aeltere Version wechseln -- die SQLite-DB kennt kein Downgrade.
|
|
image: gitea/gitea:1.27.0
|
|
restart: always
|
|
environment:
|
|
- USER_UID=1000
|
|
- USER_GID=1000
|
|
- GITEA__server__ROOT_URL=https://rohana.axion1337.de
|
|
- GITEA__service__DISABLE_REGISTRATION=true
|
|
volumes:
|
|
- gitea-data:/data
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.gitea.rule=Host(`rohana.axion1337.de`)
|
|
- traefik.http.routers.gitea.entrypoints=websecure
|
|
- traefik.http.routers.gitea.tls.certresolver=letsencrypt
|
|
- traefik.http.services.gitea.loadbalancer.server.port=3000
|
|
networks:
|
|
- traefik
|
|
|
|
cadvisor:
|
|
# Stand vorher NICHT in der Portainer-Compose (war manuell in den Stack
|
|
# gehaengt). Prometheus (monitoring-Stack) scrapt "cadvisor:8080" ueber
|
|
# das gemeinsame traefik-Netz -- container_name daher fest.
|
|
image: gcr.io/cadvisor/cadvisor:v0.49.1
|
|
container_name: cadvisor
|
|
restart: always
|
|
volumes:
|
|
- /:/rootfs:ro
|
|
- /var/run:/var/run:ro
|
|
- /sys:/sys:ro
|
|
- /var/lib/docker/:/var/lib/docker:ro
|
|
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
|
|
GITEA_RUNNER_LABELS: >-
|
|
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).
|
|
# external, damit Compose das Volume weder anlegen noch loeschen kann:
|
|
# ein Deploy mit falschem Projektnamen schlaegt laut fehl, statt leise
|
|
# ein leeres Volume zu erzeugen.
|
|
gitea-data:
|
|
external: true
|
|
name: thread-net-git_gitea-data
|
|
letsencrypt:
|