Skip to content

Commit 635a186

Browse files
committed
docs: update docs
1 parent 068874c commit 635a186

File tree

19 files changed

+1402
-131
lines changed

19 files changed

+1402
-131
lines changed

README.md

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,61 @@
1-
# Runner Fleet - GitHub Actions Runner 管理服务
1+
# Runner Fleet - GitHub Actions Runner Manager
22

3-
基于 Golang Echo 的 HTTP 管理界面,在一台机器上查看和管理多个 GitHub Actions 自托管 Runner。使用 YAML 配置,无需数据库。
3+
HTTP management UI built with Golang Echo to view and manage multiple self-hosted GitHub Actions Runners on one machine. YAML-based config, no database required.
44

5-
MIT 许可证,见 [LICENSE](LICENSE)。CI/镜像/Release 见 [.github/workflows](.github/workflows)
5+
## Highlights
66

7-
## 亮点
7+
- **Zero database**: YAML-only config, no external deps; config is your backup and easy to version.
8+
- **Web one-stop**: Add, register, start/stop, edit, and view status in the UI—no SSH or manual `config.sh`.
9+
- **Auto install & register**: In "Quick Add" enter a token to auto-download the runner, register, and start; paste `./config.sh --url ... --token ...` from GitHub to parse and fill the form.
10+
- **Container-first**: Docker / docker-compose out of the box; DinD and host-socket for in-job Docker; optional **container mode** (one runner per container) with Manager controlling lifecycle and status.
11+
- **Self-heal & troubleshoot**: ~15s after start, registered but stopped runners are started; periodic check every 5 minutes; in container mode, `status=unknown` shows a structured probe (error type, check/fix commands) for copy-paste troubleshooting or start/stop self-heal.
12+
- **Observable**: Registration result is written and shown in the UI; optional PAT (`.github_check_token`) to periodically verify runners appear in GitHub's list, synced to the UI.
813

9-
- **零数据库**:仅用 YAML 配置,无外部依赖,配置即备份、易版本管理。
10-
- **Web 一站式**:添加、注册、启停、编辑、查看状态均在界面完成,无需 SSH 或手动执行 GitHub Runner `config.sh`
11-
- **自动安装与注册**:在「快速添加」中填写 Token 即可自动下载 runner、执行注册并启动;支持从 GitHub 页面复制 `./config.sh --url ... --token ...` 一键解析并填充表单。
12-
- **容器化优先**:Docker / docker-compose 开箱即用,支持 DinD 与 host-socket 两种 Job 内 Docker 方式;可选**容器模式**(一 Runner 一容器),由 Manager 统一启停与状态采集。
13-
- **自愈与排障**:服务启动约 15 秒后自动拉起已注册未运行 Runner,并每 5 分钟定时检查;容器模式下 `status=unknown` 时提供结构化 probe(错误类型、检查/修复命令),便于复制命令排障或尝试启停自愈。
14-
- **可观测**:注册结果写入并在界面展示;可选配置 PAT(`.github_check_token`),定时检查 Runner 是否已在 GitHub 列表显示,结果与界面同步。
14+
## Features
1515

16-
## 功能
16+
- **View**: List all runners, status (installed/unregistered/missing dir), running or not; view full config per runner.
17+
- **Edit**: Change subpath, target type, target, labels (name is read-only).
18+
- **Quick Add**: Name + target (org/repo) + optional token; one-click add and optional auto-register.
19+
- **Delete**: Remove from config (does not delete disk).
20+
- **Start/Stop**: Start or stop registered runners.
21+
- **Container mode** (optional): One runner per container; Manager starts/stops via Docker; runner image tag uses `-runner` suffix.
1722

18-
- **查看**:列表展示所有 Runner,状态(已安装/未注册/目录缺失)、是否运行中;支持查看单个 Runner 完整配置
19-
- **编辑**:修改子路径、目标类型、目标、标签(名称不可改)
20-
- **快速添加**:名称 + 目标(组织/仓库)+ 可选 Token,一键添加并可自动注册
21-
- **删除**:从配置中移除(不删磁盘目录)
22-
- **启停**:对已注册 Runner 启动/停止
23-
- **容器模式**(可选):每个 Runner 独立容器,Manager 通过 C/S 启停;Runner 镜像 tag 带 `-runner` 后缀
24-
25-
## 快速开始
23+
## Quick start
2624

2725
```bash
2826
cp config.yaml.example config.yaml
29-
# 编辑 config.yamlrunners.base_path 改为 /app/runners
30-
# 宿主机:mkdir -p runners && chown 1001:1001 config.yaml runners
27+
# Edit config.yaml: set runners.base_path to /app/runners
28+
# On host: mkdir -p runners && chown 1001:1001 config.yaml runners
3129

3230
docker network create runner-net 2>/dev/null || true
3331
docker compose up -d
3432
```
3533

