Zum Inhalt

Bulwark

Einleitung und Rolle

Bulwark ist das Webmail-Frontend der Infrastruktur. Es stellt eine browserbasierte Mail-Oberfläche bereit und nutzt Stalwart als Backend. Bulwark ist damit kein eigener Mailserver, sondern die Webmail-Schicht vor dem bestehenden Stalwart/JMAP-Setup.

Die kanonische Webmail-Subdomain ist https://bulwark.marcosudau.com. https://webmail.marcosudau.com ist als permanenter Redirect auf Bulwark eingerichtet. Die Route wird, wie die übrigen Mail-nahen HTTP-Routen, manuell in /etc/caddy/Caddyfile gepflegt und nicht über routes.json generiert.

Persistente Daten und Backup-Relevanz

Pfad Zweck Backup-Relevanz
/opt/selfhost/stacks/webmail/docker-compose.yml Compose-Definition des Webmail-Stacks hoch
/opt/selfhost/secrets/bulwark.env Bulwark-Umgebungsvariablen, JMAP-URL und Session-Secret hoch
/opt/selfhost/data/bulwark/settings persistente verschlüsselte Bulwark-Settings hoch
/etc/caddy/Caddyfile manuelle Bulwark-/Webmail-Routen hoch

Das Settings-Verzeichnis enthält verschlüsselte .enc-Dateien und wird im Container nach /app/data/settings gemountet. Die Datei /opt/selfhost/secrets/bulwark.env darf nicht inhaltlich in die Dokumentation kopiert werden.

Stack, Container und Docker Compose

Der Stack liegt unter /opt/selfhost/stacks/webmail/ und läuft als Docker-Compose-Projekt webmail.

Container Image Zweck
bulwark ghcr.io/bulwarkmail/webmail:latest Webmail-Frontend

Wichtige Compose-Eigenschaften:

Eigenschaft Wert
Portbindung 127.0.0.1:3010:3000
Env-Datei /opt/selfhost/secrets/bulwark.env
Persistenter Mount /opt/selfhost/data/bulwark/settings:/app/data/settings
Extra Host host.docker.internal:host-gateway
Healthcheck http://127.0.0.1:3000/api/health im Container
Restart-Policy unless-stopped

Der Dienst bindet ausschließlich lokal. Der öffentliche Zugriff erfolgt über Caddy.

HTTP-Routen und Subdomains

Bulwark wird manuell in /etc/caddy/Caddyfile geroutet.

Hostname Verhalten
bulwark.marcosudau.com Reverse Proxy auf 127.0.0.1:3010
webmail.marcosudau.com permanenter Redirect auf https://bulwark.marcosudau.com{uri}

Zusätzlich enthält die gemeinsame Mail-Site CORS-Regeln, damit Webmail-nahe Zugriffe aus bulwark.marcosudau.com und webmail.marcosudau.com gegen die Stalwart-/Mail-Endpunkte funktionieren.

Zugehörige Dienste und Abhängigkeiten

Abhängigkeit Rolle
Stalwart Mailserver und JMAP-Backend
Caddy TLS und Reverse Proxy für Bulwark/Webmail
/opt/selfhost/secrets/bulwark.env Konfiguration von Hostname, JMAP-Server, Session und Logging
/opt/selfhost/data/bulwark/settings persistente Webmail-Einstellungen

Bulwark spricht Stalwart über die konfigurierte JMAP_SERVER_URL an. Der Compose-Stack setzt zusätzlich host.docker.internal:host-gateway, damit Container bei Bedarf kontrolliert den Host erreichen können, ohne über die öffentliche Domain-Schleife gehen zu müssen.

Authentifizierung und Sicherheit

Authentik ist nicht mehr vorgeschaltet. Bulwark verwendet sein eigenes Sitzungs-/Login-Verhalten in Verbindung mit Stalwart als Backend. Die Weboberfläche ist nur über Caddy öffentlich erreichbar; der Container-Port ist auf 127.0.0.1 beschränkt.

Secrets und Umgebungsvariablen

Die Secret-Datei liegt unter /opt/selfhost/secrets/bulwark.env. Dokumentiert werden nur Variablennamen, nicht Werte.

Variable Zweck
HOSTNAME öffentlicher Bulwark-Hostname
PORT interner Anwendungsport
JMAP_SERVER_URL JMAP-/Stalwart-Backend-URL
APP_NAME Anzeigename der Anwendung
SESSION_SECRET Session-Signatur/Absicherung
SETTINGS_SYNC_ENABLED Steuerung der Settings-Synchronisierung
LOG_LEVEL Log-Level
LOG_FORMAT Log-Format
NEXT_TELEMETRY_DISABLED Deaktivierung von Next.js-Telemetrie