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

Monica CRM mit Docker installieren: Persönliches CRM zum Verwalten von Kontakten

Monica CRM ist das meistgenutzte persönliche Open-Source-CRM (24k Stars) für Kontakte, Gespräche und Follow-ups. Diese Anleitung zeigt, wie du Monica per Docker Compose in 20 Minuten auf jedem Linux-Host installierst – mit MariaDB, sicherer .env und Verifikation nach jedem Schritt.

Monica CRM mit Docker installieren: Persönliches CRM zur Verwaltung von Kontakten, Beziehungen, Terminen und Notizen mit Docker Container, Weboberfläche, Kontaktübersicht und Self Hosting für die private Kontaktorganisation. KI-generiert

Wer Kontakte, Gespräche und wichtige Ereignisse nicht dem Gedächtnis überlassen will, braucht ein persönliches CRM. Monica ist genau das: ein quelloffenes Personal-Relationship-Management-System auf Basis von Laravel/PHP, das dir hilft, Freunde, Familie und Geschäftspartner samt Gesprächshistorie, Geburtstagen, Erinnerungen und Notizen strukturiert zu verwalten. Mit 24.800 GitHub-Stars ist es das meistgenutzte Open-Source-Tool seiner Art. Anders als klassische Business-CRMs ist Monica auf Einzelpersonen und kleine Teams ausgelegt – und läuft dank offizieller Docker-Images problemlos auf jedem Linux-Host, NAS oder VPS.

Voraussetzungen

  1. Docker Engine >= 20.10 und Docker Compose Plugin >= 2.0 (docker compose ohne Bindestrich) auf dem Host installiert – falls noch nicht vorhanden, siehe Docker und Docker Compose auf Linux installieren
  2. Linux-Host, VM oder NAS mit Docker-Unterstützung (Ubuntu, Debian, Raspberry Pi OS, Synology DSM 7 usw.)
  3. Mindestens 1,5 GB RAM frei; ca. 2 GB Festplattenspeicher für Images und Daten
  4. openssl auf dem Host für die APP_KEY-Generierung (auf nahezu allen Linux-Systemen vorinstalliert)
  5. Optional: Reverse Proxy für HTTPS-Terminierung, wenn Monica öffentlich erreichbar sein soll – siehe Caddy als Reverse Proxy mit automatischem HTTPS

Eckdaten im Überblick

ParameterWert
Docker-Image (stable)monica:4.1.2-apache (alternativ monica:latest)
Veraltetes Imagemonicahq/monicahq – nicht mehr verwenden
DatenbankbackendMariaDB 11 (MySQL 8 ebenfalls möglich, kein PostgreSQL)
Web-Port (Container)80 → Host-Port 8080
Pflicht-Volume App/var/www/html/storage
Pflicht-Volume DB/var/lib/mysql
LizenzAGPL-3.0
Architekturenamd64, arm64v8, arm32v7, i386, riscv64, s390x u. a.
RAM-Minimum1,5 GB

Schritt 1: Projektordner anlegen

Lege einen eigenen Ordner für Monica an. Alle nachfolgenden Befehle werden aus diesem Verzeichnis heraus ausgeführt:

mkdir -p /opt/monica
cd /opt/monica

Du kannst auch ~/monica verwenden, wenn du keinen root-Zugriff hast. Wichtig ist nur, dass compose.yaml und .env im selben Verzeichnis liegen.

Verifizieren: ls /opt/monica gibt das (zunächst leere) Verzeichnis zurück – kein Fehler bedeutet korrekt angelegt.

Schritt 2: APP_KEY generieren und .env anlegen

Monica (Laravel) benötigt zwingend einen 32-Byte-Verschlüsselungsschlüssel. Ohne gültigen APP_KEY startet die App nicht und zeigt „No application encryption key has been specified". Generiere ihn einmalig auf dem Host:

echo -n 'base64:'; openssl rand -base64 32

