Mailarchivierung ist aufwändig? Nicht mit Benno MailArchiv. Die Archivierung Ihrer E-Mails erfolgt reibungslos im Hintergrund und das Beste ist: Sie finden jede E-Mail in Windeseile. Gleichzeitig werden Ihre geschäftlichen E-Mails revisionssicher archiviert – ganz im Sinne der GoBD. Einmal archiviert, können die E-Mails im Nachhinein nicht mehr verändert werden, so wie es rechtlich vorgeschrieben ist.
Hier zeige ich dir, wie ich mein Mailarchiv von einer Bare-Metal-Installation (gemäss Installationsanleitung im Wiki) auf Docker Compose (auf einem neuen PC, analog zur Installationsanleitung für Docker Compose auf dem Wiki) migriert habe. Diese Anleitung kann auch zur Neuinstallation verwendet werden, dann sind die Verzeichnisse auf dem Host anfangs einfach noch leer.
1. Grundvoraussetzungen
- Docker und Docker Compose und Debian/Ubuntu
- Traefik V3 Installation, Konfiguration und CrowdSec-Security
Wenn du von einer Bare-Metal-Installation auf Docker wechseln willst, musst du zuerst alle Dienste von Benno beenden und deren automatischen Neustart verhindern. Bei Ubuntu 24.04 mit systemd sieht das z.B. so aus:
sudo systemctl stop benno-archive sudo systemctl stop benno-rest sudo systemctl disable benno-archive sudo systemctl disable benno-rest
2. Ordner anlegen
Im ersten Schritt legen wir uns ein Verzeichnis an.
mkdir -p /opt/containers/benno
3. Docker Compose erstellen
Nun erstellen wir uns eine Docker Compose Datei.
nano /opt/containers/benno/docker-compose.yml
Kopiere nun folgenden Inhalt:
services: benno: image: bennomailarchiv/appliance #ports: # - "22080:80" # - "22500:22500" # - "21080:21080" restart: always volumes: #Neue Installation - ./etc/benno:/etc/benno/ - ./srv/benno/archive:/srv/benno/archive/ - ./srv/benno/system:/srv/benno/system/ - ./srv/benno/inbox:/srv/benno/inbox/ - ./var/log/benno:/var/log/benno - ./etc/benno-web:/etc/benno-web/ - ./var/lib/benno-web:/var/lib/benno-web/ #Bestehende Installation #- {Pfad zur bestehenden Installation}/etc/benno:/etc/benno/ #- {Pfad zur bestehenden Installation}/srv/benno/archive:/srv/benno/archive/ #- {Pfad zur bestehenden Installation}/srv/benno/system:/srv/benno/system/ #- {Pfad zur bestehenden Installation}/srv/benno/inbox:/srv/benno/inbox/ #- {Pfad zur bestehenden Installation}/var/log/benno:/var/log/benno #- {Pfad zur bestehenden Installation}/etc/benno-web:/etc/benno-web/ #- {Pfad zur bestehenden Installation}/var/lib/benno-web:/var/lib/benno-web/ labels: traefik.docker.network: proxy traefik.enable: "true" traefik.http.routers.benno.entrypoints: websecure traefik.http.routers.benno.middlewares: default@file traefik.http.routers.benno.rule: Host(`mailarchiv.deinedomain.de`) traefik.http.routers.benno.service: benno traefik.http.routers.benno.tls: "true" traefik.http.routers.benno.tls.certresolver: http_resolver traefik.http.services.benno.loadbalancer.server.port: "80" networks: proxy: null networks: proxy: external: true
Hier musst du folgende Anpassungen vornehmen:
- {Pfad zur bestehenden Installation} entweder ganz löschen (dann entsprechen die Pfadangaben den Original-Pfadangaben der Installation auf dem Host mittels oben verlinktem Wiki) oder bei einer Migration auf einen neuen Server z.B. alle Pfade relativ zu diesem Pfad {Pfad zur bestehenden Installation}
- deine Domain bei Traefik (mailarchiv.deinedomain.de) durch deine Domain für das Mailarchiv ersetzen, die du vorher im DNS festgelegt hast
4. Container starten
Dazu gibst du einfach folgenden Befehl ein:
docker compose -f /opt/containers/benno/docker-compose.yml up -d
5. Notwendige Anpassungen und Abschlussarbeiten
5.1. Volume Mapping (analog Wiki)
In der Voreinstellung bildet das Compose-File die Umgebung einer Benno MailArchiv Installation auf dem Hostsystem ab, so daß die Pfade außerhalb des Containers den Pfaden einer Standard-Installation entsprechen.
Die einzelnen Pfade können über die entsprechenden Umgebungsvariablen individuell konfiguriert werden. Die voreingstellten Pfade können mit Hilfe der Umgebungsvariablen an die lokale Umgebung angepasst werden.
- ARCHIVECONF_DIR: Benno Archiver Konfiguration (/etc/benno)
- ARCHIVE_DIR: Index- und Repo- Verzeichnis (/srv/benno/archive/)
- SYSTEM_DIR: Systemdaten (/srv/benno/system)
- INBOX_DIR: Import-Verzeichnis (/srv/benno/inbox)
- LOG_DIR: Log-Dateien (/var/log/benno)
- WEBCONF_DIR: Konfiguration des Web-Interfaces (/etc/benno-web)
- WEBLIB_DIR: Datenbank des Web-Interfaces (/var/lib/benno-web)
5.2. Admin-Passwort ändern und Hilfsdatei löschen
Beim ersten Start des Containers wird automatisch ein Passwort für den Benutzer „admin“ generiert. Das Passwort ist in der Datei $WEBCONF_DIR/pw_admin.txt abgelegt. Diese Datei sollte anschließend gelöscht werden.
Am Besten meldest du dich damit ein erstes Mal in der Weboberfläche als „admin“ an und änderst dann das Passwort auf ein von dir selbst generiertes Passwort.
5.3. Lizenzdatei neu bestellen
Weil mit dem Docker-Container die Umgebung von Benno “neu ist”, startet der Container nur mit eine Community-Lizenz. Also in der Weboberfläche das “i”-Symbol anklicken und aus dem Fenster eine neue Lizenzdatei anfordern (vgl. dazu auch das Wiki).
Nach Erhalt des Mails mit der neuen Lizenz-Datei diese dann in das Verzeichnis {Pfad zur bestehenden Installation}/etc/benno auf dem Host kopieren und den Container neu starten mit:
docker compose -f /opt/containers/benno/docker-compose.yml down docker compose -f /opt/containers/benno/docker-compose.yml up -d
Damit sollte nun der Container mit einer offiziellen Lizenz laufen (über “i”-Symbol kontrollieren).
5.4. Import von E-Mails
Nun musst du noch sicherstellen, dass alle E-Mails auch an Benno gesendet werden, damit diese in das Mailarchiv importiert werden können. Hier kannst du analog zum Import-Wiki wählen, welcher Weg für dich am Besten geeignet ist. Unter Docker kannst du gemäss dem Wiki auch MILTER oder benno-smtp direkt verwenden.
Ich hatte bei mir schon auf der Bare-Metal-Server-Installation den Weg über fetchmail installiert, weshalb ich dies nun auch mit dem Docker-Container so übernommen habe. Dazu folgende Schritte auf dem Host abarbeiten (unter Ubuntu 24.04 LTS):
- zuerst fetchmail und procmail mit
sudo apt install fetchmail procmail
installieren - dann einen Benutzer benno anlegen mit
sudo adduser benno
- im Home-Verzeichnis von benno eine Datei fetchmailrc anlegen
sudo nano /home/benno/fetchmailrc
- mit folgendem Inhalt:
# /home/benno/fetchmailrc # set invisible set logfile /home/benno/fetchmailrc-benno.log # kann auskommentiert werden, wenn fetchmail läuft poll {deineIMAP-Server-Adresse} with options proto imap, user "{deinBenno-Benutzer}" password "{deinPasswortBeimIMAP-Provider}" ssl fetchall mda "/usr/bin/procmail -m /home/benno/procmailrc" expunge 0 # bitte die Variablen {} entsprechend deinen Einstellungen anpassen !
- und mit den korrekten Rechten ausstatten
sudo chmod 0700 /home/benno/fetchmailrc
- im gleichen Verzeichnis auch noch eine Datei procmailrc anlegen
sudo nano /home/benno/procmailrc
- mit folgendem Inhalt:
# /home/benno/procmailrc # MAILDIR={Pfad zur bestehenden Installation}/srv/benno/inbox # {Pfad zur bestehenden Installation} wie oben bei der docker-compose-Datei anpassen :0 new/
- im Verzeichnis /var/spool/cron die Datei benno-fetchmail anlegen
sudo nano /var/spool/cron/benno-fetchmail
- mit folgendem Inhalt:
#!/bin/sh # # gemäss http://wiki.benno-mailarchiv.de/doku.php/fetchmail # /usr/bin/fetchmail -f /home/benno/fetchmailrc for MAILFILE in `ls -1 /daten-iup-server/benno/srv/benno/inbox/new/new`; do /bin/ln "{Pfad zur bestehenden Installation}/srv/benno/inbox/new/new/${MAILFILE}" "{Pfad zur bestehenden Installation}/srv/benno/inbox/${MAILFILE}.eml" && /bin/rm "{Pfad zur bestehenden Installation}/srv/benno/inbox/new/new/${MAILFILE}" # {Pfad zur bestehenden Installation} wie oben bei der docker-compose-Datei anpassen (die doppelten "new" sind Absicht!) done
- und dann mit sudo crontab -e noch einen Crontab-Eintrag einrichten, z.B. so:
*/2 * * * * su -s /bin/bash -c '/var/spool/cron/benno-fetchmail' - benno
Wenn alles geklappt hat, verfügst du nun über ein revisionssicheres Mailarchiv!
5.5. Backup des Mailarchivs
Du kannst jede Backup-Methode wählen, die dir passt oder im Wiki vorgeschlagen wird.
Denke einfach daran, dass an Stelle des Stoppens eines Systemdienstes (/etc/init.d/benno-archive stop
) nun am Einfachsten der Docker-Container beendet werden sollte (docker compose -f /opt/containers/benno/docker-compose.yml down
), um den Index zu sichern. Anschliessend den Docker-Container einfach wieder starten mit docker compose -f /opt/containers/benno/docker-compose.yml up -d
.
Falls du das Backup über Cron als root startest, musst du daran denken, den Docker-Container mit jenem Benutzer zu beenden und wieder zu starten, mit dem du normalerweise den Befehl docker compose -f /opt/containers/benno/docker-compose.yml up -d eingibst (bei mir der Standard-Benutzer auf dem Host, aber eben nicht root). In einem Bash-Script kannst du dafür folgenden Befehl verwenden:
/sbin/runuser -l {Standard-User} -c 'docker compose -f /opt/containers/benno/docker-compose.yml down' bzw. /sbin/runuser -l {Standard-User} -c 'docker compose -f /opt/containers/benno/docker-compose.yml up -d'
Ich habe für mich ein Backup-Script mit rdiff-backup erstellt, das ich dir hier gerne zur Verfügung stelle (Verzeichnisangaben musst du natürlich anpassen!):
#!/bin/sh # # analog https://wiki.benno-mailarchiv.de/doku.php/backup # aber mit rdiff-backup https://rdiff-backup.net/ # # Benno-Archiever stoppen #/etc/init.d/benno-archive stop echo "Start Benno Backup..." echo "benno-archive anhalten...Docker-Container herunterfahren" #systemctl stop benno-archive /sbin/runuser -l reto -c 'docker compose -f /opt/containers-reto/benno/docker-compose.yml down' sleep 45 echo "alles kopieren..." rdiff-backup -v1 /daten-iup-server/benno/srv/benno /daten-iup-server/Backup-IUP-Server/benno-backup/benno-backup-iup-server #Index sichern cp -a /daten-iup-server/benno/srv/benno/archive/index /daten-iup-server/Backup-IUP-Server/benno-backup/index_backup # SQLite-DB Benutzerdatenbank sichern aus /var/lib/benno-web cp -a /daten-iup-server/benno/var/lib/benno-web /daten-iup-server/Backup-IUP-Server/benno-backup/sqlite_backup # Benno-Archiever wieder starten #/etc/init.d/benno-archive start echo "benno-archive wieder starten...Docker-Container wieder hochfahren" #systemctl start benno-archive /sbin/runuser -l reto -c 'docker compose -f /opt/containers-reto/benno/docker-compose.yml up -d' # Backup noch auf anderen Server oder in die Cloud kopieren # und für dieses Backup hier noch 3 gepackte Dateien erstellen, die dann kopiert und rotiert werden cd /daten-iup-server/Backup-IUP-Server/benno-backup tar -czf index-backup.tar.gz /daten-iup-server/Backup-IUP-Server/benno-backup/index_backup tar -czf sqlite-backup.tar.gz /daten-iup-server/Backup-IUP-Server/benno-backup/sqlite_backup tar -czf benno-mailarchiv-backup.tar.gz /daten-iup-server/Backup-IUP-Server/benno-backup/benno-backup-iup-server echo "Gepackte Dateien erstellt und lokales Backup von Benno-Mailarchiv beendet." #These functions return exit codes: 0 = found, 1 = not found isMounted () { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device isDevMounted () { findmnt -rno SOURCE "$1" >/dev/null;} #device only isPathMounted() { findmnt -rno TARGET "$1" >/dev/null;} #path only #where: -r = --raw, -n = --noheadings, -o = --output if isMounted "/daten-externer-Server"; then echo "Mountpunkt daten-externer-Server schon eingehängt." else echo "VPN mit externem Server herstellen..." sudo systemctl start wg-quick@wg1 # ich verwende hier Wireguard ! sudo mount /daten-externer-Server echo "Mountpunkt daten-externer-Server wurde eingehängt." fi # jetzt sollte Mount bestehen... if isMounted "/daten-externer-Server"; then cd /daten-externer-Server/backup-benno-iup-server echo Neuste Dateien von Host auf externen Server sichern ... rm -f index-backup-4.tar.gz mv -f index-backup-3.tar.gz index-backup-4.tar.gz mv -f index-backup-2.tar.gz index-backup-3.tar.gz mv -f index-backup-1.tar.gz index-backup-2.tar.gz mv -f index-backup.tar.gz index-backup-1.tar.gz cp -frpv /daten-iup-server/Backup-IUP-Server/benno-backup/index-backup.tar.gz /daten-externer-Server/backup-benno-iup-server/index-backup.tar.gz rm -f sqlite-backup-4.tar.gz mv -f sqlite-backup-3.tar.gz sqlite-backup-4.tar.gz mv -f sqlite-backup-2.tar.gz sqlite-backup-3.tar.gz mv -f sqlite-backup-1.tar.gz sqlite-backup-2.tar.gz mv -f sqlite-backup.tar.gz sqlite-backup-1.tar.gz cp -frpv /daten-iup-server/Backup-IUP-Server/benno-backup/sqlite-backup.tar.gz /daten-externer-Server/backup-benno-iup-server/sqlite-backup.tar.gz rm -f benno-mailarchiv-backup-4.tar.gz mv -f benno-mailarchiv-backup-3.tar.gz benno-mailarchiv-backup-4.tar.gz mv -f benno-mailarchiv-backup-2.tar.gz benno-mailarchiv-backup-3.tar.gz mv -f benno-mailarchiv-backup-1.tar.gz benno-mailarchiv-backup-2.tar.gz mv -f benno-mailarchiv-backup.tar.gz benno-mailarchiv-backup-1.tar.gz cp -frpv /daten-iup-server/Backup-IUP-Server/benno-backup/benno-mailarchiv-backup.tar.gz /daten-externer-Server/backup-benno-iup-server/benno-mailarchiv-backup.tar.gz fi # Verzeichnis auf /daten-externer-Server verlassen, da sonst umount: /daten-externer-Server: target is busy! cd /daten-iup-server sudo umount /daten-externer-Server echo "Mountpunkt daten-externer-Server wurde ausgehängt." echo "VPN mit externem Server abstellen..." sudo systemctl stop wg-quick@wg1 echo "Ich habe fertig!"