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):

  1. Hetzner Cloud Console → Account-Menü oben rechts → Settings → Profile
    • Email-Adresse auf hello@marvinkuehlmann.com umstellen
    • Bestätigungs-Email öffnen + verifizieren
  2. 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
  3. Settings → Payment
    • Zahlungsmethode auf UG-Geschäftskonto (SEPA-Lastschrift auf UG-Konto, ODER Kreditkarte UG-Hauptbank)
    • Alte privat@-Karte entfernen
  4. Pro bestehendem Project (z.B. Mayday):
    • Project-Owner bleibt Marvin (kein Owner-Wechsel nötig)
    • In intern/capabilities/hetzner/projects.md als „UG-verbucht ab YYYY-MM-DD” markieren
  5. 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.

ProjectStatusKundeBestandDetail
av-mayday (vermutet, siehe Klärungs-Status)livemaydayVPS + 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 Bucketswird 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.

WerWieWas
marvinkuehlmann (Marvin)Project-Owner + API-TokensVollzugriff auf alle AV-Projects
Service-Accounts pro ProjectAPI-Token mit Read+Write-Scope auf das ProjectProgrammatischer Zugriff für IaC + lazyants-MCP
Kunden-MitarbeiterNICHT 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

ServiceVerfügbar Mai 2026Aktiviert 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 Firewalltbd 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

PatternBeispielVerwendung
Project-Nameav-<kunde-slug>Hetzner-Console-Project + Tag project=<kunde-slug> auf jeder Resource
Server-Name<kunde-slug>-<rolle> z.B. acme-web, acme-dbCloud Server, ASCII, keine Umlaute
Bucket-Name<kunde-slug>-<zweck> z.B. acme-data, acme-auditObject Storage Buckets, kebab-case
Volume-Name<server-name>-data z.B. acme-db-dataBlock Storage
Firewall-Name<kunde-slug>-fwCloud Firewall (eine pro Project, mehrere Rules)
Network-Name<kunde-slug>-netPrivate Network pro Project
Tag-Schemaproject=<slug>, environment=prod, managed-by=marvinjede 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)

MCPStarsToolsAwesome-HCloud-listedTransportEmpfehlung
dkruyt/mcp-hetzner (Python)10827 (Server/Volume/Firewall/SSH/Info)jastdio + SSEPrimary — community-trusted, in offizieller Liste, deckt MVP-Bedarf ab
lazyants/hetzner-mcp-server (TS/npm)1104 (breit, 13 Domains inkl. LB, Floating-IPs, Certs)neinstdioOptional Erweiterung — wenn Coverage über MVP hinaus gebraucht. Sehr neu (v2.0.0 Mai 2026), wenig Track-Record
MahdadGhasemian/mcp-hetzner-go520+jastdioAlternative falls Python-Probleme — Go-Binary, lightweight
Xodus-CO/hcloud-mcpk.A.mittelnein (Smithery-listed)smithery-compatibleskip — 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.json

Stack-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-server

Plus 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_locations gruen — 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.md mit Project-Detail befüllen
  • storage.md mit 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

4 Dateien in diesem Ordner.