Ein redundantes Cluster-Setup läßt sich weitestgehend auf Basis mit Komponenten von Benno MailArchiv realisieren.
Der Import wird hier mit Hilfe der Import REST Schnittstelle realisiert. Diese Schnittstelle wird auf mehreren Nodes implementiert, die per DNS Round-Robin angesprochen werden.
Der Import REST Schnittstelle kann zusätzlich die Import SMTP Schnittstelle vorgeschaltet werden um E-Mails per SMTP zu importieren.
Das Web-Interface für Suche und Zugriff können auf einem schlanken und relativ einfach redundant zu betreibenden System betrieben werden. Die Anfragen an das Benno REST API für Suche und Zugriff werden dann per HA Proxy auf die Backend-Nodes geleitet.
Auf jedem der redundanten Nodes wird das Package benno-import-rest
installiert. Die Konfiguration erfolgt in der Konfigurationsdatei
/etc/benno-import/rest.yml.
# # Benno Import REST configuration file # benno: #waitTime: 1 tempFiles: path: /srv/benno/import/tmp jwt: # min length 32 byte sharedSecret: <shared secret on all nodes min 32 char> expirationMinutes: 5 inboxEndpoint: minBackends: 2 saveWithGWHeader: true secretHeaders: - X-REAL-MAILFROM - X-REAL-RCPTTO - X-BENNO-GW httpClient: verifyCertificate: false storageUrl: endpoint: https://localhost/import/storagelist token: <bearer token to for storagelist interface> archiveEndpoint: inboxPath: "/srv/benno/inbox" restServer: port: 21543 hostUri: https://0.0.0.0 verifyCertificate: false sslKeyStore: sslCertPath: /srv/benno-cloud/certs/bc1.benno-cloud.de.fullchain sslPrivateKeyPath: /srv/benno-cloud/certs/bc1.benno-cloud.de.key
Die E-Mails werden per POST-Request an das Import REST API geschickt. Die Authentisierung erfolgt mittels HTTP BASIC Auth. Hierbei dient der HTTP BASIC Auth Benutzername zur Identifizierung des sendenden Systems. Das Passwort ist optional.
Ein Request gegen das API wird folgendermaßen realisiert:
curl -k -u <customer>:<pass> https://bc.lw-systems.net:21543/rest/inbox -T /data/export/customer0001.eml
Der Hostname bc.lw-sytems.de wird per Round-Robin DNS den Import-Nodes zugeordnet.
Der Benutzername und das Passwort werden an den URL unter storageURL:endpoint: geschickt. Dieser Request wird analog zu folgendem cURL Aufruf durchgeführt:
curl -i -X POST -d importid=... [-d importpw=...] -H "Authorization: Bearer qDx58z..." https://localhost/import/storageurl[/nopass]
Im Response des Requests wird eine JSON Datenstruktur mit den Storageurls zur Speicherung der E-Mail geschickt. Im Response wird im JSON Objekt „storageurls“ signalisiert, auf welche URLs die E-Mail parallel gespeichert werden soll.
{
"data": {
"storageurls": {
"file:///srv/benno/inbox": ["Customer"],
"https://bc-n1.lw-systems.net:21443/rest/archive": ["Customer"]
"https://bc-n2.lw-systems.net:21443/rest/archive": ["Customer"]
"https://bc-n3.lw-systems.net:21443/rest/archive": ["Customer"]
},
},
"status": "success",
"info": "AUTH OK from 50_benno_dbauth"
}
Der Benno Import REST Daemon überträgt die zu importierende E-Mail parallel an alle Storageurls.
Dem Sender wird der HTTP Status „200 OK“ zurück gegeben, wenn die E-Mail mindestens auf der in minBackends: konfigurierten Zahl von Backends erfolgreich gespeichert werden konnte.
Falls eine E-Mail nicht erfolgreich auf einem Backend gespeichert werden
konnte, wird die E-Mail lokal unter dem Pfad tempFiles:path: in
einem Unterverzeichnis gespeichert. Die Namen der Unterverzeichnisse
werden aus der MD5 Checksumme der Storageurl gebildet. Die zugehörige
Storageurl ist zusätzlich in der Datei .storageurl im
Unterverzeichnis gespeichert.
Der Cron-Job /etc/cron.d/benno-import-rest, der mit dem Paket
installiert ist, überprüft die temporären Verzeichnisse und schickt hier
zwischengespeicherte E-Mails ggfs. an den jeweiligen Node.