Se rendre au contenu

Faire tourner Odoo dans Docker en production

Faire tourner Odoo dans Docker en production
Benjamin Akboka Apengu
octobre 26, 2026 · 7 min de lecture

La réponse courte

Odoo fonctionne bien dans Docker en production. Mais un fichier compose qui marche sur un portable n'est pas encore prêt. Il vous faut quelques éléments de plus. Figez l'image. Adaptez les workers à la mémoire du conteneur. Mettez le filestore sur un volume. Donnez de la place à Postgres. Et construisez le staging à partir de la même image.

Introduction

Docker est une bonne façon de faire tourner Odoo. Chaque Odoo a son propre espace, vous pouvez le reconstruire de la même façon à chaque fois, et le staging peut être identique à la production. C'est pour cela que beaucoup d'équipes le choisissent.

L'image officielle d'Odoo vous permet de démarrer en quelques minutes. Ce guide parle de la suite : les six choses qui changent quand de vraies personnes l'utilisent toute la journée.

1. Isolation : un Odoo par conteneur

Faites tourner chaque Odoo dans son propre conteneur, avec son propre fichier de configuration et son propre utilisateur de base de données. Deux clients, ou la production et le staging, ne doivent jamais partager un conteneur.

Dans chacun, fermez les portes dont vous n'avez pas besoin :

[options]
admin_passwd = A_LONG_RANDOM_PASSWORD
list_db = False
dbfilter = ^yourdb$
proxy_mode = True

list_db = False cache le gestionnaire de bases de données. dbfilter garantit que ce conteneur n'ouvre jamais que sa propre base.

Seul votre proxy doit pouvoir joindre les ports 8069 et 8072. Ne les publiez pas sur Internet.

2. Des builds reproductibles

« Ça marchait hier » vient souvent d'un tag d'image qui bouge. odoo:18.0 aujourd'hui n'est pas la même image que odoo:18.0 le mois prochain, car Odoo y ajoute des correctifs.

Construisez votre propre image à partir de l'officielle, figez-la, et ajoutez-y vos paquets Python :

FROM odoo:18.0@sha256:<digest-you-tested>
USER root
COPY requirements.txt /tmp/requirements.txt
RUN pip3 install --no-cache-dir --break-system-packages -r /tmp/requirements.txt
USER odoo

Figez aussi les versions dans requirements.txt. Ainsi, l'image que vous avez testée est celle qui tourne. Quand vous voulez les derniers correctifs d'Odoo, changez le digest volontairement, testez-le sur le staging, puis déployez-le.

Gardez vos modules hors du code de l'image. Montez-les dans /mnt/extra-addons, ou copiez-les au moment du build. Ne modifiez jamais de fichiers dans un conteneur en marche. Le prochain redémarrage efface ces changements.

3. Un staging identique à la production

Avec Docker, le staging peut être identique à la production. Même image, même configuration, mêmes modules. Seuls les données et le domaine changent.

Pour les données, copiez la base et les fichiers de la production. Puis nettoyez la copie avant le démarrage d'Odoo. Un Odoo de test avec les vrais e-mails des clients et un serveur de mail actif peut écrire à vos vrais clients. Notre guide sur copier la production Odoo vers le staging sans écrire à vos clients montre ce qu'il faut désactiver.

4. Les workers et la mémoire du conteneur

Avec workers = 0, Odoo tourne en un seul processus. Très bien sur un portable, trop lent pour une équipe. En production, mettez workers au-dessus de 0.

workers = 4
max_cron_threads = 1
gevent_port = 8072
limit_memory_soft = 2147483648
limit_memory_hard = 2684354560

Voici le piège de Docker. Les limites de mémoire d'Odoo sont par worker. La limite de mémoire de Docker vaut pour tout le conteneur. Si tous les workers ensemble peuvent dépasser la limite du conteneur, le noyau tue le conteneur. Odoo ne peut pas redémarrer un seul worker. Tout tombe d'un coup, souvent au moment le plus chargé de la journée.

Partez donc du haut. Prenez la mémoire du conteneur, gardez-en une partie pour le processus principal et le cron, et répartissez le reste entre les workers. Notre guide sur le nombre de workers Odoo dont vous avez besoin détaille les calculs.

Le chat et les mises à jour en direct utilisent aussi un websocket sur le port 8072. Votre proxy doit y envoyer /websocket. Consultez le guide du proxy mode pour la configuration complète.

5. Le filestore

Les pièces jointes, les images et les PDF ne sont pas dans la base de données. Odoo les garde dans le filestore, sous /var/lib/odoo dans l'image officielle.

Si ce chemin n'est pas sur un volume nommé, vos fichiers vivent dans le conteneur. Recréez le conteneur, et ils disparaissent. La base s'ouvre toujours, donc personne ne le remarque avant qu'on clique sur une ancienne facture.

volumes:
- odoo-data:/var/lib/odoo

Sauvegardez-le avec la base, au même moment. Une base du lundi avec des fichiers du vendredi ne correspond pas.

