← Übersicht  ·  Skripte & Dateien  ·  cloud-host · Domain

Domain-Baukasten

Was du alles über seb4u.com laufen lassen kannst: eine öffentliche Website, selbst-gehostete Dienste (Nextcloud, Gitea, Status-Seite) auf dem Hetzner-Server, und Cloudflare-only (Weiterleitungen, Pages, Workers) – ohne Server. Mit Subdomain-Plan, dem DNS-Grundmuster und je einem kompakten Rezept.

Stand: 30. August 2026 baut auf: Domain bei Cloudflare + Projekt-Host je Dienst ~0–2 €/Mon extra

Platzhalter einsetzen – nur im Browser

Subdomain-Plan

Ein Vorschlag. Jede Zeile ist unten ein Rezept. öffentlich Login Cloudflare, kein Server

SubdomainDienstWo
@ / wwwöffentliche Website / Blog / PortfolioServer oder Pagesoffen
cloudNextcloud – Dateien, Kalender, KontakteServerLogin (eigener)
gitGitea – eigene ReposServerLogin (eigener)
statusUptime Kuma – Status & AlarmServeroffen (Status-Seite)
apiBackends für eigene AppsServerje nach App
lab, demo, testProjekt-Demos, PreviewsServerAccess
go / linksKurzlinks / WeiterleitungenCloudflareRedirect Rule
docsDoku-Site aus einem Git-RepoCloudflare Pagesgratis
hookWebhook-Empfänger, Mini-APICloudflare Workergratis
mail-Records (MX…)E-MailZoho (extern)siehe Domain-Umzug, Abschnitt 7
Basis

Der Server-Teil setzt den Geschützten Projekt-Host voraus (Cloudflare-Tunnel, Docker-Netz web, /opt/stacks). Der Cloudflare-Teil braucht nur die Zone. Alles baut auf Domain zu Cloudflare umziehen.

1 DNS: Records erklärt + Grundmuster

Ein DNS-Record ist ein Eintrag in der Zone deiner Domain: Name → Typ → Wert. Der Resolver fragt danach, um herauszufinden, wohin eine Anfrage geht.

Die Record-Typen

TypWofürBeispiel-Wert
AName → IPv4 (Internet Protocol Version 4). Der häufigste Record.203.0.113.10
AAAAName → IPv6 (Internet Protocol Version 6).2a01:4f8:c17:...
CNAMEName = Alias für einen anderen Namen. Kein CNAME (Canonical Name) neben anderen Records am selben Namen. Am Apex (@) nur, weil Cloudflare „flattening“ macht.meine-app.pages.dev
MXWohin E-Mail für die Domain geht, mit Priorität (kleiner = zuerst).10 mail.seb4u.com
TXTFreitext. Trägt: SPF (Sender Policy Framework), DKIM (DomainKeys Identified Mail), DMARC (Domain-based Message Authentication, Reporting and Conformance), Domain-Verifizierungen (google-site-verification=, apple-domain=).v=spf1 include:zoho.eu ~all
SRVEndpunkt eines Dienstes: _dienst._proto → Prio Gewicht Port Ziel. Autodiscover, VoIP, Matrix, Minecraft.0 1 443 mail.seb4u.com
NSAn welche Nameserver eine (Sub-)Zone delegiert ist. Die der Root-Zone verwaltet der Registrar.aria.ns.cloudflare.com
CAAWelche Zertifizierungsstelle Zertifikate für die Domain ausstellen darf.0 issue "letsencrypt.org"
SOAKopf der Zone (Seriennummer, TTLs). Verwaltet Cloudflare automatisch.
PTRReverse: IP (Internet Protocol) → Name. Steht nicht in deiner Zone, sondern beim IP-Besitzer (Hetzner-Console). Pflicht für einen eigenen Mailserver.mail.seb4u.com

Die drei E-Mail-TXT-Records

  • SPF (@, TXT): welche Server dürfen für die Domain senden. v=spf1 include:zoho.eu -all-all hart (Rest ablehnen), ~all weich. Nur ein SPF-Record pro Domain.
  • DKIM (<selector>._domainkey, TXT/CNAME): der öffentliche Schlüssel, mit dem Empfänger die Signatur deiner Mails prüfen. Den privaten Teil hält dein Mail-Anbieter.
  • DMARC (_dmarc, TXT): was tun mit Mail, die SPF und DKIM nicht bestehtp=none (nur beobachten) → p=quarantinep=reject. rua=mailto:… = wohin die Report-Mails.

