Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung IT-Branche 05.07.2026 · 11 min Lesezeit

Mautic mit Docker installieren: Open-Source-Marketing-Automation als HubSpot-Alternative

Mautic ist die leistungsfähigste selbst gehostete Marketing-Automation-Plattform: E-Mail-Kampagnen, Lead-Nurturing und Segmentierung ohne SaaS-Abo. Diese Anleitung zeigt das Docker-Compose-Setup mit vier Containern in 25 Minuten.

Mautic mit Docker installieren: Open Source Marketing Automation als HubSpot Alternative mit Docker Container, E Mail Kampagnen, Lead Management, CRM, Workflows, Analysen und Self Hosting für automatisiertes digitales Marketing. KI-generiert

Mautic ist mit knapp 10.000 GitHub-Stars die meistgenutzte selbst gehostete Marketing-Automation-Plattform und liefert auf einer einzigen Instanz alles, was kommerzielle SaaS-Lösungen wie HubSpot für mehrere hundert Euro im Monat verkaufen: E-Mail-Kampagnen, Lead-Nurturing, Kontaktsegmentierung, Landing Pages, Formulare, A/B-Tests und Multi-Channel-Marketing. Für KMU, Agenturen und Digital-Marketing-Teams, die Kundenkommunikation automatisieren wollen, ohne sich an einen Anbieter zu binden, ist das Docker-basierte Setup der schnellste Weg zur eigenen Marketing-Zentrale. Diese Anleitung führt dich Schritt für Schritt durch Installation, Konfiguration und erste Verifikation auf einem beliebigen Linux-Host.

Voraussetzungen

  1. Docker Engine 24+ mit Compose-Plugin v2 (docker compose, nicht das veraltete docker-compose v1) – Docker und Compose auf Linux einrichten: Docker und Docker Compose auf Linux installieren
  2. Linux-Host, VM oder NAS mit Docker-Unterstützung (amd64 oder arm64, beides wird nativ unterstützt)
  3. Mindestens 2 GB RAM und 10 GB freier Festplattenplatz; empfohlen sind 4 GB RAM für flüssigen Betrieb mit Worker-Prozessen
  4. SMTP-Zugangsdaten für ausgehenden E-Mail-Versand (Gmail, eigener Postfix, Mailgun o. ä.) – werden nach dem Setup-Wizard in Mautic konfiguriert
  5. Optional: Reverse Proxy für HTTPS (Traefik oder Nginx Proxy Manager) – siehe Traefik als Docker-Reverse-Proxy mit automatischem HTTPS

Schritt 1: Projektordner und Verzeichnisstruktur anlegen

Lege zunächst ein dediziertes Projektverzeichnis an. Alle persistenten Daten landen in Unterordnern, die Mautic als Bind-Mounts einbindet. Unter Linux empfiehlt sich /opt/mautic für produktive Instanzen.

mkdir -p /opt/mautic
cd /opt/mautic
mkdir -p ./mautic/config ./mautic/logs ./mautic/media/files ./mautic/media/images

Auf Linux-Hosts läuft der Mautic-Container unter dem Benutzer www-data (UID 33). Wenn du die Verzeichnisse als root anlegst, muss die Eigentümerschaft stimmen, damit der Container schreiben kann:

chown -R 33:33 ./mautic

Verifizieren: Prüfe, ob die Verzeichnisstruktur korrekt angelegt wurde und die Berechtigungen stimmen:

ls -la ./mautic/
# Erwartete Ausgabe: config/ logs/ media/ – alle mit Eigentümer 33:33 (www-data)

Schritt 2: Umgebungsvariablen in .env und .mautic_env definieren

Mautic trennt seine Konfiguration bewusst auf zwei Dateien auf: .env enthält die Docker-Compose-Variablen und MySQL-Credentials, .mautic_env die Mautic-internen Anwendungseinstellungen. Beide Dateien liegen im Projektverzeichnis neben der compose.yaml.

Erstelle zuerst die .env-Datei:

