Zum Inhalt springen

Mautic 6 mit Docker installieren – Schritt-für-Schritt Anleitung

Mit Mautic 6 ist eine moderne, überarbeitete Version des beliebten Open-Source-Marketingtools erschienen. Der Umstieg bringt nicht nur viele neue Features, sondern auch technische Anforderungen wie PHP 8.1+, ein neues Installationssystem – und den Umstieg auf .env-Konfiguration.

In dieser Anleitung zeige ich dir, wie du Mautic 6 sauber und nachhaltig mit Docker aufsetzt – inklusive Lösung typischer Fehler wie dem bekannten .env missing-Fehler.

✅ Voraussetzungen

Bevor du loslegst, solltest du Folgendes auf deinem System installiert haben:

  • Docker
  • Docker Compose
  • Git
  • Ein bisschen Terminal-Erfahrung 😉

Allgemein

🧠 Wie ist Mautic aufgebaut? – Struktur und wichtige Dateien erklärt

Bevor wir in den praktischen Teil einsteigen oder tiefer in Konfigurationsdetails gehen, lohnt sich ein kurzer Blick auf die grundlegende Struktur von Mautic 6 und die wichtigsten Dateien im Docker-Setup.

📁 Die Verzeichnisstruktur von Mautic (im Container)

Wenn du Mautic in einem Docker-Container installierst, liegt der Mautic-Code standardmäßig im Verzeichnis:

/var/www/html/

Dort findest du unter anderem:

Datei / OrdnerBeschreibung
.envEnthält alle Umgebungsvariablen (z. B. DB-Zugang, Umgebung, Debug-Modus)
index.phpStartpunkt für den Webzugriff – leitet alles in das Symfony-Framework
app/Kernkonfiguration von Symfony + Mautic
bin/consoleCLI-Werkzeug für Cronjobs, Wartung usw.
config/Projektweite Symfony-Konfiguration (ab Symfony 5+)
public/Öffentlicher Webzugriff (wenn Webroot geändert wird)
vendor/Abhängigkeiten – wird durch Composer installiert
var/Cache, Logs, temporäre Daten

🐳 Docker-Setup: Was machen die einzelnen Dateien?

Beim Einsatz von Docker erzeugen wir einige zusätzliche Dateien, um Mautic automatisiert starten zu können. Hier ein Überblick:

🧱 Dockerfile – Das Herzstück

Hier wird definiert:

  • welches PHP-Basis-Image verwendet wird (z. B. php:8.2-apache)
  • welche PHP-Erweiterungen installiert werden (z. B. pdo_mysql, mbstring, gd)
  • woher der Mautic-Quellcode kommt (GitHub-Release)
  • wie Mautic vorbereitet und kopiert wird
  • welches Entrypoint-Skript den Startprozess steuert

⚙️ docker-compose.yml

Definiert die Dienste, die zusammenarbeiten:

  • mautic: der Webcontainer mit PHP und Apache
  • db: eine MariaDB-Instanz für die Datenbank
  • Volumes zur Persistenz der Daten

🔧 common/docker-entrypoint.sh

Ein Bash-Skript, das beim Start des Containers ausgeführt wird. Es sorgt dafür, dass:

  • Mautic-Dateien nur kopiert werden, wenn das Zielverzeichnis leer ist
  • die .env-Datei korrekt gesetzt wird
  • Cronjobs (falls aktiviert) automatisch gestartet werden
services:
  mautic:
    build: .
    ports:
      - "8080:80"
    depends_on:
      - db
  db:
    image: mariadb:10.6

🗒️ common/.env

Die wichtigste Konfigurationsdatei für Mautic 6. Hier stehen alle Umgebungsvariablen, z. B.:

APP_ENV=prod
MAUTIC_DB_HOST=db
MAUTIC_DB_USER=mautic
MAUTIC_DB_PASSWORD=mauticpass

🧪 common/makeconfig.php und makedb.php

Mautic braucht regelmäßige Cronjobs, damit Kampagnen, E-Mail-Versand und Segmentupdates funktionieren. Diese Datei definiert die wichtigsten Befehle, z. B.:

*/5 * * * * www-data php /var/www/html/bin/console mautic:segments:update

