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.
Bibliothek – LAB-WIP-MAVEN-Bibliothek-Enterprise: acht Spring-Services, Angular-Frontend, Postgres, Redis, Kafka, Keycloak, Helm, kind und OKD. Hauptreferenz für die Liberty-Migrationsseite.
Novaris – LAB-WIP-MAVEN-Novaris-Versicherung-Legacy: WebSphere-traditional-Legacy mit EJB, JMS/IBM MQ, Oracle/DB2 und modernem Spring-/Jakarta-/OpenShift-Reaktor. Referenz für Modernisierung und Strangler-Fig.
Procurex – PROCUREX-PROJEKT: Procurement-Domäne mit mehreren Maven-Services, Helm-Chart, Keycloak/OIDC, NetworkPolicy und Frontend. Der konkrete Security-Beleg liegt in keycloak/README.md, die Netzgrenzen in helm/procurex/templates/networkpolicy.yaml.
Concordia – LAB-WIP-WAS-Concordia-Bank-Middleware: Middleware-Betrieb mit Open Liberty, LDAP, JNDI, DB2-Anbindung, Jenkins und geprüften Betriebs-/Deploymentskripten. Referenz für den realen Liberty- und Support-Betrieb.
Aurora – LAB-WIP-MAVEN-Aurora-Bank-TDD-Masterclass: sechs fachliche Services mit TDD, Ports-and-Adapters, eigenen Datenbanken, Kafka-Events und Keycloak. Die Belege stehen in aurora-bank-platform/README.md und im Parent-pom.xml; Referenz für Testtiefe, Bounded Contexts und Integrationsverträge.
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.
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.
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 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.
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.
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.
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).
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.
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.
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.
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.
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.
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).
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.
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.
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.
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).
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 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.
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.
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 undoc-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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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).
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.
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.
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.
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).
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).
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.
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.
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.
Keine Anleitung passt zu Suche + Filter.
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.
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.
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.
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.
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.
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.