# /opt/mautic/.env
COMPOSE_PROJECT_NAME=mautic
MYSQL_ROOT_PASSWORD=sicheres_root_passwort_hier_aendern
MYSQL_DATABASE=mautic
MYSQL_USER=mautic
MYSQL_PASSWORD=sicheres_db_passwort_hier_aendern
DOCKER_MAUTIC_LOAD_TEST_DATA=false

Dann die .mautic_env-Datei für die Mautic-Anwendung:

# /opt/mautic/.mautic_env
# Datenbankverbindung – WICHTIG: Host muss "mysql" lauten (Docker links-Alias), nicht "db"
MAUTIC_DB_HOST=mysql
MAUTIC_DB_PORT=3306
MAUTIC_DB_DATABASE=mautic
MAUTIC_DB_USER=mautic
MAUTIC_DB_PASSWORD=sicheres_db_passwort_hier_aendern

# Message-Queue-Transport (Standard: DB-basiert, kein RabbitMQ nötig)
MAUTIC_MESSENGER_DSN_EMAIL=doctrine://default
MAUTIC_MESSENGER_DSN_HIT=doctrine://default

# PHP-Tuning
PHP_INI_VALUE_DATE_TIMEZONE=Europe/Berlin
PHP_INI_VALUE_MEMORY_LIMIT=512M
PHP_INI_VALUE_UPLOAD_MAX_FILESIZE=512M
PHP_INI_VALUE_POST_MAX_FILESIZE=512M
PHP_INI_VALUE_MAX_EXECUTION_TIME=300

# Worker-Parallelität
DOCKER_MAUTIC_WORKERS_CONSUME_EMAIL=2
DOCKER_MAUTIC_WORKERS_CONSUME_HIT=2
DOCKER_MAUTIC_WORKERS_CONSUME_FAILED=2

Ersetze die Passwort-Platzhalter durch starke, zufällige Zeichenketten. Das Passwort in MYSQL_PASSWORD und MAUTIC_DB_PASSWORD muss identisch sein.

Verifizieren: Stelle sicher, dass beide Dateien vorhanden und nicht leer sind:

ls -la /opt/mautic/.env /opt/mautic/.mautic_env
# Beide Dateien sollten angezeigt werden und eine Größe > 0 haben

Schritt 3: compose.yaml erstellen

Das Herzstück des Setups ist die compose.yaml. Vier Container arbeiten zusammen: MySQL als Datenbankserver sowie drei Mautic-Container, die alle dasselbe Image nutzen, sich aber durch die Umgebungsvariable DOCKER_MAUTIC_ROLE unterscheiden. Ein YAML-Anchor (x-mautic-volumes) vermeidet doppelte Volume-Definitionen – das erfordert Docker Compose v2.

Die folgende Tabelle gibt einen Überblick über die wichtigsten Parameter:

ParameterWertHinweis
Imagemautic/mautic:7-apacheImmer aktuellstes 7.x; pinnen: 7.1.2-apache
Port8080:80Nur Web-Container; DB intern
Architekturamd64 + arm64Multi-Arch nativ
DB-Imagemysql:ltsKein PostgreSQL-Support
RAM (min.)2 GB4 GB empfohlen
Disk (min.)10 GBImage ~590 MB + Daten

Speichere die folgende Datei als /opt/mautic/compose.yaml:

x-mautic-volumes:
  &mautic-volumes
  - ./mautic/config:/var/www/html/config:z
  - ./mautic/logs:/var/www/html/var/logs:z
  - ./mautic/media/files:/var/www/html/docroot/media/files:z
  - ./mautic/media/images:/var/www/html/docroot/media/images:z
  # - ./cron:/opt/mautic/cron:z  # eigene Cron-Konfiguration (optional)

services:
  db:
    image: mysql:lts
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: mysqladmin --user=$$MYSQL_USER --password=$$MYSQL_PASSWORD ping
      start_period: 5s
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - default

  mautic_web:
    image: mautic/mautic:7-apache
    restart: unless-stopped
    links:
      - db:mysql
    ports:
      - "8080:80"
    volumes: *mautic-volumes
    environment:
      - DOCKER_MAUTIC_LOAD_TEST_DATA=${DOCKER_MAUTIC_LOAD_TEST_DATA:-false}
    env_file:
      - .mautic_env
    healthcheck:
      test: curl http://localhost
      start_period: 5s
      interval: 5s
      timeout: 5s
      retries: 100
    depends_on:
      db:
        condition: service_healthy
    networks:
      - default

  mautic_cron:
    image: mautic/mautic:7-apache
    restart: unless-stopped
    links:
      - db:mysql
    volumes: *mautic-volumes
    environment:
      - DOCKER_MAUTIC_ROLE=mautic_cron
    env_file:
      - .mautic_env
    depends_on:
      mautic_web:
        condition: service_healthy
    networks:
      - default

  mautic_worker:
    image: mautic/mautic:7-apache
    restart: unless-stopped
    links:
      - db:mysql
    volumes: *mautic-volumes
    environment:
      - DOCKER_MAUTIC_ROLE=mautic_worker
    env_file:
      - .mautic_env
    depends_on:
      mautic_web:
        condition: service_healthy
    networks:
      - default

volumes:
  mysql-data:

networks:
  default:
    name: ${COMPOSE_PROJECT_NAME:-mautic}-docker

Warum vier Container statt einem? Mautic trennt absichtlich zwischen dem Web-Prozess (HTTP-Anfragen), dem Cron-Prozess (geplante Aufgaben wie Kampagnen-Trigger) und dem Worker-Prozess (asynchrone Message-Queue für E-Mail-Versand). Nur wenn alle drei laufen, funktioniert die Marketing-Automation vollständig. Würde der Cron-Container fehlen, werden Kampagnen nie ausgelöst – ein häufiger Einsteigerfehler.

Verifizieren: Prüfe die compose.yaml-Syntax, bevor du den Stack startest:

docker compose config --quiet && echo "Syntax OK"
# Erwartete Ausgabe: Syntax OK (keine Fehlermeldung)

Schritt 4: Stack starten und Images laden

Lade alle Images herunter und starte den Stack im Hintergrund:

cd /opt/mautic
docker compose pull
docker compose up -d

Das erste docker compose pull lädt das MySQL-LTS-Image (~580 MB) und das Mautic-Apache-Image (~590 MB). Rechne beim ersten Start je nach Verbindung mit 2–5 Minuten Download-Zeit.

Nach dem Start arbeitet die Startsequenz automatisch in der richtigen Reihenfolge: MySQL startet zuerst und meldet sich per Healthcheck als bereit, dann startet mautic_web und führt den initialen Setup-Prozess durch, und erst wenn mautic_web als „healthy" gilt, starten mautic_cron und mautic_worker.

Verifizieren: Prüfe den Status aller Container:

docker compose ps
# Erwartete Ausgabe (nach 2-5 Minuten):
# NAME                   IMAGE                    STATUS
# mautic-db-1            mysql:lts                Up X minutes (healthy)
# mautic-mautic_web-1    mautic/mautic:7-apache   Up X minutes (healthy)
# mautic-mautic_cron-1   mautic/mautic:7-apache   Up X minutes
# mautic-mautic_worker-1 mautic/mautic:7-apache   Up X minutes

Alle vier Container müssen den Status „Up" haben. Wenn mautic_web noch auf „(health: starting)" steht, warte weitere 1–2 Minuten. Bei Fehlern hilft ein Blick in die Logs:

docker compose logs mautic_web --tail=50
# Kein "Connection refused" oder "SQLSTATE"-Fehler darf erscheinen

Schritt 5: Setup-Wizard im Browser durchführen

Sobald alle Container „Up" sind, öffne im Browser:

http://<IP-deines-Hosts>:8080/s/setup
# oder lokal testen:
curl -I http://localhost:8080/
# Erwartete Ausgabe: HTTP/1.1 302 Found (Weiterleitung auf /s/setup)

Der Setup-Wizard führt dich durch drei Schritte:

  1. Datenbankverbindung prüfen: Mautic füllt die Felder automatisch aus den Umgebungsvariablen vor. Klicke auf „Next", wenn der Verbindungstest grün wird.
  2. Admin-Account erstellen: Vergib eine E-Mail-Adresse, einen Benutzernamen und ein sicheres Passwort. Es gibt keinen vordefinierten Standardbenutzer.
  3. E-Mail-Konfiguration: Trage deine SMTP-Zugangsdaten ein oder überspringe den Schritt für den Moment. Der E-Mail-Versand lässt sich später unter Einstellungen → E-Mail-Einstellungen konfigurieren.

Nach Abschluss des Wizards landest du auf dem Mautic-Dashboard.

Verifizieren: Rufe nach dem Wizard die Startseite auf und prüfe, ob das Dashboard erreichbar ist:

curl -I http://localhost:8080/s/dashboard
# Erwartete Ausgabe: HTTP/1.1 200 OK

Schritt 6: Cron-Jobs und Worker-Status prüfen

Kampagnen, Segmentaktualisierungen und der E-Mail-Versand sind auf laufende Cron- und Worker-Prozesse angewiesen. Prüfe, ob der mautic_cron-Container planmäßig Aufgaben ausführt:

docker compose logs mautic_cron --tail=30
# Erwartete Ausgabe: Zeilen wie "Running: php bin/console mautic:campaigns:trigger"
# oder "mautic:segments:update" – keine ERROR-Zeilen

docker compose logs mautic_worker --tail=30
# Erwartete Ausgabe: Worker-Prozesse starten: "Consuming messages from..."

Möchtest du einen Cron-Job manuell auslösen (z. B. für einen Test), nutze immer den Parameter --user www-data, damit keine Datei-Berechtigungsprobleme entstehen:

docker compose exec --user www-data --workdir /var/www/html mautic_web \
  php bin/console mautic:campaigns:trigger
# Ausgabe: "Triggering events for campaigns..." – kein "Permission denied"

Verifizieren: Alle drei Mautic-Container laufen, die Logs von mautic_cron zeigen Konsolen-Aufrufe ohne Fehler, und der manuelle Konsolen-Befehl läuft als www-data durch.

Schritt 7: Reverse Proxy und HTTPS einrichten (Produktion)

Für den Produktivbetrieb solltest du Mautic nicht direkt auf Port 8080 betreiben, sondern hinter einem Reverse Proxy mit HTTPS. Entferne dazu den Port-Bind im mautic_web-Service (oder ersetze ihn durch 127.0.0.1:8080:80) und konfiguriere Traefik oder Nginx Proxy Manager als vorgelagerten Proxy.

Eine vollständige Anleitung zum HTTPS-Reverse-Proxy findest du hier: Traefik als Docker-Reverse-Proxy mit automatischem HTTPS einrichten. Alternativ eignet sich der Nginx Proxy Manager, der eine browserbasierte Oberfläche für SSL-Zertifikate bietet.

Nach der HTTPS-Einrichtung musst du in Mautic unter Einstellungen → Systemkonfiguration → Site URL die korrekte HTTPS-Domain eintragen, damit generierte Links in E-Mails stimmen.

Verifizieren:

curl -I https://deine-domain.de/s/dashboard
# Erwartete Ausgabe: HTTP/2 200 (oder HTTP/1.1 200 OK)

Schritt 8: Updates einspielen

Mautic folgt Semantic Versioning und veröffentlicht regelmäßig Minor-Updates. Minor-Updates (z. B. 7.1.2 → 7.1.3) sind in-place möglich. Bei Major-Version-Sprüngen (z. B. 6 → 7) immer zuerst die Changelogs und Migrationsdokumentation lesen.

cd /opt/mautic
# Images aktualisieren und Container neu starten:
docker compose pull
docker compose up -d

# Datenbankmigrationen ausführen (Pflicht nach jedem Update):
docker compose exec --user www-data --workdir /var/www/html mautic_web \
  php bin/console doctrine:migrations:migrate --no-interaction

Wenn du eine bestimmte Version pinnen möchtest, ersetze in der compose.yaml den Tag 7-apache durch z. B. 7.1.2-apache. Das verhindert ungewollte automatische Updates bei docker compose pull. Mehr zu automatischen Container-Updates: Watchtower mit Docker: Container automatisch aktualisieren.

Verifizieren:

docker compose ps
# Alle Container müssen nach dem Update wieder den Status "Up" haben

docker compose exec --user www-data --workdir /var/www/html mautic_web \
  php bin/console mautic:about
# Zeigt die aktuell installierte Mautic-Version

Troubleshooting / Typische Fehler

  1. „SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed": Der DB-Host ist falsch gesetzt. MAUTIC_DB_HOST muss den Wert mysql haben (Docker-Links-Alias), nicht db (Service-Name). Prüfe .mautic_env und stelle sicher, dass links: - db:mysql in allen drei Mautic-Services gesetzt ist.
  2. mautic_web bleibt im Status „health: starting": MySQL braucht auf langsamer Hardware länger. Erhöhe in der compose.yaml den healthcheck-Wert von retries: 100 auf 150 oder erhöhe start_period auf 30s. Dann docker compose up -d erneut ausführen.
  3. „.mautic_env: no such file or directory": Die Datei fehlt oder liegt nicht im Projektverzeichnis. Prüfe mit ls -la /opt/mautic/ – beide Dateien müssen neben der compose.yaml liegen.
  4. Schreibfehler / „Permission denied" in Volumes: Die Verzeichnisse unter ./mautic/ gehören root statt www-data. Fix: chown -R 33:33 /opt/mautic/mautic. Danach docker compose restart mautic_web.
  5. Kampagnen werden nicht versendet: mautic_cron und/oder mautic_worker laufen nicht. Prüfe docker compose ps – alle vier Container müssen „Up" sein. Falls Container fehlen: docker compose up -d mautic_cron mautic_worker.
  6. „Additional property condition is not allowed": Du verwendest das veraltete docker-compose v1. Das depends_on: condition-Feature und YAML-Anchors erfordern Docker Compose v2 (docker compose). Upgrade: apt install docker-compose-plugin.
  7. Netzwerkname leer / Konflikte: COMPOSE_PROJECT_NAME fehlt in der .env. Ohne diese Variable heißt das Netzwerk -docker und kollidiert mit anderen Stacks. Sicherstellen, dass COMPOSE_PROJECT_NAME=mautic gesetzt ist.
  8. Datenbankfehler nach Update: Vergessene Datenbankmigration. Immer nach dem Image-Wechsel doctrine:migrations:migrate ausführen (Schritt 8).

Häufige Fragen

Welche PHP-Version nutzt Mautic 7?

Das offizielle Image mautic/mautic:7-apache basiert auf dem PHP-Apache-Basisimage. Mautic 7.x erfordert PHP 8.1 oder neuer. Die genaue PHP-Patch-Version ist im jeweiligen Image-Tag verankert; du musst PHP nicht separat installieren oder konfigurieren.

Kann ich PostgreSQL statt MySQL verwenden?

Nein. Mautic unterstützt offiziell ausschließlich MySQL und MariaDB. Das Beispiel-Setup nutzt mysql:lts. Wer MariaDB bevorzugt, kann image: mariadb:lts einsetzen – die Konfiguration bleibt identisch. PostgreSQL wird vom Projekt nicht unterstützt.

Wie aktiviere ich HTTPS?

Einen Reverse Proxy (Traefik oder Nginx Proxy Manager) vorschalten, der TLS auf Port 443 terminiert und auf mautic_web:80 weiterleitet. Im mautic_web-Service den externen Port-Bind entfernen oder auf 127.0.0.1:8080:80 einschränken. Anschließend in Mautic unter Einstellungen → Systemkonfiguration → Site URL die HTTPS-Domain eintragen.

