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.

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-init
    

    Tipp

    • Das Argument --without-demo=all verhindert, dass Demodaten für alle Module geladen werden.

    • Das Argument --stop-after-init beendet 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

CLI-Dokumentation

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 pudb oder ipdb zur Datei requirements.txt Ihres Projekts oder

  • vorübergehend (nur im aktuellen Build) durch Ausführen des entsprechenden Befehls:

    pip install pudb --user
    
    pip install ipdb --user
    
  1. 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.

  2. Speichern Sie als Nächstes die Datei und führen Sie die Odoo-Shell aus:

    odoo-bin shell
    
  3. Verwenden Sie die Odoo-Shell, um den Code auszulösen, den Sie debuggen möchten.

    pdb bei der Ausführung in einer Odoo.sh-Shell

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.

  1. Wählen Sie in der Ansicht Branches Ihres Odoo.sh-Projekts den Branch aus, dem Sie ein Submodul hinzufügen möchten.

  2. Klicken Sie oben rechts auf Submodul und dann auf Auf Odoo.sh ausführen.

  3. 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

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'