Diese Anleitung bildet den finalen, bereinigten Ablauf auf Basis der gemeinsam erarbeiteten Schritte ab.
Rahmenbedingungen dieser Anleitung:
- Ubuntu 24.04
- Linux-Editor:
nano- Reverse Proxy: Nginx Proxy Manager
- 2 Worker
- Community-Code für den Enterprise-Betrieb per Git
- Enterprise-Code als
odoo-enterprise-19.tar.gzper FileZilla- Einheitlicher Benutzername
odoofür Linux, PostgreSQL und Odoo-Dienst- Nur der Name der Odoo-Datenbank bleibt individuell
- separater SFTP-Benutzer für FileZilla-Uploads
Diese Anleitung führt dich 1 zu 1 durch die Installation von Odoo 19 On-Premise auf Ubuntu.
Der Ablauf ist bewusst in zwei Abschnitte geteilt:
Wichtig ist:
Für den späteren Enterprise-Betrieb läuft Odoo am Ende aus dem Community-Quellcode (odoo-bin) und nicht dauerhaft aus der Paketinstallation.
Das ist wichtig, weil Enterprise nur zusätzliche Add-ons liefert. Der eigentliche Server kommt weiterhin aus dem Community-Code.
sudo apt update
sudo apt upgrade -y
sudo reboot
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
sudo systemctl status ssh
sudo ss -tulpen | grep :22
Wenn ufw aktiv ist:
sudo ufw allow OpenSSH
sudo ufw reload
sudo ufw status
Server-IP anzeigen:
hostname -I
Falls nötig, SSH-Konfiguration prüfen:
sudo nano /etc/ssh/sshd_config
Relevante Werte:
PasswordAuthentication yes
PermitRootLogin no
Danach:
sudo systemctl restart ssh
Für den Upload der Enterprise-Datei per FileZilla wird ein eigener SFTP-Benutzer eingerichtet. Dieser Benutzer erhält keine sudo-Rechte und dient ausschließlich dem sicheren Datei-Upload.
sudo adduser sftpodoo
sudo mkdir -p /opt/odoo
sudo usermod -aG odoo sftpodoo
sudo chgrp -R odoo /opt/odoo
sudo chmod 775 /opt/odoo
sudo chmod -R g+rwX /opt/odoo
id sftpodoo
groups sftpodoo
Wichtig:
sftpodoo nicht in die sudo-Gruppe aufnehmenodoo gehörensftpodoo erhält über die Gruppe odoo Schreibzugriff auf /opt/odoo/opt/odoo schreibenIn FileZilla verwendest du:
SFTP - SSH File Transfer Protocol22sftpodooDie Datei wird nach folgendem Ordner hochgeladen:
/opt/odoo
Der Dateiname lautet:
odoo-enterprise-19.tar.gz
odoo anlegensudo adduser --system --home=/opt/odoo --group odoo
sudo mkdir -p /opt/odoo
getent passwd odoo
odoosudo chown -R odoo:odoo /opt/odoo
sudo apt update
sudo apt install -y gnupg wget ca-certificates git
gpg --version
git --version
sudo apt update
sudo apt install -y postgresql postgresql-client postgresql-contrib
sudo systemctl status postgresql
odoo anlegenStandardweg:
sudo -u postgres createuser -d -R -S odoo
sudo -u postgres psql -c "ALTER USER odoo WITH PASSWORD 'SICHERES_PASSWORT';"
Falls createuser nicht gefunden wird:
sudo apt update
sudo apt install -y postgresql postgresql-client postgresql-contrib
Alternativ direkt per SQL:
sudo -u postgres psql -c "CREATE USER odoo WITH CREATEDB LOGIN PASSWORD 'SICHERES_PASSWORT';"
Falls die Rolle odoo bereits existiert:
sudo -u postgres psql -c "ALTER ROLE odoo WITH CREATEDB LOGIN PASSWORD 'SICHERES_PASSWORT';"
sudo -u postgres psql -c "\du"
sudo mkdir -p /usr/share/keyrings
wget -q -O - https://nightly.odoo.com/odoo.key | sudo gpg --dearmor --yes -o /usr/share/keyrings/odoo-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/odoo-archive-keyring.gpg] https://nightly.odoo.com/19.0/nightly/deb/ ./' | sudo tee /etc/apt/sources.list.d/odoo.list
sudo apt update
sudo apt install -y odoo
sudo systemctl enable odoo
sudo systemctl restart odoo
sudo systemctl status odoo
ss -tulpen | grep 8069
Falls ufw aktiv ist:
sudo ufw allow 8069/tcp
sudo ufw reload
python3-phonenumbers installierensudo apt install -y python3-phonenumbers
python3-phonenumbersWenn Odoo nach erfolgreicher Installation weiterhin meldet, dass python3-phonenumbers fehlt, installiere das Paket zusätzlich auf Ubuntu und prüfe das Modul auch in der verwendeten Odoo-venv.
Systempaket installieren:
sudo apt update
sudo apt install -y python3-phonenumbers
dpkg -l | grep python3-phonenumbers
Modul in der venv prüfen:
sudo -u odoo -H bash
source /opt/odoo/venv/bin/activate
python -c "import phonenumbers; print(phonenumbers.__version__)"
deactivate
exit
Falls ein Importfehler erscheint, das Modul zusätzlich in der venv nachinstallieren:
sudo -u odoo -H bash
source /opt/odoo/venv/bin/activate
pip install phonenumbers
deactivate
exit
sudo systemctl restart odoo
sudo apt update
sudo apt install -y python3-pip python3-venv python3-dev build-essential libldap2-dev libpq-dev libsasl2-dev libxml2-dev libxslt1-dev libffi-dev libssl-dev zlib1g-dev libjpeg-dev liblcms2-dev libblas-dev libatlas-base-dev npm
sudo npm install -g rtlcss
wkhtmltopdf installierendpkg --print-architecture
cd /tmp
wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.jammy_amd64.deb
sudo apt install -y ./wkhtmltox_0.12.6.1-3.jammy_amd64.deb
wkhtmltopdf --version
Nur der Enterprise-Code wird per FileZilla als Datei
odoo-enterprise-19.tar.gz
nach folgendem Zielverzeichnis auf dem Ubuntu-Server hochgeladen:
/opt/odoo
Prüfen:
sudo ls -lah /opt/odoo
python3 --version
pip3 --version
Falls nötig:
sudo apt update
sudo apt install -y python3-pip python3-venv python3-dev build-essential libldap2-dev libpq-dev libsasl2-dev libxml2-dev libxslt1-dev libffi-dev libssl-dev zlib1g-dev libjpeg-dev liblcms2-dev libblas-dev libatlas-base-dev npm
venvCommunity-Code per Git laden:
sudo -u odoo -H bash -c "cd /opt/odoo && git clone https://github.com/odoo/odoo.git -b 19.0 --depth 1 community"
ls -lah /opt/odoo/community
ls -lah /opt/odoo/community/setup
Optionales Skript, nur wenn vorhanden:
cd /opt/odoo/community
sudo ./setup/debinstall.sh
Virtuelle Umgebung anlegen:
sudo -u odoo -H bash
cd /opt/odoo
python3 -m venv venv
source /opt/odoo/venv/bin/activate
pip install --upgrade pip wheel setuptools
cd /opt/odoo/community
pip install -r requirements.txt
deactivate
exit
sudo mkdir -p /opt/odoo/enterprise
sudo mkdir -p /opt/odoo/custom-addons
sudo mkdir -p /var/lib/odoo
sudo mkdir -p /var/log/odoo
Da dein Enterprise-Archiv intern zusätzliche Unterordner enthält, wird es kontrolliert entpackt und danach der echte Add-ons-Ordner für addons_path verwendet.
Zuerst den Zielordner neu anlegen:
sudo rm -rf /opt/odoo/enterprise
sudo mkdir -p /opt/odoo/enterprise
Optional die Archivstruktur kurz prüfen:
tar -tzf /opt/odoo/odoo-enterprise-19.tar.gz | head -50
Dann das Archiv entpacken:
sudo tar -xzf /opt/odoo/odoo-enterprise-19.tar.gz -C /opt/odoo/enterprise --strip-components=1
Danach die Struktur prüfen:
find /opt/odoo/enterprise -maxdepth 6 -type d | sort
find /opt/odoo/enterprise -maxdepth 6 -type d -name web_enterprise
Wichtig ist jetzt nicht nur der Ordner /opt/odoo/enterprise, sondern der tatsächliche Ordner, in dem web_enterprise direkt liegt.
Bei deinem Archivaufbau ist der relevante Enterprise-Add-ons-Pfad nach dem Entpacken typischerweise:
/opt/odoo/enterprise/odoo-19.0+e.20260323/odoo/addons
oder – je nach entfernter Verzeichnisebene – ein sehr ähnlicher Pfad. Maßgeblich ist immer die Ausgabe des find-Befehls.
sudo chown -R odoo:odoo /opt/odoo
sudo chown -R odoo:odoo /var/lib/odoo
sudo chown -R odoo:odoo /var/log/odoo
sudo nano /etc/odoo.conf
Inhalt:
[options]
db_host = False
db_port = False
db_user = odoo
db_password = SICHERES_PASSWORT
addons_path = PFAD_ZUM_ENTERPRISE_ADDONS_ORDNER,/opt/odoo/community/addons,/opt/odoo/custom-addons
data_dir = /var/lib/odoo
logfile = /var/log/odoo/odoo.log
http_port = 8069
proxy_mode = True
workers = 2
max_cron_threads = 1
gevent_port = 8072
limit_memory_soft = 629145600
limit_memory_hard = 1677721600
limit_request = 8192
limit_time_cpu = 600
limit_time_real = 1200
Dann:
sudo chown odoo:odoo /etc/odoo.conf
sudo chmod 640 /etc/odoo.conf
Der erste Eintrag in addons_path muss genau auf den Ordner zeigen, in dem die Enterprise-Module direkt liegen.
Prüfe deshalb immer zuerst:
find /opt/odoo/enterprise -maxdepth 6 -type d -name web_enterprise
Wenn die Ausgabe zum Beispiel lautet:
/opt/odoo/enterprise/odoo-19.0+e.20260323/odoo/addons/web_enterprise
dann muss addons_path so gesetzt werden:
addons_path = /opt/odoo/enterprise/odoo-19.0+e.20260323/odoo/addons,/opt/odoo/community/addons,/opt/odoo/custom-addons
Wenn die Ausgabe stattdessen lautet:
/opt/odoo/enterprise/odoo/addons/web_enterprise
dann muss addons_path so gesetzt werden:
addons_path = /opt/odoo/enterprise/odoo/addons,/opt/odoo/community/addons,/opt/odoo/custom-addons
Vor der Installation von web_enterprise zusätzlich immer prüfen:
ls -lah PFAD_ZUM_ENTERPRISE_ADDONS_ORDNER/web_enterprise
ls -lah PFAD_ZUM_ENTERPRISE_ADDONS_ORDNER/web_enterprise/__manifest__.py
Wichtiger Übergang von Paket- zu Quellenbetrieb:
sudo systemctl stop odoo
sudo systemctl disable odoo
sudo ss -tulpen | grep 8069
Wenn 8069 weiter belegt ist:
sudo lsof -i :8069
Falls nötig:
sudo kill -9 PID
Neue systemd-Datei:
sudo nano /etc/systemd/system/odoo.service
Inhalt:
[Unit]
Description=Odoo 19
Documentation=https://www.odoo.com
After=network.target postgresql.service
[Service]
Type=simple
User=odoo
Group=odoo
ExecStart=/opt/odoo/venv/bin/python3 /opt/odoo/community/odoo-bin -c /etc/odoo.conf
WorkingDirectory=/opt/odoo/community
Restart=always
RestartSec=5s
KillMode=mixed
[Install]
WantedBy=multi-user.target
Dann:
sudo systemctl daemon-reload
sudo systemctl enable odoo
sudo systemctl restart odoo
sudo systemctl status odoo -l --no-pager
ss -tulpen | grep 8069
ss -tulpen | grep 8072
Wenn 8072 leer bleibt:
sudo journalctl -u odoo -n 100 --no-pager
sudo tail -n 100 /var/log/odoo/odoo.log
web_enterprise installierensudo systemctl stop odoo
sudo -u odoo /opt/odoo/venv/bin/python3 /opt/odoo/community/odoo-bin -c /etc/odoo.conf -d DEINE_DATENBANK -i web_enterprise --stop-after-init
sudo systemctl restart odoo
sudo systemctl status odoo -l --no-pager
Nur DEINE_DATENBANK ist individuell.
Odoo läuft hinter Nginx Proxy Manager.
Die Odoo-Konfiguration ist bereits so vorbereitet:
proxy_mode = Trueworkers = 2gevent_port = 8072Lege einen Proxy Host an:
http8069Zusätzliche Custom Location:
/websocket/http8072proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_upgrade;
proxy_read_timeout 720s;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
sudo systemctl restart odoo
sudo systemctl status odoo
ss -tulpen | grep 8069
ss -tulpen | grep 8072
sudo gpg: command not foundsudo apt update
sudo apt install -y gnupg wget ca-certificates
createuser: command not foundsudo apt update
sudo apt install -y postgresql postgresql-client postgresql-contrib
Fallback:
sudo -u postgres psql -c "CREATE USER odoo WITH CREATEDB LOGIN PASSWORD 'SICHERES_PASSWORT';"
odoo existiert bereitssudo -u postgres psql -c "ALTER ROLE odoo WITH CREATEDB LOGIN PASSWORD 'SICHERES_PASSWORT';"
./setup/debinstall.sh: command not foundls -lah /opt/odoo/community
ls -lah /opt/odoo/community/setup
Wenn das Skript nicht vorhanden ist, ohne debinstall.sh weiterarbeiten und stattdessen den Paketblock aus Schritt 12 verwenden.
OSError: [Errno 98] Address already in useUrsache:
Port 8069 ist bereits belegt, meist durch die alte Paketinstanz.
Lösung:
sudo systemctl stop odoo
sudo systemctl disable odoo
sudo ss -tulpen | grep 8069
sudo lsof -i :8069
Erst wenn 8069 frei ist, kann die Quelleninstanz sauber starten. Danach öffnet Odoo auch 8072.
invalid module names, ignored: web_enterpriseUrsache:
Der eingetragene addons_path zeigt nicht auf den echten Enterprise-Add-ons-Ordner.
Lösung:
find /opt/odoo/enterprise -maxdepth 6 -type d -name web_enterprise
Danach den ersten Eintrag in /etc/odoo.conf auf den tatsächlichen Add-ons-Ordner setzen, also auf den Ordner oberhalb von web_enterprise.
Zusätzlich prüfen:
ls -lah PFAD_ZUM_ENTERPRISE_ADDONS_ORDNER/web_enterprise
ls -lah PFAD_ZUM_ENTERPRISE_ADDONS_ORDNER/web_enterprise/__manifest__.py
Erst wenn __manifest__.py vorhanden ist und addons_path korrekt gesetzt wurde, kann web_enterprise installiert werden.
python3-phonenumbersLösung:
sudo apt update
sudo apt install -y python3-phonenumbers
Da Odoo in dieser Anleitung aus der virtuellen Umgebung /opt/odoo/venv läuft, zusätzlich prüfen:
sudo -u odoo -H bash
source /opt/odoo/venv/bin/activate
python -c "import phonenumbers; print(phonenumbers.__version__)"
deactivate
exit
Falls das Modul dort nicht importiert werden kann:
sudo -u odoo -H bash
source /opt/odoo/venv/bin/activate
pip install phonenumbers
deactivate
exit
sudo systemctl restart odoo