💡 Zusammenfassung

  • Die Mautic-Webdateien liegen in /var/www/html
  • Die Konfiguration läuft über .env (nicht mehr über local.php)
  • Docker verwendet zusätzliche Skripte zur Automatisierung (z. B. entrypoint.sh)
  • Cronjobs werden als separate Datei mitgeliefert
  • Die Datenbank liegt in einem eigenen Container (MariaDB)

Innstallation

📁 Projektstruktur vorbereiten

Erstelle ein neues Verzeichnis:

mkdir mautic6-docker && cd mautic6-docker
mkdir common
touch Dockerfile docker-compose.yml

Erstelle darin folgende Dateien:

mautic6-docker/
├── Dockerfile
├── docker-compose.yml
├── common

Lege zusätzlich die Dateien im common/-Verzeichnis an:

touch common/docker-entrypoint.sh common/makeconfig.php common/makedb.php common/mautic.crontab common/.env

🐳 Dockerfile – Basis für Mautic

Das Dockerfile basiert auf php:8.2-apache, installiert alle nötigen Abhängigkeiten für Mautic 6, lädt den Quellcode herunter und konfiguriert das System so, dass beim Start alles reibungslos läuft.

FROM php:8.2-apache

LABEL vendor="Mautic"
LABEL maintainer="Thomas Baldermann (durch eigenen namen ersetzen)<th@it-hub.at>"

# Argument für Version
ARG MAUTIC_VERSION=6.0.1
ENV MAUTIC_VERSION=${MAUTIC_VERSION}

# Abhängigkeiten & PHP-Extensions
RUN apt-get update && apt-get install --no-install-recommends -y \
    ca-certificates \
    cron \
    git \
    unzip \
    zip \
    curl \
    wget \
    libcurl4-openssl-dev \
    libicu-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libxml2-dev \
    libzip-dev \
    libonig-dev \
    libpq-dev \
    libssl-dev \
    libwebp-dev \
    mariadb-client \
    nano \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) \
        gd \
        intl \
        mbstring \
        mysqli \
        pdo \
        pdo_mysql \
        xml \
        zip \
        bcmath \
        opcache \
        sockets \
        curl \
        exif \
    && docker-php-ext-enable \
        gd \
        intl \
        mbstring \
        mysqli \
        pdo_mysql \
        xml \
        zip \
        bcmath \
        opcache \
        sockets \
        curl \
        exif \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# Composer installieren
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# Apache Rewrite aktivieren
RUN a2enmod rewrite

# Mautic herunterladen und entpacken (direkt in /var/www/html)
RUN curl -sSL https://github.com/mautic/mautic/releases/download/${MAUTIC_VERSION}/${MAUTIC_VERSION}.zip -o mautic.zip \
    && unzip mautic.zip -d /var/www/html \
    && rm mautic.zip \
    && chown -R www-data:www-data /var/www/html

# .env-Datei kopieren an den richtigen Ort
COPY common/.env /var/www/html/.env

# Eigene PHP-Konfiguration (inkl. zend.assertions = -1)
ENV PHP_INI_DATE_TIMEZONE='UTC' \
    PHP_MEMORY_LIMIT=512M \
    PHP_MAX_UPLOAD=512M \
    PHP_MAX_EXECUTION_TIME=300

RUN echo "memory_limit=${PHP_MEMORY_LIMIT}" > /usr/local/etc/php/conf.d/99-custom.ini \
 && echo "upload_max_filesize=${PHP_MAX_UPLOAD}" >> /usr/local/etc/php/conf.d/99-custom.ini \
 && echo "max_execution_time=${PHP_MAX_EXECUTION_TIME}" >> /usr/local/etc/php/conf.d/99-custom.ini \
 && echo "date.timezone=${PHP_INI_DATE_TIMEZONE}" >> /usr/local/etc/php/conf.d/99-custom.ini \
 && echo "zend.assertions=-1" >> /usr/local/etc/php/conf.d/99-custom.ini

# ENV-Variablen für Mautic (korrekter DB-User)
ENV MAUTIC_RUN_CRON_JOBS=true \
    MAUTIC_RUN_MIGRATIONS=false \
    MAUTIC_DB_USER=mautic \
    MAUTIC_DB_NAME=mautic \
    MAUTIC_DB_PORT=3306

# Volume für persistente Daten
VOLUME /var/www/html

