Zum Inhalt springen
Deutsch

Installation des Container

Neben dem grommunio Appliance und einer manuellen Installation kann grommunio auch in Containern ausgeführt werden. Das offizielle, maßgebliche Projekt hierfür ist grommunio/gromox-container — eine Docker Compose-Bereitstellung, die die Groupware in eine kleine Anzahl von Containern bündelt, die von supervisord verwaltet werden, basierend auf openSUSE Leap 16.0 mit MariaDB 11.

:::note [Maßgebliche Quelle] Dieses Kapitel fasst die Bereitstellung zusammen; das Container-Projekt selbst ist die maßgebliche Quelle und enthält sinnvolle Beispielkonfigurationen. Überprüfen Sie stets die README-Datei des Projekts und passen Sie die Konfiguration – insbesondere alle Standardpasswörter – vor dem Einsatz in der Produktion an. :::

Der Stack gliedert sich in einen Kerncontainer sowie optionale Zusatzcontainer, die jeweils auf einer eigenen MariaDB-Datenbank basieren und sich alle in einem privaten Docker-Netzwerk befinden:

  • gromox-core – der Hauptcontainer, auf dem alle zentralen Groupware-Dienste ausgeführt werden (nginx, Postfix, die gromox-*-Daemons, Admin API, Antispam, Redis, …) unter supervisord.
  • gromox-archive (optional) – E-Mail-Archivierung mit Volltextsuche.
  • gromox-office (optional) – Dokumentbearbeitung und Dateisynchronisierung.
  • gromox-db / chat-db / files-db / office-db / archive-db — MariaDB- Datenbanken für die jeweiligen Komponenten.

Alle Service-Container laufen ohne Sonderrechte – kein privileged: true, kein SYS_ADMIN, keine speziellen Laufzeiten. Interne Ports werden auf Werte über 1024 umgeleitet, und die Host-Ports werden wieder auf die Standardports abgebildet (siehe Portzuordnung).

Sie benötigen einen Host mit Docker und dem Docker Compose-Plugin, einen vollqualifizierten Domänennamen (FQDN), der auf den Host verweist, sowie freie Standard-E-Mail-/Web-Ports.

  1. Das Projekt herunterladen

    Terminal-Fenster
    git clone https://github.com/grommunio/gromox-container.git
    cd gromox-container
  2. Umgebung konfigurieren — Kopieren Sie das Beispiel und passen Sie es mit Ihrer Domain, Ihren Passwörtern und Feature-Flags an:

    Terminal-Fenster
    cp var.env.example var.env
    $EDITOR var.env

    Stellen Sie mindestens FQDN, DOMAIN und ADMIN_PASS ein (siehe Konfiguration).

  3. Bereiten Sie die eingebundenen Volumes vor (oder führen Sie ./pre-launch.sh aus, was dies für Sie erledigt):

    Terminal-Fenster
    mkdir -p variables_data gromox_letsencrypt
    cp var.env variables_data/var.env
  4. Den Stapel starten:

    Terminal-Fenster
    docker compose up -d

    Der erste Start dauert einige Minuten, während jeder Container seine Datenbanken initialisiert, Zertifikate generiert und seine Dienste konfiguriert.

Sobald der Stack bereit ist, melden Sie sich mit dem Benutzer admin und dem Passwort aus ADMIN_PASS bei der Admin-Benutzeroberfläche an:

DienstURL
Webmail (grommunio Web)https://<FQDN>
Admin-Oberflächehttps://<FQDN>:8443
Exchange ActiveSynchttps://<FQDN>/Microsoft-Server-ActiveSync
CalDAV / CardDAVhttps://<FQDN>/dav
Dateien (falls aktiviert)https://<FQDN>/files
Archiv (falls aktiviert)https://<FQDN>/archive

gromox-core führt den gesamten Satz an Groupware-Diensten unter „supervisord“ aus:

DienstBeschreibung
nginxReverse-Proxy (Web, Admin, Sync, DAV)
postfixMail-Transport-Agent
gromox-httpHTTP / MAPI / AutoDiscover
gromox-imap / gromox-pop3IMAP / POP3-Server
gromox-delivery / gromox-delivery-queueLokale Zustellung + Warteschlange
gromox-zcorePHP-MAPI-Kern
gromox-midbNachrichtenindex-Datenbank
gromox-event / gromox-timerEreignisbus / geplante Aufgaben
grommunio-admin-apiAdmin REST API (uWSGI)
grommunio-antispamSpamfilter (rspamd)
grommunio-chat (optional)Nachrichtenübermittlung
php-fpmPHP FastCGI
redisCache / Sitzungsspeicher
saslauthdSMTP-Authentifizierung
crondGeplante Aufgaben (Certbot-Verlängerung, …)

