# 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 # 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). # 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: