NixOS: Relaunch-Site unter mt-rad.de bereitstellen (Soft-Launch) #15

Open
opened 2026-07-07 10:05:59 +02:00 by kreativmonkey · 2 comments

Die neue Hugo-Site soll unter mt-rad.de erreichbar sein (Soft-Launch/Beta), damit man sie live ansehen kann.

Ziel

  • NixOS-nginx-vhost für mt-rad.de (+ ggf. www.) auf dem VPS, TLS via ACME/Let's Encrypt, der das vom CI (#14) deployte public/ ausliefert.
  • DNS für mt-rad.de auf den VPS zeigen lassen (A/AAAA). DNS-Standort klären (mt-rad.de ist bereits im Besitz — wo liegt die Zone? all-inkl KAS?).
  • Additiv und reversibel: keine bestehenden vhosts/Dienste auf dem VPS stören (dort laufen n8n, rybbit, netbird u. a.).

Rahmen / Vorsicht — WICHTIG

  • An der produktiven Seite mta-r.de (All-Inkl) NICHTS ändern. Nur die neue Domain mt-rad.de wird eingerichtet.
  • Umsetzung als Code im NixOS-Flake/Colmena-Repo; colmena apply / DNS-Änderung erst nach Review.

Ergebnis in diesem Issue festhalten: vhost-/ACME-Config (als Commit/PR im nixos-Repo), nötige DNS-Records (konkret vorbereitet), Reihenfolge fürs Scharfschalten.

Bearbeitung: Subagent (Deploy-Epic 1–3, Opus), Entwurf/Plan — kein Apply/DNS-Change ohne Review.

Die neue Hugo-Site soll unter **mt-rad.de** erreichbar sein (Soft-Launch/Beta), damit man sie live ansehen kann. **Ziel** - NixOS-nginx-vhost für `mt-rad.de` (+ ggf. `www.`) auf dem VPS, TLS via ACME/Let's Encrypt, der das vom CI (#14) deployte `public/` ausliefert. - DNS für mt-rad.de auf den VPS zeigen lassen (A/AAAA). DNS-Standort klären (mt-rad.de ist bereits im Besitz — wo liegt die Zone? all-inkl KAS?). - Additiv und reversibel: keine bestehenden vhosts/Dienste auf dem VPS stören (dort laufen n8n, rybbit, netbird u. a.). **Rahmen / Vorsicht — WICHTIG** - **An der produktiven Seite mta-r.de (All-Inkl) NICHTS ändern.** Nur die neue Domain mt-rad.de wird eingerichtet. - Umsetzung als Code im NixOS-Flake/Colmena-Repo; `colmena apply` / DNS-Änderung erst nach Review. **Ergebnis in diesem Issue festhalten:** vhost-/ACME-Config (als Commit/PR im nixos-Repo), nötige DNS-Records (konkret vorbereitet), Reihenfolge fürs Scharfschalten. _Bearbeitung: Subagent (Deploy-Epic 1–3, Opus), Entwurf/Plan — kein Apply/DNS-Change ohne Review._
Author
Owner

Entwurf fertig (nur Code + Plan, nichts deployt/DNS geändert)

Gewählter Ansatz + Begründung

Kein NixOS-services.nginx + security.acme, sondern ein statischer nginx-Container hinter dem bestehenden traefik — 1:1 nach dem Muster von modules/rybbit.nix (rybbit.mta-r.de).

Begründung (Best-Practice-Abgleich): Der VPS terminiert TLS zentral in traefik (Ports 80/443 gehören traefik, in einem podman-Container), und alle Dienste werden über Container-Labels geroutet. Ein zweiter nginx + zweiter ACME-Client würde mit traefik um 80/443 konkurrieren und aus dem etablierten Muster ausbrechen. Der additive Container fügt sich nahtlos ein.

TLS via http-01 (httpresolver), nicht Wildcard/DNS-01: Das Hetzner-Wildcard-Zert *.f4mily.net deckt mt-rad.de nicht ab, und DNS-01 über den hetzner-Resolver ist unmöglich — die Zone mt-rad.de liegt bei All-Inkl/KAS, traefik kann dort keine _acme-challenge schreiben. Also derselbe httpresolver (http-01) wie bei rybbit. Konsequenz für die Reihenfolge: http-01 verlangt, dass mt-rad.de per DNS bereits auf den VPS zeigt, bevor das Zertifikat ausgestellt werden kann.

