Fortgeschrittene Themen¶
Dieser Abschnitt behandelt erweiterte Funktionen von Odoo.sh im Zusammenhang mit Containern, Git-Submodulen und geplanten Aktionen.
Container¶
Jeder Build ist in seinem eigenen Container isoliert (Linux-Namespace-Container). Die Basis ist ein Ubuntu-basiertes System, auf dem alle erforderlichen Odoo-Abhängigkeiten sowie gängige, nützliche Pakete installiert sind.
Wenn Ihr Projekt zusätzliche Python-Abhängigkeiten oder neuere Versionen erfordert, können Sie eine Datei requirements.txt im Stammverzeichnis Ihrer Branches definieren, die diese auflistet. Die Plattform stellt sicher, dass diese Abhängigkeiten in Ihren Containern installiert werden.
Siehe auch
Ein konkretes Beispiel finden Sie in der requirements.txt-Datei von Odoo Community.
Bemerkung
Die requirements.txt-Dateien von Submodulen werden ebenfalls berücksichtigt. Die Plattform sucht nach solchen Dateien im übergeordneten Ordner jedes Ordners, der ein Odoo-Modul enthält.
Verzeichnisstruktur¶
Da die Container auf Ubuntu basieren, folgt ihre Verzeichnisstruktur dem Filesystem Hierarchy Standard.
Die für Odoo.sh relevanten Verzeichnisse sind die folgenden:
.
├── home
│ └── odoo
│ ├── backup.daily
│ ├── data
│ │ ├── filestore Database attachments, as well as the files of binary fields
│ │ └── sessions Visitors and users sessions
│ ├── logs
│ │ ├── install.log Database installation logs
│ │ ├── odoo.log Running server logs
│ │ ├── update.log Database updates logs
│ │ └── pip.log Python packages installation logs
│ └── src
│ ├── odoo Odoo Community source code
│ │ └── odoo-bin Odoo server executable
│ ├── enterprise Odoo Enterprise source code
│ ├── themes Odoo Themes source code
│ └── user Your repository branch source code
└── usr
├── lib
│ └── pythonX.XX
│ └── dist-packages Python X.XX standard libraries
├── local
│ └── lib
│ └── pythonX.XX
│ └── dist-packages Python X.XX third-party libraries
└── usr
└── bin
└── pythonX.X Python X.XX executable
Datenbank-Shell¶
Wenn Sie über die Shell auf einen Container zugreifen, können Sie mit dem Befehl psql auf die Datenbank zugreifen.
odoo@odoo-master-1.odoo.sh:~$ psql
psql (16.9)
Type "help" for help.
odoo-master-1=>
Warnung
Verwenden Sie immer Transaktionen (z. B. BEGIN (…) COMMIT / ROLLBACK), wenn eine SQL-Anweisung Änderungen bewirkt (z. B. UPDATE, DELETE, ALTER usw.), insbesondere bei Ihrer Produktionsdatenbank. Der Transaktionsmechanismus ist Ihr Sicherheitsnetz im Falle eines Fehlers. Sie müssen lediglich Ihre Änderungen zurückrollen, um Ihre Datenbank in den vorherigen Zustand zu versetzen.
Vergessen Sie nicht, Transaktionen zu committen oder zurückzurollen. Offene Transaktionen können Datensätze in Ihren Tabellen sperren, und eine laufende Datenbank kann darauf warten, dass diese freigegeben werden, wodurch ein Server unbegrenzt hängen bleiben kann.
Verwenden Sie zusätzlich Ihre Staging-Datenbanken, um Ihre Anweisungen zunächst zu testen. Das gibt Ihnen ein zusätzliches Sicherheitsnetz.
Example
Sie haben vergessen, Ihre WHERE-Bedingung festzulegen. In diesem Fall können Sie ein Rollback durchführen, um die unerwünschte Änderung rückgängig zu machen:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-master-1=> ROLLBACK;
ROLLBACK
Schreiben Sie dann die Anweisung neu und committen Sie die Änderung:
odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-master-1=> COMMIT;
COMMIT
Einen Odoo-Server starten¶
Sie können eine Odoo-Serverinstanz über eine Container-Shell starten. Sie können nicht von außen mit einem Webbrowser darauf zugreifen, aber Sie können zum Beispiel:
Verwenden Sie die Odoo-Shell:
odoo-bin shell >>> partner = env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1) >>> partner.name 'ASUSTeK' >>> partner.name = 'Odoo' >>> env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1).name 'Odoo'
Installieren Sie ein Modul:
odoo-bin -i sale --without-demo=all --stop-after-initTipp
Das Argument
--without-demo=allverhindert, dass Demodaten für alle Module geladen werden.Das Argument
--stop-after-initbeendet die Serverinstanz sofort, nachdem der Vorgang abgeschlossen ist.
Aktualisieren Sie ein Modul:
odoo-bin -u sale --stop-after-init
Führen Sie die Tests für ein Modul aus:
odoo-bin -i sale --test-enable --log-level=test --stop-after-init
Siehe auch
Um den von Odoo.sh zur Ausführung Ihres Servers verwendeten Add-ons-Pfad zu finden, suchen Sie in den Protokollen nach „odoo: addons paths“ (~/logs/odoo.log).
2025-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 18.0
2025-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2025-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/18.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']
Warnung
Vorgänge, die Sie auf einer Odoo-Serverinstanz ausführen, sind nicht isoliert; Änderungen werden in der Datenbank übernommen. Denken Sie daran, Tests immer in Ihren Staging-Datenbanken durchzuführen.
Fehlerbeseitigung in Odoo.sh¶
Bemerkung
Das Debuggen eines Odoo.sh-Builds unterscheidet sich kaum vom Debuggen einer anderen Python-Anwendung. Daher besteht das Ziel dieses Abschnitts darin, die Besonderheiten und Einschränkungen der Odoo.sh-Plattform zu behandeln, und setzt voraus, dass Sie bereits wissen, wie man einen Debugger verwendet.
Sie können pdb, pudb oder ipdb verwenden, um Code auf Odoo.sh zu debuggen. Da der Server außerhalb einer Shell ausgeführt wird, können Sie den Debugger nicht direkt von Ihrem Odoo-Backend aus starten, da dieser für den Betrieb eine Shell benötigt.
pdb ist standardmäßig in jedem Container installiert.
Tipp
Um pudb oder ipdb zu verwenden, müssen sie entweder wie folgt installiert werden:
dauerhaft durch Hinzufügen von
pudboderipdbzur Dateirequirements.txtIhres Projekts odervorübergehend (nur im aktuellen Build) durch Ausführen des entsprechenden Befehls:
pip install pudb --user
pip install ipdb --user
Um den Debugger auszulösen, fügen Sie Folgendes zu dem Code hinzu, den Sie debuggen möchten:
import sys if sys.__stdin__.isatty(): import pdb; pdb.set_trace()
Bemerkung
Die Bedingung
sys.__stdin__.isatty()ist ein Workaround, um festzustellen, ob Sie Odoo über eine Shell ausführen.Speichern Sie als Nächstes die Datei und führen Sie die Odoo-Shell aus:
odoo-bin shell
Verwenden Sie die Odoo-Shell, um den Code auszulösen, den Sie debuggen möchten.
Untermodule¶
Git-Submodule ermöglichen es Ihnen, externe Repositorys direkt in Ihr Projekt einzubinden, ohne Code kopieren und einfügen zu müssen. Dies optimiert die Bereitstellung, da Abhängigkeiten zusammen mit Ihrer Hauptcodebasis geklont werden. Sie behalten eine präzise Versionskontrolle, indem Sie exakte Branches auswählen und bestimmte Commit-Revisionen festlegen, die Sie nach Belieben aktualisieren können.
Auf Odoo.sh erkennt die Plattform Submodule automatisch und fügt sie Ihrem Addons-Pfad für die Datenbankinstallation hinzu, vorausgesetzt Sie konfigurieren einen Deploy-Key in Ihren Projekt- und Repository-Einstellungen, wenn Sie private Repositorys integrieren.
Ein Untermodul hinzufügen¶
Bemerkung
Derzeit ist es nicht möglich, private Repositorys mit Odoo.sh hinzuzufügen. Mit Git können Sie dies dennoch tun.
Wählen Sie in der Ansicht Branches Ihres Odoo.sh-Projekts den Branch aus, dem Sie ein Submodul hinzufügen möchten.
Klicken Sie oben rechts auf Submodul und dann auf Auf Odoo.sh ausführen.
Füllen Sie im Dialogfeld folgende Angaben aus:
Repository-URL: die SSH-URL des Repositorys
Tipp
Klicken Sie auf GitHub auf Clone, wählen Sie SSH aus und kopieren Sie die URL.
Branch: der spezifische Branch, der verwendet werden soll
Pfad: der Ordner, in dem das Submodul in Ihrem Branch hinzugefügt werden soll
Prüfen Sie in einem Terminal in dem Ordner, in dem Ihr Git-Repository geklont ist, den Zweig, in dem Sie ein Untermodul hinzufügen möchten:
git checkout <branch>
Fügen Sie das Submodul hinzu:
git submodule add -b <branch> <git@yourprovider.com>:<username/repository.git> <path>
<git@yourprovider.com>:<username/repository.git>: die SSH-URL des Repositorys, das Sie als Submodul hinzufügen möchten
<branch>: der Branch, den Sie in obigem Repository verwenden möchten
<path>: der Ordner, in dem Sie dieses Submodul hinzufügen möchten
Committen und pushen Sie die Änderungen:
git commit -a && git push -u <remote> <branch><remote>: das Repository, in das Sie Ihre Änderungen pushen möchten. Bei einer Standard-Git-Einrichtung ist dies origin.
<branch>: der Branch, in den Sie Ihre Änderungen pushen möchten. Höchstwahrscheinlich der Branch, den Sie im ersten Schritt ausgecheckt haben.
Tipp
Wenn Sie ein Repository hinzufügen, das viele Module enthält, möchten Sie möglicherweise einige davon ignorieren, falls sie automatisch installiert werden. Versehen Sie dazu Ihren Submodul-Ordner mit dem Präfix . (z. B. .folder). Die Plattform ignoriert diesen Ordner, und Sie können die Module gezielt auswählen, indem Sie symbolische Links von einem anderen Ordner aus zu ihnen erstellen.
Geplante Aktionen¶
Auf der Odoo.sh-Plattform werden geplante Aktionen etwas anders als auf einem regulären Odoo-Server implementiert und nach bestem Ermessen ausgeführt. Der Grund dafür ist, dass sich möglicherweise mehrere Kunden denselben Server teilen und jedem Kunden ein fairer Anteil an den Serverressourcen garantiert wird. Daher kann keine genaue Ausführungszeit für geplante Aktionen garantiert werden.
Wichtig
Erwarten Sie nicht, dass eine geplante Aktion öfter als alle fünf Minuten ausgeführt wird.
Da die Ausführungszeit geplanter Aktionen begrenzt ist, empfiehlt es sich sicherzustellen, dass Ihre geplanten Aktionen:
In kleinen Datensatzstapeln arbeiten.
Ihre Arbeit nach der Verarbeitung jedes Stapels committen, sodass sie bei einer Unterbrechung durch das Zeitlimit nicht von vorne beginnen müssen.
Idempotent sind, d. h. keine Nebenwirkungen verursachen, wenn sie häufiger als erwartet ausgeführt werden.
Änderung der IP-Adresse¶
Odoo.sh benachrichtigt Projektadministratoren über Änderungen der IP-Adresse. Wenn sich die IP-Adresse einer Produktionsinstanz ändert, wird außerdem eine HTTP-GET-Anfrage an den Pfad /_odoo.sh/ip-change gesendet, wobei die neue IP-Adresse als Abfragezeichenfolgenparameter (new) und die vorherige IP-Adresse als zusätzlicher Parameter (old) enthalten ist.
Dieser Mechanismus ermöglicht es, als Reaktion auf die Änderung der IP-Adresse benutzerdefinierte Aktionen auszulösen (z. B. das Senden einer E-Mail, das Kontaktieren einer Firewall-API, das Konfigurieren von Datenbankobjekten usw.).
Aus Sicherheitsgründen ist die Route /_odoo.sh/ip-change nur intern über die Plattform selbst zugänglich und gibt eine 403-Antwort zurück, wenn auf sie über andere Mittel zugegriffen wird.
Hier ist ein Beispiel für eine Pseudo-Implementierung:
class IPChangeController(http.Controller):
@http.route('/_odoo.sh/ip-change', auth='public')
def ip_change(self, old=None, new=None):
_logger.info("IP address changed from %s to %s", old, new)
# Then perform whatever action is required for your use case, e.g., update an
# ir.config_parameter, send an email, contact an external firewall service's API, ...
return 'ok'