Skip to content

feat(infra): Hetzner-Dev-Server-Setup + Tailnet-Host für Vite - #41

Draft
GeorgDub wants to merge 1 commit into
mainfrom
claude/remote-ide-mobile-access-hts6y8
Draft

GeorgDub wants to merge 1 commit into
mainfrom
claude/remote-ide-mobile-access-hts6y8

Conversation

@GeorgDub

Copy link
Copy Markdown
Owner

Ermöglicht das Auslagern der Entwicklung auf einen Hetzner CX33, damit der lokale PC nicht mehr laufen muss und die Projekte vom Handy aus erreichbar sind.

vite.config.ts

".ts.net" zu server.allowedHosts hinzugefügt.

Der Dev-Server läuft künftig auf dem Remote-Host und wird über Tailscale MagicDNS als https://<host>.<tailnet>.ts.net geöffnet. Ohne diesen Eintrag lehnt Vite die Anfrage mit "Blocked request. This host is not allowed." ab. Dev-only, analog zu den bereits vorhandenen Tunnel-Einträgen für .trycloudflare.com und .loca.lt — build und Produktion sind nicht betroffen.

infra/hetzner/

Runbook plus vier idempotente Setup-Skripte für Ubuntu 24.04:

Skript Inhalt
01-bootstrap-root.sh Benutzer + sudo, SSH-Härtung (kein root-Login, keine Passwörter), ufw mit Tailnet-Freigabe, 4 GB Swap, Tailscale, unattended-upgrades, fail2ban
02-toolchains.sh Node 22, Python 3.13 via uv, gcc-arm-none-eabi, clang/cppcheck, libasound2-dev, Qt-Runtime für PyQt6, ffmpeg, Xvfb, tmux
03-code-server.sh code-server auf 127.0.0.1:8080, per tailscale serve als HTTPS ausschließlich im Tailnet veröffentlicht
04-projects.sh Klont Synthstudio, omnitribe und Korg_ESX_E2S_Editor und fährt deren CI-Checks als Verifikation

Die Toolchain-Versionen sind bewusst an die bestehenden Workflows angeglichen statt frei gewählt: Node 22 aus ci.yml (omnitribe braucht --experimental-strip-types), Python 3.13 aus omnitribe- und Korg-CI, pnpm über corepack aus dem packageManager-Feld.

Der Synthstudio-Clone nutzt --filter=blob:none, da die History rund 1,6 GB Sample-Dateien unter Korg ESX files/ trägt und .git dadurch auf ~1,2 GB angewachsen ist.

Verifikation

Lokal gefahren, entsprechend ci.yml:

  • pnpm gen:sandbox → sandbox-runtime.generated.ts in sync
  • pnpm check → sauber
  • pnpm build → erfolgreich (lädt vite.config.ts tatsächlich aus, also der eigentliche Test der Änderung)
  • pnpm test → 11397 passed, 101 skipped, 521 Test-Dateien
  • shellcheck -S warning infra/hetzner/*.sh → sauber

Nicht abgedeckt: Der Tailnet-Zugriff selbst lässt sich nur auf dem laufenden Server verifizieren.


Generated by Claude Code

Ermöglicht das Auslagern der Entwicklung auf einen Hetzner CX33, damit
der lokale PC nicht mehr laufen muss und die Projekte vom Handy aus
erreichbar sind.

vite.config.ts
  ".ts.net" zu server.allowedHosts hinzugefügt. Der Dev-Server läuft
  künftig auf dem Remote-Host und wird über Tailscale MagicDNS als
  https://<host>.<tailnet>.ts.net geöffnet; ohne diesen Eintrag lehnt
  Vite die Anfrage mit "Blocked request. This host is not allowed." ab.
  Dev-only, wie die bereits vorhandenen Tunnel-Einträge für
  .trycloudflare.com und .loca.lt.

infra/hetzner/
  Runbook plus vier idempotente Setup-Skripte für Ubuntu 24.04:
  01  Benutzer, SSH-Härtung (kein root, keine Passwörter), ufw mit
      Tailnet-Freigabe, 4 GB Swap, Tailscale, unattended-upgrades
  02  Toolchains, an den CI-Workflows ausgerichtet: Node 22, Python
      3.13 via uv, gcc-arm-none-eabi, clang/cppcheck, libasound2-dev,
      Qt-Runtime für PyQt6, ffmpeg, Xvfb
  03  code-server auf 127.0.0.1, per "tailscale serve" als HTTPS
      ausschließlich im Tailnet veröffentlicht
  04  Klont Synthstudio, omnitribe und Korg_ESX_E2S_Editor und fährt
      deren CI-Checks als Verifikation

  Der Synthstudio-Clone nutzt --filter=blob:none, da die History rund
  1,6 GB Sample-Dateien unter "Korg ESX files/" trägt.

Verifikation: pnpm gen:sandbox (in sync), pnpm check, pnpm build,
pnpm test (11397 passed, 101 skipped); shellcheck -S warning sauber.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bTa1Rc3WHG8Ku5TM2VAxb

Copy link
Copy Markdown
Owner Author

CI-Status auf c8f2f94

Check Ergebnis
Type-Check + Unit-Tests ✅ success
Playwright Browser-Tests ✅ success
Playwright Browser-Tests (Audio/Sim, non-blocking) ❌ failure

Der rote Job gehört nicht zu diesem PR — er ist auf dem Basis-Commit ebenso rot.

Beleg: Job Playwright Browser-Tests (Audio/Sim, non-blocking) auf main @ beab04e1 (dem Commit, von dem dieser Branch abzweigt) → conclusion: failure, gleicher Fehlerpunkt im Schritt Run Playwright Browser Tests (Audio/Sim). Hier @ c8f2f94 → derselbe Ausgang, 2 passed, der Rest der sim-*.spec.ts in Timeouts.

Das ist der in ci.yml:86-88 dokumentierte Zustand: Die Specs brauchen echtes Web-Audio bzw. den WS-Sim-Loopback, „was in headless CI fehlt → Timeouts erwartet". Der Job trägt deshalb continue-on-error: true und hält den Gesamtstatus des Runs grün.

Kein Fix portiert, weil es keinen gibt, den ich hier hineinziehen könnte — die Ursache liegt in der Headless-Umgebung, nicht im Code. Ein Re-Run wäre ohne Erkenntniswert: Die Zuordnung ist nicht über Wiederholbarkeit belegt, sondern über den identischen Ausgang auf dem Basis-Commit, und das ist das stärkere Signal.

Der Diff dieses PR kann den Job nicht beeinflussen: vite.config.ts bekommt einen zusätzlichen Eintrag in server.allowedHosts (rein additiv, localhost bleibt unverändert — und der blockierende Playwright-Job, der genau darüber läuft, ist grün), infra/hetzner/ wird von keinem Workflow ausgeführt.

Aus meiner Sicht ist der PR damit auf dem aktuellen Head grün, soweit es diesen PR betrifft.

Nebenbefund, nicht Teil dieses PR: Der Kommentar in ci.yml:87 erwartet, dass continue-on-error: true den Job-Check „als success abschließt". Tatsächlich meldet GitHub den Check-Run weiterhin als failure und hält nur den Run grün — deshalb taucht der Job in der PR-Checkliste rot auf. Wenn das stören sollte, wäre der übliche Weg, den Playwright-Aufruf selbst mit || true abzuschließen und das Ergebnis über den hochgeladenen Report zu bewerten.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants