Sujets avancés

Cette section aborde les fonctionnalités avancées d’Odoo.sh relatives aux conteneurs, aux sous-modules Git et aux actions planifiées.

Conteneurs

Chaque build est isolé dans son propre conteneur (conteneur d’espace de noms Linux). La base est un système basé sur Ubuntu sur lequel toutes les dépendances requises d’Odoo, ainsi que des paquets courants et utiles, sont installés.

Si votre projet nécessite des dépendances Python supplémentaires ou des versions plus récentes, vous pouvez définir un fichier requirements.txt à la racine de vos branches qui les répertorie. La plateforme s’assurera que ces dépendances sont installées dans vos conteneurs.

Note

Les fichiers requirements.txt des sous-modules sont également pris en compte. La plateforme recherche ces fichiers dans le dossier parent de chaque dossier contenant un module Odoo.

Structure du répertoire

Comme les conteneurs sont basés sur Ubuntu, leur structure de répertoires suit le Filesystem Hierarchy Standard.

Les répertoires pertinents pour Odoo.sh sont les suivants :

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

Shell de base de données

Lors de l’accès à un conteneur avec le shell, vous pouvez accéder à la base de données à l’aide de la commande psql.

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

odoo-master-1=>

Avertissement

Utilisez toujours des transactions (par ex. BEGIN (…) COMMIT / ROLLBACK) lorsqu’une instruction SQL entraîne des modifications (par ex. UPDATE, DELETE, ALTER, etc.), en particulier pour votre base de données de production. Le mécanisme de transaction est votre filet de sécurité en cas d’erreur. Il vous suffit d’effectuer un rollback de vos modifications pour rétablir votre base de données dans son état antérieur.

N’oubliez pas de valider ou d’annuler les transactions. Les transactions ouvertes peuvent verrouiller des enregistrements dans vos tables, et une base de données en cours d’exécution peut attendre leur libération, provoquant ainsi le blocage indéfini du serveur.

De plus, utilisez d’abord vos bases de données de préproduction pour tester vos instructions. Cela vous offre un filet de sécurité supplémentaire.

Example

Vous avez oublié de définir votre condition WHERE. Dans ce cas, vous pouvez effectuer un rollback pour annuler la modification indésirable :

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

Réécrivez ensuite l’instruction et validez la modification :

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

Faire fonctionner un serveur Odoo

Vous pouvez démarrer une instance de serveur Odoo depuis le shell d’un conteneur. Vous ne pourrez pas y accéder depuis l’extérieur avec un navigateur web, mais vous pouvez, par exemple :

  • Utiliser le shell Odoo :

    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'
    
  • Installer un module :

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

    Astuce

    • L’argument --without-demo=all empêche le chargement des données de démonstration pour tous les modules.

    • L’argument --stop-after-init arrête immédiatement l’instance du serveur une fois l’opération terminée.

  • Mettre à jour un module :

    odoo-bin -u sale --stop-after-init
    
  • Exécuter les tests d’un module :

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

Voir également

Documentation CLI

