Hetzner Capability
Operatives Inventar für das Hetzner-Hosting von Agentic Ventures. Strategische Begründung („warum Hetzner als zweite Spur, warum Mistral statt Bedrock”) liegt in den ADRs llm-hosting-eu-optionen und _index — hier nur das Operative.
Status: bootstrap. Skeleton-Stand 2026-05-13, Account-Klärung + erstes Industriekunden-Project stehen aus. Erstes laufendes Hetzner-Workload ist Mayday-VPS (mayday, anderer Stack: Coolify + Payload CMS), kein Industriekunden-Stack bisher.
Account
Entscheidung 2026-05-13: Option A — privat@-Account auf hello@-UG migrieren.
Bestehendes Hetzner-Account bleibt, Rechnungs-Email + Adresse + USt-Daten wechseln auf Agentic Ventures UG. Mayday-VPS und andere bestehende Workloads laufen unverändert weiter (werden ab Migration als UG-Spend verbucht). Neue Industriekunden kommen als zusätzliche Projects in den gleichen Account.
Migration-Schritte (Marvin-Hand-Off):
- Hetzner Cloud Console → Account-Menü oben rechts → Settings → Profile
- Email-Adresse auf
hello@marvinkuehlmann.comumstellen - Bestätigungs-Email öffnen + verifizieren
- Email-Adresse auf
- Settings → Billing
- Firmenname:
Agentic Ventures UG (haftungsbeschränkt) i.G.(oder finaler UG-Name nach HRB-Eintrag — vorher: „i.G.”) - Rechnungs-Adresse auf UG-Geschäftsadresse
- USt-ID hinterlegen sobald da (innerdeutsch, kein Reverse-Charge)
- Steuer-Status: Geschäftskunde
- Firmenname:
- Settings → Payment
- Zahlungsmethode auf UG-Geschäftskonto (SEPA-Lastschrift auf UG-Konto, ODER Kreditkarte UG-Hauptbank)
- Alte privat@-Karte entfernen
- Pro bestehendem Project (z.B. Mayday):
- Project-Owner bleibt Marvin (kein Owner-Wechsel nötig)
- In
intern/capabilities/hetzner/projects.mdals „UG-verbucht ab YYYY-MM-DD” markieren
- HRB-Auszug + USt-ID nachreichen sobald Notar-Eintrag durch (asynchron, Hetzner akzeptiert „i.G.” initial)
Buchhaltungs-Folge: Hetzner-Rechnungen ab Migration in av-finanzen-eu-central-1 (AV-UG, absetzbar) und Lexware Office. Vor Migration: privat-Spend, lief historisch ueber privat@-Account (nicht AV-Buchhaltung).
Mandanten-Trennung pro Kunde: weiterhin via separate Hetzner-Projects (1 Project = 1 Kunde-Tenant). Pattern: av-<kunde-slug> als Project-Name + project=<kunde-slug>-Tag auf jeder Resource.
Projects
Pro Kunde eigenes Hetzner Project = Mandanten-Trennungs-Konstrukt (analog AWS-Sub-Account). Project-Detail in projects.
| Project | Status | Kunde | Bestand | Detail |
|---|---|---|---|---|
av-mayday (vermutet, siehe Klärungs-Status) | live | mayday | VPS + Coolify + Postgres + R2 (kein Hetzner Object Storage) | tbd — Mayday-Project-Doku bisher in Kunden-File, nicht hier |
av-<industriekunde-slug> | tbd (geplant aus plan Unit 2) | tbd (Lead-Briefing offen) | 2× Cloud Server + Volume + Network + Firewall + Object Storage Buckets | wird av-<slug>.md analog av-becker |
Identity / Access
Hetzner hat kein Identity-Center-Äquivalent wie AWS. Permission-Modell ist pro Project: Owner + Admin/Read+Write/Read-only-Members.
| Wer | Wie | Was |
|---|---|---|
marvinkuehlmann (Marvin) | Project-Owner + API-Tokens | Vollzugriff auf alle AV-Projects |
| Service-Accounts pro Project | API-Token mit Read+Write-Scope auf das Project | Programmatischer Zugriff für IaC + lazyants-MCP |
| Kunden-Mitarbeiter | NICHT direkt — Zugriff auf Daten geht über die App-Schicht (Better Auth + Cloudflare Access), nicht über Hetzner-Console | — |
Konvention:
- API-Tokens in 1Password unter
Hetzner / <project-slug> / api-token - Pro Project genau ein Token für Marvin-Operations + ein Token für CI/CD wenn separater Workflow
- Rotation alle 6 Monate (Reminder im 1Password-Vault)
Service-Aktivierungs-Status pro Project
| Service | Verfügbar Mai 2026 | Aktiviert in av-<industriekunde>? |
|---|---|---|
| Cloud Server (CX, CCX, CPX, CAX) | ✅ | tbd Unit 2 |
| Cloud Volume (Block Storage) | ✅ | tbd Unit 2 |
| Cloud Network (private) | ✅ | tbd Unit 2 |
| Cloud Firewall | ✅ | tbd Unit 2 |
| Cloud Load Balancer | ✅ (nicht im MVP-Scope) | skip — Cloudflare-Tunnel ersetzt LB |
| Object Storage (S3-API) | ✅ | tbd Unit 3 |
| Dedicated GPU Server (GEX-Linie) | ✅ | skip in MVP (Mistral La Plateforme als LLM-Layer, kein Self-Hosted-LLM) |
| Managed Kubernetes | ❌ kein nativer Service (community: hetzner-k3s, Cloudfleet als Managed-Layer) | skip in MVP (Docker Compose statt K3s) |
Cost-Alarme pro Project
Hetzner Cloud Console hat Cost-Limits pro Project (Soft + Hard-Threshold mit Email-Notifications). Konvention pro Industriekunden-Project (siehe plan Unit 7):
- Soft-Limit: 80% des Monats-Budgets → Email-Alarm an hello@marvinkuehlmann.com
- Hard-Limit: 100% des Monats-Budgets → optional Server-Stop (default off, sonst Auto-Outage-Risiko)
- Plus: Better-Stack-Heartbeat auf Hetzner-Billing-API alle 24h als Backup-Monitor
Naming-Konvention
| Pattern | Beispiel | Verwendung |
|---|---|---|
| Project-Name | av-<kunde-slug> | Hetzner-Console-Project + Tag project=<kunde-slug> auf jeder Resource |
| Server-Name | <kunde-slug>-<rolle> z.B. acme-web, acme-db | Cloud Server, ASCII, keine Umlaute |
| Bucket-Name | <kunde-slug>-<zweck> z.B. acme-data, acme-audit | Object Storage Buckets, kebab-case |
| Volume-Name | <server-name>-data z.B. acme-db-data | Block Storage |
| Firewall-Name | <kunde-slug>-fw | Cloud Firewall (eine pro Project, mehrere Rules) |
| Network-Name | <kunde-slug>-net | Private Network pro Project |
| Tag-Schema | project=<slug>, environment=prod, managed-by=marvin | jede Resource |
CLI-Profile
Lokal: hcloud CLI mit Context pro Project.
# Setup
hcloud context create av-<kunde-slug>
# → fragt nach API-Token, speichert in ~/.config/hcloud/cli.toml
# Switch
hcloud context use av-<kunde-slug>
hcloud server list
Plus HCLOUD_TOKEN-Env-Var für Terraform / Skript-Use.
Konvention: ~/.config/hcloud/cli.toml ist gitignored, API-Tokens in 1Password als Source-of-Truth.
Hetzner-MCP — Auswahl + Installation
Status: keiner installiert per 2026-05-13.
Vergleich der Optionen (Stand Mai 2026)
| MCP | Stars | Tools | Awesome-HCloud-listed | Transport | Empfehlung |
|---|---|---|---|---|---|
| dkruyt/mcp-hetzner (Python) | 108 | 27 (Server/Volume/Firewall/SSH/Info) | ja | stdio + SSE | Primary — community-trusted, in offizieller Liste, deckt MVP-Bedarf ab |
| lazyants/hetzner-mcp-server (TS/npm) | 1 | 104 (breit, 13 Domains inkl. LB, Floating-IPs, Certs) | nein | stdio | Optional Erweiterung — wenn Coverage über MVP hinaus gebraucht. Sehr neu (v2.0.0 Mai 2026), wenig Track-Record |
| MahdadGhasemian/mcp-hetzner-go | 5 | 20+ | ja | stdio | Alternative falls Python-Probleme — Go-Binary, lightweight |
| Xodus-CO/hcloud-mcp | k.A. | mittel | nein (Smithery-listed) | smithery-compatible | skip — kein klarer Vorteil |
Object-Storage-Lücke: keiner der MCPs spricht Hetzner S3-API. Für Bucket-Anlage + Lifecycle + Object-Lock nutzen wir aws CLI mit Hetzner-Endpoint (S3-API-kompatibel):
aws s3 ls --endpoint-url https://nbg1.your-objectstorage.com
aws s3api put-bucket-lifecycle-configuration \
--bucket <kunde-slug>-audit \
--endpoint-url https://nbg1.your-objectstorage.com \
--lifecycle-configuration file://lifecycle.jsonStack-Mirror-konsistent zu Becker (nutzt aws CLI für AWS-S3). Eigenen Hetzner-Object-Storage-MCP zu bauen wäre Scope-Creep für später — eigenes Mini-Projekt via mcp-eigenbau-Skill wenn Bedarf entsteht.
Installation Primary (dkruyt/mcp-hetzner)
Marvin-Hand-Off, siehe plan Unit 1:
# Option 1: pip install (wenn als Package verfügbar)
pip install mcp-hetzner
# Option 2: aus Source clonen
git clone https://github.com/dkruyt/mcp-hetzner.git
cd mcp-hetzner
pip install -e .Registration in Claude Code (~/.claude/mcp.json oder Settings):
{
"mcpServers": {
"hetzner": {
"command": "mcp-hetzner",
"env": { "HCLOUD_TOKEN": "<token-aus-1password>" }
}
}
}Plus optional SSE-Transport für Multi-Client-Setup: mcp-hetzner --transport sse --port 8080.
Installation Optional Erweiterung (lazyants, falls Bedarf)
Wenn du später Load Balancer, Floating IPs, Certificates, Placement Groups managst (nicht im MVP-Scope, aber für Folge-Iterationen relevant):
npm install -g @lazyants/hetzner-mcp-serverPlus Registration analog dkruyt, aber mit HETZNER_API_TOKEN-Env-Var (anderer Name!).
MCP-Tool-Nutzung
In Claude-Code-Sessions sind die MCP-Tools dann typischerweise als mcp__hetzner__* verfügbar. Bevorzugt MCP-Tools nutzen statt CLI-Shell-Out wo möglich (cleaner, strukturierte Outputs).
Für Object-Storage-Operationen bleibt aws CLI via Bash der Pfad (siehe oben).
Nächste Schritte
Aus plan:
- Account-Pfad entschieden — Option A (privat@-Account auf hello@-UG migrieren, 2026-05-13)
- dkruyt/mcp-hetzner als Primary-MCP installiert + in Claude Code registriert (2026-05-13, Smoke-Test via
list_locationsgruen — 6 Datacenter zurueck) - Hetzner-Account-Profil + Billing-Adresse + Payment-Method auf UG umstellen (Marvin Console-Aktion, siehe §Account oben — asynchron, blockiert MVP-Bau nicht)
- Optional: lazyants-MCP zusätzlich falls erweiterte Coverage gebraucht (Load Balancer, Floating IPs, Certs)
- Erstes Hetzner-Project anlegen (Becker oder neuer Industriekunde — Reihenfolge mit Marvin klären)
-
projects.mdmit Project-Detail befüllen -
storage.mdmit Bucket-Inventar befüllen -
av-<slug>.md(Bestand-Doku analog av-becker) anlegen - Mayday-Project-Doku herziehen (heute in Kunden-File, gehört eigentlich hier) + als „UG-verbucht ab YYYY-MM-DD” markieren