36-
浏览器打开 http://localhost:8080。更多方式(docker run、DinD、容器模式)见 [使用指南](docs/guide.md)。健康检查:`GET /health`;版本:`GET /version`
34+
Open http://localhost:8080. For more options (docker run, DinD, container mode) see the [User Guide](docs/guide.md). Health: `GET /health`; version: `GET /version`.
35+
36+
## Use cases
37+
38+
- **Personal / team**: One machine as self-hosted runners for multiple repos or orgs; manage via Web UI, no need to remember CLI.
39+
- **Internal CI**: Deploy on internal network; use DinD (isolated) or host-socket (shared with host) when jobs need Docker; runners recover after Manager or DinD restart.
40+
- **Isolation & traceability**: Container mode gives one container per runner with clear boundaries; combine with registration result and GitHub visibility check to verify runners.
41+
42+
## Documentation
43+
44+
- **[User Guide](docs/guide.md)** — Deployment (Docker/docker-compose), config, adding runners, security & troubleshooting
45+
- **[Development & Build](docs/development.md)** — Go build, local debug, HTTP API, Makefile
46+
47+
Documentation in other languages (each contains User Guide and Development & Build):
3748

38-
## 适用场景
49+
| Language | Docs |
50+
|------------|------|
51+
| 中文 | [docs/zh/](docs/zh/) |
52+
| Français | [docs/fr/](docs/fr/) |
53+
| Deutsch | [docs/de/](docs/de/) |
54+
| 한국어 | [docs/ko/](docs/ko/) |
55+
| 日本語 | [docs/ja/](docs/ja/) |
3956

40-
- **个人 / 团队**:一台机器快速配置为多个 repo 或 org 提供自托管 Runner,用 Web 界面统一管理,无需记命令。
41-
- **内网 CI**:在内网部署,Job 需要 Docker 时选用 DinD(隔离)或 host-socket(与宿主机共享);Manager 或 DinD 重启后 Runner 自动恢复。
42-
- **需要隔离与可追溯**:容器模式下每 Runner 独立容器,资源与权限边界清晰;结合注册结果与 GitHub 显示检查,便于核对 Runner 是否生效。
57+
## Other
4358

44-
## 文档
59+
CI / images / releases: [.github/workflows](.github/workflows).
4560

46-
- **[使用指南](docs/guide.md)**:部署(Docker/docker-compose)、配置、添加 Runner、安全与排障
47-
- **[开发与构建](docs/development.md)**:Go 构建、本地调试、HTTP API、Makefile
61+
MIT License — see [LICENSE](LICENSE).

docs/README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
# 文档
1+
# Documentation
22

3-
- **[使用指南](guide.md)**:部署、配置、添加 Runner、安全与排障
4-
- **[开发与构建](development.md)**:构建、APIMakefile
3+
- **[User Guide](guide.md)** — Deployment, configuration, adding runners, security & troubleshooting
4+
- **[Development & Build](development.md)** — Build, API, Makefile
55

6-
[← 返回项目首页](../README.md)
6+
**Language:** English (default) | [中文](zh/) | [Français](fr/) | [Deutsch](de/) | [한국어](ko/) | [日本語](ja/)
7+
8+
[← Back to project home](../README.md)

docs/de/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Dokumentation
2+
3+
- **[Benutzerhandbuch](guide.md)** — Bereitstellung, Konfiguration, Runner hinzufügen, Sicherheit und Fehlerbehebung
4+
- **[Entwicklung & Build](development.md)** — Build, API, Makefile
5+
6+
**Sprache:** [English (default)](../) | [中文](../zh/) | [Français](../fr/) | Deutsch | [한국어](../ko/) | [日本語](../ja/)
7+
8+
[← Zurück zur Projektstartseite](../../README.md)

