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.

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
- Docker Engine >= 20.10 und Docker Compose Plugin >= 2.0 (
docker composeohne Bindestrich) auf dem Host installiert – falls noch nicht vorhanden, siehe Docker und Docker Compose auf Linux installieren - Linux-Host, VM oder NAS mit Docker-Unterstützung (Ubuntu, Debian, Raspberry Pi OS, Synology DSM 7 usw.)
- Mindestens 1,5 GB RAM frei; ca. 2 GB Festplattenspeicher für Images und Daten
opensslauf dem Host für die APP_KEY-Generierung (auf nahezu allen Linux-Systemen vorinstalliert)- Optional: Reverse Proxy für HTTPS-Terminierung, wenn Monica öffentlich erreichbar sein soll – siehe Caddy als Reverse Proxy mit automatischem HTTPS
Eckdaten im Überblick
| Parameter | Wert |
|---|---|
| Docker-Image (stable) | monica:4.1.2-apache (alternativ monica:latest) |
| Veraltetes Image | monicahq/monicahq – nicht mehr verwenden |
| Datenbankbackend | MariaDB 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 |
| Lizenz | AGPL-3.0 |
| Architekturen | amd64, arm64v8, arm32v7, i386, riscv64, s390x u. a. |
| RAM-Minimum | 1,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/monicaDu 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 32Die 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=falseSchütze die Datei vor unbefugtem Zugriff:
chmod 600 /opt/monica/.envVerifizieren: 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_mysqlEin 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 -dDocker 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 psErwartete 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 secondsBeide 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 dbSchritt 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:productionDer 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=20Die letzten Log-Zeilen sollten keine ERROR- oder SQLSTATE-Einträge enthalten. Zusätzlich mit curl prüfen:
curl -I http://localhost:8080Erwartet: 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=trueStarte dann den Stack neu, damit die neue Variable übernommen wird:
docker compose up -dVerifizieren: Ö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.comDann neu starten:
docker compose up -dDen 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:
| Variable | Wert | Funktion |
|---|---|---|
MFA_ENABLED | true | Zwei-Faktor-Authentifizierung (empfohlen für öffentliche Instanzen) |
DAV_ENABLED | true | WebDAV/CardDAV/CalDAV-Synchronisation aktivieren |
MAIL_MAILER | smtp | E-Mail-Versand für Erinnerungen und Einladungen |
MAIL_HOST | SMTP-Host | z. B. smtp.gmail.com oder eigener Mailserver |
MAIL_PORT | 587 | SMTP-Port (TLS/STARTTLS) |
MAIL_FROM_ADDRESS | E-Mail-Adresse | Absenderadresse für Monica-Mails |
CACHE_DRIVER | redis | Redis statt Dateicache – bessere Performance |
QUEUE_CONNECTION | redis | Asynchrone 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:productionNach 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:
monica_data: Uploads, Logs, Sessions (/var/www/html/storage)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).sqlDas 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
- „No application encryption key has been specified": Der
APP_KEYin der.envist leer oder hat kein korrektes Format. Er muss exakt mitbase64:beginnen, gefolgt von einem 44-Zeichen-Base64-String – ohne Anführungszeichen, ohne Leerzeichen. Mitecho -n 'base64:'; openssl rand -base64 32neu generieren. - Weiße Seite oder Datenbankfehler beim ersten Aufruf:
setup:productionwurde nicht ausgeführt. Sofort nachholen:docker compose exec app php artisan setup:production. - monica_app startet, monica_db zeigt „Restarting": MariaDB konnte sich nicht initialisieren. Häufige Ursache: falsches oder fehlendes
DB_PASSWORDin der.env. Logs prüfen:docker compose logs db. - Redirect-Loop nach HTTPS-Aktivierung:
APP_ENV=productionerzwingt HTTPS. Wenn kein Reverse Proxy mit SSL-Terminierung vorgeschaltet ist, entsteht ein Loop. Proxy einrichten oder für rein lokale NutzungAPP_ENV=localsetzen. - APP_URL stimmt nicht überein: Interne Links und OAuth-Redirects funktionieren nicht, wenn
APP_URLnicht exakt der aufrufbaren URL entspricht – inklusive Port. Bei Reverse-Proxy-Betrieb muss es die externe HTTPS-URL sein. - Altes Image
monicahq/monicahqverwendet: Dieses Image ist deprecated und erhält keine Sicherheitsupdates mehr. Aufmonica:latestodermonica:4.1.2-apachewechseln. - Registrierung nach Update wieder offen:
APP_DISABLE_SIGNUP=truemuss dauerhaft in der.envstehen – 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
- Docker und Docker Compose auf Linux installieren (Ubuntu/Debian)
- Docker-Netzwerke und Volumes richtig nutzen
- Traefik als Docker-Reverse-Proxy mit automatischem HTTPS
- Restic Backup auf Linux einrichten und automatisieren
- Docker-Container automatisch aktualisieren: Diun, WUD und Renovate
- Firefly III mit Docker installieren: Self-Hosted-Finanzverwaltung
Offizielle Quellen: Monica auf Docker Hub, Monica GitHub, Monica Docker-Dokumentation.