TTL, Proxy, Propagation

  • TTL (Time To Live) = wie lange ein Resolver den Wert zwischenspeichern darf. Vor einem Umzug niedrig setzen (60 s), sonst Auto (bei Cloudflare 300 s proxied). Änderungen sind erst überall da, wenn die alte TTL abgelaufen ist.
  • Proxy bei Cloudflare: orange = HTTP(S)-Traffic läuft durch Cloudflare (CDN, WAF, verbirgt die Server-IP). Grau = Cloudflare löst nur den Namen auf. MX/TXT/SRV haben keinen Proxy. Mail-Namen (mail.) und Records für Zertifikats-Challenges nie proxen.
  • Apex / @ = die Domain selbst (seb4u.com), alles andere ist eine Subdomain (blog., mail.…).
Laptop · einen Record prüfen
Resolve-DnsName blog.seb4u.com -Type A     -Server 1.1.1.1
Resolve-DnsName seb4u.com -Type MX          -Server 1.1.1.1
Resolve-DnsName _dmarc.seb4u.com -Type TXT  -Server 1.1.1.1
# -Server 1.1.1.1 fragt einen oeffentlichen Resolver, umgeht den lokalen Cache

Grundmuster: welcher Record wofür

Je nachdem, wohin ein neuer Name zeigen soll.

ZielEintragProxy
Dienst auf dem Server, über den TunnelTunnel-Dashboard → Public Hostnames → Add. Cloudflare legt den CNAME automatisch an.immer proxied
Dienst auf dem Server, über Traefik (Variante Mehrere Dienste)A auf die Server-IP (am besten eine Primary IP)orange, sobald Zertifikat steht
Cloudflare Pagesim Pages-Projekt Custom domain hinzufügen – Record entsteht automatischproxied
Cloudflare WorkerWorker → Triggers → Custom Domainproxied
Weiterleitung (kein Backend)AAAA-Sub auf 100:: (Discard-Prefix), proxied – dann greift die Redirect Ruleproxied (nötig)
Extern (GitHub Pages, anderer Host)CNAME auf deren HostnamenDNS only (grau)
E-Mail-Anbieter (Zoho, iCloud+, Workspace)MX + TXT (SPF) + DKIM + DMARC nach Vorgabe des Anbietersalle grau
Merksatz

Tunnel-Dienste und Cloudflare-Sachen (Pages, Workers) legen ihren DNS-Eintrag selbst an – du klickst nur den Hostnamen. Von Hand tippst du Records nur für Traefik-Dienste (A auf die IP), externe Ziele (CNAME, grau) und E-Mail (MX/TXT).

2 Öffentliche Website (@ / www)

Ohne Login, für alle. Drei Wege – vom simpelsten zum flexibelsten.

Drei Fragen, bis der Browser weiß, wohin – und warum eine Änderung nicht sofort wirkt.

Zeichnung aus Diagramme: Hetzner & CRC (32).

