Signaturmonster — Dokumentation

Signaturmonster ist ein selbst-gehosteter SMTP-Proxy, der zwischen deinem Mailprogramm (z.B. Thunderbird) und dem ausgehenden Mailserver sitzt. Er fängt jede ausgehende E-Mail ab und reichert sie automatisch mit HTML-Signaturen, Corporate-Identity-Branding und animierten GIF-Bannern an — ohne jede Änderung am Mailprogramm oder am Mailserver.

Architektur

Signaturmonster besteht aus fünf Docker-Containern, die als Compose-Stack betrieben werden:

Architektur
# Eingehend vom Mailprogramm
Thunderbird / Outlook
       │
       ▼ Port 587
SMTP Proxy       # Python / aiosmtpd — fängt Mails ab, injiziert Signatur
       │
       ▼ intern
Backend API      # FastAPI + SQLite — Signaturen, Regeln, CI-Profile
       │
       ├─ Frontend    # React + nginx — Web-UI auf Port 8080
       │
       └─ Updater     # Prüft ghcr.io auf neue Versionen
       │
       ▼ Weitergeleitet
Echte Mailserver (SMTP, Port 465/587)
💡
Kein Eingriff nötig: Am Mailprogramm wird nur der SMTP-Server auf die IP des Geräts umgestellt, auf dem Docker läuft 192.168.x.x:587. Authentifizierung, Passwörter und Mailserver-Konfiguration bleiben unverändert — Signaturmonster reicht die Credentials transparent weiter.

Voraussetzungen

Für den Betrieb von Signaturmonster brauchst du:

  • Docker ≥ 24 und Docker Compose ≥ 2.20
  • Ein Gerät im lokalen Netz mit mindestens 512 MB RAM und Docker-Unterstützung
  • Einen ausgehenden SMTP-Server (z.B. Gmail SMTP, Postfix, Hetzner Mail, eigener Server)
  • Port 587 auf dem Host frei oder konfigurierbar
  • Port 8080 für das Web-UI erreichbar im lokalen Netz (kann geändert werden)
Ideal für den Heimserver oder Büronetz: Signaturmonster ist für den Betrieb im lokalen Netzwerk konzipiert. Perfekt geeignet sind z.B. ein Proxmox-LXC-Container, ein Raspberry Pi (ab Pi 4), eine NAS mit Docker-Unterstützung (Synology, QNAP, TrueNAS SCALE) oder jede andere Hardware, auf der Docker läuft.

Docker-Version prüfen

bash
docker --version
docker compose version

Installation

Signaturmonster wird über einen Installer eingerichtet — kein manuelles Klonen, kein Editieren von Konfigurationsdateien. Der Installer prüft Docker, fragt deine SMTP-Zugangsdaten ab, lädt alle nötigen Dateien herunter und startet die Container automatisch.

Linux & macOS

Öffne ein Terminal und führe folgenden Befehl aus:

bash
curl -fsSL https://raw.githubusercontent.com/choldermann/signaturmonster/main/install.sh | bash

Der Installer läuft interaktiv und führt dich Schritt für Schritt durch die Einrichtung. Er funktioniert auf allen gängigen Linux-Distributionen sowie auf macOS. Für Proxmox-LXC, Raspberry Pi oder NAS-Systeme reicht ein einfaches SSH-Terminal.

Windows

Öffne PowerShell als Administrator und führe folgenden Befehl aus:

