UCS DC-Demote: Member Server zeigen nach dem Demote weiterhin auf den alten DC

Nach einem UCS DC-Demote zeigen alle Member Server weiterhin auf den toten DC. ucr set ldap/server/name hilft nicht — ‘overridden by scope ldap’. Der echte Täter: Das UDM-Objekt des alten DC behält univentionServerRole=master im OpenLDAP, und der Listener-Mechanismus setzt ldap/server/name daraus.

21.02.2026 · 4 Minuten · 718 Wörter · root_cause

pfSense: WireGuard als Default-Gateway – wenn dpinger sich selbst belügt

Alle Clients offline nach WireGuard-Reconnect, aber pfSense meldet ‘online’. Ursache: dpinger pingt bei WireGuard-Gateways ohne Monitor-Target die eigene Interface-IP – und die antwortet immer, auch wenn der Tunnel tot ist.

20.02.2026 · 4 Minuten · 735 Wörter · root_cause

Zammad: Mails nach Import archivieren statt löschen — ohne Elasticsearch

Zammad löscht Mails nach dem IMAP-Import. Wer ein Backup im Postfach behalten will, stößt auf ein nicht-offensichtliches Problem: Die Zammad-API findet Message-IDs ohne Elasticsearch nicht. Die Lösung ist ein Python-Cron-Job mit einem direkten Rails-Query via docker exec.

19.02.2026 · 6 Minuten · 1153 Wörter · root_cause

Zammad SMTP direkt über Proxmox Mail Gateway — kein Auth nötig

Wer PMG im Homelab oder als internes Mail-Relay betreibt, braucht für Zammad keinen externen SMTP-Account. PMG akzeptiert Verbindungen aus dem internen Netz per mynetworks ohne Auth und übernimmt DKIM-Signierung. So stellt du Zammads Outbound-SMTP auf PMG um — inklusive DKIM-Aktivierung per pmgsh.

19.02.2026 · 4 Minuten · 646 Wörter · root_cause

Python: {{ }} außerhalb von f-Strings generiert keinen Escape — ein stiller Code-Bug

Ein Python-Script generiert Ruby-Code mit Blöcken. Manche Strings sind f-Strings, manche nicht. {{ }} sollte zu { } werden — tut es aber nur in f-Strings. In normalen Strings bleiben {{ }} literal. Das erzeugt ungültiges Ruby, Python wirft keinen Fehler, und das Programm schlägt still fehl.

19.02.2026 · 4 Minuten · 671 Wörter · root_cause

PHPMailer SMTP auth schlägt fehl, curl geht — der `!`-Passwort-Trick

PHPMailer kann sich nicht per SMTP authentifizieren, obwohl curl mit denselben Credentials funktioniert. Die überraschende Ursache: Bash-History-Expansion verwandelt ! heimlich in \! — und PHP kennt diesen Trick nicht.

19.02.2026 · 5 Minuten · 981 Wörter · root_cause

JavaScript Smooth-Scroll: Die offsetTop-Falle bei verschachtelten Elementen

Du baust einen eigenen Smooth-Scroll-Handler und er funktioniert perfekt – bis er es nicht tut. Anker-Links auf tief verschachtelte Elemente scrollen nach ganz oben statt zum Ziel. Die Ursache: offsetTop lügt dich an.

19.02.2026 · 4 Minuten · 847 Wörter · root_cause

Zammad 6.5 Docker: Rails Console funktioniert nicht – drei Fallen und ihre Lösungen

Wer Zammad in Docker per Rails Console konfigurieren will, läuft in drei nicht-offensichtliche Fallen: DATABASE_URL wird nicht vererbt, Bang-Methoden werden von Bash escapet, und das Calendar-Modell hat ein paar stille Eigenheiten. Hier sind die Lösungen.

18.02.2026 · 5 Minuten · 1039 Wörter · root_cause

UCS Memberserver nach DC-Demote migrieren: Wenn net ads join nicht reicht

Nach dem Demote eines UCS Domain Controllers zeigen Memberserver noch auf den alten DC. net ads join repariert nur die AD-Seite - für UCS braucht man univention-join. Plus: TLS-Fallen mit Step-CA und ein UCR-Revert den niemand erwartet.

18.02.2026 · 7 Minuten · 1432 Wörter · root_cause

Docker: Custom CA in Non-Root Containern einbinden (ohne update-ca-certificates)

update-ca-certificates schlägt fehl mit Permission denied — weil der Container als Non-Root läuft. Die Lösung: Ein pre-built Combined CA Bundle, das direkt gemountet wird. Kein Entrypoint-Override, kein Build-Step.

18.02.2026 · 4 Minuten · 655 Wörter · root_cause