dein Rechner Stub-Resolver rekursiver Resolver 1.1.1.1 oder der des Providers blog.seb4u.com? UDP 53 1 · Root-Server (.) „für .com frag die da“ 2 · TLD-Server (.com) „für seb4u.com frag Cloudflare“ 3 · autoritativer Server der Einzige, der die Antwort kennt hier stehen deine Records UDP 53 · drei Fragen, eine je Ebene A 203.0.113.10, TTL 300 Antwort · wird 300 s gemerkt Was dort stehen kann A eine IPv4-Adresse AAAA eine IPv6-Adresse CNAME ein anderer Name statt Adresse TXT freier Text – ACME, SPF MX wohin die Post geht Am Apex (seb4u.com selbst) ist ein CNAME nicht erlaubt – nur A / AAAA TTL – warum die Änderung nicht wirkt Jede Antwort trägt eine Haltbarkeit. Bis die abläuft, antwortet jeder Resolver auf dem Weg aus dem Gedaechtnis – ohne zu fragen. Bei TTL 3600 sehen manche noch eine Stunde die alte Adresse, während andere schon die neue haben. Beides gleichzeitig. Deshalb: TTL vor einem Umzug senken, danach wieder anheben. Und beim Prüfen den Resolver angeben: -Server 1.1.1.1. nip.io – der Trick ohne eigene Domain Ein autoritativer Server, der die Adresse aus dem Namen liest: api.lab.203.0.113.10.nip.io → 203.0.113.10 Damit löst jede Subdomain auf, ohne dass ein Record angelegt wird. Genau das braucht OpenShift, das api.<cluster> und *.apps.<cluster> auflösbar verlangt. Für ein Lab ideal – für Produktion nicht: die IP steht im Namen, und der Dienst ist fremd. Der lokale Sonderfall: apps-crc.testing löst kein DNS-Server der Welt auf. CRC trägt dafür einen Eintrag in die Windows-hosts-Datei ein – und die wird vor jeder DNS-Frage gelesen. Deshalb funktioniert der Name auf dem Host und nirgends sonst. Und deshalb ist die WSL-Falle aus Zeichnung 09 genau hier verwurzelt: die WSL-Maschine hat ihre eigene hosts-Datei. Was Windows kennt, kennt sie nicht – man muss es dort noch einmal eintragen, und zwar mit der Gateway-Adresse statt mit 127.0.0.1. Reihenfolge der Auflösung, immer gleich: hosts-Datei → Cache → rekursiver Resolver → die Kette oben.
Niemand kennt die ganze Antwort – jeder kennt den Nächsten. Das macht DNS robust und zugleich träge: zwischen Änderung und Wirkung liegt die TTL, und in dieser Zeit sehen verschiedene Leute verschiedene Wahrheiten. Wer das einkalkuliert, senkt die TTL vorher – wer nicht, sucht den Fehler im Server.

Der Unterschied zwischen grauer und oranger Wolke – und wann die orange schadet.

Zeichnung aus Diagramme: Hetzner & CRC (07).

Besucher DNS – A-Record blog, vault, @ UDP 53 graue Wolke DNS zeigt direkt auf den Server TLS endet am Server orange Wolke DNS zeigt auf Cloudflare TLS endet dort, echte IP verborgen nur HTTP/HTTPS – sonst nichts A-Record A-Record auf Cloudflare Server (Origin) Reverse Proxy + Let's Encrypt braucht Port 80 für die Zertifikatsprüfung HTTPS 443 · eine TLS-Strecke HTTPS 443 · zweite TLS-Strecke Die orange Wolke verbirgt die Server-IP und fängt Angriffe ab – aber sie spricht nur HTTP. Ein SSH- oder Mailserver dahinter ist schlicht nicht mehr erreichbar. Deshalb wird sie pro Record gesetzt, nicht pro Domain.
Der Proxy ist eine Eigenschaft des einzelnen Records, nicht der Domain. Für blog und www ist er sinnvoll, für einen Record, hinter dem SSH oder Mail liegt, macht er den Dienst unerreichbar – und der Fehler sieht dann nach einem Serverproblem aus.

A – Cloudflare Pages kein Server, gratis

  1. Frontend-/Static-Site-Repo bei GitHub (Angular-dist, Astro, Hugo, plain HTML).
  2. Cloudflare-Dashboard → Workers & Pages Create Pages Connect to Git → Repo, Build-Command (npm run build), Output-Ordner (dist).
  3. Nach dem Build: Custom domainsseb4u.com und www hinzufügen. Cloudflare setzt die Records.
  4. Jeder git push deployt neu. Preview-URLs pro Branch inklusive.
Bester Default

Für eine statische Seite ist Pages fast immer richtig: nichts zu betreiben, kein Update, kein Patchen, globales CDN (Content Delivery Network), gratis. Der Hetzner-Server bleibt für die Sachen, die wirklich einen Server brauchen.

B – nginx-Container auf dem Server