Artefakte

  • Repo Homelab/homelab-infrastructure, Branch feat/mt-rad-site (Worktree, nicht gemergt, nicht colmena apply).
    • Basis: feat/rybbit-vps (die aktuell auf dem VPS deployte Realität inkl. httpresolver) — Merge-Reihenfolge beachten (stackt auf der rybbit-Arbeit).
    • nixos/modules/mt-rad-site.nix (neu): nginx:1.27-alpine, Mount /docker/mt-rad.de/site:ro, traefik-Router mt-rad (Apex) + mt-rad-www (www→apex 301), deklarativer Deploy-User mtrad-deploy, tmpfiles fürs Zielverzeichnis.
    • nixos/hosts/hetzner-vps1.nix: eine Import-Zeile ergänzt.
    • nix-instantiate --parse OK für beide Dateien.

Konkrete DNS-Records (VORBEREITET — noch NICHT gesetzt)

Zone mt-rad.de. liegt bei All-Inkl/KAS. VPS-Ziel = 91.99.145.19 / 2a01:4f8:c17:ed08::1 (identisch zu den bestehenden rybbit.mta-r.de-Records).

Aktion Name Typ Wert Hinweis
ändern @ A 85.13.150.16991.99.145.19 record_id 69250579
anlegen @ AAAA 2a01:4f8:c17:ed08::1 fehlt bisher
anlegen www A 91.99.145.19 überschreibt den *-Wildcard (der auf All-Inkl zeigt)
anlegen www AAAA 2a01:4f8:c17:ed08::1 dito
unverändert * A, MX, SPF, _dmarc, DKIM Mail bleibt komplett bei All-Inkl

Die produktive Seite mta-r.de (andere Zone, a statt Bindestrich) wird nicht berührt.

Reihenfolge zum Scharfschalten

  1. Deploy-Public-Key ins Modul eintragen (Platzhalter AAAA_PLATZHALTER_DEPLOY_PUBKEY ersetzen), Review.
  2. colmena apply → Container mt-rad-site + User mtrad-deploy + Verzeichnis entstehen (Cert noch pending, Verzeichnis leer → 403 bis Deploy).
  3. Erster Deploy via CI/#14 (rsync geht direkt auf die IP, braucht kein DNS) → Site liegt in /docker/mt-rad.de/site.
  4. DNS-Cutover (Tabelle oben) → http-01 greift → TLS live → https://mt-rad.de erreichbar.

Offene Fragen / Risiken

  • Vor Go-Live entscheiden: httpresolver muss in /docker/traefik/config/traefik.yaml (on-host) existieren — durch rybbit vorhanden, bitte verifizieren.
  • Entscheidung: poc.mta-r.de weiter betreiben oder abschalten? baseURL/site_url sind im #14-Branch bereits auf mt-rad.de umgestellt.
  • Merge-Abhängigkeit: feat/mt-rad-site stackt auf feat/rybbit-vps.
