C:\Entwicklung\lernen\final_Besser\cloud-host

cloud-host

Anleitungssammlung: einen Hetzner-Cloud-Server vom Windows-Laptop aus als Container-, Kubernetes-, OpenShift- oder Anwendungs-Host betreiben, Dienste hosten, die Domain verwalten – und bei Nichtgebrauch löschen, damit Vergessen kein Geld kostet. Anleitungen liegen in anleitungen/, Skripte in scripts/.

Bevor / während du etwas dauerhaft betreibst: Grundausstattung-Checkliste – 2FA, Tailscale, Backups außer Haus, Monitoring, Log-Limits, DNS (Domain Name System)/DMARC (Domain-based Message Authentication, Reporting and Conformance), Impressum, Recovery.

Nur zeitweise gebraucht? Snapshot & Restore – Server sauber stoppen → Snapshot → löschen → identisch neu. scripts/snapshot.ps1 für einen oder mehrere Server. ~0,30 €/Monat statt ~8.

Verbundene Lernprojekte

cloud-host ist die gemeinsame Betriebs-, OpenShift- und Architektur-Dokumentation für fünf benachbarte Quellprojekte. Die Anleitungen verwenden deren echte Services, Konfigurationen und Betriebsentscheidungen als Kontext.

Lesart: Diagramme in cloud-host sind keine losgelösten Beispiele. Sie erklären die gemeinsamen Muster und markieren, aus welchem Projekt der konkrete technische oder fachliche Bezug stammt.

Update-Datum:

Grundlagen & Setup

GEDANKENSPIEL

Bibliothek auf Liberty & OpenShift

nur Zeichnungen 14 Diagramme · 0 Befehle

Was würde sich ändern, wenn die acht Spring-Boot-Dienste als Jakarta-EE-Anwendungen auf Open Liberty liefen? WebSphere traditional gegen Liberty, server.xml und Features, JNDI, Sicherheit und MP JWT mit demselben Keycloak, die Übersetzung Baustein für Baustein, Source-to-Image, ImageStreams und den konkreten Pilotumbau von catalog-service.

Wozu: Der gemessene Engpass des bestehenden Stacks waren acht JVM-Kaltstarts. Liberty hat ein anderes Startprofil – die Seite läuft auf die Frage hinaus, ob die gestaffelte Reihenfolge dann noch nötig wäre. Werte zum bestehenden Stack sind gemessen, alle Liberty-Zahlen ausdrücklich als Schätzung gekennzeichnet.

QUERSCHNITT

Diagramme: Hetzner & CRC

nur Zeichnungen 38 Diagramme · 0 Befehle

Die einzige Seite ohne einen einzigen Befehl. Netz und Ports, Deployment, Ablauf, Zustände, Datenhoheit – erst für die Hetzner-Landschaft, dann für den CRC-Cluster mit der Bibliothek darauf. Zuletzt die Bauteile von innen: Container gegen VM, Image und Schichten, Docker gegen Podman, Compose gegen Kubernetes, Kubernetes von innen, Registries, Ingress/Route, ConfigMap/Secret, Helm, Jenkins, Git, Kafka, Keycloak, JWT, DNS, TLS – und zuletzt vier zum Nachschlagen: wo die Zeit hingeht (mit den gemessenen Werten), was welchen Neustart überlebt, welches Fehlerbild wohin zeigt, und wo ein Passwort überall liegt.

Wozu: das Ganze sehen, statt es aus vierunddreißig Anleitungen zusammensetzen zu müssen. Farbe trägt Bedeutung – derselbe Ton heißt überall dasselbe. Enthält auch die Zeichnung, die den Doppelausleih-Fehler erklärt: vorher Lesen-Prüfen-Schreiben, nachher ein bedingtes UPDATE.

Fortsetzung: die OpenShift-Themen führt der OpenShift-Atlas weiter – eigene Nummerierung, 65 Diagramme, EX280-Deckungsmatrix, inzwischen mit zweiundzwanzig Hands-on-Anleitungen darunter Konfiguration nachschauen, Project/oc/ServiceAccount, RBAC/SCC, Helm, Secrets, NetworkPolicy, Service/Route/Probes, die Build-Kette, OLM, Operator-Reconcile/Service-CA, Cluster-Betrieb, Logging/MCO/etcd, OVN/Router/Mesh, S2I bis Rollout, SNO/CRC/Deploy-Weg, Workload-Feinschliff, Kern/Auth, Tekton, GitOps, Legacy-Modernisierung, Middleware und SPA-Frontend.

LERNPROJEKT

OpenShift-Atlas

Diagramme + oc 65 Diagramme · EX280

Fortsetzung der Diagrammserie, eigene Nummerierung: OpenShift wirklich verstehen, Breite zuerst. Blöcke 0 und A–J – Fundament, Workloads, Build-Kette, Operatoren, CI/CD, Netz, Betrieb, Legacy-Migration, Middleware, Frontend. Jedes Thema mindestens ein Inline-SVG mit Kreuzverweisen und projektverankerten Punkten.

Wozu: die EX280-Themen und der Bibliothek-Betrieb an einem Ort, als Landkarte. Mit Deckungsmatrix, Fortschritts-Stolperdraht und Rail je Block. Plan und Regeln am Seitenende.

TIEFEN-LAB

SNO, CRC und Deploy-Weg praktisch einordnen

oc / crc / tailscale / podman ~40 Min

Den Hetzner-SNO-Aufbau aus den Installationsskripten ableiten, CRC sicher vermessen und den realen Weg von Git über lokalen Jenkins und Tailscale bis zu den laufenden Pods mit ausschließlich lesenden Statusabfragen inventarisieren.

Wozu: zwei OpenShift-Cluster sicher auseinanderhalten, Ein-Node-Grenzen richtig einordnen und Fehler zuerst der passenden Schicht Laptop, Tunnel, CI oder Cluster zuordnen.

GRUNDLAGE

Server-Basis

einmalig ~20 Min

Der einmalige Teil, den alle anderen Anleitungen voraussetzen: Konto & 2FA, API-Token, hcloud CLI (Command-Line Interface), SSH-Key, Firewall-Prinzip, cloud-init-Grundmuster, die Skripte konfigurieren.

Wozu: steht einmal hier statt in jeder Anleitung. Die Dienst-Guides zeigen dann nur noch ihren eigenen Teil. Abbau/Kill-Switch: Server-Snapshot & Restore.

PANEL

Hetzner Cloud Console

Web statt CLI Referenz

Alles aus den Anleitungen im Webpanel statt per hcloud: Projekt ≠ Server erklärt, der Server-Wizard Feld für Feld, Firewall/Netzwerk/Volumes/Snapshots, Server verwalten, Kosten.

Wozu: nachschlagen, wo im Panel was liegt – plus die Projekt-Strategie (prod / staging / eigenes Projekt für Wegwerf-Server).

CHECKLISTE

Grundausstattung

Dauerbetrieb

Was stehen muss, bevor ein Dienst dauerhaft läuft: 2FA, Tailscale, Backups außer Haus, Monitoring, Log-Limits, DNS/DMARC, Impressum, Recovery-Zugänge.

Wozu: die kurze Liste gegen die typischen Anfangsfehler – einmal durchgehen und abhaken.

WEGWERFEN

Server-Snapshot & Restore

snapshot.ps1 ~0,30 €/Mon

Server sauber stoppen → Snapshot → löschen → identisch neu aufbauen. Was sich ändert (die IP!), feste Primary IP (Internet Protocol) oder Dynamic DNS (cf-dns.ps1), und die vier Kill-Switch-Ebenen für den Kostenschutz.

Wozu: nur zeitweise gebraucht – ~0,30 €/Monat für den Snapshot statt ~8 für den laufenden Server. scripts/snapshot.ps1 für einen oder mehrere Server.

LAPTOP

Podman & Docker auf dem Laptop

podman machine lokal · 0 €

Wie der Client unter Windows mit einer WSL2-Linux-VM oder einem Hetzner-Server redet. Connections lokal ↔ Server umschalten, Images/Container ansehen, Podman vs. Docker, und „Cannot connect to Podman“ beheben. Bezogen auf diese Installation.

Wozu: verstehen, warum podman images nach cloud.ps1 up die Server-Images zeigt – und die lokale Maschine wieder ans Laufen bekommen.

Container, Kubernetes & OpenShift – nach Aufwand

STUFE 0

Developer Sandbox

oc gehostet · 0 €

Kostenloses, gehostetes OpenShift von Red Hat. Kein Server, keine Kreditkarte. Zwei feste Projekte, begrenzte Quota, Pods laufen max. 12 h, alles weg nach 30 Tagen.

Wozu: heute noch mit oc anfangen – Projects, Routes, S2I-Builds, Pipelines, GitOps, Dev Spaces – ohne irgendetwas aufzusetzen.

STUFE 1

Container-Host

podman / docker CPX22 ~20€/Mon

Podman oder Docker auf einem einzelnen Server. Umschalter im Kopf passt alle Befehle, die cloud-init-Datei und das Skript an.

Wozu: mehrere Container laufen lassen, ohne den Laptop-Luefter zu quaelen. Der einfachste Weg – gleicher Workflow wie lokal (podman run, docker compose), nur remote.

STUFE 2

k3s

kubectl ab ~20€/Mon

Vollständiges, leichtes Kubernetes in einem Binary (~512 MB RAM Overhead), als systemd-Dienst. kubeconfig wird auf den Laptop geholt.

Wozu: echtes Kubernetes lernen und betreiben – Deployments, Services, Ingress, Helm – ohne den Ballast eines großen Clusters. Später um weitere Nodes erweiterbar.

STUFE 3

OKD Single-Node

oc CPX52 ~0,14 €/h

Ein ganzes OpenShift (OKD 4) auf einem einzigen Server – API (Application Programming Interface), Web-Console, Router, interne Registry, alle Cluster-Operatoren. SCOS (CentOS Stream CoreOS) per kexec aus dem Rescue, bootstrap-in-place, scripts/sno.ps1 steuert alles.

Wozu: den echten OpenShift-Workflow mit Web-Console üben – oc new-project, oc new-app, Routes, BuildConfigs, SCCs (Security Context Constraints) – ohne 3-Node-Cluster. Löst die alte MicroShift-Fassung ab (deren Installations-Repo ist tot). Braucht WSL2 (Windows Subsystem for Linux 2). RAM (Random Access Memory) ist der Engpass (OKD ~11 GB), Vorgabe cpx52 / 24 GB (Gigabyte).

STUFE 4

OKD-Cluster

oc 3+ Nodes + LB (Load Balancer) · ~450 €/Mon

Ein echter mehrknotiger OpenShift-Cluster (OKD 4): 3 schedulebare Control-Plane-Nodes, platform: none, Hetzner Load Balancer, privates Netz, DNS über nip.io, Fedora CoreOS per coreos-installer.

Wozu: OpenShift so betreiben, wie es in echt aussieht – HA-etcd, Web-Console, Cluster-Operatoren, Worker-Nodes, Updates. Achtung: teuer und aufwendig – erst die anderen drei probieren.

PROJEKT-STACK

Microservices-Stack

compose → k3s 3 Ausbaustufen

Einen lokalen podman compose-/Helm-Microservices-Stack (Spring + Postgres/Kafka/ Keycloak/Observability) in drei Stufen auf Hetzner bringen: nur Infra → ganzer Stack → Helm auf k3s.

Wozu: die Infra deiner Lernprojekte (Testcontainers, infra/, Helm, kind) mit den Cloud-Guides verbinden – mit den Kafka-/Keycloak-/Secrets-Fallen und CI-Deploy.

KOMPLETT-DEPLOY

Bibliothek-Enterprise

k3s + Helm ~70–220€

Das ganze Projekt (8 Spring-Services + Angular-Frontend + Postgres/Kafka/Keycloak/ Observability) auf einem k3s-Cluster – 1 Node oder HA (Hochverfügbarkeit) mit 3 Nodes.

Wozu: konkreter Komplett-Runbook für LAB-WIP-MAVEN-Bibliothek-Enterprisedeploy.ps1, Bitnami-Infra, Ingress/TLS (Transport Layer Security), Frontend-Build.

CI/CD-DEPLOY

Bibliothek per Jenkins → OKD

Jenkins + oc 2 Server · ~0,24 €/h

Dasselbe Projekt (8 Spring-Services + Angular-Frontend + Infra), aber über die echte vierstufige Jenkins-Pipeline auf den OKD-Single-Node: Jenkins baut die Images, pusht in OKDs interne Registry, deployt per Helm.

Wozu: das Zusammenspiel lernen – Registry-Auth, ServiceAccount-Rechte, Helm-Overlays, DB-Secrets, Probe-Timing, Split-Horizon-Keycloak, local-path- Storage auf SCOS, Edge-TLS. Mit jeder Falle dokumentiert (25 Stück).

LOKAL-DEPLOY

Bibliothek auf CRC (lokal)

podman + helm + oc 0 Server · 6 vCPU / 16 GB VM

Derselbe Stack wie bei Jenkins → OKD, aber auf OpenShift Local im Laptop: gleiche Helm-Charts, gleiche Bitnami-Infra, eigenes Umgebungs-Overlay. Ende-zu-Ende getestet mit 13 Pods und drei Edge-Routen.

Wozu: den ganzen Cluster-Ablauf ohne laufende Serverkosten üben – und die Grenze sehen, an der ein Single-Node kippt: acht JVM-Kaltstarts parallel treiben die Load auf 157 und legen den API-Server lahm. Mit gestaffeltem Rollout und Messwerten je Dienst.

BETRIEB

OpenShift Local auf Windows

crc 0 Server · Hyper-V

Betrieb und Diagnose der CRC-VM, unabhängig vom Projekt: Dimensionierung, VM-Disk auf die SSD und Cache per Junction auf die große Platte, der Console-Pod der 5 GB pro Stunde schreibt, und wie man Load-Werte liest.

Wozu: die drei Dinge kennen, an denen CRC tatsächlich scheitert – zu wenig Platte, zu langsamer Speicher, zu wenig CPU. Inklusive der Falle, dass der Bundle-Download seit 2.63 an einer Junction abbricht, der laufende Betrieb aber nicht.

RUNBOOK

Jenkins lokal aus dem Snapshot

podman compose 0 Server · podman-machine

Denselben CI-Jenkins statt auf Hetzner lokal im shared-infra-Compose fahren – jenkins_home 1:1 aus dem letzten Snapshot (Jobs, Credentials, Build-Historie). Mit dem podman-compose-Socket-Umweg unter Windows.

Wozu: den zweiten Server sparen. Wie ein benanntes Volume den kaputten Bind-Mount-Pfad umgeht, die podman-machine-Prereqs, Deploy-Trigger – und die Build-Fehler #18–#22 mit Fix. Rückweg: jenkins.ps1 up.

REFERENZ

OKD-Konfiguration nachschauen

Konsole + oc Referenz

Als DevOps in der OpenShift-Web-Konsole zurechtkommen: die zwei Perspektiven, die Landkarte der Menüs, eine App im Blick behalten. Und wo welche Konfiguration liegt – DB-Passwort, Endpunkt, App-Einstellung, Cluster-Config, Node-Config – je mit Konsolen-Weg und oc-Befehl.

Wozu: nicht mehr suchen. Plus: ein CrashLoopBackOff Schritt für Schritt, der Secret-Klartext-Hinweis, und wo die Konsole aufhört und die CLI anfängt.

HANDS-ON

Helm am Bibliothek-Chart

helm ~30 Min

Helm einmal von Hand am echten Chart durchspielen, bis das mentale Modell sitzt: den Chart lesen, helm template, install und das Release-Secret ansehen, einen Wert ändern mit helm diff und upgrade --atomic, ein kaputtes Upgrade und der Rollback, Drift von Hand erzeugen.

Wozu: verstehen, dass Helm nur Schablone plus Verlauf ist – und wo es aufhört (verwaiste Objekte, keine Drift-Korrektur, Daten und Hooks laufen nicht zurück). Am Ende der reale Jenkins-Aufruf je Dienst.

HANDS-ON

Secrets in OpenShift

oc ~40 Min

Secrets von Hand durchspielen: die Typen anlegen, als env vs als Mount konsumieren und den Unterschied live sehen, der Klartext-Weg, Verschlüsselung at-rest einschalten (aescbc), Pull-Secrets für eine private Registry, Rotation ohne Ausfall, und der Weg raus aus Git.

Wozu: wissen, dass ein Kubernetes-Secret keine Verschlüsselung ist – und die drei Modelle, die es aus Git heraushalten: Sealed Secrets, External Secrets Operator, SOPS.

HANDS-ON

RBAC und SCC in OpenShift

oc ~35 Min

RBAC und SCC von Hand durchspielen: view/edit/admin live vergleichen, mit can-i/who-can prüfen, warum RBAC additiv ist. Dann scheitert ein Pod unter restricted-v2 und gewinnt live eine andere SCC über add-scc-to-user.

Wozu: verstehen, dass dieselbe RBAC-Bindung entscheidet, welche SCC ein Pod bekommt – und die richtige Fix-Reihenfolge (Image, Chart-Override, erst zuletzt SCC).

HANDS-ON

NetworkPolicy in OpenShift

oc ~35 Min

NetworkPolicy von Hand durchspielen: default-allow live sehen, eine deny-all-ingress-Policy anlegen und den Traffic wirklich brechen, gezielt wieder erlauben, die Selektoren podSelector/namespaceSelector/ipBlock, mehrere Policies die sich summieren.

Wozu: die DNS-Falle und die Probes-Falle kennen, bevor sie im echten Cluster zuschlagen – und wie Egress-Policy funktioniert.

Service, Route und Probes von Hand durchspielen: einen Service anlegen und per DNS auflösen, den Selector live kaputt machen, eine edge-Route mit Wildcard-Zertifikat anlegen, eine readiness-Probe live scheitern lassen.

Wozu: sehen, wie ein Pod aus dem Verkehr fliegt, ohne zu sterben – und readiness (raus/rein) und liveness (Neustart) nie wieder verwechseln.

HANDS-ON

Die Build-Kette in OpenShift

oc / podman / helm ~50 Min

Die Build-Kette von Hand durchspielen: mit oc new-app starten, ein BuildConfig live bauen lassen, einen echten Webhook auslösen, die Tag-Falle am eigenen ImageStream nachstellen und per Um-Taggen freigeben, feature/develop/main auf Test/QS/Prod abbilden und das Ergebnis mit einem winzigen Helm-Chart wirklich deployen.

Wozu: verstehen, warum ein Tag allein die Tag-Falle nicht löst, wie ein BuildConfig-Webhook den Branch prüft – und wie die Bibliothek das alles bewusst vereinfacht (kein BuildConfig, ein Overlay statt Branch-per-Stage).

OLM von Hand durchspielen: eine OperatorGroup anlegen, eine Subscription mit Manual-Approval abonnieren, den InstallPlan live genehmigen, die CSV-Phasen bis Succeeded verfolgen – am Beispiel OpenShift GitOps.

Wozu: die fünf OLM-Objekte einmal wirklich gesehen haben, statt nur den Hub-Klick zu kennen – und wissen, wie man sauber wieder deinstalliert.

Am eingebauten Service-CA-Operator den Reconcile sichtbar machen: internen TLS-Schlüssel und CA-Bundle anfordern, das Secret löschen und seine automatische Neuerzeugung beweisen. Optional eine echte ArgoCD-Custom-Resource untersuchen.

Wozu: Soll- und Ist-Zustand nicht nur als Diagramm verstehen, interne Service-Zertifikate sicher einsetzen und Operator-Probleme über Status, Events und Logs verfolgen.

HANDS-ON

Cluster-Betrieb in OpenShift

oc ~35 Min

Cluster-Betrieb von Hand durchspielen: oc get co lesen und einen kaputten ClusterOperator debuggen, einen ServiceMonitor und eine PrometheusRule live anlegen, ein PVC anlegen und die WaitForFirstConsumer-Bindung sehen.

Wozu: oc get co als ersten Reflex verinnerlichen – und verstehen, warum ein Upgrade auf OKD-SNO oft eher ein Rebuild ist als oc adm upgrade.

Eine Logzeile bis Node oder Logging-Stack verfolgen, die gerenderte MachineConfig eines Nodes bis zu ihren Quellen zurückverfolgen und ein echtes etcd-Backup auf genau einem Control-Plane-Node erzeugen und extern sichern.

Wozu: Clusterzustand diagnostizieren und sichern, ohne auf einer SNO versehentlich einen MachineConfig-Neustart oder einen destruktiven Restore auszulösen.

Einen Request von der ClusterIP über EndpointSlice und OVN bis zur Pod-IP verfolgen, die generierte HAProxy-Konfiguration einer Route lesen und Service Mesh 3 von der früheren Maistra-Generation unterscheiden.

Wozu: DNS-, Service-, OVN-, Router- und Mesh-Fehler an der richtigen Schicht diagnostizieren und erkennen, wann ein Service Mesh nur unnötigen Overhead erzeugt.

Eine kleine Node.js-Anwendung aus lokalen Quellen mit S2I bauen, den neuen Digest am ImageStreamTag nachweisen und per Image-Trigger bis zum neuen ReplicaSet und Pod verfolgen.

Wozu: assemble und run verstehen, Tag und Digest trennen und ImageChange sowie die ConfigChange-Wirkung eines Kubernetes-Deployments praktisch unterscheiden.

Die drei Fundament-Bausteine von Hand durchspielen: oc new-project live verfolgen und sehen wie viel mehr entsteht als ein Namespace, mit oc api-resources und oc explain die API selbst erkunden, eine eigene ServiceAccount anlegen und binden.

Wozu: verstehen, dass ein Project keine stärkere Isolation ist als ein Namespace – und dass Rechte und SCC immer von der ServiceAccount kommen, nie vom User.

HANDS-ON

Workload-Feinschliff in OpenShift

oc ~35 Min

Vier Bausteine von Hand durchspielen: Deployment vs DeploymentConfig live vergleichen, einen Pod per nodeSelector gezielt (nicht) platzieren, eine Quota live gegen einen Deploy laufen lassen, env vs Mount live vergleichen wenn sich eine ConfigMap ändert.

Wozu: verstehen, warum eine Quota ohne LimitRange alles blockiert – und warum eine ConfigMap-Änderung im laufenden Pod manchmal ankommt und manchmal nicht.

Mit oc api-resources live trennen, was reines Kubernetes ist und was die OpenShift-Schicht dazugibt, dann einen HTPasswd Identity Provider live anlegen, sich als neuer User anmelden und Rechte per oc adm policy nachtragen.

Wozu: verstehen, dass ein Login nur die Identität gibt, nie die Rechte – und welche Objekte ein Chart auf reinem Kubernetes zum Laufen bringen, welche nicht.

HANDS-ON

Tekton Pipelines in OpenShift

oc / tkn ~35 Min

Den OpenShift-Pipelines-Operator installieren, einen echten Task mit mehreren Steps schreiben, zwei Tasks über einen Workspace zu einer Pipeline verketten, einen PipelineRun live beobachten.

Wozu: den Gegenentwurf zu Jenkins-im-Cluster sehen – flüchtige Build-Pods statt eines dauerhaften Master-Pods, der mit den eigenen Diensten um CPU konkurriert.

HANDS-ON

GitOps mit Argo CD in OpenShift

oc / argocd / kubeseal ~40 Min

Den OpenShift-GitOps-Operator installieren, eine Application anlegen, live Drift erzeugen und von selfHeal zurückdrehen lassen, ein Secret über Sealed Secrets statt im Klartext versionieren, den Rebuild-Ablauf als Checkliste durchgehen.

Wozu: verstehen, warum „Git ist das Soll, der Cluster ist das Ist“ mehr ist als ein Merksatz – und was ein Rebuild aus Git ehrlich wiederherstellt und was nicht.

Sechs typische Bruchstellen einer alten WebSphere-App live durchspielen: die zufällige UID unter restricted-v2 provozieren und mit einer SA-Brücke fixen, ein readOnlyRootFilesystem mit emptyDir aufbrechen, Sticky Sessions per Cookie testen, einen EJB-Timer als CronJob nachbauen, eine Datenquelle ohne Rebuild umkonfigurieren.

Wozu: die Symptome (CrashLoopBackOff, Permission denied, plötzlich ausgeloggte Nutzer) einmal selbst provoziert und behoben haben, statt sie nur aus einem Diagramm zu kennen.

HANDS-ON

Middleware-Images auf OpenShift

oc / skopeo ~35 Min

Eine Lizenz-Schranke im Entrypoint live provozieren und fixen, das echte Pull-Secret und Entitlement-Secret im Cluster nachsehen, reale Image-Größen vergleichen, eine passthrough-Route gegen einen selbstsignierten Testserver aufbauen.

Wozu: die vier Reibungspunkte kommerzieller Middleware-Images (CrashLoopBackOff wegen Lizenz, unauthorized beim Pull, Riesen-Images, TLS-Konsolen) einmal selbst gesehen haben.

HANDS-ON

SPA-Frontends auf OpenShift

oc / curl / openssl ~35 Min

Eine SPA per Nicht-Root-nginx mit try_files ausliefern, den fehlenden CORS-Header live am Preflight sehen und per Pfad-Routing umgehen, ein echtes PKCE-Codepaar mit openssl erzeugen, env.js aus einer ConfigMap laden statt es ins Build zu backen.

Wozu: verstehen, warum „Network error“ im Browser oft ein CORS-Problem ist, obwohl der Server geantwortet hat – und wie dasselbe Image in jeder Umgebung eine andere Config bekommt, ohne Rebuild.

Dienste hosten

WEBSEITE

WordPress auf Hetzner

CloudPanel ~20–36€

Eine WordPress-Site auf einem Cloud-Server mit CloudPanel (gratis, WP-optimiert), Cloudflare davor und Backups – oder gleich der gemanagte Hetzner-Webhosting-Tarif.

Wozu: eine echte Webseite/Blog/Shop betreiben. Enthält den Hetzner-Sonderfall Port 25 gesperrt und den Vergleich Cloud-Server vs. managed Webhosting.

PASSWÖRTER

Vaultwarden auf Hetzner

Bitwarden-Apps CPX22 ~20€

Dein eigener Bitwarden-Server (winzig, Docker + Caddy-HTTPS). Offizielle Bitwarden-Apps, Autofill überall, alle sonst kostenpflichtigen Funktionen frei.

Wozu: Passwörter, Tokens und Notizen zentral, mit Autofill auf allen Geräten, unter eigener Kontrolle. Ohne eigenen Server → Proton Pass Free (in der Anleitung).

EIGENE CLOUD

Nextcloud auf Hetzner

Docker + Traefik ~35–70€

Dateien, Kalender, Kontakte, Fotos, Office – unter cloud.seb4u.com. Mit den Fallen: der Cron-Job, RAM/Redis/PHP (PHP Hypertext Preprocessor), S3-Primaerspeicher, Collabora, .well-known, Backup mit getestetem Restore.

Wozu: das „persoenliche Cloud“-Ding, das die meisten wirklich wollen – AIO (All-in-One) vs manuelles Compose, Updates nur eine Hauptversion pro Schritt.

E-MAIL

Mailserver auf Hetzner

Mailcow ~35€/Mon

Eigener Mailserver (Mailcow) für die Domain. Der Aufbau ist schnell – die Arbeit steckt in Port 25 (Support-Ticket), IP-Reputation und Deliverability.

Wozu: volle Kontrolle über E-Mail. Mit ehrlicher Einschätzung (für eine Person meist Zoho/Proton besser), rDNS, allen DNS-Records, mail-tester, Warmup, Migration von Zoho.

WEB

Statischer Blog

Hugo / Astro 0 €

Blog, Doku oder Landingpage aus Markdown: Hugo oder Astro generiert HTML (Hypertext Markup Language), dann Cloudflare Pages (gratis, Domain + TLS, Git-Deploy) oder ein nginx-Container auf dem Server.

Wozu: schnell, wartungsarm, keine Datenbank. Mit Bildern & Performance, Kommentaren (giscus), Suche (Pagefind), Analytics ohne Cookies und WordPress-Migration.

PRIVATER HOST

Geschützter Projekt-Host

Tunnel + Access CPX22 ~20€

Kleiner Server, Projekte per rsync / scripts/deploy.ps1 hoch, erreichbar unter Subdomains von seb4u.com – aber hinter Cloudflare Access (Login) und über einen Cloudflare Tunnel: kein offener Port, keine Server-IP im DNS.

Wozu: eigene Projekte / Demos online stellen, aber nur für dich (bzw. eine E-Mail-Liste). Statische Seiten + Apps, SSH (Secure Shell) nur übers Tailnet, Backup, Kosten.

KONSOLIDIEREN

Mehrere Dienste auf einem Server

Traefik + Compose 1 Server statt 3–5

Statt pro Anleitung ein Server: eine Basis, ein Reverse Proxy (Traefik), ein Compose-Stack pro Dienst. WordPress samt Datenbank ausführlich, geteilte vs. eigene DB, Backup pro Dienst, Betrieb.

Wozu: WordPress + Vaultwarden + weitere Dienste sauber nebeneinander – mit den Regeln (ein 443, Blast Radius, Ressourcen) und einer Checkliste, wann man doch trennt.

Domain & Netzwerk

BAUKASTEN

Was alles über die Domain geht

Subdomain-Plan je Dienst ~0–2 €

Subdomain-Plan für seb4u.com + Rezepte: öffentliche Website (nginx / Cloudflare Pages / WordPress), selbst-gehostete Dienste (Nextcloud, Gitea, Status-Seite, RSS, Wiki …), und Cloudflare-only (Weiterleitungen, Pages, Workers – kein Server).

Wozu: nachschlagen, welche Subdomain zu welchem Dienst gehört – plus DNS-Records erklärt (A/CNAME/MX/TXT/SRV, SPF/DKIM/DMARC, TTL & Proxy).

TRANSFER

Domain zu Cloudflare umziehen

Cloudflare Registrar ~10 €/Jahr

seb4u.com von easyname zu Cloudflare Registrar transferieren (Webhosting weg, E-Mail zu Zoho). 7 Schritte: easyname-CDN-Option abschalten → Cloudflare-Zone auf Full → Nameserver → Transfer freigeben → Zoho-Mail.

Wozu: die Domain günstig und ohne Upselling halten. Enthält die Partial→Full- Umstellung, die „geparkt“-DNS-Records und die Zoho-Mail-Records (MX/SPF/DKIM/DMARC).

HANDBUCH

Cloudflare – Handbuch

Pages + Zero Trust 0 € (Free)

Cloudflare von Grund auf: Proxy, SSL-Modi, Cache, statische Site auf Pages deployen, DNS, Zero Trust Access als Login, eigener Server per Subdomain (DNS oder Tunnel), WAF. Dashboard-Stand 2025/2026.

Wozu: seb4u.com auf Pages betreiben und verstehen, was Proxy, Cache und Access tun – plus Subdomain auf den OKD-/Hetzner-Server ohne offenen Port.

NETZ

Tailscale

privates Mesh 0 € (Free)

WireGuard-Mesh über Laptop, Server und Telefon: feste Adressen + DNS-Namen, kein offener Port mehr am Server. Mit MagicDNS, Tailscale SSH (keine Keys), Auth-Keys für cloud-init, ACLs, Subnet-Router, Exit-Node.

Wozu: in ~6 Anleitungen die Voraussetzung – hier ausführlich. SSH / kubectl / Postgres nur noch übers Tailnet, Firewall komplett zu.

Betrieb, Backup & Sicherheit

KOSTEN

Kosten & Budget

Preis-Referenz

Die eine Seite mit aktuellen Hetzner-Preisen (nach der Erhöhung Juni 2026), jedem Nebenposten, was ohne laufenden Server weiterkostet, IPv4 (Internet Protocol Version 4) sparen, den vier Kill-Switch-Ebenen und „so prüfe ich die Rechnung“.

Wozu: Hetzner hat kein Ausgabenlimit. Mit Rechner und drei Beispielrechnungen – alle anderen Anleitungen zeigen hierher.

BACKUP

Backup & Restore

Restic + Storage Box ~0,13 €/Tag

Verschlüsselte, automatische Backups mit Restic auf eine Hetzner Storage Box – Dateien und Datenbank-Dumps, Aufbewahrungsregeln, systemd-Timer, Totmann-Schalter zur Überwachung.

Wozu: die Daten, die der Snapshot nicht gut abdeckt – mit einem getesteten Restore (einzelne Datei bis kompletter Neuaufbau).

MONITORING

Monitoring & Alerting

Kuma + Netdata + ntfy 0 € self-hosted

Uptime Kuma (ist es erreichbar?), Netdata (was macht der Server?), ntfy (Push aufs Telefon). Mit sinnvollen Checks, Alarmen ohne Rauschen, Status-Seite, Totmann-Schalter.

Wozu: erfahren dass etwas kaputt ist, bevor die Nutzer es melden – und wissen, warum. Plus: wo der Monitor laufen soll (nicht auf dem überwachten Server).

CI/CD

CI/CD nach Hetzner

Actions / Jenkins 0 € (Free-Kontingent)

Von git push zum laufenden Dienst: GitHub Actions baut, schiebt nach GHCR (GitHub Container Registry), deployt per SSH über Tailscale (kein offener Port). Secrets in Environments, DB-Migrationen, Rollback, Pull-Modell, self-hosted Runner, Jenkins.

Wozu: deployen ohne Handarbeit – die automatisierte Fassung von scripts/deploy.ps1. Vollständiger Workflow zum Kopieren, plus k3s/Helm.

SECRETS

Secrets-Management

SOPS (Secrets OPerationS) + age 0 €

Passwörter und Tokens raus aus .env: verschlüsselt in Git, entschlüsselt nur auf Server/CI/Compose. Schlüssel, .sops.yaml, Rotieren, Zugriff entziehen – plus wann Vaultwarden/Infisical/Vault besser passt.

Wozu: reproduzierbar statt .env-auf-der-Platte, mit Historie – und die CI kennt idealerweise keine Secrets.

HÄRTUNG

Server-Härtung

SSH / nftables / CrowdSec 0 €

Einen öffentlichen Server absichern, in Reihenfolge: SSH härten, Auto-Updates, nftables (+ die Docker-Firewall-Falle), CrowdSec, sysctl, Docker-Härtung, auditd, mit Lynis prüfen.

Wozu: wenn Tailscale/kein-Port nicht geht und 80/443 offen muss. Mit einer Liste, was Übertreibung ist – und alles ab cloud-init.

SPEICHER

Object Storage

S3 / MinIO ab ~6 €/Mon

S3-kompatibler Speicher für Backups, App-Assets, statische Seiten, große Medien – Hetzner Object Storage oder MinIO/Garage selbst. Client, Policy, Versioning & Lifecycle, Website mit Cloudflare davor, App-Integration.

Wozu: „wächst unbegrenzt“ statt Volume – mit einer Tabelle, wann Object Storage / Volume / Storage Box, und Hetzner vs R2 vs B2.

NOTFALL

Disaster-Runbook

im Ernstfall

Was im Notfall zu tun ist – ohne im Notfall nachzudenken: die ersten 5 Minuten, dann je Szenario (Server kompromittiert, Daten verloren, Region-Ausfall, DNS, Secrets geleakt, Ransomware), der Wiederaufbau von Null und eine Checkliste zum Ausdrucken.

Wozu: bindet Snapshot, Backup, DNS, Secrets und Härtung zusammen. Vorher lesen und ausdrucken, nicht erst im Ernstfall.

Empfohlene Kombination für den Anfang: WordPress + Vaultwarden + Traefik auf einem Server (CPX32 ~35 €/Mon, CX33/CAX21 ~8,5–10,5 falls frei) statt drei einzelnen. Traefik besitzt Port 443 und verteilt nach Hostname (blog. / vault.seb4u.com), jeder Dienst ist ein eigener docker compose-Stack mit eigenem Volume und eigener Datenbank, scripts/dienste-stack.ps1 schaltet alles an/aus.

Der Weg dahin steht in Mehrere Dienste auf einem Server. Ausnahme: wer den Passwort-Tresor strikt isolieren will, gibt Vaultwarden einen eigenen CAX11 ARM (~6 €) bzw. CPX22 (~19,5 €) – siehe dort den Abschnitt „Wann doch trennen“.
Nur Passwörter lokal verwalten? Im Ordner C:\Entwicklung\vault\vault.html liegt ein eigenständiger, verschlüsselter Ein-Datei-Tresor (offline, AES-256). Für „überall + Autofill“ ist Proton Pass Free oder Vaultwarden die bessere Wahl.

Skripte & Dateien

Die ausführbaren Werkzeuge liegen in scripts/ und laufen mit Windows PowerShell 5.1; RemoteSigned reicht für die lokale Nutzung. Die Beispiele gehen vom Repo-Wurzelverzeichnis aus. Jeder Eintrag nennt Zweck, Wirkung und einen kopierbaren Beispielaufruf. Nachbardateien werden über $PSScriptRoot gefunden. Die Inhalte aller .ps1-, .sh- und .yaml-Dateien sind beim jeweiligen Eintrag standardmäßig geschlossen und lassen sich zum Lesen aufklappen.

Direkt ausführen: Der zusätzliche Button erscheint nur bei freigegebenen, lesenden Aktionen wie status und snapshots. Er verwendet denselben einmalig einzurichtenden lokalen Link-Handler wie die Terminalbuttons.

Terminal im Projektordner öffnen

Standard: Ordner dieser index.html

Einmalig aktivieren: Browser dürfen lokale Programme nicht direkt starten. Dieser Befehl registriert deshalb den eingeschränkten cloudhost-terminal:-Link nur für deinen Windows-Benutzer; beim ersten Öffnen kann der Browser noch nachfragen. Klicke auf Einrichtung kopieren, drücke Win+R, füge den Befehl ein und bestätige mit Enter.

