Lokales Werkzeug · C:\Entwicklung\lernen\final_Besser\cloud-host

cloud-host

Von einem Windows-Laptop aus einen Hetzner-Cloud-Server als Container-/Kubernetes-/ Anwendungs-Host betreiben – und bei Nichtgebrauch loeschen, damit Vergessen kein Geld kostet. Dazu Anleitungen rund um die Domain (Cloudflare, E-Mail, geschuetzter Projekt-Host).

Repo: github.com/nursude/cloud-host (privat)

Einstieg

index.html im Browser oeffnen – die vollstaendige Uebersicht mit Kurzbeschreibung, Volltextsuche, Themenfiltern und einem Umschalter lokale Datei / online. Teilbare Fassung: Online-Uebersicht. Vor dem Dauerbetrieb: Grundausstattung-Checkliste.

Ordnerstruktur

index.html, README.md, README.html im Wurzelverzeichnis · anleitungen/*.html alle Anleitungen · scripts/*.ps1 + scripts/cloud-init*.yaml die Skripte. Skripte aus dem Wurzelverzeichnis aufrufen: .\scripts\cloud.ps1 up.

Repo klonen

# einmalig: GitHub CLI + Anmeldung
winget install GitHub.cli
gh auth login                     # github.com, HTTPS, Browser

# klonen
gh repo clone nursude/cloud-host  # oder: git clone https://github.com/nursude/cloud-host.git
cd cloud-host
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned   # Skripte ausfuehren duerfen

Ohne gh: git clone https://github.com/nursude/cloud-host.git – fragt nach GitHub-Benutzer + Personal Access Token als Passwort. Aktualisieren: git pull. Zurueckschreiben: git add -A && git commit -m "…" && git push. Nach dem Klonen: index.html oeffnen.

Voraussetzungen (einmalig)

  1. hcloud CLI (Command-Line Interface) + Podman
    winget install HetznerCloud.CLI
    winget install RedHat.Podman
  2. Hetzner-Zugang – API-Token aus console.hetzner.com (Security → API Tokens, Read & Write):
    hcloud context create heim
  3. SSH-Key (falls noch keiner existiert)
    ssh-keygen -t ed25519 -f $env:USERPROFILE\.ssh\id_ed25519
    hcloud ssh-key create --name laptop --public-key-from-file $env:USERPROFILE\.ssh\id_ed25519.pub
  4. Skriptausfuehrung erlauben
    Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

Konfiguration (Servergroesse, Key-Name, …) steht oben in scripts/cloud.ps1.

Taeglicher Gebrauch

.\scripts\cloud.ps1 up       # Server hochfahren (aus letztem Snapshot), podman-Verbindung setzen
.\scripts\cloud.ps1 status   # laeuft er? seit wann? ~Kosten bisher
.\scripts\cloud.ps1 down     # Snapshot + loeschen -> Kosten sofort gestoppt
.\scripts\cloud.ps1 toggle   # umschalten
.\scripts\cloud.ps1 ssh      # SSH auf den Server

Nach up laufen alle podman … / podman compose … Befehle auf dem Server. Zurueck zu lokal: podman system connection default podman-machine-default.

Kostenschutz (empfohlen)

DateiZweck
scripts/create-shortcuts.ps1Windows-Verknuepfungen fuer eine Plattform oder mit -ForAll fuer alle; -Dest bestimmt den Zielordner
scripts/install-autodown.ps1Aufgabenplanung: taeglich zur mit -Time HH:mm gewaehlten Uhrzeit automatisch down (Vorgabe 03:00)
scripts/cloud-init.selfdestruct.yamloptional: Server loescht sich nach 12 h selbst (separates Hetzner-Projekt!)
.\scripts\create-shortcuts.ps1 -ForAll
.\scripts\install-autodown.ps1 -For cloud -Time '03:00'
Testen

Start-ScheduledTask -TaskName 'Cloud-Host Auto-Down', danach .\scripts\cloud.ps1 status – muss AUS zeigen.

Anleitungen

Alle Dateien liegen in anleitungen/. Der Name verlinkt die online lesbare Fassung. Gruppen wie in index.html.

Preise = Richtwerte

Die Spalte „Groesse / Kosten“ ist Stand nach der Hetzner-Erhoehung 15. Juni 2026. Verbindliche, aktuelle Tabelle mit allen Nebenposten: Kosten & Budget.

Grundlagen & Setup

AnleitungWas
server-basis.htmlServer-Basis – der einmalige Teil, den alle Anleitungen voraussetzen: Konto & 2FA, API-Token, hcloud CLI, SSH-Key, Firewall-Prinzip, cloud-init-Grundmuster, Skripte konfigurieren
hetzner-console.htmlPanel-Referenz – alles im Webpanel statt per hcloud: Projekt ≠ Server, Server-Wizard Feld fuer Feld, Firewall/Netzwerk/Volumes/Snapshots, Kosten, Projekt-Strategie
grundausstattung.htmlCheckliste fuer den Dauerbetrieb: 2FA, Tailscale, Backups ausser Haus, Monitoring, Log-Limits, DNS (Domain Name System)/DMARC (Domain-based Message Authentication, Reporting and Conformance), Impressum, Recovery
server-snapshot-restore.html / snapshot.ps1Server per Snapshot wegwerfen und identisch neu aufbauen – was sich aendert (IP!), feste Primary IP (Internet Protocol) oder Dynamic DNS (cf-dns.ps1), vier Kill-Switch-Ebenen. Skript fuer einen oder mehrere Server
podman-docker-lokal.htmlPodman & Docker auf dem Laptop – Client-Modell unter Windows (WSL2-Maschine), Connections lokal ↔ Server umschalten, Images/Container ansehen, Podman vs. Docker, „Cannot connect to Podman“ beheben

Container, Kubernetes & OpenShift – nach Aufwand

AnleitungWasGroesse / Kosten
developer-sandbox.htmlOpenShift Developer Sandbox (kostenlos, gehostet, oc)0 €
container-host-hetzner.htmlPodman oder Docker (Umschalter), per podman/docker1 Node, ~20 € (CX/CAX falls frei ~11)
k3s-hetzner.htmlk3s – leichtes Kubernetes, per kubectl1+ Node, ab ~8 €/Mon
okd-single-node-hetzner.htmlOKD (OpenShift Kubernetes Distribution) Single-Node – ganzes OpenShift (Web-Console, alle Operatoren) auf 1 Server, SCOS (CentOS Stream CoreOS) per kexec + bootstrap-in-place, scripts/sno.ps1, braucht WSL2 (Windows Subsystem for Linux 2), RAM (Random Access Memory) ist der Engpass (OKD selbst ~11 GB). Loest MicroShift ab1 Node CPX52 ~0,14 €/h
okd-cluster-hetzner.htmlOKD 4 – echter mehrknotiger OpenShift-Cluster, per oc3+ Nodes + LB (Load Balancer), ~450 €/Mon
microservices-stack-hetzner.htmlLokalen podman-compose-/Helm-Microservices-Stack in 3 Stufen auf Hetzner~5–30 €/Mon
bibliothek-enterprise-hetzner.htmlKomplett-Runbook: das ganze Bibliothek-Enterprise-Projekt auf k3s, 1 Node oder HA (Hochverfügbarkeit)~70–220 € (CX/CAX falls frei ~25)
bibliothek-enterprise-via-jenkins-auf-okd.htmlCI (Continuous Integration)/CD-Deploy: das ganze Projekt (8 Spring-Services + Angular-Frontend + Infra) über die vierstufige Jenkins-Pipeline auf den OKD-Single-Node (interne Registry, Helm, Split-Horizon-Keycloak) – jede Falle mit Diagnose + Fix2 Server (OKD cpx52 + Jenkins cpx42) ~0,24 €/h
jenkins-lokal-aus-hetzner-snapshot.htmlRunbook: denselben CI-Jenkins statt auf Hetzner lokal im shared-infra-Compose fahren – jenkins_home 1:1 aus dem Snapshot, der podman-compose-Socket-Umweg unter Windows (benanntes Volume mit bind-Backing), podman-machine-Prereqs, Deploy-Trigger, Build-Fehler #18–#22 mit Fix0 Server – podman-machine

Dienste hosten

AnleitungWasGroesse / Kosten
wordpress-hetzner.htmlWordPress – Cloud-Server + CloudPanel + Cloudflare + Backups, oder managed Webhosting1 Node, ~20–36 € (CX/CAX falls frei ~11)
vaultwarden-hetzner.htmlVaultwarden – eigener Bitwarden-Server (Docker + Caddy), offizielle Apps1 Node, ~20 € (CX/CAX falls frei ~11)
nextcloud-hetzner.htmlNextcloud – eigene Cloud fuer Dateien/Kalender/Kontakte/Fotos/Office. Mit den Fallen: Cron-Job, RAM/Redis/PHP (PHP Hypertext Preprocessor), S3-Primaerspeicher, Collabora, .well-known, Backup mit getestetem Restore, Updates eine Hauptversion pro Schritt1 Node, ~35–70 € (CX/CAX falls frei ~21)
mail-hetzner.htmlEigener Mailserver (Mailcow) – Port 25, IP-Blocklisten, rDNS, MX (Mail-Exchange-Record)/SPF (Sender Policy Framework)/DKIM (DomainKeys Identified Mail)/DMARC, Deliverability, Warmup, Migration von Zoho, ehrliche Einschaetzung1 eigener Node, ~35 € (CX/CAX falls frei ~11) + Pflege
blog.htmlStatischer Blog – Markdown → Hugo/AstroCloudflare Pages (gratis) oder nginx-Container oder Bucket. Bilder, giscus, Pagefind, Analytics ohne Cookies, CI/CD (Continuous Delivery), WordPress-Migration0 €
geschuetzter-projekt-host.html / deploy.ps1Projekte per rsync/scripts/deploy.ps1 hoch, ueber Subdomains erreichbar, aber hinter Cloudflare Access (Login) + Cloudflare Tunnel (kein offener Port, keine Server-IP im DNS)ab ~20 € (CX/CAX falls frei ~11)
mehrere-dienste-ein-server.html / dienste-stack.ps1Konsolidieren – Traefik als Edge-Proxy, ein Compose-Stack pro Dienst, WordPress+DB ausfuehrlich, geteilte vs. eigene DB, Backup pro Dienst, wann doch trennen. Skript: alle Stacks per SSH (Secure Shell) an/aus1 Server statt 3–5

Domain & Netzwerk

AnleitungWas
domain-baukasten.htmlWas alles ueber die Domain geht – Subdomain-Plan, DNS-Grundmuster, oeffentliche Website (nginx/Pages/WordPress), selbst-gehostete Dienste (Nextcloud/Gitea/Status), Cloudflare-only (Redirects/Pages/Workers), gehostete Anbieter binden (Zoho/iCloud+/Workspace), was hinter Login vs. offen
domain-cloudflare-transfer.htmlDomain von easyname zu Cloudflare Registrar – Reihenfolge, Fristen, DNS-Records, easyname-CDN-Option, E-Mail auf Zoho
tailscale.htmlTailscale – privates WireGuard-Mesh: feste Adressen + MagicDNS, Tailscale SSH (keine Keys), Auth-Keys fuer cloud-init, ACLs, Subnet-Router, Exit-Node. Danach ist am Server kein Port offen

Betrieb, Backup & Sicherheit

AnleitungWas
kosten.htmlKosten & Budget – die zentrale Preis-Referenz: aktuelle Hetzner-Server-Preise (Stand nach 15. Juni 2026: CX/CAX +30–40 %, CPX/CCX über 100 %), jeder Nebenposten (Primary-IPv4, Snapshots, Volumes, Load Balancer, Traffic, Storage Box), was ohne laufenden Server weiterkostet, IPv4 (Internet Protocol Version 4) sparen, die vier Kill-Switch-Ebenen, die Rechnung prüfen – plus Rechner und Beispielrechnungen. Alle anderen Anleitungen zeigen hierher.
backup-restore.htmlBackup & Restore – verschluesselte Restic-Backups auf eine Hetzner Storage Box: Dateien + DB-Dumps, Aufbewahrung, systemd-Timer, Totmann-Schalter, und ein getesteter Restore (Einzeldatei bis kompletter Neuaufbau)
monitoring.htmlMonitoring & Alerting – Uptime Kuma + Netdata + ntfy: sinnvolle Checks, Alarme ohne Rauschen, Status-Seite, Totmann-Schalter, und wo der Monitor laufen soll (nicht auf dem ueberwachten Server)
ci-cd.htmlCI/CD nach Hetzner – GitHub Actions baut, schiebt nach GHCR (GitHub Container Registry), deployt per SSH ueber Tailscale (kein offener Port): Environments, DB-Migrationen, Rollback, Pull-Modell, self-hosted Runner, k3s/Helm – und Jenkins. Automatisierte Fassung von scripts/deploy.ps1
secrets.htmlSecrets-Management – Passwoerter/Tokens raus aus .env: verschluesselt in Git mit SOPS (Secrets OPerationS) + age, entschluesselt nur auf Server/CI/Compose. Schluessel, .sops.yaml, Rotieren, Zugriff entziehen – plus wann Vaultwarden/Infisical/Vault besser passt
server-haertung.htmlServer-Haertung – einen oeffentlichen Server absichern: SSH, Auto-Updates, nftables (+ Docker-Firewall-Falle), CrowdSec, sysctl, Docker-Haertung, auditd, Lynis. Mit einer Liste, was Uebertreibung ist, und allem ab cloud-init
object-storage.htmlObject Storage – S3-kompatibler Speicher fuer Backups/Assets/Seiten/Medien: Hetzner Object Storage oder MinIO/Garage. Client, Policy, Versioning & Lifecycle, Website mit Cloudflare davor, App-Integration – mit Tabelle wann was und Hetzner vs R2 vs B2
disaster-runbook.htmlDisaster-Runbook – was im Notfall zu tun ist: die ersten 5 Minuten (Triage), dann je Szenario – Server kompromittiert, Daten verloren, Region-Ausfall, DNS-Problem, Secrets geleakt, Ransomware. Plus der komplette Wiederaufbau von Null, wo die Notfall-Zugaenge (2FA-Codes) liegen, und eine Checkliste zum Ausdrucken. Bindet Snapshot + Backup + DNS + Secrets + Haertung zusammen

Skripte & Dateien

In index.html#skripte lassen sich Befehle mit vollstaendig beschriebenen Parametern und Vorlagen zusammenstellen. Unpassende Kombinationen werden deaktiviert oder beanstandet; Risikofilter unterscheiden Lesen, Aendern, Kosten und Loeschen. Alle PowerShell-, Bash- und YAML-Quellen sind geschlossen eingebettet, mit Syntaxfarben, Zeilennummern, Umbruch, Suche und Treffer-Navigation.

DateiZweck
scripts/cloud.ps1Hauptskript, Podman-Variante: up / down / toggle / status / ssh, -Type/-Location, -CloudInit cloud-init.<name>.yaml waehlt die Erst-Installation
scripts/k3s.ps1k3s-Fassung von cloud.ps1 (ein k3s-host): up/down/toggle/status/ssh. Beim up kubeconfig holen + KUBECONFIG setzen, beim down erst systemctl stop k3s. Firewall 22 + 6443
scripts/sno.ps1OKD Single-Node (ganzes OpenShift auf 1 Server): install / up / down / status / ssh / console / destroy. install braucht WSL2: Server → Rescue → kexec in SCOS-Live → bootstrap-in-place (~35–45 min). Feste Primary-IP fuer up aus Snapshot. Helfer sno-wsl.sh, sno-kexec.sh
scripts/jenkins.ps1Jenkins-Server fuer den CI-Deploy auf OKD: install / up / down / status / open / ssh / destroy. install baut das Jenkins-Image aus shared-infra/jenkins/. down/up per Snapshot (analog sno.ps1, ohne feste IP). Traegt die Server-IP in okd-sno-fw:6443 ein. Helfer jenkins-setup.sh
scripts/cluster.ps1Kill-Switch fuer den OKD-Cluster: status / down. Loescht alle okd-* Server, den Load Balancer und das private Netz in einem Rutsch
scripts/snapshot.ps1Robustes Snapshot/Restore fuer einen oder mehrere Server: status/down/up/snapshots/prune, -Only, -Keep. Feste IP optional, DDNS-Hook, preDown/postUp je Server
scripts/dienste-stack.ps1Alle Docker-Compose-Stacks auf dem konsolidierten Server per SSH an/aus: status/up/down/stop/start/restart/pull/logs, -Only. Findet die Stacks unter /opt/stacks selbst, richtige Reihenfolge
scripts/cf-dns.ps1Dynamic DNS: Cloudflare-A-Records setzen (Upsert) oder -Delete, -DryRun. Hook in snapshot.ps1/cloud.ps1 beim up (setzen) und down (loeschen). Token in $env:CF_API_TOKEN
scripts/deploy.ps1Ein Projekt auf den geschuetzten Projekt-Host schieben: .\scripts\deploy.ps1 blog (statisch) oder .\scripts\deploy.ps1 api -Stack (Compose + build). rsync oder tar ueber SSH. -Source/-Delete/-DryRun/-Logs
scripts/create-shortcuts.ps1 / scripts/install-autodown.ps1Windows-Verknuepfungen (1-Klick) bzw. Aufgabenplanung fuer taegliches down. Shortcuts: -For, -ForAll und -Dest. Auto-Down: -For und -Time HH:mm (Vorgabe 03:00). Nutzen $PSScriptRoot
scripts/rates.psd1Hetzner-Stundensaetze (EUR) als Datentabelle – von cloud.ps1 / snapshot.ps1 per Import-PowerShellDataFile geladen. Bei einer Preisrunde nur diese Datei anpassen. Verbindlich bleibt Kosten & Budget
scripts/_dauer.ps1Gemeinsamer Baustein: jedes Skript bindet ihn ein und gibt am Ende Ausfuehrungszeit: X s aus
scripts/_common.ps1Gemeinsame Helfer der An/Aus-Skripte: Get-HcRates (Preise aus rates.psd1), Get-HcServer, Snapshot-Pruning, Set-HcFirewallRules (BOM-frei), Wait-HcSsh, Status-/Kostenrechnung – frueher in jedem Skript kopiert
scripts/build-suchindex.ps1Baut aus anleitungen/*.html den Volltext-Suchindex suchindex.js. Nach Aenderungen an einer Anleitung neu ausfuehren, damit das Suchfeld in index.html den ganzen Text findet (oder den install-hooks.ps1-Hook nutzen)
scripts/build-script-inhalte.ps1Baut script-inhalte.js mit allen PowerShell-, Bash- und YAML-Quelltexten sowie den aus Comment-based Help und AST gelesenen PowerShell-Parametermetadaten fuer index.html
scripts/install-hooks.ps1Einmalig pro Klon: aktiviert die versionierten Hooks in .githooks. Danach aktualisiert pre-commit je nach geaenderten Dateien automatisch suchindex.js und script-inhalte.js
tests/Scripts.Tests.ps1 / tests/index-ui.test.jsPester-Tests fuer PowerShell-Syntax, Parameterhilfe und generierte Metadaten sowie Node-Tests fuer Generatoren, Vorlagen, Validierung, Risikoklassen, Quelltextdarstellung und Anker. Aufruf: Invoke-Pester .\tests\Scripts.Tests.ps1; node .\tests\index-ui.test.js
suchindex.jsAuto-generiert (siehe build-suchindex.ps1), wird mit eingecheckt und von index.html geladen
script-inhalte.jsAuto-generierte Quelltexte fuer die standardmaessig geschlossenen Datei-Leser im Skriptbereich
scripts/cloud-init.yamlServer-Erstinstallation Podman – die Vorgabe von cloud.ps1
scripts/cloud-init.docker.yaml / scripts/cloud-init.k3s.yaml / scripts/cloud-init.host.yamlFertige Varianten fuer -CloudInit bzw. --user-data-from-file (Docker-Host / k3s-Node / geschuetzter Projekt-Host) – Vorgabe von cloud.ps1 / k3s.ps1. Eigene daneben legen: cloud-init.<name>.yaml
scripts/sno-wsl.sh / scripts/sno-kexec.shHelfer fuer sno.ps1 install: sno-wsl.sh in WSL2 (openshift-install/oc, Ignition, wait-for), sno-kexec.sh im Hetzner-Rescue (SCOS-Live per kexec, Ignition als /config.ign eingebettet)
scripts/jenkins-setup.shHelfer fuer jenkins.ps1 install: laeuft einmalig auf dem frischen Server (podman, unqualified-search-registries, Jenkins-Image bauen, Container mit --restart=always, podman-restart.service). Danach steckt alles im Snapshot
scripts/cloud-init.selfdestruct.yamlWie cloud-init.yaml, plus systemd-Dead-Man-Switch (nur mit separatem Hetzner-Projekt)
index.htmlDie Uebersichtsseite: Volltextsuche, Themen-/Datumsfilter und interaktiver Skriptbereich mit Parametereditor, Vorlagen, Risikofilter und Quelltextleser

Hinweise

Ebene 4 – wichtig

Die Selbstzerstoerung legt ein Hetzner-API-Token auf dem Server ab. Nur mit einem separaten Hetzner-Projekt verwenden, das ausschliesslich diesen einen Server enthaelt – dann kann ein geleaktes Token maximal diese eine Maschine zerstoeren.