## Entwurf fertig (nur Code + Plan, nichts deployt/DNS geändert) ### Gewählter Ansatz + Begründung **Kein NixOS-`services.nginx` + `security.acme`, sondern ein statischer nginx-Container hinter dem bestehenden traefik** — 1:1 nach dem Muster von `modules/rybbit.nix` (rybbit.mta-r.de). Begründung (Best-Practice-Abgleich): Der VPS terminiert TLS **zentral in traefik** (Ports 80/443 gehören traefik, in einem podman-Container), und *alle* Dienste werden über Container-Labels geroutet. Ein zweiter nginx + zweiter ACME-Client würde mit traefik um 80/443 konkurrieren und aus dem etablierten Muster ausbrechen. Der additive Container fügt sich nahtlos ein. **TLS via http-01 (`httpresolver`), nicht Wildcard/DNS-01:** Das Hetzner-Wildcard-Zert `*.f4mily.net` deckt `mt-rad.de` nicht ab, und DNS-01 über den `hetzner`-Resolver ist unmöglich — die Zone `mt-rad.de` liegt bei **All-Inkl/KAS**, traefik kann dort keine `_acme-challenge` schreiben. Also derselbe `httpresolver` (http-01) wie bei rybbit. **Konsequenz für die Reihenfolge:** http-01 verlangt, dass `mt-rad.de` per DNS *bereits auf den VPS zeigt*, bevor das Zertifikat ausgestellt werden kann. ### Artefakte - Repo `Homelab/homelab-infrastructure`, Branch **`feat/mt-rad-site`** (Worktree, nicht gemergt, nicht `colmena apply`). - Basis: **`feat/rybbit-vps`** (die aktuell auf dem VPS deployte Realität inkl. `httpresolver`) — Merge-Reihenfolge beachten (stackt auf der rybbit-Arbeit). - `nixos/modules/mt-rad-site.nix` (neu): nginx:1.27-alpine, Mount `/docker/mt-rad.de/site:ro`, traefik-Router `mt-rad` (Apex) + `mt-rad-www` (www→apex 301), deklarativer Deploy-User `mtrad-deploy`, tmpfiles fürs Zielverzeichnis. - `nixos/hosts/hetzner-vps1.nix`: eine Import-Zeile ergänzt. - `nix-instantiate --parse` OK für beide Dateien. ### Konkrete DNS-Records (VORBEREITET — noch NICHT gesetzt) Zone `mt-rad.de.` liegt bei **All-Inkl/KAS**. VPS-Ziel = `91.99.145.19` / `2a01:4f8:c17:ed08::1` (identisch zu den bestehenden `rybbit.mta-r.de`-Records). | Aktion | Name | Typ | Wert | Hinweis | |---|---|---|---|---| | **ändern** | `@` | A | `85.13.150.169` → **`91.99.145.19`** | record_id 69250579 | | **anlegen** | `@` | AAAA | `2a01:4f8:c17:ed08::1` | fehlt bisher | | **anlegen** | `www` | A | `91.99.145.19` | überschreibt den `*`-Wildcard (der auf All-Inkl zeigt) | | **anlegen** | `www` | AAAA | `2a01:4f8:c17:ed08::1` | dito | | unverändert | `*` A, MX, SPF, `_dmarc`, DKIM | — | — | **Mail bleibt komplett bei All-Inkl** | > Die produktive Seite **mta-r.de** (andere Zone, `a` statt Bindestrich) wird nicht berührt. ### Reihenfolge zum Scharfschalten 1. Deploy-**Public-Key** ins Modul eintragen (Platzhalter `AAAA_PLATZHALTER_DEPLOY_PUBKEY` ersetzen), Review. 2. `colmena apply` → Container `mt-rad-site` + User `mtrad-deploy` + Verzeichnis entstehen (Cert noch pending, Verzeichnis leer → 403 bis Deploy). 3. Erster Deploy via CI/#14 (rsync geht direkt auf die IP, braucht kein DNS) → Site liegt in `/docker/mt-rad.de/site`. 4. **DNS-Cutover** (Tabelle oben) → http-01 greift → TLS live → `https://mt-rad.de` erreichbar. ### Offene Fragen / Risiken - **Vor Go-Live entscheiden:** `httpresolver` muss in `/docker/traefik/config/traefik.yaml` (on-host) existieren — durch rybbit vorhanden, bitte verifizieren. - **Entscheidung:** `poc.mta-r.de` weiter betreiben oder abschalten? `baseURL`/`site_url` sind im #14-Branch bereits auf `mt-rad.de` umgestellt. - Merge-Abhängigkeit: `feat/mt-rad-site` stackt auf `feat/rybbit-vps`.
Author
Owner

Go-Live: https://mt-rad.de ist live (Soft-Launch)