Wenn du die Seite lieber per deploy.ps1 aus dem gleichen Workflow schiebst (siehe Projekt-Host, Schritt 4). Tunnel-Hostname @ / wwwhttp://web-www:80. Wichtig: für diese Hostnamen keine Cloudflare-Access-App anlegen – sonst kommt ein Login davor.

C – WordPress

Dynamische Seite mit Redaktion: eigene Anleitung WordPress auf Hetzner.

3 Nextcloud – cloud.seb4u.com

Dateien, Kalender, Kontakte, Foto-Sync. Hat einen eigenen Login – Cloudflare Access davor ist optional (zweite Tür).

Datei · /opt/stacks/nextcloud/compose.yaml
services:
  app:
    image: nextcloud:30-apache
    restart: unless-stopped
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: ${DB_PW}
      REDIS_HOST: redis
      NEXTCLOUD_TRUSTED_DOMAINS: cloud.seb4u.com
      OVERWRITEPROTOCOL: https            # wichtig hinter dem Tunnel
      OVERWRITECLIURL: https://cloud.seb4u.com
    volumes: [ nc_data:/var/www/html ]
    networks: [ web, internal ]
  db:
    image: mariadb:11.4
    restart: unless-stopped
    command: [ --transaction-isolation=READ-COMMITTED, --innodb-buffer-pool-size=256M ]
    environment:
      MARIADB_DATABASE: nextcloud
      MARIADB_USER: nextcloud
      MARIADB_PASSWORD: ${DB_PW}
      MARIADB_RANDOM_ROOT_PASSWORD: "yes"
    volumes: [ nc_db:/var/lib/mysql ]
    networks: [ internal ]
  redis:
    image: redis:7-alpine
    restart: unless-stopped
    networks: [ internal ]
volumes: { nc_data: {}, nc_db: {} }
networks:
  web: { name: web, external: true }
  internal: {}
  1. .env: DB_PW= (langes Zufallspasswort), chmod 600.
  2. docker compose up -d. Tunnel → Public Hostname cloudhttp://nextcloud-app-1:80 (docker compose ps zeigt den genauen Namen. Per container_name: festnageln ist sauberer).
  3. https://cloud.seb4u.com → Admin-Konto anlegen. Danach in Nextcloud die App Calendar, Contacts, Memories aktivieren.
RAM (Random Access Memory)

Nextcloud + MariaDB + Redis wollen ~1–1,5 GB (Gigabyte). Auf einem CAX11 neben Kleinkram geht das knapp. Neben WordPress lieber CPX32.

4 Gitea – git.seb4u.com

Eigene Repos, Issues, Actions-CI. ~200 MB (Megabyte) RAM. Eigener Login.

Datei · /opt/stacks/gitea/compose.yaml
services:
  gitea:
    image: gitea/gitea:1.22
    restart: unless-stopped
    environment:
      GITEA__server__ROOT_URL: https://git.seb4u.com/
      GITEA__server__SSH_DOMAIN: git.seb4u.com
      GITEA__server__SSH_PORT: "2222"
      GITEA__service__DISABLE_REGISTRATION: "true"
    volumes:
      - gitea:/data
    ports:
      - "2222:22"          # nur fuer 'git clone ssh://' - eigene Firewall-Regel noetig
    networks: [ web ]
volumes: { gitea: {} }
networks:
  web: { name: web, external: true }
  1. Cloud-Firewall: Regel für TCP (Transmission Control Protocol) 2222 hinzufügen (Git-SSH geht nicht durch den HTTP-Tunnel). Alternativ Gitea nur über HTTPS (Hypertext Transfer Protocol Secure) nutzen und Git per Token/HTTPS klonen – dann ports: weglassen.
  2. Tunnel → Public Hostname githttp://gitea:3000.
  3. Erstaufruf legt den Admin an. Danach Registrierung aus (schon per Env gesetzt).

5 Status-Seite – status.seb4u.com

Uptime Kuma prüft deine Dienste und zeigt eine öffentliche Status-Seite. Am besten auf einem anderen Host – sonst meldet es sich nicht, wenn der Server weg ist.

Datei · /opt/stacks/status/compose.yaml
services:
  kuma:
    image: louislam/uptime-kuma:1
    restart: unless-stopped
    volumes: [ kuma:/app/data ]
    networks: [ web ]