6. Postgres

Vous pouvez faire tourner Postgres dans son propre conteneur à côté d'Odoo, ou utiliser une base managée. Les deux fonctionnent. Quelques points comptent dans Docker :

  • Mettez les données de Postgres sur un volume nommé, et ne supprimez jamais ce volume par erreur avec docker compose down -v.
  • Donnez plus de mémoire partagée à Postgres. Le /dev/shm par défaut de Docker fait 64 Mo, et les grosses requêtes peuvent échouer avec l'erreur « could not resize shared memory segment ».
  • Restaurez les bases pour que l'utilisateur Odoo en soit le propriétaire. Sur presque toute autre application, un simple pg_restore suffit. Avec Odoo, une base qui appartient au mauvais utilisateur disparaît du gestionnaire de bases d'Odoo.

Un fichier compose qui reprend les six points :

services:
db:
image: postgres:16
environment:
POSTGRES_USER: odoo
POSTGRES_PASSWORD: CHANGE_ME
POSTGRES_DB: postgres
shm_size: 256mb
volumes:
- db-data:/var/lib/postgresql/data
restart: unless-stopped


 odoo:
image: registry.example.com/our-odoo:2026-10-01
depends_on: [db]
environment:
HOST: db
USER: odoo
PASSWORD: CHANGE_ME
volumes:
- ./config/odoo.conf:/etc/odoo/odoo.conf:ro
- ./addons:/mnt/extra-addons:ro
- odoo-data:/var/lib/odoo
ports:
- "127.0.0.1:8069:8069"
- "127.0.0.1:8072:8072"
mem_limit: 6g
restart: unless-stopped

volumes:
db-data:
odoo-data:

Pour mettre à jour un module, arrêtez Odoo et lancez la mise à jour dans un conteneur ponctuel :

docker compose stop odoo
docker compose run --rm odoo odoo -d yourdb -u your_module --stop-after-init
docker compose start odoo

Faites d'abord une sauvegarde de la base et du filestore. Si la mise à jour échoue à mi-chemin, l'ancienne image ne correspond plus à la base modifiée.

Ce qui reste votre responsabilité

Docker rend Odoo plus facile à reconstruire. Il ne fait pas tourner Odoo à votre place. Sauvegardes, tests de restauration, mises à jour, copies de staging, rotation des logs, espace disque et surveillance restent des tâches que quelqu'un fait chaque semaine. Chaque piège Odoo arrive un par un, et les apprendre tous prend des mois.

Comment Skysize fait tourner Odoo dans Docker

Nous faisons tourner chaque Odoo de cette façon, sur notre cloud ou sur votre propre serveur.

  • Chaque Odoo tourne dans son propre conteneur, avec sa propre base de données.
  • Chaque build reçoit une copie neuve de votre code. Deux conteneurs ne partagent jamais un dossier.
  • Le staging tourne avec la même configuration que la production, avec les données privées nettoyées.
  • Avant chaque mise à jour, votre base est copiée. Si Odoo ne revient pas en bonne santé, tout revient comme avant.

Voyez comment les branches deviennent des environnements. Si vous voulez garder votre propre serveur, voyez bring your own server : vous gardez le serveur, et nous faisons tourner Odoo dessus. Notre logiciel se connecte depuis votre serveur vers l'extérieur, vous n'ouvrez donc aucun port pour nous.

Skysize est conçu par d'anciens ingénieurs d'Odoo et certifié ISO 27001.

Parlez à un expert en hébergement Odoo

FAQ

Docker est-il un bon choix pour faire tourner Odoo en production ? Oui. Il donne à chaque Odoo son propre espace et rend le staging identique à la production. Il vous faut quand même des images figées, des workers bien dimensionnés, un volume pour le filestore et des sauvegardes testées.

Où est le filestore dans l'image Docker officielle d'Odoo ? Sous /var/lib/odoo. Mettez-le sur un volume nommé, sinon vos fichiers sont perdus quand le conteneur est recréé.

Pourquoi mon conteneur Odoo redémarre-t-il sous la charge ? Souvent, les workers peuvent utiliser ensemble plus de mémoire que la limite du conteneur, alors le noyau arrête tout le conteneur. Baissez le nombre de workers ou leurs limites de mémoire, ou donnez plus de mémoire au conteneur.

Postgres doit-il aussi tourner dans Docker ? Il peut. Utilisez un volume nommé pour ses données et donnez-lui plus de mémoire partagée. Une base managée fonctionne aussi.

Comment mettre à jour un module Odoo sur Docker ? Arrêtez Odoo, sauvegardez la base et le filestore, puis lancez odoo -d yourdb -u your_module --stop-after-init dans un conteneur ponctuel.

Faire tourner Odoo dans Docker en production
Benjamin Akboka Apengu
Écrit sur l'infrastructure Odoo chez Skysize, un hébergeur Odoo basé en Belgique, créé par d'anciens ingénieurs Odoo et certifié ISO 27001, servant des entreprises et des agences dans le monde entier.