Geavanceerde onderwerpen

In dit gedeelte worden geavanceerde functies van Odoo.sh behandeld met betrekking tot containers, Git-submodules en geplande acties.

Containers

Elke build is geïsoleerd in zijn eigen container (Linux namespace container). De basis is een op Ubuntu gebaseerd systeem waarop alle vereiste afhankelijkheden van Odoo zijn geïnstalleerd, evenals algemene, nuttige pakketten.

Als je project extra Python-afhankelijkheden of recentere versies vereist, kun je in de hoofdmap van je branches een requirements.txt-bestand definiëren waarin deze worden vermeld. Het platform zorgt ervoor dat deze afhankelijkheden in je containers worden geïnstalleerd.

Zie ook

Notitie

Er wordt ook rekening gehouden met de requirements.txt-bestanden van submodules. Het platform zoekt naar dergelijke bestanden in de bovenliggende map van elke map die een Odoo-module bevat.

Directorystructuur

Aangezien de containers op Ubuntu zijn gebaseerd, volgt hun directorystructuur de Filesystem Hierarchy Standard.

De directories die relevant zijn voor Odoo.sh zijn de volgende:

.
├── 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

Databaseshell

Wanneer je via de shell toegang hebt tot een container, kun je toegang krijgen tot de database met het commando psql.

odoo@odoo-master-1.odoo.sh:~$ psql
psql (16.9)
Type "help" for help.

odoo-master-1=>

Waarschuwing

Gebruik altijd transacties (bv. BEGIN (…) COMMIT / ROLLBACK) wanneer een SQL-statement tot wijzigingen leidt (bv. UPDATE, DELETE, ALTER, enz.), vooral voor je productiedatabase. Het transactiemechanisme is je vangnet in het geval van een fout. Je hoeft je wijzigingen alleen maar terug te draaien om je database terug te zetten naar de vorige staat.

Vergeet niet om transacties te committen of terug te draaien. Openstaande transacties kunnen records in je tabellen vergrendelen en een actieve database kan wachten tot deze worden vrijgegeven, waardoor een server voor onbepaalde tijd kan vastlopen.

Gebruik daarnaast eerst je staging-databases om je statements te testen. Dit biedt je een extra vangnet.

Example

Je bent vergeten je WHERE-voorwaarde in te stellen. In zo’n geval kun je een rollback uitvoeren om de ongewenste wijziging terug te draaien:

odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-master-1=> ROLLBACK;
ROLLBACK

Herschrijf vervolgens het statement en commit de wijziging:

odoo-master-1=> BEGIN;
BEGIN
odoo-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-master-1=> COMMIT;
COMMIT

Voer een Odoo-server jeit

Je kunt een Odoo-serverinstantie starten vanuit een containershell. Je hebt er vanaf de buitenwereld geen toegang toe met een webbrowser, maar je kunt bijvoorbeeld:

  • Gebruik de 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'
    
  • Installeer een module:

    odoo-bin -i sale --without-demo=all --stop-after-init
    

    Tip

    • Het argument --without-demo=all voorkomt dat er demodata wordt geladen voor alle modules.

    • Het argument --stop-after-init sluit de serverinstantie onmiddellijk af nadat de bewerking is voltooid.

  • Werk een module bij:

    odoo-bin -u sale --stop-after-init
    
  • Voer de tests voor een module uit:

    odoo-bin -i sale --test-enable --log-level=test --stop-after-init
    