volumes: { kuma: {} }
networks:
  web: { name: web, external: true }
  1. Tunnel → statushttp://kuma:3001. Erstaufruf = Admin anlegen.
  2. Monitore hinzufügen: HTTP(s) auf https://cloud.…, https://git.… usw. – von außen, damit auch Tunnel-Ausfälle auffallen.
  3. Benachrichtigung: Telegram / E-Mail / ntfy. Status Page anlegen, die darfst du öffentlich lassen (keine Access-App für status).
Henne-Ei

Kuma auf demselben Server wie die überwachten Dienste merkt einen Serverausfall nicht. Optionen: eine zweite Mini-Box (anderer Anbieter / daheim), oder ein externer Ping-Dienst (UptimeRobot Free) zusätzlich nur auf status.seb4u.com.

6 Weitere Dienste Kurzrezepte

Alle nach demselben Muster: Stack unter /opt/stacks/<name>, ans web-Netz, Tunnel-Hostname, Access je nach Bedarf.

DienstImagePortSubdomain / Zugriff
FreshRSS – RSS-Readerfreshrss/freshrss80rss · eigener Login
linkding – Bookmarkssissbruecker/linkding9090links · eigener Login
BookStack – Wikilscr.io/linuxserver/bookstack80wiki · eigener Login
Vaultwarden – Passwörtervaultwarden/server80vault · eigener Server empfohlen (Guide)
Plausible – Analyticsplausible/analytics8000stats · braucht ClickHouse + Postgres, ~1 GB
Stirling-PDF / IT-Toolsstirlingtools/stirling-pdf8080tools · Access

7 Weiterleitungen / Kurzlinks

Kein Server. go.seb4u.com/xyz → irgendeine lange URL (Uniform Resource Locator).

  1. DNS: AAAA go100::, proxied (ein Discard-Ziel, das nie antwortet – die Regel übernimmt).
  2. Rules Redirect Rules Create rule
  3. Einzelziel: When Hostname equals go.seb4u.comThen Static redirect → deine Ziel-URL, Status 301.
  4. Mehrere Kürzel: Bulk Redirects – eine Liste go.…/gh → https://github.com/… als CSV (Comma-Separated Values) hochladen.

Klassiker: www@ (oder umgekehrt), alte Pfade auf neue, eine cv.seb4u.com auf ein PDF (Portable Document Format) in R2/Pages.

8 Cloudflare Pages

Statische Sites und SPAs direkt aus einem Git-Repo – gratis gehostet, global, mit CI (Continuous Integration).

  • Gut für: Doku (docs), Portfolio, Landingpages, Angular-/React-Builds, Astro/Hugo/Next (static export).
  • Build läuft bei Cloudflare. Du pushst nur ins Repo. Pro Pull-Request eine Preview-URL.
  • Functions: kleine serverseitige Endpunkte im selben Projekt (/functions/api/….ts) – für Formulare, Auth-Callbacks.
  • Custom domain im Projekt hinzufügen → docs.seb4u.com.
Wann Pages statt Server

Sobald „Website“ = Dateien ausliefern (evtl. mit einem Build-Schritt), nimm Pages. Der Server ist für Dienste mit Zustand, Datenbank, Hintergrundprozessen.

9 Cloudflare Workers

Kleine Funktionen am Rand – kein Server, 100 000 Requests/Tag gratis.

Laptop · ein Worker
npm create cloudflare@latest hook -- --type=hello-world
cd hook
# src/index.ts anpassen - z.B. Webhook annehmen, in eine Queue / KV / Discord schreiben
npx wrangler deploy
# dann: Dashboard -> Worker -> Settings -> Triggers -> Custom Domain: hook.seb4u.com
  • Typische Rollen: Webhook-Empfänger (GitHub/Stripe/…), kleine JSON-API, Redirect-Logik, Bot für Telegram/Discord, Bild-Resize, Auth-Gateway vor einer Origin.
  • Zustand: KV (einfache Key-Values), D1 (SQLite), R2 (Objektspeicher, S3-kompatibel), Queues.
  • Cron: wrangler.toml[triggers] crons = ["0 * * * *"] für periodische Jobs ohne Server.

