Pourquoi Odoo n'affiche pas le pays des visiteurs et comment le résoudre
Un paquet GeoIP installé dans un format incorrect bloque complètement les statistiques des pays. Comment l'erreur se produit, comment la localiser en quatre étapes et d'où provient la base de données.
Un paquet qui semble installé mais ne fait rien
Sur le serveur se trouvait une base de données GeoIP, le chemin étant indiqué dans la configuration. Pourtant, chaque visiteur était attribué au pays « Inconnu », pendant des mois, sans qu'une seule ligne apparaisse dans le journal d'erreurs.
Odoo lit les bases de données GeoIP exclusivement au format MaxMind-DB avec l'extension .mmdb. Le paquet Linux geoip-database fournit GeoIP.datun autre format, désormais obsolète. Le serveur signale GeoIP comme installé et ne détermine aucun pays.
C'est le type d'erreur le plus désagréable. Il ne plante pas, n'écrit rien dans les journaux, et son résultat semble plausible. Une statistique où chaque visiteur est marqué « Inconnu » ressemble à celle d'un site qui n'aurait aucun visiteur étranger. C'est seulement en comparant avec les journaux du serveur qu'on réalise qu'aucune donnée n'est déterminée. Chez nous, cela a pris des mois.
Les informations de cet article concernent Odoo 19 sous Debian Trixie, vérifié le 12 août 2026.
Pourquoi Odoo ne peut pas lire le fichier
Odoo accède à la base de données via la bibliothèque geoip2. Elle comprend un seul format. L'ancien GeoIP.dat provient de la même maison, mais appartient à la série Legacy désactivée, pour laquelle MaxMind ne fournit plus de données depuis des années.
Le paquet Debian contient exactement deux fichiers sous Trixie :
/usr/share/GeoIP/GeoIP.dat
/usr/share/GeoIP/GeoIPv6.dat
Quiconque apt install geoip-database exécute et regarde ensuite dans le répertoire trouvera des fichiers et en déduira que le problème est résolu. Le nom du paquet perpétue cette erreur.
Un second détail prend du temps si on ne le connaît pas. Odoo ouvre la base de données une seule fois au démarrage d'un processus de travail et maintient l'accès en mémoire. Si vous remplacez le fichier pendant l'exécution, rien ne change. Nous avons reproduit la situation en supprimant le fichier pendant qu'il était ouvert. Les requêtes continuaient à s'exécuter et répondaient à partir du fichier déjà supprimé. En pratique, cela signifie qu'une mise à jour n'agit qu'après un redémarrage, et un cronjob qui renouvelle le fichier hebdomadairement tourne à vide tant que personne ne redémarre le service.
La deuxième condition s'appelle proxy_mode
Même avec le bon fichier, le pays reste vide si Odoo fonctionne derrière un proxy inverse et proxy_mode manque dans la configuration. Odoo voit alors l'adresse du proxy, généralement 127.0.0.1. Pour une adresse privée, chaque base de données géographiques renvoie un résultat vide, tout à fait correctement.
Les deux causes apparaissent identiques dans le tableau de bord.
C'est pourquoi il vaut la peine de les vérifier séparément plutôt que de deviner à un endroit.
Deux sources gratuites, toutes deux soumises à une obligation de mention
Aucune des bases de données utiles n'est maison, et les deux sont gratuites:
| Source | Compte requis | Mise à jour | Édition |
|---|---|---|---|
| DB-IP Lite | non | mensuel | Mention (CC BY 4.0) |
| MaxMind GeoLite2 | oui, gratuit | hebdomadaire | Mention (CC BY-SA 4.0) |
Nous avons testé DB-IP Lite contre l'appel interne effectué par Odoo. Le fichier s'annonce comme DBIP-Country-Lite et résout8.8.8.8 une adresse IPv4 allemande et une adresse IPv6 allemande chacune selon DE. Pour une statistique par pays, cela suffit complètement.
La mention du nom est une obligation de licence. Pour DB-IP, l'indication est « This product includes IP2Country data from DB-IP.com », pour MaxMind « This product includes GeoLite2 data created by MaxMind ». Elle doit être placée à l'endroit où l'analyse est publiée, le plus souvent dans les mentions légales ou dans la politique de confidentialité.
Les deux fournisseurs vendent également des variantes plus précises. Ceux qui ont besoin de villes, de fuseaux horaires ou d'opérateurs de réseau trouveront les conditions à leurs pages de prix. Pour la question de savoir d'où provient une visite, les versions gratuites suffisent.
Quatre étapes pour isoler l'erreur
-
Y a-t-il vraiment un fichier
.mmdbdans le répertoire ?bash ls -la /usr/share/GeoIP/ -
La configuration fait-elle référence à ce fichier, et est
proxy_modedéfini ?bash grep -E "^(geoip_country_db|proxy_mode)" /etc/odoo/odoo.conf -
Le fichier répond-il à l'appel interne d'Odoo ?
bash python3 -c "import geoip2.database as d; r=d.Reader('/usr/share/GeoIP/GeoLite2-Country.mmdb'); print(r.metadata().database_type, r.country('8.8.8.8').country.iso_code)"On s'attend au type de base de données et
US. -
Les nouvelles visites indiquent-elles un pays ? Cette vérification seule exclut
proxy_modecomme cause.
Étape 3 est décisive, car elle cible la même bibliothèque sur le même chemin que le serveur. Si elle répond correctement et que les statistiques restent vides, l'adresse du visiteur ne passe pas.
Vérifiez d'abord le fichier, puis le chemin réseau. Celui qui modifie les deux en même temps ne saura pas plus tard ce qui a aidé.
Si l'installation fait toujours l'erreur
Le problème de format n'était pas la seule erreur silencieuse ce jour-là. Deux autres modèles sont apparus, et les deux concernent tout type d'installation serveur, que ce soit dans un conteneur ou sur une machine classique.
L'outil geoipupdate se trouve dans Debian dans le composant contrib . Celui qui utilise une base légère n'a souvent que main activé. L'installation échoue alors avec „Package 'geoipupdate' has no installation candidate\" ab, même si le paquet est listé sur la page Debian. Le message est trompeur, car le nom est connu, mais aucune version installable n'est disponible. Un coup d'œil sur la page du paquet montre le composant, un regard dans les sources de paquet indique s'il est activé.
Nous récupérons l'outil depuis le fabricant, avec une version fixe et une somme de contrôle vérifiée. Cela fonctionne de la même manière sur tout système Debian, qu'il s'agisse de lignes dans un Dockerfile ou dans un Ansible-Playbook :
curl -fsSLo geoipupdate.deb \\n \"https://github.com/maxmind/geoipupdate/releases/download/v8.0.0/geoipupdate_8.0.0_linux_amd64.deb\"\necho \"6616449c83038b5a92908d0d6eee01595e594995248872ec5183c8488201f0fb geoipupdate.deb\" | sha256sum -c -\ndpkg -i geoipupdate.deb\n
Le deuxième modèle concerne les versions verrouillées. Nous avions fixé une version Python qui avait déjà deux successeurs. La compilation a quand même fonctionné, car les anciens états de patch restent conservés dans les registres. Un pin qui casse se signale. Un pin qui continue simplement s'âpre en silence, et un jour l'application tourne sur une base sous-jacente que personne n'a plus choisi consciemment. Nous comparons maintenant automatiquement l'état verrouillé à la version actuelle de la même série et la pipeline avertit dès que les deux divergent.
La base de données géographiques elle-même n'est en aucun cas intégrée dans une installation. Sa diffusion n'est pas couverte par le droit de licence, et comme les plages IP sont réattribuées en continu, une copie fournie devient obsolète de toute façon. Elle est chargée à l'exécution, avant le démarrage du processus serveur, et se trouve sur un support de données permanent plutôt que dans l'image.
Depuis la refonte, notre page de paramètres indique en clair si la détection des pays fonctionne, et indique la source de données utilisée. Celui qui souhaite reproduire cela n'a pas besoin de compte ni de contrat : un fichier de DB-IP, une entrée dans la configuration, un redémarrage.