Lokales Werkzeug · C:\Entwicklung\lernen\final_Besser\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)
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.
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.
# 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.
winget install HetznerCloud.CLI
winget install RedHat.Podman
hcloud context create heim
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
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Konfiguration (Servergroesse, Key-Name, …) steht oben in scripts/cloud.ps1.
.\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.
| Datei | Zweck |
|---|---|
| scripts/create-shortcuts.ps1 | Windows-Verknuepfungen fuer eine Plattform oder mit -ForAll fuer alle; -Dest bestimmt den Zielordner |
| scripts/install-autodown.ps1 | Aufgabenplanung: taeglich zur mit -Time HH:mm gewaehlten Uhrzeit automatisch down (Vorgabe 03:00) |
| scripts/cloud-init.selfdestruct.yaml | optional: Server loescht sich nach 12 h selbst (separates Hetzner-Projekt!) |
.\scripts\create-shortcuts.ps1 -ForAll
.\scripts\install-autodown.ps1 -For cloud -Time '03:00'
Start-ScheduledTask -TaskName 'Cloud-Host Auto-Down', danach
.\scripts\cloud.ps1 status – muss AUS zeigen.
Alle Dateien liegen in anleitungen/. Der Name verlinkt die online lesbare Fassung. Gruppen wie in index.html.
Die Spalte „Groesse / Kosten“ ist Stand nach der Hetzner-Erhoehung 15. Juni 2026. Verbindliche, aktuelle Tabelle mit allen Nebenposten: Kosten & Budget.
| Anleitung | Was |
|---|---|
| server-basis.html | Server-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.html | Panel-Referenz – alles im Webpanel statt per hcloud: Projekt ≠ Server, Server-Wizard Feld fuer Feld, Firewall/Netzwerk/Volumes/Snapshots, Kosten, Projekt-Strategie |
| grundausstattung.html | Checkliste 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.ps1 | Server 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.html | Podman & 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 |
| Anleitung | Was | Groesse / Kosten |
|---|---|---|
| developer-sandbox.html | OpenShift Developer Sandbox (kostenlos, gehostet, oc) | 0 € |
| container-host-hetzner.html | Podman oder Docker (Umschalter), per podman/docker | 1 Node, ~20 € (CX/CAX falls frei ~11) |
| k3s-hetzner.html | k3s – leichtes Kubernetes, per kubectl | 1+ Node, ab ~8 €/Mon |
| okd-single-node-hetzner.html | OKD (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 ab | 1 Node CPX52 ~0,14 €/h |
| okd-cluster-hetzner.html | OKD 4 – echter mehrknotiger OpenShift-Cluster, per oc | 3+ Nodes + LB (Load Balancer), ~450 €/Mon |
| microservices-stack-hetzner.html | Lokalen podman-compose-/Helm-Microservices-Stack in 3 Stufen auf Hetzner | ~5–30 €/Mon |
| bibliothek-enterprise-hetzner.html | Komplett-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.html | CI (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 + Fix | 2 Server (OKD cpx52 + Jenkins cpx42) ~0,24 €/h |
| jenkins-lokal-aus-hetzner-snapshot.html | Runbook: 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 Fix | 0 Server – podman-machine |
| Anleitung | Was | Groesse / Kosten |
|---|---|---|
| wordpress-hetzner.html | WordPress – Cloud-Server + CloudPanel + Cloudflare + Backups, oder managed Webhosting | 1 Node, ~20–36 € (CX/CAX falls frei ~11) |
| vaultwarden-hetzner.html | Vaultwarden – eigener Bitwarden-Server (Docker + Caddy), offizielle Apps | 1 Node, ~20 € (CX/CAX falls frei ~11) |
| nextcloud-hetzner.html | Nextcloud – 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 Schritt | 1 Node, ~35–70 € (CX/CAX falls frei ~21) |
| mail-hetzner.html | Eigener 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 Einschaetzung | 1 eigener Node, ~35 € (CX/CAX falls frei ~11) + Pflege |
| blog.html | Statischer Blog – Markdown → Hugo/Astro → Cloudflare Pages (gratis) oder nginx-Container oder Bucket. Bilder, giscus, Pagefind, Analytics ohne Cookies, CI/CD (Continuous Delivery), WordPress-Migration | 0 € |
geschuetzter-projekt-host.html / deploy.ps1 | Projekte 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.ps1 | Konsolidieren – 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/aus | 1 Server statt 3–5 |
| Anleitung | Was |
|---|---|
| domain-baukasten.html | Was 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.html | Domain von easyname zu Cloudflare Registrar – Reihenfolge, Fristen, DNS-Records, easyname-CDN-Option, E-Mail auf Zoho |
| tailscale.html | Tailscale – 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 |
| Anleitung | Was |
|---|---|
| kosten.html | Kosten & 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.html | Backup & 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.html | Monitoring & 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.html | CI/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.html | Secrets-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.html | Server-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.html | Object 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.html | Disaster-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 |
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.
| Datei | Zweck |
|---|---|
| scripts/cloud.ps1 | Hauptskript, Podman-Variante: up / down / toggle / status / ssh, -Type/-Location, -CloudInit cloud-init.<name>.yaml waehlt die Erst-Installation |
| scripts/k3s.ps1 | k3s-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.ps1 | OKD 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.ps1 | Jenkins-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.ps1 | Kill-Switch fuer den OKD-Cluster: status / down. Loescht alle okd-* Server, den Load Balancer und das private Netz in einem Rutsch |
| scripts/snapshot.ps1 | Robustes 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.ps1 | Alle 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.ps1 | Dynamic 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.ps1 | Ein 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.ps1 | Windows-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.psd1 | Hetzner-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.ps1 | Gemeinsamer Baustein: jedes Skript bindet ihn ein und gibt am Ende Ausfuehrungszeit: X s aus |
| scripts/_common.ps1 | Gemeinsame 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.ps1 | Baut 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.ps1 | Baut 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.ps1 | Einmalig 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.js | Pester-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.js | Auto-generiert (siehe build-suchindex.ps1), wird mit eingecheckt und von index.html geladen |
| script-inhalte.js | Auto-generierte Quelltexte fuer die standardmaessig geschlossenen Datei-Leser im Skriptbereich |
| scripts/cloud-init.yaml | Server-Erstinstallation Podman – die Vorgabe von cloud.ps1 |
| scripts/cloud-init.docker.yaml / scripts/cloud-init.k3s.yaml / scripts/cloud-init.host.yaml | Fertige 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.sh | Helfer 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.sh | Helfer 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.yaml | Wie cloud-init.yaml, plus systemd-Dead-Man-Switch (nur mit separatem Hetzner-Projekt) |
| index.html | Die Uebersichtsseite: Volltextsuche, Themen-/Datumsfilter und interaktiver Skriptbereich mit Parametereditor, Vorlagen, Risikofilter und Quelltextleser |
install-autodown.ps1 ist der Schutzmechanismus.down behaelt immer den neuesten Snapshot und loescht aeltere.down sind dann weg.CX33/CAX21 ≈ 8,5–10,5 €/Monat, falls gerade frei.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.