|
| 1 | +# Benutzerhandbuch |
| 2 | + |
| 3 | +Bereitstellung, Konfiguration, Hinzufügen von Runnern und Sicherheit werden hier behandelt. Für Build und API für Mitwirkende siehe [Entwicklung & Build](development.md). |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +## 1. Bereitstellung (Docker) |
| 8 | + |
| 9 | +- Das Image basiert auf **Ubuntu** mit .NET Core 6.0-Abhängigkeiten; läuft unter **UID 1001** – gemountete Host-Verzeichnisse müssen für diesen Benutzer schreibbar sein (z. B. `chown 1001:1001 config.yaml runners`). |
| 10 | +- Etwa 15 Sekunden nach dem Start werden registrierte, aber gestoppte Runner automatisch gestartet; periodische Prüfung alle 5 Minuten. |
| 11 | + |
| 12 | +### Veröffentlichtes Image verwenden (empfohlen) |
| 13 | + |
| 14 | +```bash |
| 15 | +docker pull ghcr.io/soulteary/runner-fleet:main |
| 16 | +``` |
| 17 | + |
| 18 | +### docker-compose Schnellstart |
| 19 | + |
| 20 | +Im Repo-Root liegt `docker-compose.yml`. DinD nur aktivieren, wenn Sie den Containermodus nutzen und Jobs Docker mit `job_docker_backend: dind` benötigen. |
| 21 | + |
| 22 | +```bash |
| 23 | +cp config.yaml.example config.yaml |
| 24 | +# config.yaml bearbeiten: runners.base_path auf /app/runners setzen |
| 25 | + |
| 26 | +chown 1001:1001 config.yaml |
| 27 | +mkdir -p runners && chown 1001:1001 runners |
| 28 | + |
| 29 | +docker network create runner-net 2>/dev/null || true |
| 30 | +docker compose up -d |
| 31 | +# Bei job_docker_backend: dind: docker compose --profile dind up -d |
| 32 | +``` |
| 33 | + |
| 34 | +UI: http://localhost:8080. Auth-Details in [4. Sicherheit und Validierung](#4-sicherheit-und-validierung). |
| 35 | + |
| 36 | +### Container starten (volle Parameter) |
| 37 | + |
| 38 | +`config.yaml` und `runners` müssen gemountet werden; der Port muss mit `server.port` in der Config übereinstimmen (Standard 8080). |
| 39 | + |
| 40 | +```bash |
| 41 | +docker run -d --name runner-manager \ |
| 42 | + -p 8080:8080 \ |
| 43 | + -v $(pwd)/config.yaml:/app/config.yaml \ |
| 44 | + -v $(pwd)/runners:/app/runners \ |
| 45 | + ghcr.io/soulteary/runner-fleet:main |
| 46 | +``` |
| 47 | + |
| 48 | +Host-Verzeichnisse müssen für UID 1001 schreibbar sein. Basic Auth: `-e BASIC_AUTH_PASSWORD=password`, `-e BASIC_AUTH_USER=admin`. Für Docker in Jobs `-v /var/run/docker.sock:/var/run/docker.sock` hinzufügen oder DinD nutzen (siehe Repo `docker-compose.yml`, `--profile dind`). Das Image enthält die Docker-CLI; gängige Actions funktionieren mit DinD. |
| 49 | + |
| 50 | +### Automatische Installation und Registrierung |
| 51 | + |
| 52 | +In der UI „Quick Add Runner“ Name, Ziel, Token eingeben und absenden; zuerst läuft das Installationsskript, dann Registrierung und Start. Bei Fehlern: |
| 53 | + |
| 54 | +```bash |
| 55 | +docker exec runner-manager /app/scripts/install-runner.sh <name> [version] |
| 56 | +``` |
| 57 | + |
| 58 | +Oder auf dem Host [actions-runner](https://github.com/actions/runner/releases) unter `runners/<name>/` entpacken, dann in der UI absenden oder `./config.sh` manuell ausführen. |
| 59 | + |
| 60 | +### Containermodus (ein Runner pro Container) |
| 61 | + |
| 62 | +Jeder Runner läuft in seinem eigenen Container; der Manager startet/stoppt über Host-Docker und holt den Status per HTTP vom Agent im Container. |
| 63 | + |
| 64 | +In **config.yaml** aktivieren (siehe `config.yaml.example`): |
| 65 | + |
| 66 | +```yaml |
| 67 | +runners: |
| 68 | + base_path: /app/runners |
| 69 | + container_mode: true |
| 70 | + container_image: ghcr.io/soulteary/runner-fleet-runner:main |
| 71 | + container_network: runner-net |
| 72 | + agent_port: 8081 |
| 73 | + job_docker_backend: dind # dind | host-socket | none |
| 74 | + dind_host: runner-dind |
| 75 | + volume_host_path: /abs/path/on/host/to/runners |
| 76 | +``` |
| 77 | +
|
| 78 | +Runner-Image: gleicher Name wie Manager mit Tag `-runner`, oder lokal bauen: `docker build -f Dockerfile.runner -t ghcr.io/soulteary/runner-fleet-runner:main .`. Der Manager muss Host-Docker verwenden (Mount von `docker.sock`), nicht DinD über `DOCKER_HOST`; in Compose `group_add` für Host-Docker-GID oder `user: "0:0"` verwenden. Runner-Namen werden zu Containernamen normalisiert; Duplikate nach dem Mapping kollidieren. |
| 79 | + |
| 80 | +### Fehlerbehebung |
| 81 | + |
| 82 | +- **Runner startet nach compose down nicht**: Einmal `docker network create runner-net` ausführen. Bei anhaltendem Fehler in der UI „Start“ zum Neuerstellen nutzen oder `docker rm -f github-runner-<name>` dann „Start“. |
| 83 | +- **Lauf als root**: Gemountete Verzeichnisse müssen für den Prozessbenutzer schreibbar sein; für root `RUNNER_ALLOW_RUNASROOT=1` setzen. |
| 84 | +- **Altes Runner-Image**: `docker rm -f github-runner-<name>`, dann in der UI „Start“ zum Neuerstellen. |
| 85 | +- **status=unknown**: Probe im Detail-Popup prüfen; „Start/Stop“ zur Selbstheilung versuchen. |
| 86 | + |
| 87 | +### Images lokal bauen |
| 88 | + |
| 89 | +```bash |
| 90 | +docker build -t runner-manager . |
| 91 | +docker build -f Dockerfile.runner -t ghcr.io/soulteary/runner-fleet-runner:main . |
| 92 | +``` |
| 93 | + |
| 94 | +Make: `make docker-build`, `make docker-run`, `make docker-stop`. |
| 95 | + |
| 96 | +--- |
| 97 | + |
| 98 | +## 2. Konfiguration |
| 99 | + |
| 100 | +```bash |
| 101 | +cp config.yaml.example config.yaml |
| 102 | +``` |
| 103 | + |
| 104 | +| Feld | Beschreibung | Standard | |
| 105 | +|------|--------------|----------| |
| 106 | +| `server.port` | HTTP-Server-Port | `8080` | |
| 107 | +| `server.addr` | Bind-Adresse; leer = alle Interfaces | leer | |
| 108 | +| `runners.base_path` | Wurzelpfad der Runner-Installationsverzeichnisse; **in Container auf `/app/runners` setzen** | `./runners` | |
| 109 | +| `runners.items` | Vordefinierte Runner-Liste | Kann auch über die Web-UI hinzugefügt werden | |
| 110 | +| `runners.container_mode` | Containermodus aktivieren | `false` | |
| 111 | +| `runners.container_image` | Runner-Image im Containermodus (Tag -runner) | `ghcr.io/soulteary/runner-fleet-runner:main` | |
| 112 | +| `runners.container_network` | Netzwerk für Runner im Containermodus | `runner-net` | |
| 113 | +| `runners.agent_port` | Agent-Port im Container | `8081` | |
| 114 | +| `runners.job_docker_backend` | Docker in Jobs: `dind` / `host-socket` / `none` | `dind` | |
| 115 | +| `runners.dind_host` | DinD-Hostname bei `job_docker_backend=dind` | `runner-dind` | |
| 116 | +| `runners.volume_host_path` | Absoluter Host-Pfad zu runners im Containermodus (erforderlich) | leer | |
| 117 | + |
| 118 | +**Validierung**: Keine doppelten Namen; Containermodus prüft auf Container-Namenskonflikte. `job_docker_backend` erlaubt nur `dind`/`host-socket`/`none`; im Containermodus mit Container-`base_path` ist `volume_host_path` erforderlich. Fehlendes `job_docker_backend` bedeutet `dind`; nach Backend-Änderung Runner in der UI neu starten. |
| 119 | + |
| 120 | +Beispiel: |
| 121 | + |
| 122 | +```yaml |
| 123 | +server: |
| 124 | + port: 8080 |
| 125 | + addr: 0.0.0.0 |
| 126 | +runners: |
| 127 | + base_path: /app/runners |
| 128 | + items: [] |
| 129 | +``` |
| 130 | + |
| 131 | +--- |
| 132 | + |
| 133 | +## 3. Runner hinzufügen |
| 134 | + |
| 135 | +**Token besorgen**: Repo/Org → Settings → Actions → Runners → New self-hosted runner, Token kopieren (ca. 1 Stunde gültig). Jeder Runner braucht einen neuen Token. |
| 136 | + |
| 137 | +**Im Service hinzufügen**: In der UI „Quick Add Runner“ Name (eindeutig), Zieltyp (org/repo), Ziel, Token (optional; wenn gesetzt, kann Absenden automatisch registrieren und starten) eingeben. Sie können `./config.sh --url ... --token ...` von GitHub in „Parse from GitHub command“ einfügen und „Parse & fill“ klicken. Auto-Registrierung nur für GitHub.com; GitHub Enterprise erfordert manuelles `config.sh` im Runner-Verzeichnis. |
| 138 | + |
| 139 | +**Wenn Runner nicht installiert**: Von [GitHub Actions Runner](https://github.com/actions/runner/releases) herunterladen, unter `runners/<name>/` entpacken, dann Token in der UI eingeben oder `./config.sh` dort ausführen. Bei Container-Deploy löst das Absenden eines Tokens in der UI zuerst Installation, dann Registrierung aus; Containermodus erfordert zuerst Runner-Image und `volume_host_path` (siehe Containermodus oben). |
| 140 | + |
| 141 | +**Registrierungsergebnis**: Wird in `.registration_result.json` im Runner-Verzeichnis geschrieben. **GitHub-Sichtbarkeitsprüfung** (optional): `.github_check_token` (PAT; Org braucht `admin:org`, Repo braucht `repo`) ins Runner-Verzeichnis legen; wird ca. alle 5 Minuten geprüft, Ergebnis in `.github_status.json`. |
| 142 | + |
| 143 | +Mehrere Runner pro Maschine: getrennte Unterverzeichnisse verwenden. |
| 144 | + |
| 145 | +--- |
| 146 | + |
| 147 | +## 4. Sicherheit und Validierung |
| 148 | + |
| 149 | +**Auth**: Standardmäßig keine Anmeldung; nur im internen Netz oder auf localhost verwenden. Umgebungsvariable `BASIC_AUTH_PASSWORD` setzen für Basic Auth; `BASIC_AUTH_USER` optional (Standard `admin`). Alle Routen außer `GET /health` erfordern Auth; keine Secrets committen – `.env` verwenden. Im Container: `-e BASIC_AUTH_PASSWORD=...` oder compose `env_file`. |
| 150 | + |
| 151 | +**Pfade und Eindeutigkeit**: name/path dürfen nicht `..`, `/`, `\` enthalten; Verzeichnisse müssen unter `runners.base_path` liegen. Keine doppelten Namen; Name beim Bearbeiten schreibgeschützt. Im Containermodus werden Namen zu Containernamen normalisiert; Duplikate nach Mapping führen zu Fehler. |
| 152 | + |
| 153 | +**Sensible Dateien**: config.yaml und .env stehen in `.gitignore`. Für `.github_check_token` jedes Runners `chmod 600` verwenden; `**/.github_check_token` zu `.gitignore` hinzufügen, wenn unter Versionskontrolle. |
| 154 | + |
| 155 | +[← Zurück zur Projektstartseite](../../README.md) |
0 commit comments