docs/de/development.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Entwicklung & Build
2+
3+
Für Produktion Container-Bereitstellung verwenden; siehe [Benutzerhandbuch](guide.md). Dieses Dokument ist für Mitwirkende: lokaler Build und Debug.
4+
5+
## Anforderungen
6+
7+
- Go 1.26 (abgestimmt auf [go.mod](../../go.mod)).
8+
9+
## Build
10+
11+
```bash
12+
# runner-manager-Binary bauen
13+
go build -o runner-manager ./cmd/runner-manager
14+
15+
# Mit Version (für /version und Debug)
16+
go build -ldflags "-X main.Version=1.0.0" -o runner-manager ./cmd/runner-manager
17+
18+
# Nur Runner Agent bauen (Containermodus)
19+
go build -o runner-agent ./cmd/runner-agent
20+
21+
# Oder Make: make build / make build-agent / make build-all
22+
```
23+
24+
Templates sind im Manager-Binary eingebettet (`cmd/runner-manager/templates/`); einzelnes Binary, kein separates `templates/` nötig.
25+
26+
## Lokal ausführen und debuggen
27+
28+
```bash
29+
cp config.yaml.example config.yaml
30+
go run ./cmd/runner-manager
31+
# Oder make run (build dann run); eigene Config: ./runner-manager -config /path/to/config.yaml
32+
```
33+
34+
Lauscht auf `:8080`, http://localhost:8080. Basic Auth zum Debuggen: `BASIC_AUTH_PASSWORD=secret go run ./cmd/runner-manager`; siehe [Benutzerhandbuch – Sicherheit](guide.md#4-sicherheit-und-validierung).
35+
36+
## CLI-Flags
37+
38+
- `-config <path>`: Pfad zur Konfigurationsdatei.
39+
- `-version`: Version ausgeben und beenden (beim Build mit `-ldflags "-X main.Version=..."` injizieren).
40+
41+
## HTTP-API
42+
43+
Mit Basic Auth müssen alle Anfragen außer `/health` den Header `Authorization: Basic <base64(user:password)>` enthalten.
44+
45+
| Pfad | Methode | Beschreibung |
46+
|------|---------|--------------|
47+
| `/health` | GET | Gibt `{"status":"ok"}` zurück; für Ingress/K8s-Probes; immer unauthentifiziert. |
48+
| `/version` | GET | Gibt `{"version":"..."}` zurück. |
49+
| `/api/runners` | GET | Runner-Liste. Im Containermodus bei Probe-Fehler `status=unknown` mit strukturiertem `probe` (`error/type/suggestion/check_command/fix_command`). |
50+
| `/api/runners/:name` | GET | Einzelner Runner. Gleiches `probe` bei Probe-Fehler im Containermodus. |
51+
| `/api/runners/:name/start` | POST | Runner starten. Bei Probe-Fehler startet trotzdem, gibt strukturiertes `probe` in der Antwort zurück. |
52+
| `/api/runners/:name/stop` | POST | Runner stoppen. Bei Probe-Fehler stoppt trotzdem, gibt strukturiertes `probe` in der Antwort zurück. |
53+
54+
### Breaking Change (Upgrade-Hinweis)
55+
56+
Alte flache Felder `probe_*` sind entfernt; Objekt `probe` verwenden: `probe.error`, `probe.type`, `probe.suggestion`, `probe.check_command`, `probe.fix_command`. Werte von `probe.type`: `docker-access`, `agent-http`, `agent-connect`, `unknown`. Die Web-UI kann bei `status=unknown` weiter „Start/Stop“ zur Selbstheilung nutzen.
57+
58+
Beispiel (Probe-Fehler):
59+
60+
```json
61+
{
62+
"name": "runner-a",
63+
"status": "unknown",
64+
"probe": {
65+
"error": "agent returned 502: bad gateway",
66+
"type": "agent-http",
67+
"suggestion": "Check runner container logs and Agent + /runner process state",
68+
"check_command": "docker ps -a | rg \"github-runner-\" && docker logs --tail=200 <runner_container_name>",
69+
"fix_command": "docker restart <runner_container_name>"
70+
}
71+
}
72+
```
73+
74+
## Makefile-Ziele
75+
76+
- `make help`: Alle Ziele anzeigen.
77+
- `make build`: Manager bauen (mit Version-ldflags).
78+
- `make build-agent`: Runner Agent bauen (Containermodus).
79+
- `make build-all`: Manager und Agent bauen.
80+
- `make test`: Tests ausführen.
81+
- `make run`: Manager bauen und ausführen.
82+
- `make docker-build` / `make docker-run` / `make docker-stop`: Manager-Image bauen und ausführen; siehe [Benutzerhandbuch](guide.md).
83+
- `make docker-build-runner`: Runner-Image für Containermodus bauen (`Dockerfile.runner`, Standard-Tag in `RUNNER_IMAGE`).
84+
- `make clean`: Gebaute Binaries entfernen (runner-manager, runner-agent).
85+
86+
Containermodus nutzt Agent aus `cmd/runner-agent` und Runner-Image aus `Dockerfile.runner`.
87+
88+
[← Zurück zur Dokumentation](README.md)

docs/de/guide.md

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
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

Comments
 (0)