Om het addons-pad te vinden dat Odoo.sh gebruikt om je server uit te voeren, zoek je naar “odoo: addons paths” in de logs (~/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']

Waarschuwing

Bewerkingen die je uitvoert op een Odoo-serverinstantie zijn niet geïsoleerd; wijzigingen worden doorgevoerd in de database. Vergeet niet om altijd tests uit te voeren in je staging-databases.

Foutopsporing in Odoo.sh

Notitie

Het debuggen van een Odoo.sh-build verschilt niet echt van het debuggen van een andere Python-app. Het doel van dit onderdeel is dan ook de bijzonderheden en beperkingen van het Odoo.sh-platform te behandelen, waarbij ervan wordt uitgegaan dat je al weet hoe je een debugger moet gebruiken.

Je kunt pdb, pudb of ipdb gebruiken om code op Odoo.sh te debuggen. Omdat de server buiten een shell draait, kun je de debugger niet rechtstreeks vanuit je Odoo-backend starten, aangezien deze een shell nodig heeft om te werken.

pdb wordt standaard in elke container geïnstalleerd.

Tip

Om pudb of ipdb te gebruiken, is het nodig om ze te installeren, ofwel:

  • permanent door pudb of ipdb toe te voegen aan het bestand requirements.txt van je project, of

  • tijdelijk (alleen in de huidige build) door de betreffende opdracht uit te voeren:

    pip install pudb --user
    
    pip install ipdb --user
    
  1. Voeg dit toe aan de code die je wilt debuggen om de debugger te activeren:

    import sys
    if sys.__stdin__.isatty():
        import pdb; pdb.set_trace()
    

    Notitie

    De voorwaarde sys.__stdin__.isatty() is een workaround om te detecteren of je Odoo vanuit een shell uitvoert.

  2. Sla vervolgens het bestand op en voer de Odoo-shell uit:

    odoo-bin shell
    
  3. Gebruik de Odoo-shell om de code te activeren die je wilt debuggen.

    pdb die draait in een Odoo.sh-shell

Submodules

Git submodules stellen je in staat om externe repositories rechtstreeks aan je project te koppelen zonder code te kopiëren en te plakken. Dit stroomlijnt de implementatie door afhankelijkheden samen met je primaire codebase te klonen. Je behoudt nauwkeurig versiebeheer door exacte branches te kiezen en specifieke commit-revisies vast te pinnen, zodat je deze kunt bijwerken wanneer je maar wilt.

Op Odoo.sh detecteert het platform automatisch submodules en voegt ze toe aan je addons-pad voor database-installatie, op voorwaarde dat je een deploy key configureert in je project- en repository-instellingen bij het integreren van private repositories.

Een submodule toevoegen

Notitie

Momenteel is het niet mogelijk om private repositories toe te voegen met Odoo.sh. Je kunt dit echter wel doen met Git.

  1. Kies in de weergave Filialen van je Odoo.sh-project het filiaal waarin je een submodule wilt toevoegen.

  2. Klik in de rechterbovenhoek op Submodule en vervolgens op Uitvoeren op Odoo.sh.

  3. Vul in het dialoogvenster het volgende in:

    • Repository-URL: de SSH-URL van de repository

      Tip

      Klik op GitHub op Clone, selecteer SSH en kopieer de URL.

    • Filiaal: het specifieke filiaal dat moet worden gebruikt

    • Pad: de map waarin de submodule moet worden toegevoegd in je filiaal

Tip

Wanneer je een repository toevoegt die veel modules bevat, wil je er mogelijk enkele negeren als deze automatisch worden geïnstalleerd. Plaats hiervoor een . (bv. .folder) voor je submodulemap. Het platform zal deze map negeren en je kunt de modules handmatig selecteren door vanuit een andere map symbolische links ernaartoe te maken.

Geplande acties

Op het Odoo.sh-platform zijn geplande acties net iets anders geïmplementeerd dan op een reguliere Odoo-server en worden ze uitgevoerd op basis van best effort. Dit komt omdat er meerdere klanten op dezelfde server kunnen staan en elke klant verzekerd is van een eerlijk deel van de resources van de server. Daarom kan een exacte uitvoeringstijd voor geplande acties niet worden gegarandeerd.

Belangrijk

Verwacht niet dat een geplande actie vaker dan om de vijf minuten wordt uitgevoerd.

Omdat de uitvoeringstijd van geplande acties beperkt is, is het raadzaam om ervoor te zorgen dat je geplande acties:

  • Met kleine batches records werken.

  • Hun werk na de verwerking van elke batch vastleggen (commit), zodat ze niet opnieuw hoeven te beginnen als ze door de tijdslimiet worden onderbroken.

  • Idempotent zijn, d.w.z. dat ze geen neveneffecten mogen veroorzaken als ze vaker worden gestart dan verwacht.

IP-adres wijzigen

Odoo.sh informeert projectbeheerders over IP-adreswijzigingen. Daarnaast wordt, wanneer het IP-adres van een productie-instantie verandert, een HTTP GET-verzoek gedaan naar het pad /_odoo.sh/ip-change met het nieuwe IP-adres als een querystringparameter (new), samen met het vorige IP-adres als een extra parameter (old).

Met dit mechanisme kunnen aangepaste acties worden geactiveerd als reactie op de wijziging van het IP-adres (bijv. een e-mail verzenden, contact opnemen met een firewall-API, databaseobjecten configureren, enz.).

Om veiligheidsredenen is de route /_odoo.sh/ip-change alleen intern toegankelijk voor het platform zelf en retourneert een 403-respons bij toegang via andere middelen.

Hier is een voorbeeld van een pseudo-implementatie:

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'