Table des matières :
- Nouveautés clés d’Odoo 19 à valider en environnement réel (pas dans une démo)
- Pré-requis techniques et matrice de compatibilité (Linux, Python, PostgreSQL, Node)
- Stratégie de migration vers Odoo 19 : in-place, side-by-side, SaaS/Odoo.sh
- Audit de vos modules custom : là où Odoo 19 fait réellement mal
- Données, index et performance : éviter que l’upgrade Odoo 19 transforme votre DB en marécage
- Intégrations (e-commerce, WMS, ETL) : sécuriser les flux pendant et après la migration
- Sécurité et observabilité : durcir Odoo 19 sans se mentir sur le core
- Checklist opérationnelle (runbook) : migration Odoo 19 avec cutover et rollback
Nouveautés clés d’Odoo 19 à valider en environnement réel (pas dans une démo)
Odoo 19 n’est pas “juste” une itération UI : comme sur les versions précédentes, les changements réellement coûteux se cachent dans les couches transverses (web client, moteur d’assets, ORM, permissions, mail, accounting, règles stock). La bonne lecture, côté développeur, consiste à classifier les nouveautés par surface de rupture : (1) ce qui casse vos modules (API Python/JS, vues XML, héritages), (2) ce qui change vos flux métier (stock, facturation, e-commerce), (3) ce qui modifie le runtime (PostgreSQL, Python, dépendances Node), (4) ce qui impacte la perf (requêtes, index, workers, cache).
Dans la pratique, les “nouveautés clés” qui comptent sont celles qui déplacent les points de friction habituels :
- Web client : évolutions OWL / rendering / bundling qui rendent certains patterns JS legacy plus fragiles (patches de widgets, surcharges non encapsulées).
- Données & stock : ajustements sur les règles de réservation, le multi-entrepôt, les champs calculés et leurs triggers (compute/store) qui peuvent changer la latence sur gros volumes.
- Sécurité & compliance : durcissements d’accès aux modèles sensibles, changements sur les groupes/record rules, et besoins d’audit trail plus explicites.
Ne prenez pas “nouveauté” comme synonyme de “gain automatique”. Sur Odoo, une fonctionnalité supplémentaire peut augmenter vos coûts d’exploitation si elle multiplie les dépendances (cron, bus, mail gateway, indexation). Pour cadrer l’analyse, partez d’un inventaire concret : nombre d’utilisateurs simultanés, taille DB (en Go), nombre de mouvements de stock/jour, volume d’emails, nombre de modules custom et niveau d’override (monkey patch, héritage de vues, surcharges ORM). C’est ce contexte qui détermine si Odoo 19 est un upgrade “tranquille” ou un projet.
Pour éviter l’effet “ça marche en démo”, validez sur données et charge réalistes. Un minimum pragmatique :
- Jeu de données de staging représentatif : base anonymisée ou clonée (avec filestore), incluant l’historique (messages, pièces jointes, mouvements de stock, factures).
- Parcours critiques chronométrés (avant/après) : ouverture d’un devis lourd, validation d’un bon de livraison, génération d’une facture PDF, import de relevé bancaire, etc.
- Sondes orientées métier : par exemple, “un préparateur scanne 200 lignes de picking le matin” ou “un comptable poste 500 écritures après clôture mensuelle”.
Mini-scénario (très courant en France) : une société multi-sites avec 2 entrepôts (Île-de-France + Auvergne-Rhône-Alpes) et un e-commerce. Une modification subtile des règles de réservation peut ne rien montrer en démo, mais provoquer en production :
- des ruptures “fantômes” si la réservation se fait plus tôt/tard que prévu,
- des sur-réservations sur un canal (marketplace) au détriment du B2B,
- des écarts de stock difficiles à expliquer si l’équipe n’a pas un runbook de réconciliation.
Enfin, côté finance, gardez en tête les impacts de conformité : si votre instance sert de socle de facturation, une migration est aussi un bon moment pour revalider vos processus “source de vérité” (numérotation, taxes, export comptable, preuves).
Pré-requis techniques et matrice de compatibilité (Linux, Python, PostgreSQL, Node)
Les migrations Odoo ratées commencent souvent par un angle mort : l’équipe se concentre sur la DB et oublie le runtime. Pour Odoo 19 auto-hébergé (Community/Enterprise), partez du principe que vous devez recertifier : version Python, version PostgreSQL, wkhtmltopdf (si utilisé pour PDF), dépendances système (libxml2, libxslt, ldap, sass), et toolchain front (Node/Yarn) si vous rebuild des assets. Les exemples ci-dessous supposent une instance Linux (Debian/Ubuntu), PostgreSQL récent et une installation standard odoo-bin ; adaptez selon la matrice officielle Odoo 19 disponible dans la documentation : https://www.odoo.com/documentation.
Point critique : PostgreSQL. Odoo pousse fortement le SQL via son ORM ; une version PG trop ancienne vous fait perdre des optimisations (planner, index-only scans, améliorations VACUUM/REINDEX), et une version trop récente non supportée peut vous exposer à des incompatibilités de drivers/paramètres. Avant même de lancer une upgrade, sortez un état de santé DB :
-- Taille DB et tables top
SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size;
SELECT relname AS table,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;
Pour rendre la “matrice de compatibilité” exploitable, l’objectif n’est pas d’écrire une doc théorique : c’est d’avoir une checklist de commandes reproductibles (et enregistrées dans votre runbook). Exemple de contrôles rapides utiles avant migration (et à rejouer après) :
| Élément | Pourquoi ça compte | Vérification (exemples) |
|---|---|---|
| Version PostgreSQL + outils | éviter décalage pg_dump/serveur, compatibilité |
psql -V / pg_dump -V / SHOW server_version; |
| Locale / encodage / timezone | cohérence tri, formats, jobs planifiés | SHOW lc_collate; / SHOW server_encoding; / SHOW TimeZone; |
| Extensions indispensables | monitoring, perf, recherche | \dx puis valider pg_stat_statements si utilisé |
| Stockage & I/O | migrations = beaucoup d’écritures | vérifier volume libre, IOPS observés, latences disque |
| Python venv | éviter “mélanges” de dépendances | python3 -V + freeze des requirements |
| Node/Yarn (si assets custom) | builds reproductibles | node -v, yarn -v, lockfile versionné |
Enfin, ne sous-estimez pas le front : si vous avez des modules qui injectent du JS/CSS, la migration Odoo 19 est souvent l’occasion où les builds cassent (imports, bundling, dépendances). Mettez au propre un pipeline reproductible (Docker ou VM immuable), et figez les versions (Python venv, lockfile Node) pour éviter le “ça marche sur mon laptop”.
Deux points souvent oubliés en environnement EU/France (sans être “exotiques”) :
- Horodatage et timezone : si vous avez des intégrations logistiques (cut-off transporteur, promesses de livraison), un
Europe/Pariscohérent côté système + DB + Odoo évite des décalages subtils. - PDF et preuves : si les factures/BL sont contractuels, validez que vos PDF sortent identiques (ou au moins acceptables) après migration : police, pagination, pied de page légal, conditions générales.
Stratégie de migration vers Odoo 19 : in-place, side-by-side, SaaS/Odoo.sh
Odoo a trois réalités d’upgrade : SaaS, Odoo.sh et self-hosted. Sur SaaS, vous déléguez une bonne partie de l’exécution (mais pas la compatibilité de vos customisations). Sur Odoo.sh, vous avez des environnements staging/production pratiques, mais vous restez contraints par le modèle de build et les add-ons autorisés. En self-hosted, vous contrôlez tout — et vous payez tout : infra, scripts, rollback, et observabilité.
Pour la migration vers Odoo 19, le choix structurants est souvent side-by-side (nouvelle infra + restauration DB + tests + cutover) plutôt que in-place (upgrade sur la machine existante). Side-by-side réduit le risque opérationnel : vous conservez un chemin de rollback propre (ancien environnement intact) et vous évitez d’empiler des états de configuration “entre deux”. In-place n’a d’intérêt que si vous êtes très contraints (licences, IP, stockage) et que vous maîtrisez parfaitement les fenêtres d’arrêt.
Critères concrets pour trancher (sans débat “religieux”) :
- Downtime tolérable : si vous devez tenir une fenêtre < 2–3 heures, le side-by-side + cutover maîtrisé est généralement plus réaliste (surtout avec tests).
- Niveau de custom : plus vous avez de modules et d’overrides, plus vous avez intérêt à isoler l’exécution (staging strictement identique, répétable).
- Intégrations temps réel : si des systèmes externes poussent des écritures (commandes web, WMS, EDI), planifiez un mode “dégradé” (file d’attente, pause des webhooks, ou mise en tampon).
- Stratégie de rollback : si vous n’avez pas de rollback clair, vous êtes en train de choisir “in-place” par défaut — c’est rarement un bon signe.
Si votre Odoo est connecté à un e-commerce (PrestaShop, PIM, WMS, marketplace), traitez la migration comme un projet d’intégration autant qu’un upgrade ERP. Les ruptures les plus fréquentes ne sont pas dans les écrans, mais dans les contrats d’API, la sémantique des statuts et l’idempotence. Pour un cadrage orienté e-commerce, vous pouvez recouper avec l’article interne : Intégration e-commerce Odoo : architecture bi-directionnelle et synchronisation stocks.
Conseil “jour J” simple, mais efficace : baissez le TTL DNS (ou préparez la bascule via load balancer) au moins 24h avant, et prévoyez une page de maintenance claire si vous avez un front e-commerce. Le problème n’est pas technique, il est opérationnel : limiter les écritures pendant la fenêtre, éviter les “double commandes” et rendre la reprise explicite.
Audit de vos modules custom : là où Odoo 19 fait réellement mal
Le point dur n’est pas Odoo 19, c’est votre code. Odoo supporte un style de développement très permissif (héritage de vues, overrides Python, patch JS), ce qui crée mécaniquement des modules “fragiles” aux changements de version. Ici, la règle de base est celle de Michael Feathers : « Legacy code is code without tests. » (Working Effectively with Legacy Code, 2004). Si vous n’avez pas de tests fonctionnels minimaux sur vos parcours critiques (commande → livraison → facture → paiement → avoir), l’upgrade Odoo 19 devient une séance de QA manuelle sans fin.
Commencez par une cartographie des surfaces d’override :
- surcharges de modèles (
create,write,unlink,name_get,search,read_group) ; - champs calculés
computeetinverse, surtout s’ils font du SQL brut ; - héritages de vues XML (risque élevé si vous vous accrochez à des
xpathtrop spécifiques) ; - code JS (widgets, controllers) et templates (QWeb/OWL) ;
- dépendances vers des modules OCA/tiers (compatibilité Odoo 19 pas toujours immédiate).
Pour rendre cette cartographie actionnable, classez chaque module selon deux axes simples :
- Criticité métier (bloque la vente, la logistique, la compta ?),
- Risque technique (beaucoup d’override, beaucoup de JS, beaucoup d’
xpathfins, SQL direct, champs compute non stockés).
Une pratique qui évite de “subir” les surprises : lister explicitement les endroits où vous contournez le core. Quelques signaux faibles typiques :
- des vues héritées avec des
xpathtrès longs (accrochés à une structure HTML fragile) ; - des règles de sécurité écrites “au cordeau” sur des modèles sensibles (compta, RH) ;
- des surcharges de
create/writequi font des appels réseau (API) ou déclenchent des envois d’emails : en migration, ça peut tourner en boucle ou ralentir fortement les scripts.
Ensuite, rendez l’audit exécutable. En self-hosted, vous pouvez activer les tests au niveau CLI, au minimum sur un subset de modules :
./odoo-bin -d odoo19_mig --test-enable --stop-after-init \
-i votre_module_1,votre_module_2 \
--log-level=test
Sur des bases réelles, l’essentiel des régressions vient de trois causes : (1) une vue core qui a bougé (vos xpath ne matchent plus), (2) une règle de sécurité (record rule) qui filtre différemment, (3) un changement implicite sur un champ (type/contrainte/valeur par défaut). Il faut donc des tests qui valident les droits et les écritures autant que l’affichage.
Pour gagner du temps en QA, ajoutez une routine “anti-régression” très courte, mais répétable, qui échoue vite :
- se connecter avec 2–3 profils (admin, commercial, préparateur, comptable),
- créer une commande, confirmer, générer le picking, valider la livraison,
- générer facture + PDF, enregistrer paiement (ou lettrage),
- vérifier l’envoi d’un email (ou au minimum la création de
mail.mail), - lancer 1 ou 2 crons critiques manuellement sur staging pour voir s’ils explosent.
Données, index et performance : éviter que l’upgrade Odoo 19 transforme votre DB en marécage
Une upgrade Odoo sérieuse ne se termine pas au “serveur qui démarre”. Elle se termine quand les temps de réponse reviennent à un niveau acceptable sous charge. Les migrations génèrent souvent du bloat (tables/index gonflés) et des statistiques obsolètes, ce qui dégrade le planner PostgreSQL. PostgreSQL est explicite sur le rôle de VACUUM : « VACUUM reclaims storage occupied by dead tuples. » (Documentation PostgreSQL, Routine Vacuuming, https://www.postgresql.org/docs/current/routine-vacuuming.html). Traduction opérationnelle : si vous migrez et réécrivez beaucoup de lignes, planifiez VACUUM/ANALYZE et surveillez les tables volumineuses.
Concrètement, après migration (sur staging), exécutez une phase de remise en forme :
-- Mettre à jour les stats pour le planner
ANALYZE;
-- Identifier les tables avec beaucoup de dead tuples (nécessite stats à jour)
SELECT relname, n_live_tup, n_dead_tup,
round(100.0*n_dead_tup/nullif(n_live_tup+n_dead_tup,0),2) AS dead_pct
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 20;
Ajoutez un contrôle “prêt pour production” orienté Odoo (souvent les mêmes tables deviennent problématiques) :
- Messagerie / chatter :
mail_messagepeut grossir très vite (volumes d’emails et logs). - Pièces jointes :
ir_attachment+ filestore (taille, latence I/O, sauvegardes). - Stock :
stock_move,stock_move_line, et l’historique des quants selon votre usage.
Côté applicatif, traquez les régressions classiques : N+1 ORM (boucles qui lisent des relations), search_read trop larges, read_group coûteux, cron qui s’allongent. Activez pg_stat_statements et comparez top queries avant/après. Même si l’article interne est orienté MySQL, la logique “EXPLAIN d’abord, optimisation ensuite” est la même : Index MySQL : optimiser WHERE, JOIN et ORDER BY avec EXPLAIN. En PostgreSQL, travaillez avec EXPLAIN (ANALYZE, BUFFERS) et des index ciblés sur les colonnes réellement filtrées.
Deux bonnes pratiques souvent rentables après une migration (sans tomber dans la “tuning mania”) :
- Comparer à périmètre constant : mêmes workers, mêmes paramètres, même dataset, même scénario de test. Sinon vous ne saurez pas si la lenteur vient d’Odoo 19, du code custom, ou d’un simple changement d’infra.
- Mesurer la durée des crons critiques : si un cron passe de 2 minutes à 20 minutes, c’est rarement “acceptable” même si l’UI semble fluide. En e-commerce, ce sont souvent les traitements asynchrones qui font dériver le système (sync stocks, mises à jour statuts, emails, relances).
Intégrations (e-commerce, WMS, ETL) : sécuriser les flux pendant et après la migration
Une migration Odoo 19 casse rarement “tout” d’un coup ; elle casse des détails : format de payload, règles de mapping, champs désormais requis, statuts qui changent, contraintes de sécurité. Si vous synchronisez stocks, commandes, expéditions, factures, vous devez figer des contrats d’échange et les tester comme une API publique : schémas, erreurs, idempotence, retries.
Sur des architectures e-commerce, le point le plus fragile est la gestion des stocks et des réservations. Les équipes découvrent après upgrade que la réservation se fait à un autre moment (confirmation, picking, etc.), ou que certains flux “annulent/réservent” différemment, créant des écarts par canal. Pour cadrer cela, reprenez une logique d’“inventaire unifié” : une source de vérité, des règles de routage, des verrous d’écriture, et une latence acceptable documentée. Référence interne utile : Inventaire unifié : synchronisation temps réel et routage par canal.
Un format simple de “contrat” qui fonctionne bien en migration : une page (ou ticket) par flux, avec :
- Source → cible (ex : PrestaShop → Odoo : commande),
- clé d’idempotence (ex :
order_external_id+ verrou côté Odoo), - règles de mapping (statuts, taxes, transporteur, entrepôt),
- comportement en erreur (retry, DLQ, alerte, arrêt automatique),
- tests attendus (ex : rejouer 10 commandes, dont 2 déjà importées, sans doublon).
Automatisation : si vous utilisez n8n, Make ou des jobs maison, profitez de la migration pour rendre les workflows observables (logs structurés, DLQ, alerting). Les erreurs “silencieuses” post-migration sont un classique (webhook qui reçoit 200 mais ne fait plus l’action attendue). Pour outiller le diagnostic côté n8n : Workflows n8n : diagnostiquer les erreurs de chargement et rechargement.
Astuce opérationnelle : pendant la fenêtre de bascule, prévoyez un “mode tampon” pour les événements entrants (commandes web, retours transporteurs). Même une solution simple (mise en file sur un topic/queue, ou désactivation temporaire des webhooks avec rattrapage) est préférable à une ingestion partielle et difficile à réconcilier.
Sécurité et observabilité : durcir Odoo 19 sans se mentir sur le core
Le core Odoo donne des briques (ACL, record rules, groupes), mais la sécurité “réelle” en production est un empilement : reverse proxy, TLS, WAF, segmentation réseau, MFA/SSO, politique de mots de passe, durcissement SMTP, et surtout journalisation exploitable. Pour des équipes déjà matures côté e-commerce, les patterns sont transposables : Sécurité PrestaShop : protéger API backoffice, WAF et journalisation SIEM. La différence : Odoo concentre plus de données “entreprise” (RH, finance), donc l’impact d’un compte compromis est souvent plus critique.
Sur Odoo 19, vérifiez systématiquement :
- les endpoints exposés (RPC/JSON, controllers custom), et leur authentification ;
- les comptes techniques (intégrations) et leurs permissions minimales ;
- la configuration des workers et timeouts (éviter les DoS involontaires) ;
- la politique d’export (CSV/XLSX) si vous avez des contraintes RGPD.
Deux points concrets qui améliorent vraiment la posture (sans promesse magique) :
- Principe du moindre privilège pour les intégrations : un compte technique ne devrait pas avoir les mêmes droits qu’un administrateur “par confort”. Typiquement, on isole par rôle (lecture stock vs création commande vs écriture factures) et on trace les opérations.
- Séparer les secrets de la base : tokens API, mots de passe SMTP, clés SSO. La migration est un bon moment pour vérifier où ils vivent (fichiers de conf, variables d’env, vault) et qui y accède.
Observabilité : sans métriques, vous pilotez à l’intuition. Mettez au minimum : logs applicatifs centralisés, métriques PostgreSQL (connexions, locks, buffer cache), et traces sur les transactions e-commerce (commande → picking → facture). L’objectif n’est pas le “monitoring joli”, c’est de détecter les dérives post-upgrade : cron qui prennent x2, taux d’erreurs 5xx, latence API, locks DB. Le plus fréquent après migration : un cron qui tourne plus longtemps et bloque une table, ce qui cascade en lenteur globale.
Un indicateur simple (et souvent révélateur) à suivre sur la première semaine : nombre de verrous/transactions longues pendant les heures ouvrées, corrélé aux plaintes utilisateurs. Si vous voyez des pics de locks côté PostgreSQL au moment où un cron s’exécute, vous avez probablement un goulot à traiter (index manquant, requête ORM trop large, ou traitement batch à découper).
Checklist opérationnelle (runbook) : migration Odoo 19 avec cutover et rollback
Le runbook n’est pas du confort : c’est votre assurance-vie. Préparez une exécution “à blanc” sur staging qui reproduit le jour J : restauration DB, upgrade, rebuild assets, warmup, exécution des crons nécessaires, tests de fumée, puis bascule simulée. Vous voulez connaître à l’avance : durée totale, étapes bloquantes, taille des backups, et points de non-retour.
Checklist technique (à adapter) :
- Gel fonctionnel : stop changements de config/modules 48–72h avant.
- Sauvegardes : dump PostgreSQL + filestore + config + clés (et test de restore).
- Staging identique : même version PG, même sizing CPU/RAM, mêmes workers.
- Upgrade DB : via service officiel (Enterprise) ou scripts (OpenUpgrade si applicable : https://github.com/OCA/OpenUpgrade). Validez les logs et les migrations de données métier.
- Rebuild assets : contrôlez les warnings JS/CSS, et testez les écrans critiques.
- Post-migration DB :
ANALYZE, vérification bloat, index,pg_stat_statements. - Tests de fumée : création devis/commande, réception stock, facture, paiement, emails.
- Intégrations : tests contractuels (API), rejouabilité, idempotence, DLQ.
Ajouts très “terrain” qui évitent des incidents bêtes :
- Fenêtre de communication : qui annonce le gel, qui annonce la bascule, et où les utilisateurs voient l’info (mail + canal interne + bannière éventuelle). Si vous opérez en multi-sites, attention aux horaires (équipes logistiques tôt le matin).
- Warmup applicatif : après démarrage, faites ouvrir les menus clés, déclenchez un rapport PDF, et exécutez une ou deux requêtes lourdes attendues. Le premier utilisateur ne doit pas “subir” le cold start.
- Contrôle des files : si vous avez du mail sortant/entrant, vérifiez la file (mails en attente, erreurs SMTP) et la non-répétition (éviter d’envoyer deux fois des confirmations).
Rollback : définissez-le avant de migrer. Le rollback le plus robuste reste side-by-side : vous repointez le trafic vers l’ancien environnement (DNS/LB), en bloquant les écritures ou en restaurant un snapshot cohérent si vous avez basculé. Si vous ne pouvez pas tolérer une perte de données, vous devez prévoir un plan de “reconciliation” (rejouer les commandes, réimporter les mouvements) — et ce n’est jamais gratuit. Documentez explicitement votre RTO/RPO, et alignez-le avec les métiers (finance/stock) avant de lancer la migration Odoo 19 en production.
Une règle pratique : si vous n’avez pas écrit noir sur blanc “comment on revient en arrière en moins de X minutes, avec quel impact données”, vous n’avez pas de rollback — vous avez un espoir. En migration ERP, l’espoir n’est pas une stratégie.




