Cluster Setup

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.

Implementierung

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.