Die Ausgabe sieht beispielsweise so aus:

base64:AbCdEfGhIjKlMnOpQrStUvWxYz1234567890ab==

Wähle außerdem ein sicheres Datenbankpasswort (mindestens 20 zufällige Zeichen, zum Beispiel mit openssl rand -hex 20). Erstelle dann die .env-Datei:

# Monica CRM – Umgebungsvariablen
# APP_KEY: einmalig generiert, NIEMALS nach dem ersten Start ändern
APP_KEY=base64:AbCdEfGhIjKlMnOpQrStUvWxYz1234567890ab==

# URL der Instanz – exakt so wie im Browser aufgerufen (inkl. Port)
APP_URL=http://localhost:8080

# Datenbankpasswort – gleiches Passwort in beiden Variablen
DB_PASSWORD=SICHERES_PASSWORT_HIER_EINSETZEN

# Nach dem ersten Account-Anlegen auf true setzen:
APP_DISABLE_SIGNUP=false

Schütze die Datei vor unbefugtem Zugriff:

chmod 600 /opt/monica/.env

Verifizieren: cat /opt/monica/.env zeigt die vier Variablen mit deinen Werten. Der APP_KEY beginnt exakt mit base64:, gefolgt von einem Base64-String – kein Leerzeichen, keine Anführungszeichen.

Schritt 3: compose.yaml erstellen

Für eine Erklärung der Compose-Syntax und des Volume-Konzepts siehe Docker-Netzwerke und Volumes richtig nutzen. Erstelle die Datei /opt/monica/compose.yaml:

services:
  app:
    image: monica:4.1.2-apache
    container_name: monica_app
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "8080:80"
    environment:
      - APP_KEY=${APP_KEY}
      - APP_ENV=production
      - APP_DEBUG=false
      - APP_URL=${APP_URL:-http://localhost:8080}
      - DB_HOST=db
      - DB_PORT=3306
      - DB_DATABASE=monica
      - DB_USERNAME=monica
      - DB_PASSWORD=${DB_PASSWORD}
      - APP_DISABLE_SIGNUP=${APP_DISABLE_SIGNUP:-false}
    volumes:
      - monica_data:/var/www/html/storage
    restart: unless-stopped

  db:
    image: mariadb:11
    container_name: monica_db
    environment:
      - MYSQL_RANDOM_ROOT_PASSWORD=true
      - MYSQL_DATABASE=monica
      - MYSQL_USER=monica
      - MYSQL_PASSWORD=${DB_PASSWORD}
    volumes:
      - monica_mysql:/var/lib/mysql
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      start_period: 10s
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  monica_data:
    name: monica_data
  monica_mysql:
    name: monica_mysql

Ein paar wichtige Designentscheidungen: Der depends_on-Block mit condition: service_healthy stellt sicher, dass Monica erst startet, wenn MariaDB vollständig initialisiert ist – ohne diesen Healthcheck schlägt die DB-Verbindung beim Erststart zuverlässig fehl. Das Volume monica_data ist Pflicht; ohne es gehen alle Uploads, Sessions und Logs bei jedem Container-Neustart verloren. MYSQL_RANDOM_ROOT_PASSWORD=true verhindert ein bekanntes root-Passwort in der Datenbank.

Verifizieren: Syntaxcheck mit docker compose config im Projektverzeichnis – der Befehl gibt die interpolierte Compose-Konfiguration ohne Fehlermeldung aus.

Schritt 4: Container starten

Starte beide Container im Hintergrund:

docker compose up -d

Docker lädt zunächst die Images herunter (monica:4.1.2-apache ca. 600 MB, mariadb:11 ca. 400 MB). Der App-Container wartet automatisch auf den Healthcheck des DB-Containers, bevor er startet.

Verifizieren:

docker compose ps

Erwartete Ausgabe nach 30–60 Sekunden:

NAME          IMAGE                  STATUS
monica_db     mariadb:11             Up X seconds (healthy)
monica_app    monica:4.1.2-apache    Up X seconds

Beide Container müssen den Status Up zeigen, monica_db zusätzlich (healthy). Falls ein Container Restarting zeigt, Logs prüfen:

docker compose logs app
docker compose logs db

Schritt 5: Datenbank initialisieren (setup:production)

Nach dem allerersten Start müssen Datenbanktabellen angelegt und die Laravel-Konfiguration für den Produktivbetrieb optimiert werden. Dieser Befehl ist einmalig nach dem ersten Start und nach größeren Updates notwendig:

docker compose exec app php artisan setup:production

Der Befehl führt alle Datenbankmigrationen aus, erstellt den Config-Cache und Route-Cache und prüft, ob alle Systemvoraussetzungen erfüllt sind. Ohne diesen Schritt zeigt Monica eine leere Seite oder einen Fehler – er wird häufig vergessen und ist der häufigste Grund für einen nicht funktionierenden Erststart.

Verifizieren:

docker compose logs app --tail=20

Die letzten Log-Zeilen sollten keine ERROR- oder SQLSTATE-Einträge enthalten. Zusätzlich mit curl prüfen:

curl -I http://localhost:8080

Erwartet: HTTP/1.1 302 Found (Weiterleitung auf die Login-Seite) oder HTTP/1.1 200 OK.

Schritt 6: Ersten Account anlegen und Registrierung sperren

Öffne http://localhost:8080 im Browser. Du wirst zur Registrierungsseite weitergeleitet. Lege deinen ersten Account mit E-Mail-Adresse und Passwort an.

Sobald dein Account existiert, solltest du neue Registrierungen sperren – andernfalls kann sich jede Person mit Zugang zur URL registrieren. Öffne /opt/monica/.env und setze:

APP_DISABLE_SIGNUP=true

Starte dann den Stack neu, damit die neue Variable übernommen wird:

docker compose up -d

Verifizieren: Öffne einen privaten Browser-Tab und rufe http://localhost:8080/register auf. Die Seite sollte jetzt eine Fehlermeldung anzeigen oder auf die Login-Seite weiterleiten – Registrierung ist gesperrt.

Schritt 7: Reverse Proxy und HTTPS einrichten (für öffentlichen Zugriff)

Für den Betrieb im lokalen Netz reicht HTTP auf Port 8080. Sobald Monica von außen erreichbar sein soll, ist HTTPS Pflicht – mit APP_ENV=production erzwingt Monica intern das HTTPS-Schema. Ohne SSL-Terminierung entsteht ein Redirect-Loop.

Empfehlenswerte Optionen: Traefik als Docker-Reverse-Proxy mit automatischem HTTPS oder Caddy. Passe anschließend in der .env die URL an:

APP_URL=https://monica.example.com

Dann neu starten:

docker compose up -d

Den Port 8080 musst du dann nicht mehr öffentlich freigeben – der Proxy übernimmt Port 443.

Verifizieren: curl -I https://monica.example.com gibt HTTP/2 200 oder 302 zurück. Im Browser erscheint das Schloss-Symbol.

Schritt 8: Optionale Erweiterungen

Monica bietet mehrere optionale Features, die über Umgebungsvariablen aktiviert werden:

VariableWertFunktion
MFA_ENABLEDtrueZwei-Faktor-Authentifizierung (empfohlen für öffentliche Instanzen)
DAV_ENABLEDtrueWebDAV/CardDAV/CalDAV-Synchronisation aktivieren
MAIL_MAILERsmtpE-Mail-Versand für Erinnerungen und Einladungen
MAIL_HOSTSMTP-Hostz. B. smtp.gmail.com oder eigener Mailserver
MAIL_PORT587SMTP-Port (TLS/STARTTLS)
MAIL_FROM_ADDRESSE-Mail-AdresseAbsenderadresse für Monica-Mails
CACHE_DRIVERredisRedis statt Dateicache – bessere Performance
QUEUE_CONNECTIONredisAsynchrone Job-Queue über Redis

Für Redis als optionalen Cache ergänze den Compose-Stack um einen Redis-Dienst und setze zusätzlich REDIS_HOST=redis, CACHE_DRIVER=redis und QUEUE_CONNECTION=redis in der .env.

Updates durchführen

Monica-Updates folgen dem Standard-Docker-Workflow:

cd /opt/monica
docker compose pull
docker compose up -d
docker compose exec app php artisan setup:production

Nach größeren Updates sollte setup:production erneut ausgeführt werden, um neue Datenbankmigrationen einzuspielen. Für automatisierte Update-Benachrichtigungen eignet sich Diun oder WUD – beide erkennen neue Image-Tags ohne automatisches Deployment.

Verifizieren: docker compose ps zeigt die aktualisierten Images; im Monica-UI unter „Einstellungen → Über Monica" steht die neue Versionsnummer.

Backup

Die persistenten Daten liegen in zwei Docker-Volumes:

  1. monica_data: Uploads, Logs, Sessions (/var/www/html/storage)
  2. monica_mysql: Alle Datenbankdaten (/var/lib/mysql)

Für ein konsistentes Datenbank-Backup empfiehlt sich ein mariadb-dump-Snapshot:

docker compose exec db mariadb-dump -u monica -p"${DB_PASSWORD}" monica > monica_backup_$(date +%Y%m%d).sql

Das SQL-Dump kombinierst du am besten mit einer Volume-Sicherung über Restic. Das Volume monica_data liegt unter /var/lib/docker/volumes/monica_data/_data und kann direkt in ein Backup eingeschlossen werden.

Troubleshooting / Typische Fehler

  1. „No application encryption key has been specified": Der APP_KEY in der .env ist leer oder hat kein korrektes Format. Er muss exakt mit base64: beginnen, gefolgt von einem 44-Zeichen-Base64-String – ohne Anführungszeichen, ohne Leerzeichen. Mit echo -n 'base64:'; openssl rand -base64 32 neu generieren.
  2. Weiße Seite oder Datenbankfehler beim ersten Aufruf: setup:production wurde nicht ausgeführt. Sofort nachholen: docker compose exec app php artisan setup:production.
  3. monica_app startet, monica_db zeigt „Restarting": MariaDB konnte sich nicht initialisieren. Häufige Ursache: falsches oder fehlendes DB_PASSWORD in der .env. Logs prüfen: docker compose logs db.
  4. Redirect-Loop nach HTTPS-Aktivierung: APP_ENV=production erzwingt HTTPS. Wenn kein Reverse Proxy mit SSL-Terminierung vorgeschaltet ist, entsteht ein Loop. Proxy einrichten oder für rein lokale Nutzung APP_ENV=local setzen.
  5. APP_URL stimmt nicht überein: Interne Links und OAuth-Redirects funktionieren nicht, wenn APP_URL nicht exakt der aufrufbaren URL entspricht – inklusive Port. Bei Reverse-Proxy-Betrieb muss es die externe HTTPS-URL sein.
  6. Altes Image monicahq/monicahq verwendet: Dieses Image ist deprecated und erhält keine Sicherheitsupdates mehr. Auf monica:latest oder monica:4.1.2-apache wechseln.
  7. Registrierung nach Update wieder offen: APP_DISABLE_SIGNUP=true muss dauerhaft in der .env stehen – nicht nur einmalig gesetzt werden.

Häufige Fragen

Wie generiere ich den APP_KEY korrekt?

Auf dem Host ausführen: echo -n 'base64:'; openssl rand -base64 32. Das Ergebnis – zum Beispiel base64:AbCdEfGhIjKlMnOpQrStUvWxYz1234567890ab== – vollständig als Wert für APP_KEY in die .env eintragen. Einmal gesetzt, darf der Key nie mehr verändert werden, da sonst alle verschlüsselten Daten unleserlich werden.

Welche Datenbank wird unterstützt?

Monica unterstützt ausschließlich MySQL und MariaDB – kein PostgreSQL, kein SQLite für den Produktivbetrieb. Die offizielle Empfehlung ist mariadb:11. Ältere Anleitungen verwenden noch mysql:5.7, das jedoch End-of-Life ist.

Was macht php artisan setup:production genau?

Der Befehl führt alle ausstehenden Datenbankmigrationen aus, erstellt den Laravel-Config-Cache und Route-Cache für optimale Performance und prüft, ob alle Systemvoraussetzungen erfüllt sind. Er muss nach dem allerersten Start und nach jeder größeren Versionsaktualisierung ausgeführt werden.

Kann ich Monica hinter Traefik oder Caddy betreiben?

Ja, das ist für jeden öffentlich erreichbaren Betrieb der empfohlene Weg. APP_URL auf die externe HTTPS-URL setzen (z. B. https://monica.example.com), APP_ENV=production beibehalten. Der Port 8080 am Host muss dann nicht öffentlich sein – nur der Proxy auf Port 443 ist erreichbar.

Gibt es bereits eine stabile Version 5?

Nein. Monica v5 (intern „Chandler" genannt) befindet sich Stand 2025 noch in der Beta-Phase und ist als ghcr.io/monicahq/monica-next:main verfügbar. Für den produktiven Einsatz sollte ausschließlich die stabile 4.x-Reihe (monica:latest oder monica:4.1.2-apache) verwendet werden.

Unterstützt Monica CardDAV/CalDAV-Synchronisation?

Ja – mit DAV_ENABLED=true in der .env aktivierst du WebDAV, über das du Kontakte und Kalendereinträge mit kompatiblen Apps (z. B. macOS Kontakte, Thunderbird, DAVx⁵ auf Android) synchronisieren kannst. Danach docker compose up -d für einen Neustart mit der neuen Einstellung.

Fazit

Monica CRM ist eine solide Wahl für alle, die Kontakte, Gespräche und persönliche Ereignisse strukturiert verwalten wollen – ohne Cloud-Abhängigkeit und ohne monatliche Kosten. Der Docker-Betrieb ist offiziell unterstützt und nach dieser Anleitung in unter 20 Minuten einsatzbereit. Die wichtigsten Fallstricke sind der APP_KEY (Pflichtformat base64:...), der einmalige setup:production-Befehl nach dem Erststart und die korrekte APP_URL beim Reverse-Proxy-Betrieb. Für den Dauerbetrieb lohnt sich die Kombination mit automatischen Backups und einem Update-Monitoring-Tool.

Monica v5 (Chandler) ist in der Beta-Pipeline – wer die Entwicklung verfolgen möchte, findet aktuelle Infos im GitHub-Repository. Für den produktiven Einsatz bleibt die 4.x-Reihe die zuverlässige Wahl.

Weiterführende Anleitungen und Quellen

  1. Docker und Docker Compose auf Linux installieren (Ubuntu/Debian)
  2. Docker-Netzwerke und Volumes richtig nutzen
  3. Traefik als Docker-Reverse-Proxy mit automatischem HTTPS
  4. Restic Backup auf Linux einrichten und automatisieren
  5. Docker-Container automatisch aktualisieren: Diun, WUD und Renovate
  6. Firefly III mit Docker installieren: Self-Hosted-Finanzverwaltung

Offizielle Quellen: Monica auf Docker Hub, Monica GitHub, Monica Docker-Dokumentation.

Passende Anleitungen auf S-EDV

  1. Automatische Sicherheitsupdates unter Debian/Ubuntu mit unattended-upgrades rich
  2. Google schließt Android-Zero-Day CVE-2025-48595 in Juni-Sicherheitsupdates – 124
  3. netcup Local Block Storage bestellen, einrichten und unter Linux einbinden