powershell
iex (irm https://raw.githubusercontent.com/choldermann/signaturmonster/main/install.ps1)
Voraussetzung: Docker Desktop muss installiert und gestartet sein, bevor du den Installer ausführst.

Was der Installer einrichtet

Der Installer fragt folgende Werte interaktiv ab:

Eingabe Beschreibung Standard
Installationsverzeichnis Wo docker-compose.yml, .env und Daten abgelegt werden ~/signaturmonster
RELAY_HOST Hostname deines ausgehenden Mailservers (z.B. smtp.ionos.de)
RELAY_PORT Port des Mailservers (587 STARTTLS, 465 SSL) 587
RELAY_USER Benutzername / E-Mail-Adresse für den Mailserver
RELAY_PASS Passwort für den Mailserver
SMTP-Port (Proxy) Port, den Thunderbird & Co. ansprechen 2587
Web-Dashboard-Port Port für das Web-UI im Browser 8080

Danach lädt der Installer docker-compose.yml und nginx.conf direkt von GitHub, schreibt die .env-Datei und startet den Stack mit docker compose pull && docker compose up -d. Ein zufälliger SECRET_KEY wird automatisch generiert.

Am Ende zeigt der Installer die Adressen an:

text
✓ Signaturmonster läuft!

  Dashboard:  http://192.168.1.42:8080
  SMTP-Port:  192.168.1.42:2587  ← in Thunderbird eintragen
💡
Beim ersten Start erstellt der Backend-Container automatisch die SQLite-Datenbank im data/-Verzeichnis unterhalb des Installationsordners. Dieses Verzeichnis regelmäßig sichern — es enthält alle Signaturen, Regeln und Benutzerdaten. Standard-Login: monster / monster.

Proxmox LXC-Container einrichten

Proxmox VE ist eine beliebte Heimserver-Plattform, auf der Signaturmonster besonders gut läuft. Ein LXC-Container ist leichtgewichtiger als eine vollständige VM und teilt sich den Kernel des Hosts — ideal für dauerhaft laufende Dienste. Diese Anleitung führt dich Schritt für Schritt von der Container-Erstellung bis zum laufenden Signaturmonster.

⚠️
Nesting erforderlich: Docker innerhalb von LXC benötigt die Option Nesting (und ggf. FUSE). Ohne diese Einstellung schlägt der Docker-Start fehl. Die entsprechenden Schritte sind unten beschrieben.

Schritt 1 — LXC-Container erstellen

  1. Melde dich im Proxmox-Webinterface an und wähle den gewünschten Node aus
  2. Klicke oben rechts auf CT erstellen
  3. Allgemein: Vergib eine CT-ID (z.B. 200) und einen aussagekräftigen Hostnamen (z.B. signaturmonster)
  4. Template: Wähle ein aktuelles Template — empfohlen ist Debian 12 oder Ubuntu 22.04 LTS. Templates können im Proxmox-Webinterface unter Datacenter → Storage → CT Templates heruntergeladen werden.
  5. Festplatte: Mindestens 8 GB — für Docker-Images und die Signaturmonster-Daten reichen 8 GB problemlos aus, 16 GB geben mehr Reserve
  6. CPU: Mindestens 1 Core, empfohlen 2 Cores
  7. Arbeitsspeicher: Mindestens 512 MB, empfohlen 1024 MB (1 GB) — das gibt dem Docker-Stack komfortabel Luft
  8. Netzwerk: Wähle vmbr0 (oder deine LAN-Bridge), stelle DHCP ein oder vergib eine feste IP aus deinem Subnetz. Eine feste IP ist empfohlen, da Thunderbird und andere Clients die Adresse fix eingetragen haben müssen.
  9. Klicke auf Fertigstellen — starte den Container noch nicht
ParameterMinimumEmpfohlen
CPU Cores12
RAM512 MB1024 MB
Festplatte8 GB16 GB
OS-TemplateDebian 12 oder Ubuntu 22.04 LTS
NetzwerkFeste IP empfohlen (z.B. 192.168.1.50)

Schritt 2 — Nesting aktivieren (für Docker)

Bevor der Container gestartet wird, muss die Nesting-Option aktiviert werden. Ohne sie kann Docker keinen eigenen Netzwerk-Namespace anlegen.

  1. Wähle den soeben erstellten Container im Proxmox-Webinterface aus
  2. Gehe zu Optionen
  3. Doppelklicke auf Funktionen (Features)
  4. Aktiviere das Häkchen bei Nesting
  5. Optional, aber empfohlen: aktiviere auch FUSE
  6. Klicke auf OK
💡
Alternativ lässt sich Nesting auch direkt in der LXC-Konfigurationsdatei setzen. Öffne auf dem Proxmox-Host die Datei /etc/pve/lxc/<CT-ID>.conf und füge folgende Zeile ein:
/etc/pve/lxc/200.conf
lxc.apparmor.profile: unconfined
features: nesting=1,fuse=1

Schritt 3 — Container starten und Docker installieren

Starte den Container und öffne die Konsole über das Proxmox-Webinterface oder per SSH.

💡
Betriebssystem wählen: Klappe das passende Script für dein Template auf — Debian 12 oder Ubuntu 22.04 LTS. Beide Varianten installieren Docker CE inklusive Compose-Plugin.

Schritt 4 — Signaturmonster installieren

Mit laufendem Docker kann der Signaturmonster-Installer direkt im Container ausgeführt werden:

bash
curl -fsSL https://raw.githubusercontent.com/choldermann/signaturmonster/main/install.sh | bash

Der Installer fragt interaktiv nach deinen SMTP-Zugangsdaten und richtet alles ein. Am Ende werden die Adressen angezeigt, unter denen du das Dashboard erreichst und die du in Thunderbird einträgst. Trage dort die feste IP-Adresse des LXC-Containers ein (nicht localhost), damit alle Geräte im Netzwerk den Proxy erreichen können.

💡
Tipp: Damit Signaturmonster nach einem Neustart des Proxmox-Hosts automatisch wieder läuft, stelle in den Container-Optionen Startauftrag → Start beim Booten auf Ja. Docker selbst startet bereits automatisch (systemd-Unit), und docker compose up -d im Installationsverzeichnis wird beim Docker-Start automatisch nicht erneut benötigt — die Container haben die Restart-Policy unless-stopped.

Konfiguration

SMTP-Zugänge anlegen

Bevor Thunderbird oder ein anderes Mailprogramm den Proxy nutzen kann, muss mindestens ein SMTP-Zugang angelegt werden. Diese Zugangsdaten sind unabhängig von den Web-UI-Benutzern und dienen ausschließlich zur Authentifizierung am Proxy.

  1. Öffne das Web-UI und navigiere zu Konfiguration → SMTP-Zugänge
  2. Klicke auf Zugang anlegen
  3. Vergib einen Benutzernamen (z.B. den Vornamen oder die E-Mail-Adresse des Mitarbeiters) und ein Passwort
  4. Speichern — der Zugang ist sofort aktiv

Du kannst beliebig viele Zugänge anlegen — z.B. einen pro Mitarbeiter oder einen gemeinsamen für das ganze Team.

💡
Unter Konfiguration → SMTP-Zugänge findest du auch das TLS-Zertifikat zum Herunterladen. Da der Proxy ein selbstsigniertes Zertifikat verwendet, muss es einmalig in Thunderbird importiert werden (oder Thunderbird fragt beim ersten Verbindungsaufbau automatisch nach).

Thunderbird einrichten

Ändere in Thunderbird den Postausgangsserver auf den Signaturmonster-Proxy. Die Einstellung findest du unter Konten-Einstellungen → Postausgangs-Server (SMTP).

EinstellungWert
Server-AdresseIP des Geräts, auf dem Signaturmonster läuft
Port2587 (Standard, kann beim Installer geändert werden)
VerbindungssicherheitSTARTTLS
AuthentifizierungsmethodePasswort, normal
BenutzernameDer in Konfiguration → SMTP-Zugänge angelegte Benutzername
⚠️
Der Proxy erzwingt STARTTLS und Authentifizierung. Als Zugangsdaten trägst du den in Konfiguration → SMTP-Zugänge angelegten Benutzernamen und das dort gesetzte Passwort ein — nicht die Zugangsdaten deines eigentlichen Mailservers.

Erste Signatur erstellen

Öffne das Web-UI unter http://localhost:8080 und navigiere zu Signaturen → Neue Signatur.

  1. Gib der Signatur einen Namen (z.B. "Standard-Signatur")
  2. Füge Blöcke per Drag & Drop aus der linken Palette hinzu:
    • Text-Block — Freitext, Name, Titel, Abteilung
    • Bild-Block — Logo, Profilbild
    • Link-Block — Website, LinkedIn, etc.
    • Social-Block — vorgefertigte Social-Media-Icons
    • Trennlinie — horizontale Linie
    • Banner-Block — GIF-Banner (aus dem Banner-Editor)
  3. Konfiguriere jeden Block in der rechten Seitenleiste
  4. Nutze die Live-Vorschau, um das Ergebnis zu sehen
  5. Klicke auf Speichern

Variablen nutzen

In Text-Blöcken kannst du Variablen verwenden, die beim Senden automatisch aus der Absender-Datenbank befüllt werden. Variablen werden in doppelte geschweifte Klammern gesetzt:

html
{{vorname}} {{nachname}}
{{titel}} · {{abteilung}}
{{firma}}

Tel: {{telefon}}
Mobil: {{mobil}}
{{webseite}}

Verfügbare Variablen:

VariableBedeutung
{{vorname}}Vorname des Absenders
{{nachname}}Nachname des Absenders
{{titel}}Titel / akademischer Grad
{{abteilung}}Abteilung
{{firma}}Firmenname
{{telefon}}Telefonnummer
{{mobil}}Mobilnummer
{{email}}E-Mail-Adresse des Absenders
{{webseite}}Website-URL
{{linkedin}}LinkedIn-Profil-URL
{{strasse}}Straße & Hausnummer
{{ort}}Ort mit PLZ

Die Werte werden pro Absender in Einstellungen → Absender hinterlegt und beim Senden automatisch eingesetzt.

CI-Profil anlegen

CI-Profile definieren das visuelle Erscheinungsbild einer Marke: Primärfarbe, Schriftart, Logo, Hintergrundfarbe für den Mail-Body. Über den Mail Beautifier wird der eingehende Mail-Body gesäubert (Fremd-Signaturen entfernt) und in dein CI-Template eingebettet.

  1. Navigiere zu Corporate Identity → Neues CI-Profil
  2. Lade das Firmenlogo hoch (PNG/SVG, max. 2 MB)
  3. Wähle Primärfarbe, Akzentfarbe und Hintergrundfarbe
  4. Wähle die Schriftart (Google Fonts werden unterstützt)
  5. Aktiviere den Mail Beautifier für dieses Profil
  6. Speichern — das Profil steht nun in den Signatur-Regeln zur Verfügung

Regeln konfigurieren

Regeln steuern, welche Signatur (und welches CI-Profil) für welchen Absender verwendet wird. Ohne passende Regel wird eine Mail unverändert weitergeleitet.

  1. Navigiere zu Regeln → Neue Regel
  2. Gib eine Absender-E-Mail-Adresse ein (oder ein Wildcard-Muster, z.B. *@example.com)
  3. Wähle die Signatur, die angewendet werden soll
  4. Optional: CI-Profil auswählen
  5. Optional: Disclaimer aktivieren
  6. Priorität festlegen (niedrigere Zahl = höhere Priorität)
  7. Speichern und aktivieren
💡
Mehrere Regeln können für denselben Absender existieren. Es gilt immer die Regel mit der höchsten Priorität (niedrigste Prioritätszahl). So kannst du z.B. eine allgemeine Domain-Regel und eine spezifische Absender-Regel kombinieren.

Disclaimer hinzufügen

Disclaimer werden am Ende jeder E-Mail eingefügt. Sie können als HTML (mit Formatierung) und als Plaintext-Variante hinterlegt werden. Signaturmonster fügt automatisch die richtige Variante je nach Mail-Format ein.

  1. Navigiere zu Disclaimer → Neuer Disclaimer
  2. Gib den HTML-Text ein (Formatierungen wie <b>, <a> sind erlaubt)
  3. Gib die Plaintext-Variante ein
  4. Weise den Disclaimer einer oder mehreren Regeln zu
html — Disclaimer-Beispiel
<!-- HTML-Disclaimer -->
<p style="font-size:11px;color:#888">
  Diese E-Mail und ihre Anhänge sind vertraulich und ausschließlich
  für den Empfänger bestimmt. Wenn Sie diese E-Mail irrtümlich
  erhalten haben, informieren Sie bitte den Absender.
  <a href="https://example.com/impressum">Impressum</a>
</p>

Erweitert

Benutzer & Rechte

Signaturmonster unterstützt mehrere Benutzer mit unterschiedlichen Rollen. Benutzer werden im Web-UI unter Einstellungen → Benutzer verwaltet.

Rollen

RolleBerechtigungen
Admin Vollzugriff: Benutzer anlegen, alle Einstellungen, Updates auslösen
Editor Signaturen, Banner, CI-Profile und Regeln bearbeiten; keine Benutzerverwaltung
Viewer Nur Ansicht — keine Änderungen möglich; nützlich für Audits

SMTP-Benutzer

Jeder Absender (SMTP-Benutzer) hat eine eigene Eintragung unter Einstellungen → Absender. Dort werden die Profildaten (für Variablen) und die SMTP-Zugangsdaten für den echten Mailserver hinterlegt.

Updates

Der Updater-Service prüft regelmäßig die GitHub Container Registry (ghcr.io/choldermann) auf neue Image-Versionen. Werden neue Versionen gefunden, erscheint im Web-UI eine Benachrichtigung.

Manuelles Update

bash
# Neue Images holen
docker compose pull

# Stack mit neuen Images neu starten
docker compose up -d

# Alte (nicht mehr genutzte) Images aufräumen
docker image prune -f

Automatisches Update

Der integrierte Updater-Service kann so konfiguriert werden, dass er Updates automatisch einspielt. Dies wird über eine Umgebungsvariable gesteuert:

.env
# Automatische Updates aktivieren (true/false)
AUTO_UPDATE=true

# Prüfintervall in Minuten (Standard: 60)
UPDATE_INTERVAL=60
⚠️
Achtung: Automatische Updates erfordern, dass der Updater-Container Zugriff auf den Docker-Socket hat (/var/run/docker.sock). Achte auf die Sicherheitsimplikationen in Produktivumgebungen.

Sicherheit & Kryptografie

S/MIME und PGP — Architekturelle Klarstellung

Signaturmonster ist ein SMTP-Proxy, der Mailinhalte modifiziert (Signatur, Branding, Disclaimer). Das ist strukturell unvereinbar mit Ende-zu-Ende-Kryptografie (S/MIME, PGP), deren Kernaussage lautet: „Ich, der Absender, habe genau diesen Inhalt signiert."

Ein Proxy, der Inhalte verändert und anschließend kryptografisch signiert, könnte diese Aussage nicht treffen — er hat den Inhalt ja verändert. Das ist kein Bug, sondern ein grundlegender Widerspruch, den alle inhaltsmodifizierenden Mailsysteme haben — einschließlich kommerzieller Cloud-Anbieter wie Exclaimer oder CodeTwo.

💡
Self-hosted-Vorteil: Bei Cloud-Diensten modifiziert ein Dritter deine Mails — das ist ein echtes Vertrauensproblem. Signaturmonster läuft auf deiner eigenen Infrastruktur. Die Modifikation findet innerhalb deines kontrollierten Netzwerks statt, bevor die Mail dein System verlässt — vergleichbar mit einem Exchange-Server, der serverseitig Signaturen anhängt.

Workaround für E2E-Signierpflicht

Wer persönliche E2E-Signierung benötigt (z. B. Anwaltskanzleien, Behörden mit QES-Pflicht nach eIDAS):

  1. Kryptografische Signatur im Mailclient setzen, bevor die Mail an den Proxy gesendet wird
  2. Alle Proxy-Funktionen für diese Mail per #sm:off deaktivieren

Der Befehl #sm:off wird auf einer eigenen Zeile in die Mail geschrieben — der Proxy leitet die Mail dann unverändert weiter. Der Befehl selbst wird vor dem Versand entfernt.

Geplant: Gateway-Signing auf Organisationsebene (Organisationssignatur nach dem Proxy-Durchlauf) ist für eine zukünftige Version vorgesehen. Das beweist „Diese Mail hat die Organisation X in diesem Zustand versandt" — kein persönliches E2E, aber für viele Compliance-Anforderungen ausreichend.

Mail-Queue & Zwischenspeicherung

Eingehende Mails werden beim SMTP-Proxy empfangen und zunächst in einer lokalen SQLite-Queue auf deinem Server zwischengespeichert, bevor Verarbeitung und Weiterleitung starten. Die Mails verbleiben dabei vollständig in deiner Infrastruktur — es besteht zu keinem Zeitpunkt eine Verbindung zu externen Diensten für den Mailversand.

Queue-Übersicht im Web-UI

Unter System → Mail-Queue sind alle Einträge mit Status, Absender, Empfänger und Betreff einsehbar:

StatusBedeutung
pendingWartet auf Verarbeitung oder Retry
sentErfolgreich zugestellt
failedAlle Retry-Versuche erschöpft

Mails herunterladen

Einzelne Mails können direkt aus der Queue-Übersicht heruntergeladen werden — nützlich für Debugging, Audit-Zwecke oder die Prüfung fehlgeschlagener Zustellversuche. Fehlgeschlagene Einträge lassen sich außerdem manuell neu einreihen.

Retry-Strategie

Bei Zustellfehlern wiederholt der Proxy automatisch mit exponentiellem Backoff:

VersuchWartezeit
1. Fehler1 Minute
2. Fehler5 Minuten
3. Fehler30 Minuten
4. Fehler2 Stunden
5. Fehler (final)Status failed + Bounce-Mail an Absender
💡
Datenschutz-Hinweis: Die Queue-Speicherung sollte im Datenschutzkonzept berücksichtigt werden, da Mailinhalte für die Dauer der Verarbeitung auf dem Server vorgehalten werden. Erfolgreich zugestellte Mails können unter System → Mail-Queue → Alle gesendeten bereinigen manuell gelöscht werden.

Troubleshooting

Hier sind die häufigsten Probleme und ihre Lösungen:

SMTP-Verbindung schlägt fehl

Überprüfe die Logs des SMTP-Proxy-Containers:

bash
docker compose logs smtp-proxy

Häufige Ursachen:

  • Port 587 ist auf dem Host bereits belegt — ändere PROXY_PORT in .env
  • SMTP_HOST oder SMTP_PORT falsch konfiguriert
  • Firewall blockiert den ausgehenden Port

Web-UI nicht erreichbar

bash
# Status aller Container prüfen
docker compose ps

# nginx-Logs anzeigen
docker compose logs nginx

# Backend-Logs anzeigen
docker compose logs backend
  • Stelle sicher, dass Port 8080 (oder dein konfigurierter Port) nicht blockiert ist
  • Der Frontend-Container braucht beim ersten Start etwas Zeit zum Starten

Signatur wird nicht injiziert

  • Prüfe, ob eine Regel für den Absender existiert und aktiv ist
  • Stelle sicher, dass die Mail über den Signaturmonster-Proxy gesendet wurde (Port 587)
  • Prüfe die Logs: docker compose logs smtp-proxy

GIF-Banner wird in Outlook nicht angezeigt

  • Dies ist erwartetes Verhalten — Outlook zeigt das statische PNG-Fallback
  • Prüfe, ob Szene 1 korrekt und visuell sinnvoll ist
  • Stelle sicher, dass der Banner als CID eingebettet wird (Standard-Verhalten)

Datenbank-Reset

bash
# Vorsicht: löscht alle Daten!
docker compose down
rm -rf ./data
docker compose up -d
⚠️
Backup: Erstelle regelmäßige Backups des ./data-Verzeichnisses. Es enthält die gesamte SQLite-Datenbank mit allen Signaturen, Regeln und Benutzern.