Odoo lässt sich auf verschiedenen Wegen installieren. Wer Odoo aber flexibel, sauber trennbar und gut wartbar betreiben möchte, landet sehr schnell bei Docker, denn Odoo ist nicht mit PHP / mySQL erstellt, wie z.B. Typo3 oder Wordpress, sondern läuft auf Basis der Programmiersprache Python und der Datenbank Postgress. Somit ist Odoo nicht einfach auf einer Lowcost Hosting Umgebung installierbar. Eine Installation auf einem Server ist somit etwas anspruchsvoller und erfordert entsprechendes Technik Know-How.
IONOS bietet als ein großer, deutscher Hosting Provider Virtual Server mit Plesk Admin-Oberfläche an. Plesk verwaltet unter anderem Domains, SSL-Zertifikate und Webserver-Konfigurationen und erlaubt durch die Docker Container Virtualisierung die eigentliche Odoo-Umgebung zu kapseln. Portainer als Teil von Docker erleichtert zusätzlich die Verwaltung der Container, Stacks, Logs und Volumes.
In diesem Artikel zeige ich ein praxistaugliches Setup für Odoo mit Docker, PostgreSQL und Portainer auf einem IONOS Server mit Plesk. Ziel ist eine saubere Architektur mit getrennten Test- und Live-Instanzen, eigenen Datenbanken, persistenten Volumes und Reverse Proxy über Plesk.
Für mich war der Ausbau dieses Setup Grundlage für den gleichzeitigen Betrieb meiner eigenen Odoo Umgebung und den Betrieb für unsere Kunden. Das erlangte Know-How möchte ich gerne teilen.
Wichtig: Diese Anleitung richtet sich an technisch versierte Anwender, Administratoren und Unternehmen, die Odoo kontrolliert betreiben möchten. Für produktive Systeme sollten Backups, Security, Monitoring und Updates immer bewusst geplant werden.
Warum Odoo mit Docker betreiben?
Odoo besteht nicht nur aus der Anwendung selbst. Für den Betrieb wird auch eine PostgreSQL-Datenbank benötigt. Zusätzlich müssen Daten, Anhänge, Konfigurationen und optionale Zusatzmodule dauerhaft gespeichert werden.
Docker eignet sich für diese Struktur sehr gut, weil Odoo und PostgreSQL als getrennte Container betrieben werden können. Dadurch wird das System übersichtlicher, reproduzierbarer und leichter wartbar.
Besonders praktisch wird Docker, wenn mehrere Odoo-Instanzen parallel laufen sollen — zum Beispiel eine Testumgebung und eine Produktivumgebung. Jede Umgebung bekommt ihre eigene Odoo-Instanz, ihre eigene Datenbank und ihre eigenen Volumes.
Das reduziert Risiken und macht Updates, Tests und Erweiterungen deutlich kontrollierbarer.
Ziel dieses Odoo Setups
In diesem Beispiel bauen wir eine Struktur mit zwei getrennten Odoo-Umgebungen:
- Eine Testinstanz für Konfiguration, Updates, Module und Experimente.
- Eine Liveinstanz für den produktiven Betrieb.
Beide Umgebungen laufen auf demselben Server, aber mit getrennten Containern, getrennten PostgreSQL-Datenbanken und getrennten Volumes.
Die Odoo-Container werden nicht direkt öffentlich ins Internet geöffnet. Stattdessen binden wir die Ports nur lokal auf 127.0.0.1 und lassen Plesk später per Nginx Reverse Proxy auf diese lokalen Ports zugreifen. Das ist sauberer als offene Odoo-Ports auf der öffentlichen Server-IP.
Voraussetzungen
Für dieses Setup brauchst du:
- Einen IONOS VPS, Cloud Server oder Dedicated Server mit Linux (ich habe es selbst auf VPN Cloud laufen)
- Eine installierte Plesk-Umgebung.
- Administrativen Zugriff auf Plesk.
- Optional SSH-Zugriff auf den Server mit root Rechten
- Die Plesk Docker-Erweiterung.
- Portainer zur Verwaltung der Docker-Stacks.
- Eine Domain oder Subdomain für Odoo, zum Beispiel: odoo-test.example.com und odoo.example.com
Plesk unterstützt Docker über eine eigene Docker-Erweiterung. Die Plesk-Dokumentation nennt Docker als unterstützte Funktion in Plesk Obsidian und listet verschiedene unterstützte Linux-Distributionen wie Debian, Ubuntu, AlmaLinux, Rocky Linux und weitere auf.
Schritt 1: Plesk auf dem IONOS Server prüfen
Wenn dein IONOS Server bereits mit Plesk ausgeliefert wurde, kannst du direkt im Plesk Panel starten.
Prüfe zuerst:
- Läuft Plesk korrekt?
- Ist die Domain oder Subdomain im Plesk Panel angelegt?
- Ist SSL über Let’s Encrypt oder ein ionos Zertifikat aktivierbar?
- Hast du Administratorrechte in Plesk?
- Ist SSH-Zugriff möglich?
Wichtig: Die Docker-Erweiterung in Plesk kann nur von Administratoren verwaltet werden. Kunden- oder Reseller-Zugänge reichen dafür in der Regel nicht aus. Plesk weist darauf hin, dass die Docker-Erweiterung nur für Administratoren verwaltbar ist. (Plesk Support)
Schritt 2: Docker-Erweiterung in Plesk installieren
Öffne im Plesk Panel den Bereich:
- Erweiterungen → Erweiterungskatalog
Suche nach:
- Docker
- Wenn noch nicht installiert, dann installiere die Docker-Erweiterung.
Nach der Installation sollte in Plesk ein eigener Docker-Bereich erscheinen. Dort kannst du Container, Images und später auch Portainer verwalten.
Schritt 3: Portainer in Plesk aktivieren
Portainer ist eine grafische Verwaltungsoberfläche für Docker. Für Odoo ist Portainer besonders praktisch, weil du damit Stacks über Docker Compose verwalten kannst.
In aktuellen Plesk-Versionen lässt sich Portainer direkt über die Docker-Erweiterung starten:
- Plesk öffnen.
- Docker-Erweiterung öffnen.
- Portainer aktivieren oder starten.
- Portainer-Container erstellen lassen.
- Portainer öffnen.
Beim ersten Start legst du einen Administrator-Zugang für Portainer an. Danach kannst du in Portainer die lokale Docker-Umgebung verwalten.
Wichtig: Portainer selbst ist ebenfalls ein Container. Lösche diesen Container nicht versehentlich, sonst ist deine Portainer-Oberfläche weg. Die Odoo-Container laufen zwar weiter, aber du verlierst die grafische Verwaltung, bis Portainer neu eingerichtet ist.
Schritt 4: Grundarchitektur verstehen
Bevor wir Odoo installieren, ist die Ziel-Architektur wichtig. Wir bauen nicht einfach „einen Odoo-Container“.
Wir bauen vier Container:
- odoo-test
- odoo-test-db
- odoo-live
- odoo-live-db
Dazu kommen getrennte Docker Volumes:
- Odoo-Daten Test
- Odoo-Konfiguration Test
- PostgreSQL-Daten Test
- Odoo-Daten Live
- Odoo-Konfiguration Live
- PostgreSQL-Daten Live
Warum wir das so strikt trennen? Weil wir aus Gründen der Datensicherheit / Integrität Test und Live niemals dieselbe Datenbank oder dieselben Volumes nutzen sollten.
Wenn beide Instanzen auf dieselben Daten zugreifen, sind Fehler, Datenverlust oder ungewollte Änderungen fast vorprogrammiert.
Schritt 5: Warum feste Odoo-Version statt „latest“?
Ein häufiger Fehler ist die Verwendung von:
- odoo:latest
Das wirkt bequem, ist aber für produktive Systeme riskant. Wenn du später ein neues Image ziehst, kann sich die Odoo-Version ungewollt ändern. Gerade bei ERP-Systemen ist das gefährlich, weil Module, Datenbankstruktur, Addons und Anpassungen versionsabhängig sind.
Besser ist eine feste Version, zum Beispiel:
- odoo:18.0
oder
- odoo:19.0
Das offizielle Odoo Docker Image ist auf Docker Hub verfügbar. Für produktive Setups ist es sinnvoll, bewusst mit konkreten Image-Tags zu arbeiten, statt unkontrolliert auf „latest“ zu setzen.
Schritt 6: Beispiel-YAML für Odoo Test und Live
Die folgende Docker-Compose-Datei ist als praxistaugliche Grundlage gedacht. Sie erstellt:
- eine Odoo-Testinstanz auf Port 10069
- eine Odoo-Liveinstanz auf Port 11069
- jeweils eine eigene PostgreSQL-Datenbank
- persistente Volumes
- lokale Portbindung auf 127.0.0.1
- optionale Addon-Verzeichnisse für eigene Module
Die Ports werden bewusst nur lokal gebunden:
- 127.0.0.1:10069:8069
- 127.0.0.1:11069:8069
Dadurch ist Odoo nicht direkt über die öffentliche Server-IP erreichbar. Die Veröffentlichung erfolgt später sauber über Plesk als Nginx Reverse Proxy. Tipp: ich habe mir die Beispiel Yaml in den Code Editor "Virtual Studio Code" kopiert und dort so angepasst, bis diese für mich gut funktioniert hat. Das untentstehende YAML ist ein Beispiel und keine endgültige Konfiguration:
version: "3.8"
services:
odoo-test:
image: odoo:19.0
container_name: odoo-test
depends_on:
- odoo-test-db
ports:
- "127.0.0.1:10069:8069"
volumes:
- odoo-test-web-data:/var/lib/odoo
- odoo-test-config:/etc/odoo
- ./addons/test:/mnt/extra-addons
environment:
- HOST=odoo-test-db
- USER=odoo
- PASSWORD=CHANGE_ME_TEST_DB_PASSWORD
restart: unless-stopped
odoo-test-db:
image: postgres:16
container_name: odoo-test-db
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=CHANGE_ME_TEST_DB_PASSWORD
volumes:
- odoo-test-db-data:/var/lib/postgresql/data
restart: unless-stopped
odoo-live:
image: odoo:19.0
container_name: odoo-live
depends_on:
- odoo-live-db
ports:
- "127.0.0.1:11069:8069"
volumes:
- odoo-live-web-data:/var/lib/odoo
- odoo-live-config:/etc/odoo
- ./addons/live:/mnt/extra-addons
environment:
- HOST=odoo-live-db
- USER=odoo
- PASSWORD=CHANGE_ME_LIVE_DB_PASSWORD
restart: unless-stopped
odoo-live-db:
image: postgres:16
container_name: odoo-live-db
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=CHANGE_ME_LIVE_DB_PASSWORD
volumes:
- odoo-live-db-data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
odoo-test-web-data:
odoo-test-config:
odoo-test-db-data:
odoo-live-web-data:
odoo-live-config:
odoo-live-db-data:
Wichtig: Ersetze die Passwörter unbedingt durch starke individuelle Passwörter. Nutze niemals die Beispielwerte in einem produktiven System.
Schritt 7: Stack in Portainer anlegen
Öffne Portainer. Gehe zu:
- Stacks → Add stack
- Vergib einen Namen, zum Beispiel: odoo
- Füge die YAML-Datei ein.
- Prüfe die Passwörter.
- Prüfe die Odoo-Version.
- Prüfe die Ports.
- Klicke auf: Deploy the stack
- Portainer erstellt nun die Container, Netzwerke und Volumes.
- Nach kurzer Zeit sollten die Container laufen.
Prüfe anschließend die Logs der Odoo-Container. Wenn Odoo PostgreSQL erreicht, sollte Odoo starten und auf dem lokalen Port erreichbar sein.
Schritt 8: Zugriff testen
Da die Ports nur auf 127.0.0.1 gebunden sind, kannst du Odoo nicht direkt über deine öffentliche IP und den Port aufrufen. Das ist gewollt.
Zum Testen kannst du per SSH lokal prüfen, ob der Dienst antwortet:
und:
Wenn eine HTML-Antwort kommt, läuft Odoo.
Schritt 9: Reverse Proxy in Plesk einrichten
Jetzt wird Odoo über eine Domain oder Subdomain erreichbar gemacht.
Beispiel:
odoo-test.example.com → 127.0.0.1:10069
odoo.example.com → 127.0.0.1:11069
In Plesk legst du dafür jeweils eine Subdomain an. Dies erfolgt im Bereich Websites & Domains. Es muss für die Produkt-Instanz und Test-Instanz eine Site angelegt werden. Dies erfolgt durch "Add Domain".
Danach richtest du den Reverse-Proxy ein. Klicke hierzu auf "Hosting & DNS" in Deiner Site Konfiguration und öffne "Apache & nginx". Füge den unten stehenden Code in das Feld "Additional nginx directives" ein.
Wichtig: bei nginx Settings muss der Toggle "Proxy mode" deaktiviert sein.
Beispiel für zusätzliche Nginx-Direktiven
Je nach Plesk-Setup kann ein Reverse Proxy über zusätzliche Nginx-Direktiven so aussehen:
location / {
proxy_pass http://127.0.0.1:11069;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Verhindert Konflikte mit statischen Plesk-Regeln
proxy_redirect off;
}
Für die Testumgebung erfolgt die gleiche Konfiguration in der Test-Site Konfiguration. Hier ersetzt du den Port 11069 entsprechend durch:
- 10069
Hinweis: Die konkrete Reverse-Proxy-Konfiguration kann je nach Plesk-Version, Webserver-Modus und Server-Setup variieren. Deshalb sollte sie immer nach dem eigenen Plesk-System geprüft werden.
Schritt 10: Erste Odoo-Datenbank erstellen
Wenn Odoo erreichbar ist, öffnest du die Domain im Browser.
Beispiel:
- Beim ersten Start erscheint der Odoo-Datenbankmanager.
- Dort legst du deine erste Datenbank an.
- Wichtig: Verwende ein starkes Master-Passwort. Dokumentiere das Master Passwort an einem sicheren Ort. Das Master-Passwort wird bei späteren Migrationen, Datensicherungen oder -Wiederherstellungen benötigt!
- Verwende eindeutige Datenbanknamen.
- Lege Test- und Live-Datenbanken sauber getrennt an.
- Aktiviere keine Demo-Daten in der Liveumgebung.
Typische Fehler und Lösungen
Fehler 1: Odoo startet nicht
Prüfe zuerst die Logs des Odoo-Containers in Portainer.
Häufige Ursachen:
- Falscher Datenbank-Host.
- Falsches Passwort.
- PostgreSQL-Container läuft noch nicht.
- Odoo-Version und Datenbank passen nicht zusammen.
- Der HOST-Wert muss exakt dem Service-Namen des PostgreSQL-Containers entsprechen.
In unserem Beispiel:
- HOST=odoo-live-db
oder:
- HOST=odoo-test-db
Fehler 2: PostgreSQL-Port-Konflikt
Ein häufiger Denkfehler ist, PostgreSQL nach außen zu mappen. Das ist in diesem Setup nicht notwendig.
Odoo und PostgreSQL kommunizieren intern über das Docker-Netzwerk. Deshalb braucht PostgreSQL keinen öffentlichen Host-Port. Wenn mehrere PostgreSQL-Container denselben Host-Port verwenden, entstehen Konflikte.
Die Lösung:
Keine PostgreSQL-Ports nach außen veröffentlichen, wenn es nicht zwingend erforderlich ist.
Fehler 3: Odoo-Port ist bereits belegt
Wenn Port 10069 oder 11069 bereits genutzt wird, startet der Container nicht.
Lösung:
Einen anderen freien Host-Port wählen, zum Beispiel:
- 12069
- 13069
- 14069
Wichtig ist nur: Jede Odoo-Instanz bekommt einen eigenen Host-Port.
Fehler 4: Daten sind nach Neustart weg
Wenn Daten nach einem Neustart fehlen, wurden wahrscheinlich keine persistenten Volumes verwendet oder falsche Pfade gemappt. Wichtige Pfade:
- Odoo-Daten und Filestore: /var/lib/odoo
- Odoo-Konfiguration: /etc/odoo
- PostgreSQL-Daten: /var/lib/postgresql/data
Diese Pfade sollten über Docker Volumes dauerhaft gespeichert werden.
Fehler 5: Test und Live greifen auf dieselben Daten zu
Das darf nicht passieren. Test und Live brauchen:
- eigene Odoo-Container
- eigene PostgreSQL-Container
- eigene Volumes
- eigene Datenbanken
- eigene Ports
Wenn eine Testumgebung versehentlich auf Live-Daten arbeitet, können echte Geschäftsdaten beschädigt werden.
Fehler 6: Odoo zeigt falsche URLs oder Probleme mit HTTPS
Das passiert häufig, wenn Odoo hinter einem Reverse Proxy läuft und proxy_mode nicht aktiviert ist.
Lösung:
In der Odoo-Konfiguration prüfen:
proxy_mode = True
Danach den Odoo-Container neu starten.
Fehler 7: Portainer ist nicht erreichbar
Wenn Portainer nicht erreichbar ist, läuft möglicherweise der Portainer-Container nicht oder die lokale Docker-Umgebung ist nicht verbunden.
Plesk beschreibt beispielsweise Fälle, in denen die lokale Umgebung in Portainer nicht erreichbar ist. In solchen Fällen sollten Docker-Dienst, Portainer-Container und die Plesk Docker-Erweiterung geprüft werden. (Plesk Support)
Best Practices für Odoo mit Docker und Portainer
1. Keine „latest“-Images in Produktion
Nutze feste Versionen wie:
odoo:18.0 oder odoo:19.0
So bleibt kontrollierbar, wann ein Versionswechsel stattfindet.
2. Test- und Liveumgebung strikt trennen
Test und Live sollten niemals dieselben Volumes oder dieselbe Datenbank verwenden.
Eine Testumgebung ist nur dann nützlich, wenn sie gefahrlos verändert werden kann.
3. PostgreSQL nicht öffentlich freigeben
Die Datenbank sollte nicht direkt aus dem Internet erreichbar sein.
Odoo und PostgreSQL sprechen intern über Docker.
Das reduziert die Angriffsfläche.
4. Odoo nur über Reverse Proxy veröffentlichen
Binde Odoo lokal auf 127.0.0.1 und veröffentliche es über Plesk mit HTTPS.
Das macht die Domainverwaltung, SSL-Zertifikate und Webserver-Konfiguration sauberer.
5. Backups nicht vergessen
Ein Odoo-Backup besteht nicht nur aus einem Datenbankdump. Du brauchst mindestens:
- PostgreSQL-Dump
- Odoo-Filestore
- Odoo-Konfiguration
- eigene Addons
- Docker-Compose-Datei
- Informationen zu Versionen und Passwörtern
- Ohne Filestore fehlen Anhänge, Bilder und Dokumente.
- Ohne Datenbankdump fehlt die eigentliche Odoo-Datenbank.
Ein Backup ist erst dann gut, wenn auch ein Restore getestet wurde.
6. Updates immer zuerst in der Testumgebung prüfen
Odoo-Updates, neue Module, Theme-Anpassungen oder Integrationen sollten nie direkt in der Liveumgebung getestet werden. Der richtige Weg wäre:
- Live-Backup erstellen.
- Backup in Testumgebung wiederherstellen.
- Update oder Änderung testen.
- Fehler prüfen.
- Erst danach in Live übernehmen.
7. Ressourcen beobachten
Odoo und PostgreSQL brauchen ausreichend RAM und CPU. Bei kleinen Servern kann es schnell eng werden, wenn Test und Live gleichzeitig laufen.
Darum beobachte:
- CPU-Auslastung
- RAM
- Swap (RAM Auslagerungsdatei)
- Datenbankgröße
- Filestore-Größe
- Log-Dateien
- Backup-Größe
8. Eigene Addons sauber organisieren
Lege eigene Addons getrennt nach Umgebung ab:
./addons/test
./addons/live
Für produktive Systeme empfiehlt sich zusätzlich eine Versionsverwaltung, zum Beispiel Git.
So bleibt nachvollziehbar, welche Module in welcher Version aktiv sind.
Beispiel: Backup per Kommandozeile
Ein einfacher PostgreSQL-Dump kann zum Beispiel so erstellt werden:
docker exec -t odoo-live-db pg_dump -U odoo -d DEINE_ODOO_DATENBANK > odoo-live-backup.sql
Der Filestore liegt im Odoo-Volume unter:
/var/lib/odoo/filestore
Je nach Docker-Volume-Pfad muss dieses Volume zusätzlich gesichert werden.
Für eine produktive Umgebung sollte daraus ein automatisierter Backup-Prozess entstehen.
Beispiel: Container neu starten
Ein einzelner Container kann über das Portainer Interface einfach neu gestartet werden.
Alternativ per SSH:
docker restart odoo-live
oder für die Testinstanz:
docker restart odoo-test
Fazit: Odoo mit Docker und Portainer ist ein starkes Setup
Odoo mit Docker, PostgreSQL, Portainer und Plesk auf einem IONOS Server ist ein sehr praxistaugliches Setup.
- Plesk übernimmt Domains, SSL und Webserver-Verwaltung.
- Docker kapselt Odoo und PostgreSQL sauber in Containern.
- Portainer macht die Verwaltung von Stacks, Logs und Volumes komfortabler.
Die wichtigste Grundlage ist eine saubere Trennung:
- Test und Live getrennt.
- Odoo und PostgreSQL getrennt.
- Volumes sind persistent.
- Ports bewusst lokal gebunden.
- Reverse Proxy über Nginx Setup in Plesk.
Wer diese Punkte beachtet, bekommt eine flexible und gut wartbare Odoo-Umgebung, die sich kontrolliert erweitern, testen und betreiben lässt.
Natürlich biete ich die Installation auch als Dienstleistung an und wer Unterstützung benötigt sollte gerne Kontakt mit uns aufnehmen. Das Kontaktformular ist rechts oben auf unserer Seite hinter der grünen Schaltfläche erreichbar.