Odoo auf dem Synology NAS installieren: ERP und CRM für kleine Unternehmen
Odoo 20.0 Community mit PostgreSQL 17 im Synology Container Manager: Master-Passwort, gesperrter Datenbank-Manager, Backup aus Dump und Filestore, Updates und Versionswechsel.
Geprüft am 14.10.2026 · für odoo 20.0
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Odoo ist ein quelloffenes ERP-System mit Apps für CRM, Verkauf, Rechnungsstellung, Lager, Einkauf und Projekte. Die Community Edition steht unter LGPLv3 und lässt sich auf einem Synology NAS als Zwei-Container-Stack aus Odoo und PostgreSQL im Container Manager betreiben. Diese Anleitung führt Sie durch Ordnerstruktur, Konfiguration, Compose-Projekt, erste Datenbank, Absicherung des Datenbank-Managers, Backup und Versionswechsel.
Voraussetzungen
- Synology NAS mit DSM 7.2 oder neuer und installiertem Container Manager. Das offizielle Image
odoowird laut Dockerfile für amd64, arm64 und ppc64le gebaut. - 4 GB RAM als Untergrenze für einen kleinen Betrieb, 8 GB, wenn auf dem NAS weitere Dienste laufen.
- Mindestens 20 GB frei auf dem Volume; Datenbank und Filestore wachsen mit Belegen und Anhängen.
- File Station und einen Texteditor (DSM Text Editor oder lokal) für die Konfigurationsdatei.
- SSH nur für Backup-Befehle und Logs (SSH auf dem Synology NAS aktivieren und verbinden). Die Einrichtung selbst läuft über die DSM-Oberfläche.
- Für Zugriff von außen: eigene Domain und ein Zertifikat in DSM.
Eckdaten auf einen Blick
| Parameter | Wert |
|---|---|
| Odoo-Image | odoo:20.0 (Release September 2026) |
| Datenbank-Image | postgres:17 (Odoo 20 verlangt PostgreSQL 16 oder neuer) |
| Web-Port | 8069 (HTTP) |
| Port 8072 | nur im Multiprocessing-Modus (workers größer 0) für Websockets, im Standardmodus nicht nötig |
| Filestore | /volume1/docker/odoo/web-data:/var/lib/odoo |
| Datenbank | /volume1/docker/odoo/db:/var/lib/postgresql/data |
| Addons | /volume1/docker/odoo/addons:/mnt/extra-addons |
| Konfiguration | /volume1/docker/odoo/config:/etc/odoo |
Schritt 1: Verzeichnisstruktur anlegen
Öffnen Sie die File Station und legen Sie im Ordner /volume1/docker den Ordner odoo an. Darin erstellen Sie vier Unterordner:
db: Datendateien von PostgreSQLweb-data: Odoo-Datenverzeichnis mit dem Filestore (Anhänge, Bilder, Berichte)addons: zusätzliche Module, darf leer bleibenconfig: die Dateiodoo.conf
Bind-Mounts übernehmen die Rechte des NAS-Ordners. Kann der Container nicht schreiben, scheitert später das Anlegen der Datenbank oder das Speichern von Anhängen. Wie Sie Rechte für Container-Ordner setzen, zeigt Docker-Ordner und Berechtigungen auf dem Synology NAS.
Verifizieren: In der File Station zeigt /volume1/docker/odoo genau die Unterordner db, web-data, addons und config.
Schritt 2: Master-Passwort in odoo.conf setzen
Das Master-Passwort (admin_passwd) schützt die Bildschirme des Datenbank-Managers, über die sich Datenbanken anlegen, löschen, sichern und wiederherstellen lassen. Laut Odoo-Dokumentation lässt es sich nur in der Konfigurationsdatei setzen und soll ein zufällig erzeugter Wert sein. In der Vorlage des Docker-Images ist die Zeile auskommentiert. Legen Sie deshalb vor dem ersten Start /volume1/docker/odoo/config/odoo.conf mit diesem Inhalt an:
[options]
admin_passwd = IHR_ZUFAELLIGES_MASTER_PASSWORT
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo
http_interface = 0.0.0.0
proxy_mode = True
Die Zeilen addons_path und data_dir entsprechen der Vorlage des offiziellen Images. http_interface = 0.0.0.0 lässt Odoo auf allen Schnittstellen im Container lauschen; in unserem Test mit Odoo 20.0 meldete das Log ohne diese Zeile HTTP service running on 127.0.0.1:8069, und die Oberfläche war trotz Portfreigabe nicht erreichbar. proxy_mode = True benötigen Sie, sobald Odoo hinter einem Reverse Proxy läuft (Schritt 7); dann wertet Odoo die X-Forwarded-*-Header aus. Ein geeignetes Passwort erzeugt die Odoo-Doku zum Beispiel per SSH mit:
python3 -c 'import base64, os; print(base64.b64encode(os.urandom(24)))'
Bewahren Sie das Master-Passwort im Passwortmanager auf, getrennt von den Benutzerkonten.
Verifizieren: Die Datei heißt exakt odoo.conf (ohne .txt) und enthält eine Zeile admin_passwd mit Ihrem Wert statt des Platzhalters.
Schritt 3: Compose-Stack im Container Manager anlegen
Öffnen Sie den Container Manager, wählen Sie Projekt und dann Erstellen. Projektname odoo, Pfad /volume1/docker/odoo, Quelle „compose.yaml erstellen“. Fügen Sie ein:
services:
odoo-db:
image: postgres:17
container_name: odoo-db
restart: unless-stopped
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=IHR_DB_PASSWORT
volumes:
- /volume1/docker/odoo/db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U odoo"]
interval: 10s
timeout: 5s
retries: 5
odoo:
image: odoo:20.0
container_name: odoo
restart: unless-stopped
depends_on:
odoo-db:
condition: service_healthy
ports:
- "8069:8069"
environment:
- HOST=odoo-db
- PORT=5432
- USER=odoo
- PASSWORD=IHR_DB_PASSWORT
volumes:
- /volume1/docker/odoo/web-data:/var/lib/odoo
- /volume1/docker/odoo/addons:/mnt/extra-addons
- /volume1/docker/odoo/config:/etc/odoo
- HOST, USER, PASSWORD: So verbindet sich das Odoo-Image laut Docker-Hub-Beschreibung mit PostgreSQL.
USERundPASSWORDmüssen zuPOSTGRES_USERundPOSTGRES_PASSWORDpassen. Die Beispiele auf Docker Hub zeigenodoo:17.0mitpostgres:15; für Odoo 20 ist das zu alt. - Fester Tag:
odoo:20.0erhält laut Docker Hub regelmäßig neue Builds derselben Hauptversion.latestwürde irgendwann auf eine neue Hauptversion springen, mit der Ihre Datenbank nicht ohne Migration läuft. Datierte Tags wie20.0-20260926frieren einen Build ein. - Healthcheck: Odoo startet erst, wenn PostgreSQL Verbindungen annimmt.
Klicken Sie auf Weiter und Fertig. Das Herunterladen der Images dauert beim ersten Mal einige Minuten. Allgemeines zu Projekten im Container Manager finden Sie unter Container Manager: Docker-Compose-Projekt anlegen, starten und aktualisieren.
Verifizieren: Das Projekt odoo steht auf „Wird ausgeführt“, beide Container sind grün. Im Protokoll des Containers odoo (oder per SSH mit sudo docker logs odoo --tail 20) erscheint HTTP service running on 0.0.0.0:8069.
Schritt 4: Erste Datenbank anlegen und Odoo einrichten
Rufen Sie http://NAS-IP:8069 auf. Ohne vorhandene Datenbank zeigt Odoo das Formular zum Anlegen:
- Master Password: der Wert aus
odoo.conf - Database Name: kurz, ohne Leerzeichen, zum Beispiel
meinefirma - Email und Password: Ihr erstes Administratorkonto. Die Odoo-Doku rät, nicht
adminals Login zu verwenden und dieses Konto nicht für die tägliche Arbeit zu nutzen. - Language und Country: Deutsch und Ihr Land
- Demo data: aus. Datenbanken mit Demodaten enthalten laut Odoo Standardkonten und gehören nicht auf erreichbare Server.
Nach Create Database dauert die Einrichtung einige Minuten, danach landen Sie im Odoo-Dashboard.
Verifizieren: Sie sind mit dem neuen Konto angemeldet, das Menü zeigt die App-Übersicht, und im Ordner web-data ist ein Unterordner filestore entstanden.
Schritt 5: Erstes Modul installieren (Beispiel CRM)
Öffnen Sie Apps, suchen Sie CRM und klicken Sie auf Aktivieren bzw. Installieren. Abhängigkeiten installiert Odoo selbst.
Zusätzliche Module legen Sie entpackt nach /volume1/docker/odoo/addons, starten den Container odoo neu, aktivieren den Entwicklermodus (URL-Parameter ?debug=1) und wählen unter Apps den Punkt App-Liste aktualisieren. Installieren Sie nur Module aus Quellen, denen Sie vertrauen, denn Module laufen mit vollen Rechten in Odoo.
Verifizieren: Im Hauptmenü erscheint „CRM“, und ein Test-Lead lässt sich anlegen und speichern.
Schritt 6: Datenbank-Manager sperren und Backup einrichten
Die Odoo-Sicherheitsempfehlungen sind eindeutig: Sobald das System eingerichtet ist, soll der Zugriff auf den Datenbank-Manager eingeschränkt werden. Mit list_db = False sperrt Odoo die Datenbankauswahl und alle Verwaltungsbildschirme. Bei nur einer Datenbank ergänzen Sie in odoo.conf:
dbfilter = ^meinefirma$
list_db = False
Starten Sie danach den Container odoo neu. Brauchen Sie den Manager später wieder (zweite Datenbank, Wiederherstellung), kommentieren Sie list_db vorübergehend aus.
Odoo hält Daten an zwei Orten, und die Odoo-Doku empfiehlt tägliche Sicherungen beider Teile auf ein entferntes Archiv, das vom Server selbst nicht erreichbar ist:
| Datentyp | Speicherort | Sicherung |
|---|---|---|
| Strukturierte Daten (Kunden, Rechnungen, Einstellungen) | PostgreSQL | pg_dump |
| Anhänge, Bilder, Berichte | web-data/filestore | Ordnerkopie |
Legen Sie den Ordner /volume1/docker/odoo/backup an und erzeugen Sie per SSH einen Dump im Custom-Format:
sudo docker exec odoo-db pg_dump -U odoo -Fc meinefirma > /volume1/docker/odoo/backup/meinefirma_$(date +%Y%m%d).dump
Erzeugen Sie Dump und Filestore-Kopie zeitnah hintereinander, am besten außerhalb der Arbeitszeit, damit beide zueinander passen. Sichern Sie mit Hyper Backup die Ordner backup, web-data und config auf ein externes Ziel. Den Ordner db mit den laufenden PostgreSQL-Dateien nutzen Sie nicht als Sicherung, maßgeblich ist der Dump. Für Zeitplan und Rotation siehe MySQL & PostgreSQL Backup automatisieren mit cron.
Verifizieren: Ein Aufruf von http://NAS-IP:8069/web/database/manager zeigt keine Datenbankverwaltung mehr. Die Dump-Datei ist größer als 0 Byte, und eine Probewiederherstellung in eine Testdatenbank läuft ohne Fehler durch:
sudo docker exec odoo-db createdb -U odoo test_restore
sudo docker exec -i odoo-db pg_restore -U odoo -d test_restore --no-owner < /volume1/docker/odoo/backup/meinefirma_JJJJMMTT.dump
sudo docker exec odoo-db dropdb -U odoo test_restore
Schritt 7: HTTPS und Reverse Proxy einrichten (optional)
Für den Zugriff per HTTPS legen Sie in DSM unter Systemsteuerung > Anmeldeportal > Erweitert > Reverse Proxy eine Regel an: Quelle HTTPS, Ihre Domain, Port 443; Ziel HTTP, localhost, Port 8069. Im Reiter für benutzerdefinierte Header (englisch „Custom Header“) fügen Sie über Erstellen > WebSocket die Header Upgrade und Connection hinzu. Odoo nutzt Websockets für Chatter und Benachrichtigungen; im Standardmodus des Images (Multithreading) laufen sie über Port 8069 mit. Weisen Sie das Zertifikat der Domain unter Sicherheit > Zertifikat zu. proxy_mode = True aus Schritt 2 sorgt dafür, dass Odoo Hostname und Schema des Proxys übernimmt. Als Alternative eignet sich Nginx Proxy Manager auf der Synology.
Odoo empfiehlt für erreichbare Server zusätzlich HTTPS ausschließlich, einen Schutz gegen Anmeldeversuche per Brute Force und starke, eindeutige Admin-Passwörter.
Verifizieren: https://ihre-domain.de öffnet die Odoo-Anmeldung mit gültigem Zertifikat, und eine Nachricht im Chatter eines CRM-Leads erscheint in einem zweiten Browserfenster ohne Neuladen.
Updates und Wechsel der Hauptversion
Updates innerhalb von 20.0 erhalten Sie, indem Sie das Image odoo:20.0 neu herunterladen und das Projekt neu erstellen; das Vorgehen im Container Manager zeigt die oben verlinkte Grund-Anleitung. Sichern Sie vorher wie in Schritt 6. Laut Docker Hub betrifft das nur Releases derselben Hauptversion; ein Sprung zwischen Hauptversionen braucht Migrationsskripte.
Für Odoo 17 endete der Standard-Support im September 2026. Ein Tagwechsel von odoo:17.0 auf odoo:20.0 tauscht nur das Programm, nicht die Datenbank. Der Upgrade-Dienst von Odoo (upgrade.odoo.com) migriert Datenbanken; nach der Odoo-Doku ist das Upgrade mit Enterprise-Abonnement enthalten, ein Wechsel der Edition ist nicht Teil des Upgrades. Für die Community Edition existiert das Community-Projekt OCA/OpenUpgrade; prüfen Sie dort die Abdeckung Ihrer Module.
Zusätzlich muss PostgreSQL mindestens Version 16 sein. Ein älteres Datenverzeichnis überführen Sie per pg_dump und Wiederherstellung in einen neuen postgres:17-Container mit leerem db-Ordner. Spielen Sie die Migration immer zuerst auf einer Kopie durch (zweites Projekt, eigener Port, eigene Ordner).
Verifizieren: Die migrierte Kopie startet ohne Fehler im Log, und Stichproben aus Kunden, Rechnungen und Anhängen sind vollständig.
Troubleshooting / Typische Fehler
- „connection refused“ beim Start: Odoo startet vor PostgreSQL. Healthcheck und
condition: service_healthyprüfen, Projekt neu starten. - „could not translate host name odoo-db“: Beide Dienste stehen nicht im selben Projekt, oder
HOSTpasst nicht zum Dienstnamen. - Oberfläche nicht erreichbar, Container läuft: Log zeigt
127.0.0.1:8069.http_interface = 0.0.0.0ergänzen, Container neu starten. - Fehler beim Anlegen der Datenbank oder beim Hochladen: Der Container kann nicht nach
web-dataschreiben. Ordnerrechte prüfen. - Datenbank-Manager weg: Gewollt durch
list_db = False. Für Wartung kurz auskommentieren. - Zu alte PostgreSQL-Version: Odoo 20 verlangt PostgreSQL 16 oder neuer. Datenverzeichnisse lassen sich nicht durch Tagwechsel heben, nötig sind Dump und Wiederherstellung.
- Anhänge fehlen nach Wiederherstellung: Nur der Dump wurde gesichert. Filestore immer mitsichern.
- Eigene Module fehlen in der Liste: Container neu starten, Entwicklermodus aktivieren, App-Liste aktualisieren.
Häufige Fragen
Worin unterscheiden sich Community und Enterprise?
Community ist quelloffen (LGPLv3), Enterprise ist ein Abonnement von Odoo S.A. mit zusätzlichen Apps, Hersteller-Support und Upgrade-Dienst. Welche Apps zu welcher Edition gehören, ändert sich je Version. Prüfen Sie den Bedarf vor der Entscheidung in der Editionsübersicht auf odoo.com. Ein offizielles Enterprise-Image gibt es laut Docker Hub nicht; Enterprise-Module werden in das Community-Image eingebunden.
Wie lange dauert der Erststart?
Der Container ist kurz nach dem Start erreichbar. Das Anlegen der ersten Datenbank dauert je nach NAS einige Minuten. Bleibt die Seite unerreichbar, prüfen Sie im Log die Adresse, auf der Odoo lauscht.
Kann ich später auf Enterprise wechseln?
Ja. Die Odoo-Doku beschreibt den Wechsel: Datenbank sichern, Server stoppen, Modul web_enterprise installieren, Server starten und den Abonnement-Code eingeben. Im Docker-Betrieb binden Sie dafür die Enterprise-Module als Addons ein.
Welche Version nehmen Sie für eine Neuinstallation?
Odoo 20.0. Laut Odoo endet der Standard-Support für 20.0 voraussichtlich im September 2029, für 19.0 im September 2028 und für 18.0 im September 2027. Für 17.0 endete er im September 2026.
Reicht Hyper Backup über den ganzen Odoo-Ordner?
Nicht als alleinige Datenbanksicherung. Sichern Sie die Datenbank per pg_dump und lassen Sie Hyper Backup den Dump, den Filestore und die Konfiguration auf ein externes Ziel kopieren, wie in Schritt 6 beschrieben.
Kann eine Instanz mehrere Datenbanken bedienen?
Ja, Odoo ist laut Doku mandantenfähig. Mit mehreren Datenbanken brauchen Sie einen passenden dbfilter, etwa je Hostname mit %h oder %d. Für die Website-App verlangt Odoo dann zwingend einen gesetzten Filter.
Fazit
Auf einem Synology NAS läuft Odoo 20 mit PostgreSQL 17 als überschaubares Compose-Projekt. Entscheidend sind die Details vor und nach dem Erststart: zufälliges Master-Passwort, danach gesperrter Datenbank-Manager, Backup aus Dump und Filestore auf ein externes Ziel und Hauptversionswechsel als eigenes Migrationsprojekt. Für Zeiterfassung ergänzt Kimai auf dem Synology NAS, für digitale Unterschriften DocuSeal auf dem Synology NAS.
Weiterführende Anleitungen und Quellen
- Container Manager auf dem Synology NAS: Docker-Compose-Projekt anlegen, starten und aktualisieren
- Nginx Proxy Manager auf der Synology mit Container Manager einrichten
- MySQL & PostgreSQL Backup automatisieren mit cron
- Kimai auf dem Synology NAS installieren
- DocuSeal auf dem Synology NAS installieren
- Odoo 20.0: System configuration (dbfilter, admin_passwd, list_db, Proxy, Sicherheit)
- Odoo 20.0: Installation aus den Quellen (PostgreSQL ab 16)
- Odoo: Standard and extended support
- Odoo 20.0: Upgrade
- Docker Hub: offizielles Image odoo


