La gestion des environnements de serveur est un aspect crucial pour toute entreprise utilisant Odoo. Lors des OCA Days 2024, Raphaël Reverdy, a présenté une conférence intitulée "Server Environment Management with Odoo". Cette présentation a abordé les défis et les solutions pour gérer efficacement les environnements de serveur dans Odoo.
Définition
Environnements
Environnement de Production : Utilisé par les utilisateurs réels.
Environnement de Staging/CI : Utilisé avec des données réelles (neutralisées, anonymisées) pour l'assurance qualité. Peut également être utilisé pour montrer les futures fonctionnalités aux clients.
Environnement de Développement : Idéalement utilisé avec des données de démonstration localement (ou dans une boîte de développement à distance).
Credentials
Les credentials incluent l'URL, le login, le mot de passe, le token, le certificat, etc., lorsque Odoo crée une connexion à un serveur externe.
Utilisation
Les credentials sont utilisés pour diverses tâches telles que :
EDI (Electronic Data Interchange)
Banque
Paiements
E-mails
Transmission
Les credentials peuvent être transportés via :
Mail (SMTP, IMAP)
Fichiers (SFTP, S3 buckets)
API (REST, SOAP)
Utilisation des Credentials
Les credentials peuvent être stockés et consommés de différentes manières :
Stockés en tant qu'enregistrement dans la base de données
Accessibles depuis un fichier ou une variable d'environnement, mais non stockés dans la base de données
Ajoutés par un serveur proxy que vous contrôlez à chaque connexion
Approche Standard
L'approche standard pour gérer les credentials est souvent difficile à déployer et coûteuse à maintenir. Elle nécessite un accès au serveur et peut être utilisée par le système pour des modules tels que sentry, bus_alt_connection, mail, payment_providers, delivery_carrier_account, auth_api_key, etc.
Stockage des Credentials
Les credentials peuvent être stockés de différentes manières :
Enregistrement dans la base de données
Via l'interface utilisateur d'Odoo
Via un fichier XML <record> (par un module) - source code
Via un script Python ou SQL - source code
Variable d'environnement
Copiée-collée sur le serveur (par un administrateur)
Stockée dans la gestion de configuration (généralement versionnée dans Git - source code)
Risques
Les risques associés à la gestion des credentials incluent :
Les credentials dans la base de données sont sauvegardés dans les dumps de base de données
Les credentials dans le code source peuvent être chargés dans le mauvais environnement
Les credentials disponibles dans le mauvais environnement peuvent entraîner des fuites de données
Modules
Comment configurer cela ?
Différentes implémentations :
server_environment : Module de base + implémentation par défaut
server_environment_data_encryption (dans la base de données)
server_environment_ir_config_parameter
Exemples d'utilisation
Installation de connector_search_engine
Installer connector_search_engine
server_environment est une dépendance
Comment configurer server_environment
[options]
running_env=prod
[outgoing_mail]
smtp_host = smtp.myserver.com
smtp_encryption = ssl
Modifier le fichier de configuration d'Odoo (odoo.cfg)
Comment configurer server_environment_ir_config_param
[options]
running_env=prod
[ir.config_parameter]
ribbon.name = prod
Modifier le fichier de configuration d'Odoo (odoo.cfg)
Comment configurer server_environment_data_encryption
from cryptography.fernet import Fernet
print(Fernet.generate_key())
print(Fernet.generate_key())
print(Fernet.generate_key())
[options]
running_env=prod
encryption_key_dev=gpe-6yzzIF8iNVmbZtHCUumup3HmmnfFQhHMrYJT0CQ=
encryption_key_ci=FLUybCIZNnl_PJ5uYvu_bJE_tVcY_b5hnv6z
encryption_key_prod=vtry8joRNSTKi9v67ySndLEp4EzVSYeg2LPbijL_bHg=
Ajouter les clés au fichier de configuration d'Odoo (odoo.cfg)
Intégration de votre module avec server_environment
Utilisation pour les développeurs
Ajouter server_environment comme dépendance de votre module
server_environment
my_module
Exemple de code
class SeBackend(models.Model):
_name = "se.backend"
_description = "Se Backend"
_inherit = [
"server.env.techname.mixin",
"server.env.mixin",
]
name = fields.Char(required=True)
index_prefix_name = fields.Char(
help="Prefix for technical indexes tech name. "
)
backend_type = fields.Selection(selection=[], string="Type")
index_ids = fields.One2many("se.index", "backend_id")
@property
def _server_env_fields(self):
return {"index_prefix_name": {}, "backend_type": {}}
backend_type_env_default
Autres Solutions
Neutralize.sql
Depuis Odoo v16, un script SQL nommé data/neutralize.sql peut être utilisé pour neutraliser les données.
-- cat odoo/addons/delivery/data/neutralize.sql
-- disable delivery carriers from external providers
UPDATE delivery_carrier
SET active = false
WHERE delivery_type NOT IN ('fixed', 'base_on_rule');
Custom Scripts
Des scripts personnalisés en Python ou SQL peuvent être utilisés pour neutraliser les données.
Conclusion
L'intégration de server_environment au début d'un projet permet de simplifier la gestion des environnements de serveur. Bien que cela puisse ajouter une certaine complexité initiale, cela permet de gagner du temps et d'améliorer la gestion des projets à long terme.