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

data-i18n und textContent: Warum deine Spans spurlos verschwinden

Du baust eine hübsche Wortmarke mit verschiedenen Spans, aber nach dem Laden der Seite sind die Spans weg. Schuld ist ein einziger Zeile in deiner i18n-Library: element.textContent = translation. Hier ist warum – und wie du es löst.

17.02.2026 · 3 Minuten · 627 Wörter · root_cause

CSS transform:scale() und Überlappungen – drei falsche Diagnosen bis zum Fix

Eine skalierte CSS-Card überlappt den nächsten Abschnitt. z-index hilft nicht, padding auch nicht. Warum margin-bottom der einzige echte Fix ist – und was transform:scale() eigentlich mit dem DOM macht.

17.02.2026 · 4 Minuten · 773 Wörter · root_cause

OpenVPN: Von fragiler Screen-Session zu robustem systemd Service

Dein OpenVPN-Client läuft in einer Screen-Session? Dann betet besser zu den Mächten der Macht, dass niemand die Session killt. Hier ist der Weg zu einem ordentlichen systemd Service - mit Auto-Reconnect und Health-Monitoring.

16.02.2026 · 7 Minuten · 1349 Wörter · root_cause