Pour trouver le chemin des addons utilisé par Odoo.sh pour exécuter votre serveur, recherchez « odoo: addons paths » dans les journaux (~/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']

Avertissement

Les opérations effectuées sur une instance de serveur Odoo ne sont pas isolées ; les modifications seront répercutées dans la base de données. N’oubliez pas de toujours effectuer les tests dans vos bases de données de transition.

Débogage dans Odoo.sh

Note

Déboguer une build Odoo.sh n’est pas vraiment différent du débogage d’une autre application Python. Ainsi, l’objectif de cette section est de couvrir les spécificités et les limites de la plateforme Odoo.sh, en supposant que vous savez déjà utiliser un débogueur.

Vous pouvez utiliser pdb, pudb ou ipdb pour déboguer le code sur Odoo.sh. Comme le serveur s’exécute en dehors d’un shell, vous ne pouvez pas lancer le débogueur directement depuis votre backend Odoo, car cela nécessite un shell pour fonctionner.

pdb est installé par défaut dans chaque conteneur.

Astuce

Pour utiliser pudb ou ipdb, il est nécessaire de les installer soit :

  • de façon permanente en ajoutant pudb ou ipdb au fichier requirements.txt de votre projet, ou

  • de façon temporaire (uniquement dans la build actuelle) en exécutant la commande appropriée :

    pip install pudb --user
    
    pip install ipdb --user
    
  1. Pour déclencher le débogueur, ajoutez ceci au code que vous souhaitez déboguer :

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

    Note

    La condition sys.__stdin__.isatty() est une solution de contournement permettant de détecter si vous exécutez Odoo à partir d’un shell.

  2. Ensuite, enregistrez le fichier et exécutez le shell Odoo :

    odoo-bin shell
    
  3. Utilisez le shell Odoo pour déclencher le code que vous souhaitez déboguer.

    pdb en cours d'exécution dans un shell Odoo.sh

Sous-modules

Les sous-modules Git vous permettent de lier des dépôts externes directement à votre projet sans copier-coller de code, ce qui simplifie le déploiement en clonant les dépendances aux côtés de votre code source principal. Vous conservez un contrôle précis des versions en choisissant des branches exactes et en épinglant des révisions de commit spécifiques à mettre à jour quand vous le souhaitez.

Sur Odoo.sh, la plateforme détecte automatiquement les sous-modules et les ajoute à votre addons path pour l’installation de la base de données, à condition de configurer une clé de déploiement dans les paramètres de votre projet et de votre dépôt lors de l’intégration de dépôts privés.

Ajouter un sous-module

Note

Actuellement, il n’est pas possible d’ajouter des dépôts privés avec Odoo.sh. Vous pouvez néanmoins le faire avec Git.

  1. Depuis la vue Branches de votre projet Odoo.sh, choisir la branche dans laquelle vous souhaitez ajouter un sous-module.

  2. Dans le coin supérieur droit, cliquer sur Submodule, puis sur Run on Odoo.sh.

  3. Dans la boîte de dialogue, renseigner les champs suivants :

    • Repository URL : l’URL SSH du dépôt

      Astuce

      Sur GitHub, cliquer sur Clone, sélectionner SSH et copier l’URL.

    • Branch : la branche spécifique à utiliser

    • Path : le dossier dans lequel le sous-module doit être ajouté dans votre branche

Astuce

Lors de l’ajout d’un dépôt contenant de nombreux modules, vous souhaiterez peut-être en ignorer certains si certains sont installés automatiquement. Pour ce faire, préfixer le dossier de votre sous-module d’un . (par ex. .folder). La plateforme ignorera ce dossier et vous pourrez sélectionner manuellement les modules en créant des liens symboliques vers ceux-ci depuis un autre dossier.

Actions planifiées

Sur la plateforme Odoo.sh, les actions planifiées sont implémentées de manière légèrement différente de celle d’un serveur Odoo classique et sont exécutées au mieux. En effet, plusieurs clients peuvent se trouver sur le même serveur et chacun a la garantie d’une part équitable des ressources du serveur. Par conséquent, une heure d’exécution exacte des actions planifiées ne peut être garantie.

Important

Ne pas s’attendre à ce qu’une action planifiée soit exécutée plus souvent que toutes les cinq minutes.

Le temps d’exécution des actions planifiées étant limité, il est conseillé de s’assurer que vos actions planifiées :

  • Traitent de petits lots d’enregistrements.

  • Valident leur travail après le traitement de chaque lot de manière à ne pas devoir recommencer si elles sont interrompues par la limite de temps.

  • Soient idempotentes, c’est-à-dire qu’elles ne doivent pas provoquer d’effets secondaires si elles sont exécutées plus souvent que prévu.

Changement d’adresse IP

Odoo.sh notifie les administrateurs du projet des changements d’adresse IP. De plus, lorsque l’adresse IP d’une instance de production change, une requête HTTP GET est effectuée vers le chemin /_odoo.sh/ip-change avec la nouvelle adresse IP incluse comme paramètre de chaîne de requête (new), ainsi que l’adresse IP précédente comme paramètre supplémentaire (old).

Ce mécanisme permet de déclencher des actions personnalisées en réponse au changement d’adresse IP (par ex. envoyer un e-mail, contacter une API de pare-feu, configurer des objets de base de données, etc.)

Pour des raisons de sécurité, la route /_odoo.sh/ip-change est accessible uniquement en interne par la plateforme elle-même et renvoie une réponse 403 si elle est accédée par tout autre moyen.

Voici un exemple de pseudo-implémentation :

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'