Umgesetzt 2026-07-07:

  • NixOS: Modul mt-rad-site.nix auf feat/mt-rad-site scharfgeschaltet (statischer nginx-Container hinter Traefik, nach rybbit-Muster). Deploy via nixos-rebuild switch --flake .#hetzner-vps1 (der colmena-Flake-Output ist mit colmena 0.5 kaputt — braucht colmenaHive; nixos-rebuild über nixosConfigurations umgeht das). Deploy-User mtrad-deploy + SSH-Key eingerichtet.
  • Content: hugo --minify + rsync nach /docker/mt-rad.de/site. Deployt wurde main (baseURL/site_url→mt-rad.de) + Favicon-Fix. Brand-Wortmarke (poc-hugo-sveltia PR#2) und 200-Artikel-Migration (PR#3) sind bewusst noch nicht gemergt (Optik-/Bild-Review offen).
  • DNS (All-Inkl KAS): Apex-A + www-A → 91.99.145.19. Mail (MX/SPF/DKIM) und Wildcard unangetastet. Produktives mta-r.de ebenfalls unberührt.
  • TLS: Let's Encrypt via Traefik http-01, CN=mt-rad.de. www→apex-301 aktiv.

⚠️ Zwischenfall (behoben): rybbit-Ausfall durch den Deploy

Der Switch triggerte einen latenten Bug in rybbit.nix: die tmpfiles-Regeln d /docker/rybbit/*-data 0750 root root setzen die DB-Datenverzeichnisse bei jedem systemd-tmpfiles-Lauf auf root:root — die Container laufen aber als uid 999/101 → Postgres/Redis/ClickHouse verloren den Zugriff, rybbit-Login kaputt. Behoben: Ownership wiederhergestellt + Regeln auf die korrekten uids korrigiert (durabler Fix, per Switch verifiziert). rybbit läuft wieder (api/health 200).

Noch offen (→ #14, #16)

  • CI-Pipeline scharfschalten: Forgejo-Actions-Secrets VPS_DEPLOY_SSH_KEY + VPS_SSH_KNOWN_HOSTS, MT-R-Runner (Workflow liegt auf feat/ci-deploy).
  • Forgejo-OAuth-Redirect-URI https://mt-rad.de/admin/ für Sveltia (#16).
## ✅ Go-Live: https://mt-rad.de ist live (Soft-Launch) Umgesetzt 2026-07-07: - **NixOS:** Modul `mt-rad-site.nix` auf `feat/mt-rad-site` scharfgeschaltet (statischer nginx-Container hinter Traefik, nach rybbit-Muster). Deploy via `nixos-rebuild switch --flake .#hetzner-vps1` (der colmena-Flake-Output ist mit colmena 0.5 kaputt — braucht `colmenaHive`; nixos-rebuild über `nixosConfigurations` umgeht das). Deploy-User `mtrad-deploy` + SSH-Key eingerichtet. - **Content:** `hugo --minify` + rsync nach `/docker/mt-rad.de/site`. Deployt wurde **main** (baseURL/site_url→mt-rad.de) + Favicon-Fix. Brand-Wortmarke (poc-hugo-sveltia PR#2) und 200-Artikel-Migration (PR#3) sind bewusst noch **nicht** gemergt (Optik-/Bild-Review offen). - **DNS (All-Inkl KAS):** Apex-A + `www`-A → 91.99.145.19. Mail (MX/SPF/DKIM) und Wildcard **unangetastet**. Produktives mta-r.de ebenfalls unberührt. - **TLS:** Let's Encrypt via Traefik http-01, CN=mt-rad.de. `www`→apex-301 aktiv. ### ⚠️ Zwischenfall (behoben): rybbit-Ausfall durch den Deploy Der Switch triggerte einen latenten Bug in `rybbit.nix`: die tmpfiles-Regeln `d /docker/rybbit/*-data 0750 root root` setzen die DB-Datenverzeichnisse bei **jedem** systemd-tmpfiles-Lauf auf root:root — die Container laufen aber als uid 999/101 → Postgres/Redis/ClickHouse verloren den Zugriff, rybbit-Login kaputt. **Behoben:** Ownership wiederhergestellt + Regeln auf die korrekten uids korrigiert (durabler Fix, per Switch verifiziert). rybbit läuft wieder (api/health 200). ### Noch offen (→ #14, #16) - CI-Pipeline scharfschalten: Forgejo-Actions-Secrets `VPS_DEPLOY_SSH_KEY` + `VPS_SSH_KNOWN_HOSTS`, MT-R-Runner (Workflow liegt auf `feat/ci-deploy`). - Forgejo-OAuth-Redirect-URI `https://mt-rad.de/admin/` für Sveltia (#16).
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
MT-R/PoC-mt-r#15
No description provided.