Wo finde ich den initialen Admin-Account?

Es gibt keinen vordefinierten Standardbenutzer. Der Setup-Wizard unter http://<host>:8080/s/setup erstellt beim ersten Aufruf den Admin-Account. Hast du den Wizard bereits abgeschlossen und das Passwort vergessen, kannst du es per CLI zurücksetzen:

docker compose exec --user www-data --workdir /var/www/html mautic_web \
  php bin/console mautic:user:manage

Wie führe ich Cron-Jobs manuell aus?

Mit dem folgenden Befehl – der Parameter --user www-data ist zwingend, sonst entstehen Berechtigungsprobleme:

docker compose exec --user www-data --workdir /var/www/html mautic_web \
  php bin/console mautic:campaigns:trigger

Im laufenden Betrieb übernimmt der mautic_cron-Container diese Aufgabe automatisch.

Kann ich RabbitMQ für die Message-Queue verwenden?

Ja. Das Standard-Setup nutzt doctrine://default (DB-basierte Queue), was für die meisten KMU-Installationen ausreicht. Bei hohem E-Mail-Volumen (mehr als 10.000 Kontakte, mehrere parallele Kampagnen) lohnt sich RabbitMQ als Queue-Transport. Das offizielle GitHub-Repository docker-mautic enthält ein fertiges rabbitmq-worker-Beispiel.

Welche Integrationen bietet Mautic?

Mautic unterstützt nativ Integrationen mit Salesforce, HubSpot (Daten-Import), Mailchimp, Twilio für SMS sowie zahlreiche weitere CRM- und E-Commerce-Systeme. Erweiterungen sind über die offizielle Plugin-API möglich. Die Community pflegt regelmäßig neue Konnektoren.

Fazit

Mautic ist der überzeugendste Beweis, dass Marketing-Automation kein SaaS-Abo benötigt. Mit vier Docker-Containern und zwei Konfigurationsdateien bekommt ein KMU eine vollständige Plattform für E-Mail-Kampagnen, Lead-Nurturing, Segmentierung und Multi-Channel-Marketing – ohne monatliche Lizenzkosten und ohne Vendor-Lock-in. Der häufigste Einrichtungsfehler ist der falsche DB-Host-Alias: Sobald MAUTIC_DB_HOST=mysql korrekt gesetzt ist und alle vier Container laufen, arbeitet Mautic stabil. Für den Produktivbetrieb sind ein Reverse Proxy mit HTTPS und eine regelmäßige Backup-Routine der persistenten Volumes essenziell.

Wer tiefer in sichere Docker-Konfiguration einsteigen möchte, findet in der Anleitung Docker Compose absichern: Secrets, Healthchecks, Non-Root und Read-Only weitere Best Practices. Für die Absicherung mit Backups ist 3-2-1-Backup-Strategie umsetzen ein guter nächster Schritt.

Weiterführende Anleitungen und Quellen

  1. Docker und Docker Compose auf Linux installieren (Ubuntu/Debian)
  2. Traefik als Docker-Reverse-Proxy mit automatischem HTTPS einrichten
  3. Docker Compose absichern: Secrets, Healthchecks, Non-Root und Read-Only
  4. 3-2-1-Backup-Strategie praktisch umsetzen
  5. n8n mit Docker: KI-Workflows und Automatisierung self-hosted

Quellen: Mautic auf Docker Hub (offizielles Image, Tags, Architektur) · docker-mautic auf GitHub (Compose-Beispiele, README) · Mautic Haupt-Repository (Releases, Status) · docs.mautic.org (offizielle Dokumentation)

Passende Anleitungen auf S-EDV

  1. netcup Local Block Storage bestellen, einrichten und unter Linux einbinden
  2. Linux 7.1-rc6 veröffentlicht: Kernel-Entwicklung stabilisiert sich nach KI-bedin
  3. Linux-Kernel CVE-2026-23111: Ein-Zeichen-Fehler in nf_tables ermöglicht lokale R