En 2025, Agile Minds a migré son instance Odoo depuis Odoo Online (SaaS) vers un VPS self-hosted chez OVHcloud. Après 18 mois d’utilisation de la version SaaS, les limitations devenaient un frein concret à notre croissance. Ce retour d’expérience détaille les raisons de cette migration Odoo Online VPS, l’architecture mise en place, les problèmes rencontrés et la procédure complète, étape par étape. Que vous soyez une PME belge ou une TPE francophone qui envisage de migrer Odoo Belgique vers du self-hosted, ce guide vous évitera les pièges dans lesquels nous sommes tombés.
Pourquoi quitter Odoo Online ?
Odoo Online est une excellente solution pour démarrer rapidement. Mais à mesure que votre entreprise grandit et vos besoins se complexifient, ses limites deviennent visibles. Chez Agile Minds, le point de rupture est arrivé quand nous avons voulu connecter notre ERP à n8n pour automatiser les flux entre la facturation, le CRM et nos agents IA. Impossible sur Odoo Online sans contorsions. Concrètement, voici ce qui nous bloquait :
- Contrôle limité : pas d’accès SSH, pas de gestion fine du serveur, pas de cron personnalisé. On ne pouvait même pas ajuster les paramètres PostgreSQL pour optimiser les requêtes lourdes sur nos rapports comptables trimestriels.
- Coût croissant : le prix par utilisateur s’accumule rapidement avec la croissance. À 5 utilisateurs avec les modules Enterprise (CRM, Comptabilité, Inventaire, Achat, Vente), la facture dépassait 250 EUR/mois. En self-hosted, le VPS nous revient à 35 EUR/mois, licence Enterprise incluse via le programme partenaire Odoo.
- Modules custom impossibles : Odoo Online n’accepte pas les modules tiers non certifiés. Or, pour notre activité de consultance IT, nous avions besoin d’un module de timesheet avancé et d’un connecteur webhook personnalisé vers n8n.
- Accès API restreint : limitations sur les appels API et les webhooks. Notre workflow d’automatisation n8n nécessitait plus de 500 appels API par heure pour synchroniser les contacts, les factures et les opportunités CRM en temps réel. Odoo Online throttlait au-delà de 200 appels.
- Performance : serveur mutualisé, pas de contrôle sur les ressources. Les temps de réponse fluctuaient entre 400 ms et 2 secondes selon l’heure de la journée, particulièrement lors de la génération de rapports PDF complexes.
- Souveraineté des données : données hébergées hors de votre contrôle direct. Pour une PME belge soucieuse du RGPD, savoir exactement où se trouvent ses données et qui y accède est un enjeu majeur. Avec un VPS OVHcloud à Gravelines, nos données restent dans l’UE, sur une infrastructure que nous maîtrisons.
L’architecture cible
Voici le stack technique mis en place chez Agile Minds. Chaque choix a été guidé par trois critères : fiabilité, conformité RGPD et rapport qualité-prix. Le VPS OVHcloud Gravelines offre une latence inférieure à 15 ms depuis la Belgique, ce qui se ressent immédiatement dans l’interface Odoo. L’ensemble tourne de manière stable depuis plus d’un an sans interruption majeure.
| Composant | Choix technique | Justification |
|---|---|---|
| Hébergeur | OVHcloud VPS (Gravelines, France) | Proximité (~30 ms Belgique), RGPD UE, rapport qualité/prix imbattable |
| OS | Debian 12 (Bookworm) | Stabilité, LTS jusqu’en 2028, large communauté, mises à jour sécurité rapides |
| Base de données | PostgreSQL 18 | Recommandé par Odoo, performance avec JSONB, tuning possible (shared_buffers, work_mem) |
| Reverse proxy | Traefik v3 | SSL automatique Let’s Encrypt, routing dynamique, dashboard de monitoring intégré |
| SSL | Let’s Encrypt (via Traefik) | Gratuit, renouvellement automatique tous les 60 jours, wildcard supporté |
| Python | Python 3.12 (venv) | Isolation des dépendances, pas de conflit avec le Python système |
| Sauvegarde | pg_dump + snapshots OVHcloud | Double sécurité : dump quotidien 03h00 + snapshot hebdomadaire VPS complet |
| Monitoring | Uptime Kuma | Alertes Slack en temps réel, vérification toutes les 60 secondes, historique uptime |
Procédure de migration en 4 phases
Phase 1 : Préparation du serveur (Jour 1-2)
La fondation de toute migration Odoo self-hosted réussie, c’est un serveur bien préparé. Nous avons passé deux jours complets sur cette phase, et c’est un investissement qui se rentabilise immédiatement en stabilité. Ne lésinez pas sur la sécurisation initiale : un serveur Odoo exposé sur Internet sans hardening, c’est une cible facile.
- Commander un VPS OVHcloud (8 vCPU, 22 GB RAM, SSD NVMe). Pour une PME de 5 à 15 utilisateurs, cette configuration offre une marge confortable. En dessous de 5 utilisateurs, un VPS 4 vCPU / 8 GB suffit.
- Installer Debian 12 et sécuriser le serveur : clés SSH uniquement (désactiver l’authentification par mot de passe), fail2ban avec des règles strictes (3 tentatives max, ban 24h), firewall UFW (ouvrir uniquement 22, 80, 443).
- Installer PostgreSQL 18 et configurer les accès. Tuning essentiel :
shared_buffers = 4GB,work_mem = 64MB,effective_cache_size = 12GBpour un serveur 22 GB RAM. Créer un utilisateur PostgreSQL dédié pour Odoo (jamais utiliser le superuser). - Installer les dépendances Python et surtout wkhtmltopdf. Attention : la version des dépôts Debian ne fonctionne PAS correctement avec Odoo. Il faut impérativement installer la version patched 0.12.6.1 depuis le dépôt GitHub officiel wkhtmltopdf.
- Configurer Traefik v3 avec Let’s Encrypt. Prévoir les middlewares de sécurité : headers HSTS, rate limiting, et un timeout adapté aux rapports Odoo lourds (300 secondes minimum).
Phase 2 : Installation d’Odoo (Jour 3)
L’installation d’Odoo 19 Enterprise en self-hosted demande de la rigueur. Le moindre oubli dans la configuration peut provoquer des comportements erratiques difficiles à diagnostiquer. Voici la procédure que nous avons rodée chez Agile Minds après plusieurs installations clients.
- Cloner le dépôt Odoo 19 Enterprise depuis GitHub. Vous aurez besoin de deux dépôts :
odoo/odoo(Community, base) etodoo/enterprise(modules Enterprise). Vérifiez que votre licence Enterprise est active avant de cloner. - Créer un environnement virtuel Python dédié dans
/opt/odoo/venv. Cela isole complètement les dépendances Odoo du système et facilite les futures mises à jour. - Installer les dépendances Python (
pip install -r requirements.txt). Sur Debian 12, il faut aussi installer les paquets système :libldap2-dev,libsasl2-dev,libpq-dev,libjpeg-dev. Un oubli fréquent qui fait échouer l’installation. - Configurer le fichier
odoo.confavec soin. Les paramètres critiques :db_host = localhost,db_port = 5432,workers = 4(règle : 2 workers par CPU disponible pour Odoo),max_cron_threads = 2,limit_memory_hard = 2684354560(2.5 GB),proxy_mode = True(obligatoire derrière Traefik). - Créer le service systemd pour Odoo : cela garantit le redémarrage automatique en cas de crash et permet une gestion propre via
systemctl. ConfigurerRestart=on-failureetRestartSec=5s. - Tester le démarrage sur le port 8069. Vérifier les logs dans
/var/log/odoo/odoo-server.log. Un démarrage propre ne doit montrer aucun WARNING lié aux modules. Si c’est le cas, vous êtes prêt pour la phase 3.
Phase 3 : Migration des données (Jour 4-5)
C’est la phase la plus délicate de toute migration Odoo Online vers self-hosted. Une erreur ici peut corrompre vos données comptables ou perdre l’historique de vos contacts. Prenez votre temps, faites des backups à chaque étape, et testez sur un environnement de staging avant la production. Chez Agile Minds, nous avons effectué 3 dry-runs avant la migration finale.
- Exporter la base depuis Odoo Online via le menu Database Manager (accessible à l’URL
/web/database/manager). Vous obtiendrez un fichier ZIP contenant le dump SQL et le filestore (pièces jointes, images). Pour une base de 2 GB, l’export prend environ 15 minutes. - Transférer le dump vers le VPS via SCP. Conseil : compressez d’abord avec
gzippour réduire le temps de transfert. Notre dump de 1.8 GB compressé à 400 MB s’est transféré en moins de 2 minutes. - Restaurer la base dans PostgreSQL local. Créer d’abord la base vide avec
createdb, puis restaurer avecpg_restoreoupsqlselon le format du dump. Placer le filestore dans le répertoire/opt/odoo/.local/share/Odoo/filestore/. - Vérifier l’intégrité des données : contrôler les soldes comptables (menu Comptabilité > Rapports > Bilan), le nombre de contacts (comparer avec Odoo Online), les stocks si applicable. Nous avons créé un script Python de validation qui compare les totaux entre l’ancien et le nouveau système.
- Mettre à jour les paramètres système : URL de base (
web.base.url), serveur email sortant (SMTP Google Workspace port 587), clés API, et surtout désactiver le mode SaaS (database.enterprise_code). - Installer les modules custom nécessaires. C’est le moment de profiter de la liberté du self-hosted : modules OCA (Odoo Community Association), connecteurs n8n, et modules développés en interne.
Phase 4 : Mise en production (Jour 6)
Le jour J. Si les phases précédentes ont été bien exécutées, cette dernière étape est la plus fluide. L’objectif : basculer en production avec zéro interruption perceptible par les utilisateurs. Chez Agile Minds, nous avons planifié la bascule un samedi matin pour minimiser l’impact.
- Configurer le DNS : créer un enregistrement A pour
odoo.agile-minds.bepointant vers l’IP du VPS. Le TTL doit être abaissé à 300 secondes quelques jours avant la migration pour permettre un rollback rapide si nécessaire. - Activer le SSL via Traefik. Traefik v3 gère automatiquement la demande de certificat Let’s Encrypt dès que le DNS est résolu. Vérifier avec
curl -I https://odoo.agile-minds.beque le certificat est valide. - Configurer les workers Odoo pour la performance : 4 workers HTTP + 2 cron threads pour notre configuration 8 vCPU. Surveiller la consommation mémoire les premières heures avec
htop. Si un worker dépasse lelimit_memory_hard, Odoo le recycle automatiquement. - Mettre en place les sauvegardes automatiques : un cron
pg_dumpquotidien à 03h00 avec rotation sur 14 jours, plus un snapshot OVHcloud hebdomadaire le dimanche. Le script envoie une notification Slack en cas d’échec via notre instance n8n. - Tester l’ensemble des flux métier : créer un devis, le convertir en commande, générer une facture PDF, envoyer un email depuis Odoo, vérifier les rapports comptables. Chaque flux doit fonctionner exactement comme sur Odoo Online.
- Basculer les utilisateurs : envoyer les nouvelles URL de connexion, vérifier que chaque utilisateur peut se connecter et retrouver ses favoris et tableaux de bord. Prévoir une demi-journée de support le lundi suivant pour répondre aux questions.
Problèmes rencontrés et solutions
Aucune migration Odoo Online vers VPS self-hosted ne se passe sans accroc. Voici les 5 problèmes majeurs que nous avons rencontrés chez Agile Minds, avec le diagnostic et la solution appliquée. Si vous préparez votre propre migration Odoo Belgique, cette liste vous fera gagner des heures de debugging.
| Problème | Cause | Solution |
|---|---|---|
| Erreur wkhtmltopdf (PDF vides) | Version incompatible dans les dépôts Debian. Le paquet standard wkhtmltopdf de Debian 12 n’inclut pas le patch Qt nécessaire pour le rendu headless. |
Installer la version patched 0.12.6.1 depuis le dépôt GitHub officiel. Vérifier avec wkhtmltopdf --version que la mention « patched qt » apparaît. |
| Lenteur extrême au démarrage | workers = 0 (mode mono-thread par défaut). Odoo tourne alors en mode développement, incapable de servir plus d’une requête simultanée. | Configurer workers = 4 et max_cron_threads = 2 dans odoo.conf. Règle empirique : workers = (nombre de CPU * 2) + 1, sans dépasser 8 pour un VPS standard. |
| CSS cassé sur le portail | Assets non regénérés après migration. Les fichiers CSS/JS compilés référencent encore les anciens chemins de l’instance Online. | Supprimer les assets compilés dans la table ir_attachment (filtrer sur res_model = 'ir.ui.view') et relancer Odoo avec le flag -u base pour forcer la recompilation. |
| Emails sortants bloqués | Port 25 bloqué par défaut par OVHcloud sur tous les VPS pour lutter contre le spam. C’est une mesure standard chez la plupart des hébergeurs cloud. | Utiliser le port 587 avec STARTTLS via Google Workspace. Configurer le serveur SMTP sortant dans Odoo : smtp.gmail.com:587, TLS activé, authentification avec un mot de passe d’application Google. |
| Timeout Traefik sur gros rapports | Le timeout par défaut de Traefik (30 secondes) est trop court pour les rapports PDF comptables complexes qui peuvent prendre 2 à 3 minutes à générer. | Augmenter respondingTimeouts.readTimeout et respondingTimeouts.writeTimeout à 300s dans la configuration Traefik. Ajouter aussi proxy_read_timeout 300s si Nginx est utilisé en amont. |
Avant / Après : la comparaison
Après plus d’un an d’exploitation de notre instance Odoo self-hosted, voici les chiffres réels mesurés chez Agile Minds. La différence la plus frappante est le temps de réponse : divisé par 4, ce qui change radicalement le confort d’utilisation au quotidien pour l’équipe.
| Aspect | Odoo Online | VPS Self-hosted |
|---|---|---|
| Coût mensuel (5 users) | ~250 EUR/mois | ~35 EUR/mois (VPS OVHcloud) |
| Modules custom | Impossible | Illimité (OCA, modules internes, connecteurs) |
| Accès serveur | Aucun | Root complet (SSH, logs, config) |
| Performance | Variable (mutualisé) | Constante (ressources dédiées) |
| API / webhooks | Limités (~200 appels/h) | Illimités (nous faisons 500+/h sans problème) |
| Sauvegardes | Quotidiennes (Odoo gère) | Personnalisables : pg_dump quotidien + snapshot hebdo |
| Temps de réponse moyen | ~800 ms | ~200 ms (divisé par 4) |
| Maintenance | Zéro (Odoo gère) | ~2h/mois (mises à jour sécurité, monitoring) |
Notre verdict après 1 an
La migration Odoo Online vers VPS a été le meilleur investissement technique d’Agile Minds en 2025. Le gain de performance (temps de réponse divisé par 4), la liberté d’installer des modules custom (notamment pour l’intégration n8n et les agents IA Claude qui communiquent avec Odoo via JSON-RPC) et la réduction des coûts (de 250 à 35 EUR/mois, soit une économie de 2 580 EUR/an) justifient largement les 6 jours d’effort initial. En un an, nous n’avons eu que 12 minutes de downtime non planifié, lié à une mise à jour PostgreSQL qui a nécessité un restart. Le monitoring Uptime Kuma nous a alerté en 60 secondes.
Conseil : si vous êtes une PME belge avec moins de 3 utilisateurs et des besoins standards (facturation, CRM basique), restez sur Odoo Online. C’est plus simple et le coût est raisonnable. Au-delà de 3-5 utilisateurs, ou dès que vous avez besoin de modules custom, d’intégrations API poussées ou d’automatisations via n8n, la migration Odoo self-hosted mérite sérieusement d’être envisagée. N’hésitez pas à nous contacter pour un audit gratuit de votre instance : nous évaluons en 30 minutes si le self-hosted est pertinent pour votre cas.
Patrick Impens · CEO Agile Minds SRL · agile-minds.be
Maintenance et support Odoo post-migration
Notre accompagnement Odoo pour votre projet de migration.
À lire aussi
Parlons de votre projet
Prendre rendez-vous →