.\scripts\register-terminal-links.ps1

Server & Plattformen

scripts/cloud.ps1PowerShell

Zweck: Verwaltet einen einzelnen Hetzner-Podman-Host mit up, down, toggle, status und ssh.

Wirkung: up baut den Server aus dem neuesten Snapshot oder erstmals per Cloud-init auf und setzt die Podman-Verbindung. down erstellt einen Snapshot und löscht danach den kostenpflichtigen Server.

.\scripts\cloud.ps1 status
scripts/k3s.ps1PowerShell

Zweck: An/Aus-Workflow für den einzelnen Kubernetes-Server k3s-host.

Wirkung: Beim Hochfahren werden Kubeconfig und KUBECONFIG auf dem Laptop aktualisiert; beim Herunterfahren wird k3s sauber gestoppt, gesichert und der Server gelöscht.

.\scripts\k3s.ps1 status
scripts/sno.ps1PowerShell + WSL2

Zweck: Installiert und verwaltet ein vollständiges OKD/OpenShift als Single-Node-Cluster auf Hetzner.

Wirkung: install durchläuft Rescue, SCOS-kexec und bootstrap-in-place. down sichert den Node als Snapshot; destroy entfernt Server, Snapshot, reservierte IP und Firewall.

.\scripts\sno.ps1 status
scripts/jenkins.ps1PowerShell

Zweck: Betreibt den Jenkins-Server für CI-Deployments auf den OKD-Single-Node.

Wirkung: install baut das Image aus shared-infra/jenkins/; up/down verwenden Snapshots und pflegen die OKD-Firewallregel für Port 6443.

Passwort: Ohne -AdminPassword erzeugt das Skript selbst ein Passwort. Bei manueller Eingabe erscheint es im erzeugten und kopierten Befehl im Klartext.

.\scripts\jenkins.ps1 status
scripts/cluster.ps1PowerShell

Zweck: Status und Kostenkontrolle für den mehrteiligen OKD-Cluster.

Achtung: down ist ein Kill-Switch und löscht alle okd-*-Server, den Load Balancer und das private Netz in einem Durchlauf.

.\scripts\cluster.ps1 status
scripts/snapshot.ps1PowerShell

Zweck: Sichert und restauriert mehrere konfigurierte Hetzner-Server; mit -Only auch gezielt einen einzelnen.

Wirkung: Zeigt Laufzeitkosten und Snapshot-Inventar, stoppt Dienste vor dem Snapshot, kann reservierte IPs wieder anhängen und mit prune -Keep N alte Sicherungen entfernen.

.\scripts\snapshot.ps1 status

Dienste, DNS & Deployment

scripts/dienste-stack.ps1PowerShell + SSH

Zweck: Steuert alle Compose-Stacks unter /opt/stacks auf dem konsolidierten Server.

Wirkung: Erkennt Stacks automatisch, startet Traefik und gemeinsame Datenbanken zuerst und fährt sie umgekehrt herunter. Unterstützt Status, Start, Stop, Neustart, Pull und Logs sowie -Only.

.\scripts\dienste-stack.ps1 status
scripts/cf-dns.ps1PowerShell + Cloudflare

Zweck: Erstellt, aktualisiert oder löscht Cloudflare-A-Records, wenn ein neu aufgebauter Server eine andere IPv4 erhält.

Wirkung: Nutzt $env:CF_API_TOKEN, akzeptiert eine IP direkt oder liest sie per hcloud aus. -DryRun zeigt die geplante Änderung ohne Schreibzugriff.

.\scripts\cf-dns.ps1 -Zone example.com -Name 'app' -IP 203.0.113.10 -DryRun
scripts/deploy.ps1PowerShell + SSH

Zweck: Überträgt eine statische Website oder einen Compose-Stack auf den geschützten Projekt-Host.

Wirkung: Nutzt bevorzugt rsync, sonst tar über SSH. -Stack startet anschließend Compose; -Delete entfernt mit rsync veraltete Zieldateien und -Logs folgt den Container-Logs.

.\scripts\deploy.ps1 blog -Source .\dist -DryRun

Windows-Automation

scripts/create-shortcuts.ps1PowerShell

Zweck: Legt Windows-Verknüpfungen für up, down und status einer oder aller Plattformen an.

Wirkung: -For wählt cloud, k3s, sno, jenkins oder cluster; -ForAll verarbeitet alle. -Dest bestimmt den automatisch angelegten Zielordner.

.\scripts\create-shortcuts.ps1 -ForAll
scripts/install-autodown.ps1PowerShell + Aufgabenplanung

Zweck: Installiert den wichtigsten Kostenschutz als tägliche Windows-Aufgabe.

Wirkung: Ruft zur mit -Time gewählten Uhrzeit das passende down auf und holt einen verpassten Lauf beim nächsten Start nach. Vorgabe ist 03:00; jede Plattform erhält einen eigenen Task-Namen.

.\scripts\install-autodown.ps1 -For cloud -Time '03:00'
scripts/register-terminal-links.ps1PowerShell + HKCU

Zweck: Aktiviert die drei Terminal-Schaltflächen oberhalb dieser Liste.

Wirkung: Registriert cloudhost-terminal: nur für den aktuellen Benutzer und verweist auf den fest eingeschränkten Handler. Mit -Unregister lässt sich die Registrierung wieder entfernen.

.\scripts\register-terminal-links.ps1
scripts/open-terminal-link.ps1interner Handler

Zweck: Startet Windows Terminal, PowerShell oder Bash im Wurzelverzeichnis dieses Repositories.

Sicherheit: Der Handler akzeptiert drei fest codierte Terminalziele, eine Whitelist lesender Skriptaktionen und ein vorhandenes Dateisystem-Verzeichnis; URL-Inhalte werden nie direkt als Befehl ausgeführt. Bash verwendet Git Bash, ersatzweise WSL.

Parameter: -Url ist ein Pflichtparameter an Position 0 und enthält ausschließlich den registrierten cloudhost-terminal:-Link. Nicht manuell aufrufen; der Browser übergibt ihn an den Handler.

scripts\open-terminal-link.ps1

Suche, Hooks & gemeinsame Bausteine

scripts/build-suchindex.ps1PowerShell