10 E-Mail / Kalender / Dateien: gehostete Anbieter an die Domain binden

Kein Server. Ein paar DNS-Einträge, dann laufen deine @seb4u.com-Adressen bei einem großen Anbieter – in dessen App.

E-Mail

Willst duWeg~€/Mon
Postfach + App (Webmail, Handy), einfachZoho Mail Forever Free – siehe Domain zu Cloudflare umziehen, Abschnitt 70
Dasselbe, aber mit IMAP (Thunderbird/Outlook/…)Zoho Mail Lite, mailbox.org, Fastmail, Proton Mail Plus – MX (Mail-Exchange-Record)/SPF/DKIM des Anbieters in Cloudflare~1–5
@seb4u.com in Apple Mail / iCloudiCloud+ Custom Email Domain – braucht irgendeinen bezahlten iCloud+-Plan (ab 0,99 €, 50 GB). Bis 5 Domains à 3 Adressen. Apple liefert MX/SPF/DKIM/DMARC + Verifizierungs-TXT → in Cloudflare eintragen.ab ~1
@seb4u.com in der Gmail-OberflächeGoogle Workspace – Domain hinzufügen, TXT-Verifizierung, MX → Google. Danach ganz normal in Gmail/App.~6 / Nutzer
… im kostenlosen Gmail lesen/sendenGmail → Einstellungen → Konten → „Senden als“ + „E-Mail aus anderen Konten abrufen (POP3)“. Braucht ein IMAP/POP-Backend (Zoho Lite, mailbox.org, eigener Mailcow). Abruf verzögert.1+
Kein Gratis-Gmail an der Domain

Das alte kostenlose „G Suite / Gmail for your domain“ wurde 2022 beendet. @seb4u.com in der echten Gmail-Oberfläche gibt es nur mit Workspace. Zoho Free hat kein IMAP/POP (Post Office Protocol) – der Gmail-Trick oben braucht mindestens Zoho Lite.

iCloud+ Custom Email Domain – Schritt für Schritt

Voraussetzung: ein bezahlter iCloud+-Plan (50 GB / 200 GB / 2 TB – Family Sharing zählt). Bis zu 5 Domains, je 3 Adressen pro Person. Kein Catch-all.

  1. Zoho vorher sichern. Custom Email Domain übernimmt die MX – sobald du umstellst, empfängt Zoho nichts mehr. Gebrauchte Mails vorher aus dem Zoho-Webmail exportieren (oder per imapsync nach dem Umzug in iCloud ziehen).
  2. Einstieg: iPhone/iPad Einstellungen → [dein Name] → iCloud → iCloud Mail → Eigene E-Mail-Domain, Mac Systemeinstellungen → Apple-Account → iCloud → iCloud Mail → Eigene E-Mail-Domain, oder Web: icloud.com/icloudplus/customdomain.
  3. Domain hinzufügen → Nur du (oder Du und weitere Personen) → seb4u.com eingeben.
  4. Mindestens eine Adresse anlegen, z. B. du@seb4u.com.
  5. Apple zeigt jetzt die DNS-Einträge. In Cloudflare eintragen (alle DNS only / grau), die alten Zoho-Records vorher löschen (MX, SPF-include:zoho, DKIM-CNAME, autoconfig/autodiscover):
NameTypWert (Muster – genaue Werte zeigt Apple)
@MXmx01.mail.icloud.com  Prio 10
@MXmx02.mail.icloud.com  Prio 10
@TXT (Text-Record)v=spf1 include:icloud.com ~all
sig1._domainkeyCNAMEsig1.dkim.seb4u.com.at.icloudmailadmin.com (von Apple generiert)
@TXTapple-domain=<code von Apple>  (Domain-Verifizierung)
_dmarcTXTv=DMARC1; p=quarantine;  (Apple schlägt das vor)
  1. Zurück bei Apple auf Setup abschließen – die Records werden geprüft (kann ein paar Minuten dauern).
  2. In Mail (Apple) die neue Adresse als Standard-Absender setzen. Webmail: icloud.com/mail.
  3. Nicht-Apple-Zugriff (Thunderbird/Outlook/Android): ein app-spezifisches Passwort auf appleid.apple.comAnmeldung & Sicherheit → App-spezifische Passwörter erzeugen. Server: imap.mail.me.com:993 (SSL), smtp.mail.me.com:587 (STARTTLS), Benutzername = deine Haupt-iCloud-Adresse (nicht die Custom-Adresse), Passwort = das app-spezifische. „Von“ dann auf du@seb4u.com stellen.