Der optionale Container gromox-archive fügt grommunio-archive, grommunio-archive-smtp und einen Sphinx searchd hinzu; gromox-office fügt die Daemons für den Dokumentendienst und den Konverter sowie RabbitMQ hinzu.

Die gesamte Konfiguration erfolgt über Umgebungsvariablen in var.env.

VariableBeschreibungBeispiel
FQDNVollqualifizierter Domänenname des Serversmail.example.com
DOMAINE-Mail-Domäneexample.com
ADMIN_PASSgrommunio-AdministratorpasswortSecurePassword123
MYSQL_HOSTDatenbankhost für den Kerngromox-db
MYSQL_USER / MYSQL_PASS / MYSQL_DBAnmeldedaten / Name der Core-Datenbankgrommunio
VariableBeschreibungStandardwert
SSL_INSTALL_TYPE0 = selbstsigniert, 2 = Let's Encrypt0
SSL_BUNDLE / SSL_KEYPfade zu Ihrem eigenen Zertifikat und Schlüssel
SSL_EMAILE-Mail-Adresse für Let's Encrypt-Benachrichtigungenadmin@DOMAIN

Bei Let's Encrypt (SSL_INSTALL_TYPE=2) wird Certbot beim ersten Start ausgeführt, und ein Cron- Job erneuert das Zertifikat alle 12 Stunden; Port 80 muss über das Internet erreichbar sein. Falls die Bereitstellung von Let's Encrypt fehlschlägt, greift der Stack auf ein selbstsigniertes Zertifikat zurück, sodass die Dienste weiterhin verfügbar sind.

Jedes Add-on wird über das Flag ENABLE_* aktiviert bzw. deaktiviert und mit eigenen Datenbankzugangsdaten konfiguriert:

KomponenteAktivierungsflagZusätzliche Variablen
Chat(wird gestartet, wenn CHAT_CONFIG vorhanden ist)CHAT_MYSQL_*, CHAT_ADMIN_PASS, CHAT_CONFIG
DateienENABLE_FILES=trueFILES_MYSQL_*, FILES_ADMIN_PASS
BüroENABLE_OFFICE=trueOFFICE_HOST, OFFICE_MYSQL_*
ArchivENABLE_ARCHIVE=trueARCHIVE_HOST, ARCHIVE_MYSQL_*, ARCHIVE_INDEXER_*_INTERVAL
Keycloak SSOENABLE_KEYCLOAK=trueKEYCLOAK_REALM, KEYCLOAK_URL, KEYCLOAK_CLIENT_ID, KEYCLOAK_CLIENT_SECRET
VariableBeschreibungStandardwert
RELAYHOSTSMTP-Relay-Host für ausgehende E-Mails(leer)
ORGANIZATIONName der Organisation für AutoDiscover
TIMEZONEZeitzone für ContainerEurope/Vienna
FORCE_RECONFIGSetup-Skripte beim nächsten Neustart erneut ausführenfalse
CLEAR_DBSDatenbanken beim Start löschen und neu anlegen (erfordert MYSQL_ROOT_PASS)false
X500X.500-Organisationskennung (wird automatisch generiert, wenn leer)

:::caution [Standardwerte ändern] Die in den Beispieldatenbanken docker-compose.yml und var.env hinterlegten Passwörter dienen lediglich als Einstiegshilfe. Ändern Sie alle Passwörter (Datenbank, Admin, Chat/Dateien/ Büro/Archiv), bevor Sie die Installation öffentlich zugänglich machen. :::

Interne Ports liegen alle über 1024 (sodass Container keine Berechtigungen benötigen); der Host ordnet sie den Standardports zu:

Host-PortContainer-PortDienst
252525SMTP (Postfix eingehend)
808080HTTP (Let's Encrypt-Challenge, Weiterleitung von HTTP nach HTTPS)
4438443HTTPS (Webmail, Synchronisierung, DAV, Dateien, Office, Archiv)
4652465SMTPS (implizites TLS)
5872587Einreichung (authentifiziert)
9932993IMAPS
1432143IMAP (STARTTLS)
9952995POP3S
1102110POP3 (STARTTLS)
84439443Admin-Web-UI

Namensgebundene Volumes enthalten den gesamten Status, sodass Container ohne Datenverlust wiederhergestellt werden können. Die wichtigsten davon sollten gesichert werden:

DatenträgerEinhängepunktZweck
gromox/var/lib/gromoxPostfachdaten
gromox_config/etc/gromoxGromox-Konfiguration
cert_data/etc/grommunio-common/sslTLS-Zertifikate (gemeinsam genutzt)
gromox_mysql_dataMariaDB-DatenKerndatenbank
*_mysql_dataMariaDB-DatenChat-/Datei-/Office-/Archiv-Datenbanken
gromox_letsencrypt/etc/letsencryptLet's Encrypt-Status

Die Dienste innerhalb eines Containers werden mit supervisorctl verwaltet:

Terminal-Fenster
# Status of all services in the core container
docker exec gromox-core supervisorctl status
# Restart a single service
docker exec gromox-core supervisorctl restart nginx
# Per-service logs
docker exec gromox-core tail -f /var/log/supervisor-nginx.log
docker exec gromox-core cat /var/log/grommunio-setup.log # initial setup log

Die Einrichtungsskripte werden nur einmal ausgeführt (durch Marker-Dateien gesichert). So wenden Sie die Änderungen erneut an:

Terminal-Fenster
echo "FORCE_RECONFIG=true" >> variables_data/var.env
docker compose restart gromox-core

Sichern Sie die Datenbank und die Datenvolumes, zum Beispiel:

Terminal-Fenster
docker run --rm -v gromox_mysql_data:/data -v "$(pwd)/backup:/backup" \
busybox tar czf /backup/gromox-db.tar.gz /data
docker run --rm -v gromox:/data -v "$(pwd)/backup:/backup" \
busybox tar czf /backup/gromox-data.tar.gz /data
docker run --rm -v gromox_config:/data -v "$(pwd)/backup:/backup" \
busybox tar czf /backup/gromox-config.tar.gz /data
Terminal-Fenster
git pull
docker compose build
docker compose up -d

Die Container-Images wenden standardmäßig die aktuelle TLS-Sicherheitshärtung an:

  • Postfix (25/587): Die veralteten Verschlüsselungsalgorithmen und die der DH-Familie werden ausgeschlossen (aNULL, eNULL, EXP, MD5, RC4, DES, 3DES, DHE, EDH, kDHE, kEDH, ADH), während die Forward-Secret-ECDHE-Suiten beibehalten werden (smtpd_tls_eecdh_grade = strong); SSLv2/SSLv3 und TLS 1.0/1.1 sind deaktiviert. Durch den Ausschluss ausschließlich der DH-Familie wird CVE-2002-20001 (ein Denial-of-Service-Angriff beim reinen DHE-Schlüsselaustausch) gemindert, ohne dabei die Forward-Secrecy zu beeinträchtigen.
  • Gromox http / imap / pop3: tls_min_proto = tls1.2 — SSLv3 und TLS 1.0/1.1 sind deaktiviert, wobei TLS 1.2 die Mindestversion darstellt. (993/995 sind clientseitig ohne vorangeschaltetem Proxy; daher würde eine Mindestanforderung von TLS 1.3 E-Mail-Clients ausschließen, die nur TLS 1.2 unterstützen, wie ältere Thunderbird-, Mobil- und Outlook-Versionen.)
  • Alle Container laufen ohne Sonderrechte.

Für die Produktion sollten Sie die Bereitstellung zusätzlich hinter einer Firewall platzieren, Let's Encrypt oder Ihre eigenen, von einer Zertifizierungsstelle signierten Zertifikate verwenden und die Images auf dem neuesten Stand halten.

Terminal-Fenster
docker compose ps # container + database health
docker compose logs gromox-core
# a service stuck in FATAL — read its error log:
docker exec gromox-core cat /var/log/supervisor-<service>-err.log

Häufige Ursachen: ein fehlendes FQDN/DOMAIN in var.env (Postfix schlägt fehl), fehlendes OFFICE_MYSQL_* (Dokumentendienst schlägt fehl) oder grommunio Files lehnt ein selbstsigniertes Zertifikat ab – verwenden Sie Let's Encrypt oder fügen Sie den Host zu den vertrauenswürdigen Domänen von „Files“ hinzu. Weitere Informationen finden Sie im README-Abschnitt zur Fehlerbehebung des Projekts.