9.2 KiB
Self-Hosted GitHub Actions Runner für rebreak-monorepo
Datum: 2026-06-18
Status: Genehmigt — bereit für Implementierungsplanung
Autor: Kimi Code (Brainstorming-Session)
Ziel: GitHub-Actions-Buildkosten eliminieren, indem Backend- und Admin-Builds auf den bereits vorhandenen Hetzner-Server api.trucko.org (128.140.47.53) verlagert werden.
1. Zusammenfassung
Derzeit laufen Backend- und Admin-Builds auf kostenpflichtigen GitHub-gehosteten Runnern (ubuntu-latest). Bei einem privaten Repository führt das bei hoher Push-Frequenz zu Kosten von über 200 €/Monat.
Dieses Design schlägt vor, einen self-hosted GitHub Actions Runner auf dem bereits vorhandenen, aktuell ungenutzten Hetzner-Server api.trucko.org (128.140.47.53, 8 GB RAM) zu betreiben. Der Code-Hosting-Aspekt bleibt vollständig auf GitHub; nur die Build- und Deploy-Ausführung wird auf die eigene Infrastruktur verlagert.
Das Runner-Label raynis-builder ist bewusst generisch gewählt, damit später weitere Raynis-Apps (Mutterfirma von ReBreak) denselben Runner nutzen können.
2. Kontext & Ausgangslage
Aktueller Flow
local dev → push to main
↓
GitHub Actions (ubuntu-latest)
↓
Build Backend / Admin
↓
Upload Artifact
↓
Deploy-Job (ubuntu-latest)
↓
SCP + SSH zu staging.rebreak.org
↓
deploy-from-artifact.sh
Bestehende Komponenten (werden wiederverwendet)
.github/workflows/deploy-staging.yml.github/workflows/deploy-admin-staging.ymlscripts/deploy-from-artifact.shscripts/deploy-admin-from-artifact.shecosystem.config.jsaufstaging.rebreak.org
Probleme mit dem aktuellen Setup
- GitHub Actions Minuten kosten bei privatem Repo über 200 €/Monat.
- Keine Notwendigkeit für die ursprüngliche Entscheidung, Builds auf GitHub laufen zu lassen (Server-OOM auf CX23) —
api.trucko.orghat 8 GB RAM.
3. Ziele
- Kosten eliminieren: Keine kostenpflichtigen GitHub Actions Minuten mehr für Backend-/Admin-Builds.
- Minimaler Änderungsaufwand: Bestehende Workflows und Deploy-Scripts bleiben weitgehend erhalten.
- Sicherheit: Self-hosted Runner wird nicht für Pull Requests von Forks genutzt.
- Zuverlässigkeit: Concurrency-Group, Health-Check und atomic deploy bleiben erhalten.
4. Nicht-Ziele
- Kein Wechsel des Code-Hostings (GitHub bleibt).
- Kein Ersatz für Windows- oder iOS-Builds (diese bleiben bei GitHub Actions oder werden lokal gebaut).
- Keine Einführung zusätzlicher CI-Tools wie Gitea, GitLab oder Woodpecker.
- Keine Änderung an der Production-Infrastruktur auf
staging.rebreak.orgüber das Nötige hinaus.
5. Architektur
GitHub Push (main)
↓
GitHub Actions Workflow
↓
Self-hosted Runner auf api.trucko.org
↓
Checkout → pnpm install → pnpm build → tar artifact
↓
SCP artifact zu staging.rebreak.org
↓
SSH: bash /srv/rebreak/scripts/deploy-from-artifact.sh
↓
Atomic swap .output-staging + pm2 restart + health-check
Komponenten
| Komponente | Ort | Verantwortung |
|---|---|---|
| GitHub Repository | GitHub Cloud | Code-Hosting, Workflow-Definitionen |
| GitHub Actions Runner | api.trucko.org |
Workflow-Ausführung, Build, Deploy-Trigger |
| Build-Umgebung | api.trucko.org |
pnpm install, pnpm build, Artifact-Erstellung |
| Production-Server | staging.rebreak.org |
Artifact entpacken, Migrationen, PM2-Restart |
| Deploy-Script | staging.rebreak.org |
scripts/deploy-from-artifact.sh / deploy-admin-from-artifact.sh |
6. Datenfluss (detailliert)
6.1 Backend-Deploy
- Push auf
maintriggert.github/workflows/deploy-staging.yml. - Workflow-Job
buildläuft aufruns-on: self-hosted(Runner aufapi.trucko.org). - Runner checkt Repo mit
actions/checkout@v4aus. pnpm install --frozen-lockfilewird ausgeführt.cd backend && pnpm builderzeugtbackend/.output.- Artifact wird gepackt:
tar czf backend-output.tar.gz -C backend/.output .. - Artifact wird per SCP auf
staging.rebreak.org:/srv/rebreak/backend/.output-incoming.tar.gzkopiert. imap-idle/wird per SCP synchronisiert.- Runner führt per SSH
bash /srv/rebreak/scripts/deploy-from-artifact.shaus. - Server entpackt Artifact atomisch, führt ggf. Prisma-Migrationen aus und restartet
rebreak-staging. - Health-Check gegen
https://staging.rebreak.org/api/auth/meprüft Erreichbarkeit.
6.2 Admin-Deploy
- Analog zu Backend über
.github/workflows/deploy-admin-staging.yml. - Ziel:
staging.rebreak.org:/srv/rebreak/apps/admin/.output-incoming.tar.gz. - Script:
scripts/deploy-admin-from-artifact.sh. - Health-Check:
https://admin.staging.rebreak.org/.
7. Sicherheit
Runner-Isolation
- Der Runner wird als Repository-Level Runner im
rebreak-monoreporegistriert, damit nur dieses Repo ihn nutzen kann. - Der Runner bekommt ein dediziertes Label:
raynis-builder. - Der Workflow fordert das Label explizit an:
runs-on: [self-hosted, raynis-builder]. - Der Runner reagiert nicht auf Pull-Request-Events — nur auf
pushzumainundworkflow_dispatch.
SSH-Zugriff
- Ein neuer SSH-Deploy-Key wird auf
api.trucko.orgerzeugt. - Der Public Key wird auf
staging.rebreak.orgin/root/.ssh/authorized_keyseingetragen. - Der Private Key wird als GitHub Secret (z. B.
STAGING_DEPLOY_KEY) im Environmentstaginghinterlegt.
Secrets
- Keine Secrets im Runner-Image.
- Alle sensiblen Daten kommen weiterhin aus GitHub Environments oder Infisical (auf
staging.rebreak.org).
8. Fehlerbehandlung
Build-Fehler
- Wenn
pnpm buildfehlschlägt, bricht der Workflow ab. - Es wird nichts auf
staging.rebreak.orgkopiert.
Deploy-Fehler
deploy-from-artifact.shbricht bei fehlgeschlagenen Prisma-Migrationen ab.- Der alte
.output-staging-Ordner bleibt durch atomischesmverhalten. - Health-Check muss bestehen, sonst schlägt der Workflow fehl.
Parallelität
- Concurrency-Group bleibt erhalten:
concurrency: group: deploy-staging cancel-in-progress: false - Parallele Deploys queueen sich, statt sich gegenseitig abzubrechen.
9. Tests in CI
Aktuell laufen keine automatisierten Tests in den Deploy-Workflows. Mit dem eigenen Runner entstehen hierfür keine zusätzlichen Kosten.
Empfohlener optionaler nächster Schritt:
- Vitest-Unit-Tests vor dem Build-Schritt ausführen.
- Reihenfolge:
install → lint → test → build → deploy.
Dies ist nicht Teil dieses Designs und wird in einem separaten Plan behandelt.
10. Migrationsschritte
-
Runner auf
api.trucko.orginstallieren- Node.js 24.11.1, pnpm 10.23.0, git einrichten.
- GitHub Actions Runner herunterladen und konfigurieren.
- Als Service registrieren (
./svc.sh install && ./svc.sh start). - Label
raynis-builderzuweisen.
-
SSH-Verbindung einrichten
- Auf
api.trucko.org:ssh-keygen -t ed25519 -f ~/.ssh/rebreak-deploy. - Public Key auf
staging.rebreak.orgin/root/.ssh/authorized_keyseintragen. - Private Key als GitHub Secret
STAGING_DEPLOY_KEYim Environmentstaginghinterlegen.
- Auf
-
Workflows anpassen
runs-on: ubuntu-latest→runs-on: [self-hosted, raynis-builder].- SSH-Setup-Step an neues Secret
STAGING_DEPLOY_KEYanpassen. - Node-Setup beibehalten (Version 24.11.1).
-
Test-Deploy durchführen
workflow_dispatchaufmainauslösen.- Logs auf
api.trucko.orgundstaging.rebreak.orgprüfen. - Health-Check bestätigen.
-
Alte Pfade abschalten
- Nach erfolgreichen Test-Deploys können die alten Webhook-basierten Deploys deaktiviert werden.
pm2 stop rebreak-webhook && pm2 saveaufstaging.rebreak.org(nur auf User-Approval).
11. Risiken & Mitigationen
| Risiko | Wahrscheinlichkeit | Auswirkung | Mitigation |
|---|---|---|---|
| Runner-Prozess stürzt ab | Niedrig | Hoch | Runner als systemd-Service laufen lassen; GitHub zeigt Runner offline an. |
Build auf api.trucko.org zu langsam |
Mittel | Mittel | 8 GB RAM + 8 GB Swap einrichten; SSD statt HDD prüfen. |
| SSH-Verbindung zwischen Servern failt | Niedrig | Hoch | SSH-Key testen; ssh-keyscan im Workflow nutzen. |
| Runner wird versehentlich für PRs genutzt | Niedrig | Hoch | Trigger auf push: branches: [main] beschränken; kein pull_request. |
| Windows-/Native-Builds bleiben kostenpflichtig | Sicher | Niedrig | In separatem Schritt evaluieren (nicht Teil dieses Designs). |
12. Offene Punkte
- Exakte Spezifikation von
api.trucko.orgbestätigen (CPU, SSD, OS). - Soll der Runner unter einem dedizierten User laufen oder als
root? - Sollen bestehende Webhook-Deploys sofort abgeschaltet oder parallel als Fallback laufen?
- Sollen Vitest-Tests vor dem Build integriert werden (separater Plan)?
13. Erwartetes Ergebnis
Nach der Umstellung:
- Backend- und Admin-Builds laufen auf
api.trucko.org. - GitHub-Actions-Minutenkosten für diese Workflows fallen nahezu auf null.
- Die Deploy-Mechanik auf
staging.rebreak.orgbleibt unverändert. - Windows-/Native-Builds bleiben bei GitHub Actions oder werden separat betrachtet.