# Init-Skripte & Cronjobs
COPY common/docker-entrypoint.sh /entrypoint.sh
COPY common/makeconfig.php /makeconfig.php
COPY common/makedb.php /makedb.php
COPY common/mautic.crontab /etc/cron.d/mautic

RUN chmod 644 /etc/cron.d/mautic && chmod +x /entrypoint.sh

# Entrypoint & Apache Start
ENTRYPOINT ["/entrypoint.sh"]
CMD ["apache2-foreground"]

📄 Konfigurationsdateien erstellen

common/docker-entrypoint.sh

#!/bin/bash
set -e

MAUTIC_DIR="/var/www/html"

if [ -z "$(ls -A $MAUTIC_DIR)" ]; then
    echo "Kopiere Mautic-Dateien nach $MAUTIC_DIR..."
    cp -R /usr/src/mautic/* "$MAUTIC_DIR"
    cp /usr/src/mautic/.env "$MAUTIC_DIR/.env"
    chown -R www-data:www-data "$MAUTIC_DIR"
fi

if [ "$MAUTIC_RUN_CRON_JOBS" = "true" ]; then
    echo "Cron-Dienst wird gestartet..."
    cron
fi

exec "$@"

Ausführbar machen:

dos2unix common/docker-entrypoint.sh
chmod +x common/docker-entrypoint.sh

common/.env

APP_ENV=prod
APP_DEBUG=0
MAUTIC_DB_HOST=db
MAUTIC_DB_PORT=3306
MAUTIC_DB_NAME=mautic
MAUTIC_DB_USER=mautic
MAUTIC_DB_PASSWORD=mauticpass

common/makeconfig.php:

<?php
echo "makeconfig.php ausgeführt.\n";

common/makedb.php:

<?php
echo "makedb.php ausgeführt.\n";

common/mautic.crontab:

*/5 * * * * www-data php /var/www/html/bin/console mautic:segments:update >> /var/log/cron.log 2>&1
*/10 * * * * www-data php /var/www/html/bin/console mautic:campaigns:update >> /var/log/cron.log 2>&1
*/15 * * * * www-data php /var/www/html/bin/console mautic:campaigns:trigger >> /var/log/cron.log 2>&1
*/30 * * * * www-data php /var/www/html/bin/console mautic:emails:send >> /var/log/cron.log 2>&1

docker-compose.yml

version: '3.8'

services:
  mautic:
    build: .
    container_name: mautic
    ports:
      - "8080:80"
    environment:
      - MAUTIC_DB_HOST=db
      - MAUTIC_DB_USER=mautic
      - MAUTIC_DB_PASSWORD=mauticpass
      - MAUTIC_DB_NAME=mautic
      - MAUTIC_RUN_CRON_JOBS=true
      - MAUTIC_RUN_MIGRATIONS=false
    volumes:
      - mautic_data:/var/www/html
    depends_on:
      - db

  db:
    image: mariadb:10.6
    container_name: mautic-db
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_DATABASE=mautic
      - MYSQL_USER=mautic
      - MYSQL_PASSWORD=mauticpass
    volumes:
      - db_data:/var/lib/mysql

volumes:
  mautic_data:
  db_data:

🚀 Installation starten

sudo docker-compose build --no-cache
sudo docker-compose up -d

🧪 Fehler: .env fehlt?

Wenn du beim ersten Start folgende Fehlermeldung bekommst:

Unable to read the "/var/www/html/.env" environment file.

Dann hast du vermutlich vergessen, die .env-Datei ins Zielverzeichnis zu kopieren(Container). Achte darauf, dass dein entrypoint.sh diese Zeile enthält:

cp /usr/src/mautic/.env "$MAUTIC_DIR/.env"

Im Container kannst du prüfen, ob sie vorhanden ist:

docker exec -it mautic bash
ls -la /var/www/html/.env
cat /var/www/html/.env

Öffne danach im Browser:

http://localhost:8080 – Du wirst direkt durch die Mautic-Installation geführt.

🔐 Bonus-Tipps

  • SMTP-Anbieter integrieren (Mailgun, Amazon SES, etc.) – nur bei großer Anzahl an Mails
  • Reverse Proxy mit HTTPS (Traefik oder nginx)
  • Automatisches DB-Backup per Cron oder Docker Volume Snapshots

Fragen oder Kontakt