Kontrolle

Von einer fremden Adresse an du@seb4u.com schreiben → kommt in Apple Mail an. Rückantwort mit mail-tester.com gegenchecken (SPF/DKIM/DMARC PASS).

Kalender & Kontakte

  • Google Workspace / iCloud: Kalender läuft über das Konto, nicht über die Domain – iCloud+ bindet nur die E-Mail an seb4u.com, der Kalender bleibt an der Apple-ID.
  • Domain-gebunden geht das nur selbst gehostet: Nextcloud (Abschnitt 3) mit CalDAV (Calendaring Extensions to WebDAV)/CardDAV (vCard Extensions to WebDAV) unter cloud.seb4u.com.

Dateien (Drive-artig)

  • Persönliches Google Drive lässt sich nicht auf drive.seb4u.com legen. Workspace gibt dir Drive/Docs unter @seb4u.com-Konten.
  • Ohne Workspace: Nextcloud (eigener Server), Cloudflare R2 + ein Worker als S3-artiger Speicher, oder ein statischer Datei-Host.
  • Vanity: drive.seb4u.com als Weiterleitung auf deinen Drive-Ordner-Link – nur ein Shortcut.
Für eine Person am günstigsten

Apple-Nutzer: iCloud+ Custom Domain (~1 €, + 50 GB Speicher). Sonst: Zoho Mail Lite (1 €, dann IMAP überall einbindbar). Ganzes Google-Paket: Workspace (6 €). Ganz frei + volle Kontrolle: Nextcloud + eigener Mailserver (eigene Guides).

11 Login: was schützen, was offen

FallZugriff
Öffentliche Website, Status-Seite, Dokuoffenkeine Access-App für diese Hostnamen
Nextcloud, Gitea, FreshRSS, BookStackhaben eigenen Login – Access optional als zweite Tür
Projekt-Demos, Tools ohne eigene Auth, Admin-OberflächenCloudflare Access – eigene App pro Hostname, Policy = deine E-Mail
API (Application Programming Interface) für Skripte/CIAccess Service Token (Header statt Browser-Login)
Wildcard vorsichtig

Eine Access-App auf *.seb4u.com sperrt alles – auch die öffentliche Seite. Für gemischt offen/geschützt: pro Hostname eine App. Oder eine Wildcard-App plus Bypass-Policy (Everyone) für die öffentlichen Namen.

+ Neuen Dienst hinzufügen

  1. /opt/stacks/<name>/compose.yaml anlegen, Service ins web-Netz, kein ports: (außer Sonderfall wie Gitea-SSH).
  2. docker compose up -d (oder deploy.ps1 <name> -Stack).
  3. Tunnel-Dashboard → Public Hostname <name> . seb4u.comhttp://<container>:<port>.
  4. Braucht Login und hat keinen eigenen? → Access-App für den Hostnamen + Policy.
  5. Ins Monitoring (Uptime Kuma) aufnehmen und ins Backup-Skript.

+ Kosten

Preise sind Richtwerte. Hetzner hat 2026 zweimal erhöht (zuletzt 15. Juni: CX/CAX +30–40 %, CPX/CCX über 100 %). Aktuelle Server-Preise, alle Nebenposten, ein Rechner und Beispielrechnungen stehen zentral in Kosten & Budget.

Posten~€/Mon
Server (CAX11 für Website + Status + 1–2 kleine Dienste)~3,8
Server größer (CPX32 / CAX21 ARM, wenn Nextcloud/WordPress/Gitea zusammen)~11–36
Cloudflare: Zone, Tunnel, Access (≤50), Pages, Workers-Free, Redirect Rules0
Zoho Mail (Forever Free)0
Backup: Hetzner Storage Box BX11 – optional~3,8
Realistisch: Website + Mail + ein paar Dienste~4–12
⌂ Cockpit