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 |