Subdomain-Plan
Ein Vorschlag. Jede Zeile ist unten ein Rezept. öffentlich Login Cloudflare, kein Server
| Subdomain | Dienst | Wo | |
|---|---|---|---|
@ / www | öffentliche Website / Blog / Portfolio | Server oder Pages | offen |
cloud | Nextcloud – Dateien, Kalender, Kontakte | Server | Login (eigener) |
git | Gitea – eigene Repos | Server | Login (eigener) |
status | Uptime Kuma – Status & Alarm | Server | offen (Status-Seite) |
api | Backends für eigene Apps | Server | je nach App |
lab, demo, test | Projekt-Demos, Previews | Server | Access |
go / links | Kurzlinks / Weiterleitungen | Cloudflare | Redirect Rule |
docs | Doku-Site aus einem Git-Repo | Cloudflare Pages | gratis |
hook | Webhook-Empfänger, Mini-API | Cloudflare Worker | gratis |
mail-Records (MX…) | Zoho (extern) | siehe Domain-Umzug, Abschnitt 7 |
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
| Typ | Wofür | Beispiel-Wert |
|---|---|---|
A | Name → IPv4 (Internet Protocol Version 4). Der häufigste Record. | 203.0.113.10 |
AAAA | Name → IPv6 (Internet Protocol Version 6). | 2a01:4f8:c17:... |
CNAME | Name = 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 |
MX | Wohin E-Mail für die Domain geht, mit Priorität (kleiner = zuerst). | 10 mail.seb4u.com |
TXT | Freitext. 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 |
SRV | Endpunkt eines Dienstes: _dienst._proto → Prio Gewicht Port Ziel. Autodiscover, VoIP, Matrix, Minecraft. | 0 1 443 mail.seb4u.com |
NS | An welche Nameserver eine (Sub-)Zone delegiert ist. Die der Root-Zone verwaltet der Registrar. | aria.ns.cloudflare.com |
CAA | Welche Zertifizierungsstelle Zertifikate für die Domain ausstellen darf. | 0 issue "letsencrypt.org" |
SOA | Kopf der Zone (Seriennummer, TTLs). Verwaltet Cloudflare automatisch. | – |
PTR | Reverse: 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–-allhart (Rest ablehnen),~allweich. 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 besteht –p=none(nur beobachten) →p=quarantine→p=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/SRVhaben 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.…).
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.
| Ziel | Eintrag | Proxy |
|---|---|---|
| Dienst auf dem Server, über den Tunnel | Tunnel-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 Pages | im Pages-Projekt Custom domain hinzufügen – Record entsteht automatisch | proxied |
| Cloudflare Worker | Worker → Triggers → Custom Domain | proxied |
| Weiterleitung (kein Backend) | AAAA-Sub auf 100:: (Discard-Prefix), proxied – dann greift die Redirect Rule | proxied (nötig) |
| Extern (GitHub Pages, anderer Host) | CNAME auf deren Hostnamen | DNS only (grau) |
| E-Mail-Anbieter (Zoho, iCloud+, Workspace) | MX + TXT (SPF) + DKIM + DMARC nach Vorgabe des Anbieters | alle grau |
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).
Der Unterschied zwischen grauer und oranger Wolke – und wann die orange schadet.
Zeichnung aus Diagramme: Hetzner & CRC (07).
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
- Frontend-/Static-Site-Repo bei GitHub (Angular-
dist, Astro, Hugo, plain HTML). - Cloudflare-Dashboard →
→ Repo, Build-Command (
npm run build), Output-Ordner (dist). - Nach dem Build: Custom domains → seb4u.com
und
wwwhinzufügen. Cloudflare setzt die Records. - Jeder
git pushdeployt neu. Preview-URLs pro Branch inklusive.
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 @ / www →
http://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).
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: {}
.env:DB_PW=(langes Zufallspasswort),chmod 600.docker compose up -d. Tunnel → Public Hostnamecloud→http://nextcloud-app-1:80(docker compose pszeigt den genauen Namen. Percontainer_name:festnageln ist sauberer).https://cloud.seb4u.com→ Admin-Konto anlegen. Danach in Nextcloud die App Calendar, Contacts, Memories aktivieren.
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.
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 }
- Cloud-Firewall: Regel für TCP (Transmission Control Protocol)
2222hinzufü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 – dannports:weglassen. - Tunnel → Public Hostname
git→http://gitea:3000. - 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.
services:
kuma:
image: louislam/uptime-kuma:1
restart: unless-stopped
volumes: [ kuma:/app/data ]
networks: [ web ]
volumes: { kuma: {} }
networks:
web: { name: web, external: true }
- Tunnel →
status→http://kuma:3001. Erstaufruf = Admin anlegen. - Monitore hinzufügen: HTTP(s) auf
https://cloud.…,https://git.…usw. – von außen, damit auch Tunnel-Ausfälle auffallen. - Benachrichtigung: Telegram / E-Mail / ntfy. Status Page anlegen, die darfst du
öffentlich lassen (keine Access-App für
status).
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.
| Dienst | Image | Port | Subdomain / Zugriff |
|---|---|---|---|
| FreshRSS – RSS-Reader | freshrss/freshrss | 80 | rss · eigener Login |
| linkding – Bookmarks | sissbruecker/linkding | 9090 | links · eigener Login |
| BookStack – Wiki | lscr.io/linuxserver/bookstack | 80 | wiki · eigener Login |
| Vaultwarden – Passwörter | vaultwarden/server | 80 | vault · eigener Server empfohlen (Guide) |
| Plausible – Analytics | plausible/analytics | 8000 | stats · braucht ClickHouse + Postgres, ~1 GB |
| Stirling-PDF / IT-Tools | stirlingtools/stirling-pdf | 8080 | tools · Access |
7 Weiterleitungen / Kurzlinks
Kein Server. go.seb4u.com/xyz
→ irgendeine lange URL (Uniform Resource Locator).
- DNS:
AAAAgo→100::, proxied (ein Discard-Ziel, das nie antwortet – die Regel übernimmt). - Einzelziel: When Hostname equals
go.seb4u.com→ Then Static redirect → deine Ziel-URL, Status 301. - Mehrere Kürzel: – 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.
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.
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.
| Willst du | Weg | ~€/Mon |
|---|---|---|
| Postfach + App (Webmail, Handy), einfach | Zoho Mail Forever Free – siehe Domain zu Cloudflare umziehen, Abschnitt 7 | 0 |
| 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 / iCloud | iCloud+ 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äche | Google Workspace – Domain hinzufügen, TXT-Verifizierung, MX → Google. Danach ganz normal in Gmail/App. | ~6 / Nutzer |
| … im kostenlosen Gmail lesen/senden | Gmail → 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+ |
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.
- 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 perimapsyncnach dem Umzug in iCloud ziehen). - 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.
- Domain hinzufügen → Nur du (oder Du und weitere Personen) → seb4u.com eingeben.
- Mindestens eine Adresse anlegen, z. B.
du@seb4u.com. - 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):
| Name | Typ | Wert (Muster – genaue Werte zeigt Apple) |
|---|---|---|
@ | MX | mx01.mail.icloud.com Prio 10 |
@ | MX | mx02.mail.icloud.com Prio 10 |
@ | TXT (Text-Record) | v=spf1 include:icloud.com ~all |
sig1._domainkey | CNAME | sig1.dkim.seb4u.com.at.icloudmailadmin.com (von Apple generiert) |
@ | TXT | apple-domain=<code von Apple> (Domain-Verifizierung) |
_dmarc | TXT | v=DMARC1; p=quarantine; (Apple schlägt das vor) |
- Zurück bei Apple auf Setup abschließen – die Records werden geprüft (kann ein paar Minuten dauern).
- In Mail (Apple) die neue Adresse als Standard-Absender setzen. Webmail: icloud.com/mail.
- Nicht-Apple-Zugriff (Thunderbird/Outlook/Android): ein
app-spezifisches Passwort auf
appleid.apple.com
→ Anmeldung & 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 aufdu@seb4u.comstellen.
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.comlegen. 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.comals Weiterleitung auf deinen Drive-Ordner-Link – nur ein Shortcut.
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
| Fall | Zugriff |
|---|---|
| Öffentliche Website, Status-Seite, Doku | offen – keine Access-App für diese Hostnamen |
| Nextcloud, Gitea, FreshRSS, BookStack | haben eigenen Login – Access optional als zweite Tür |
| Projekt-Demos, Tools ohne eigene Auth, Admin-Oberflächen | Cloudflare Access – eigene App pro Hostname, Policy = deine E-Mail |
| API (Application Programming Interface) für Skripte/CI | Access Service Token (Header statt Browser-Login) |
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
/opt/stacks/<name>/compose.yamlanlegen, Service insweb-Netz, keinports:(außer Sonderfall wie Gitea-SSH).docker compose up -d(oderdeploy.ps1 <name> -Stack).- Tunnel-Dashboard → Public Hostname
<name>. seb4u.com →http://<container>:<port>. - Braucht Login und hat keinen eigenen? → Access-App für den Hostnamen + Policy.
- 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 Rules | 0 |
| Zoho Mail (Forever Free) | 0 |
| Backup: Hetzner Storage Box BX11 – optional | ~3,8 |
| Realistisch: Website + Mail + ein paar Dienste | ~4–12 |