Zweck: Erzeugt aus allen anleitungen/*.html den Volltextindex suchindex.js.

Wann ausführen: Nach Inhaltsänderungen an Anleitungen, damit die Suche oben nicht nur Kartentexte, sondern auch den eigentlichen Seiteninhalt findet.

Parameter: keine; Quellordner und Zieldatei werden relativ zum Skript ermittelt.

.\scripts\build-suchindex.ps1
scripts/install-hooks.ps1PowerShell + Git

Zweck: Aktiviert einmalig pro Klon den lokalen pre-commit-Hook.

Wirkung: Setzt core.hooksPath auf .githooks; vor dem Commit werden bei geänderten Anleitungen suchindex.js und bei geänderten Skript-/YAML-Dateien script-inhalte.js neu gebaut und mit aufgenommen.

Parameter: keine; das Repository wird aus dem Speicherort des Skripts bestimmt.

.\scripts\install-hooks.ps1
scripts/_common.ps1Bibliothek

Zweck: Gemeinsame Hetzner-, Firewall-, SSH-, Snapshot- und Kostenfunktionen der An/Aus-Skripte.

Nutzung: Wird von den Hauptskripten per Dot-Sourcing geladen und normalerweise nicht direkt gestartet.

Skriptparameter: keine; einzelne interne Funktionen besitzen eigene Funktionsparameter.

scripts\_common.ps1
scripts/_dauer.ps1Bibliothek

Zweck: Misst die Laufzeit und gibt am Ende eines Skripts Ausfuehrungszeit: X s aus.

Nutzung: Wird von den anderen PowerShell-Dateien eingebunden und nicht eigenständig aufgerufen.

Skriptparameter: keine.

scripts\_dauer.ps1
scripts/rates.psd1Konfiguration

Zweck: Zentrale Preistabelle für die ungefähre Stunden- und Monatskostenanzeige der Verwaltungsskripte.

Hinweis: Die Werte sind lokale Rechengrundlagen und sollten bei Preisänderungen des Anbieters aktualisiert werden.

scripts\rates.psd1
suchindex.jsgeneriert

Zweck: Enthält den von build-suchindex.ps1 erzeugten Volltext aller Anleitungen für die Suche in index.html.

Hinweis: Nicht manuell bearbeiten. Fehlt die Datei, sucht die Seite weiterhin, aber nur innerhalb der sichtbaren Karten.

suchindex.js
scripts/build-script-inhalte.ps1PowerShell

Zweck: Erzeugt script-inhalte.js mit den Quelltexten aller scripts/*.ps1, *.sh und *.yaml für die aufklappbare Anzeige.

Parameter: keine; Quellordner und Zieldatei werden relativ zum Skript ermittelt.

.\scripts\build-script-inhalte.ps1
script-inhalte.jsgeneriert

Zweck: Liefert die eingebetteten Quelltexte für die aufklappbaren Leser in diesem Bereich.

Hinweis: Nicht manuell bearbeiten; nach Änderungen an PowerShell-, Bash- oder YAML-Dateien neu erzeugen.

script-inhalte.js

Cloud-init & Installationshelfer

scripts/cloud-init.yamlCloud-init

Zweck: Standard-Erstinstallation eines Ubuntu-Servers als Podman-Host.

Wirkung: Wird von cloud.ps1 nur beim allerersten up verwendet, solange noch kein Snapshot existiert.

.\scripts\cloud.ps1 up -CloudInit cloud-init.yaml
cloud-init.docker.yaml / .k3s.yaml / .host.yamlCloud-init

Zweck: Fertige Erstinstallationen für Docker, einen k3s-Node oder den geschützten Projekt-Host.

Nutzung: Die gewählte Datei wird mit -CloudInit übergeben; eigene Varianten folgen dem Namen cloud-init.<name>.yaml.

.\scripts\cloud.ps1 up -CloudInit cloud-init.docker.yaml
scripts/sno-wsl.sh / sno-kexec.shBash-Helfer

Zweck: Technische Teilschritte von sno.ps1 install.

Wirkung: sno-wsl.sh erzeugt in WSL2 Installationsdateien und wartet auf OKD; sno-kexec.sh startet im Hetzner-Rescue das SCOS-Live-System mit eingebetteter Ignition.

Parameter von sno-wsl.sh: Position 1 ist der Befehl tools, latest, stream, ignition, wait, finish, kubeadmin-password oder remediate. tools erwartet danach die OKD-Version, ignition Clustername und Node-IP, finish den Windows-Zielpfad der Kubeconfig; die anderen Befehle haben keine weiteren Positionsparameter.

Eingaben für sno-kexec.sh: Pflicht sind die Umgebungsvariablen KERNEL_URL, INITRD_URL und ROOTFS_URL; IGN ist optional und verwendet standardmäßig /root/sno.ign. Keine Positionsparameter.

scripts\sno-wsl.sh | scripts\sno-kexec.sh
scripts/jenkins-setup.shBash-Helfer

Zweck: Richtet bei jenkins.ps1 install den frischen Jenkins-Server ein.

Wirkung: Installiert Podman, konfiguriert Registries, baut das Jenkins-Image, startet den Container und richtet den Neustartdienst ein. Danach liegt der Zustand im Snapshot.

Eingaben: ADMIN_PASSWORD ist als Umgebungsvariable Pflicht; ADMIN_USER ist optional und hat die Vorgabe admin. Keine Positionsparameter.

scripts\jenkins-setup.sh
scripts/cloud-init.selfdestruct.yamlCloud-init

Zweck: Podman-Erstinstallation mit automatischer Selbstlöschung nach zwölf Stunden.

Achtung: Der Server löscht sich per Hetzner-API selbst. Nur mit einem separaten, eng berechtigten API-Token und Projekt verwenden.

.\scripts\cloud.ps1 up -CloudInit cloud-init.selfdestruct.yaml
README.md / README.htmlDokumentation

Zweck: Kurze Einstiegsübersicht zu Voraussetzungen, Installation und täglichem Gebrauch.

Enthält: Benötigte Winget-Pakete, Hetzner-Kontext, SSH-Schlüssel und die wichtigsten Aufrufe.

README.html
Gemeinsames Prinzip: Der Laptop ist nur Client (hcloud + podman/docker/kubectl/oc). Nach außen ist nur SSH (Port 22) offen, gesperrt auf deine eigene IP. Die Container-/Cluster-Schnittstelle läuft durch einen SSH-Tunnel bzw. hinter einem Load Balancer. Hetzner rechnet stundenweise ab – poweroff spart nichts, nur löschen.