Ir al contenido

Why Odoo Does Not Display Visitor Country and How to Fix It

An incorrectly formatted installed GeoIP package can completely halt country statistics. Learn how the error occurs, how to pinpoint it in four steps, and where the database originates.
12 de agosto de 2026 a través de
Martin Schmid
Odoo GeoIP Estadísticas del sitio web Operación del servidor

Por qué Odoo no muestra el país del visitante y cómo solucionarlo

Un paquete GeoIP instalado en formato incorrecto detiene la estadística de países.

M
Martin Schmid
2026-08-12

Un paquete que parece instalado y no hace nada

En el servidor había una base de datos GeoIP, la ruta estaba en la configuración. Sin embargo, cada visitante llevaba el país «Desconocido» durante meses, sin una sola línea en el registro de errores.

Odoo lee bases de datos GeoIP exclusivamente en el formato MaxMind-DB con la extensión .mmdb. El paquete de Linux geoip-database proporciona GeoIP.dat, un formato diferente y ya obsoleto. El servidor reporta GeoIP como instalado y no determina ningún país.

Este es el tipo de error más molesto. No se detiene, no escribe nada en el registro y su resultado parece plausible. Una estadística en la que cada visitante dice «Desconocido» suena como un sitio web que simplemente no tiene visitantes extranjeros. Solo la comparación con los registros del servidor muestra que aquí no se determina nada en absoluto. En nuestro caso, esto tardó meses.

La información de este artículo se refiere a Odoo 19 en Debian Trixie, verificado el 12 de agosto de 2026.

Por qué Odoo no puede leer el archivo

Odoo accede a la base de datos a través de la biblioteca geoip2. Entiende exactamente un formato. El anterior GeoIP.dat proviene de la misma casa, pero pertenece a la serie Legacy desactivada, para la cual MaxMind no envía datos desde hace años.

El paquete de Debian contiene en Trixie exactamente dos archivos:

/usr/share/GeoIP/GeoIP.dat
/usr/share/GeoIP/GeoIPv6.dat

Quien apt install geoip-database ejecuta y luego mira en el directorio, encuentra archivos y concluye que el asunto está resuelto. El nombre del paquete lleva este error.

Un segundo detalle consume tiempo si no se conoce. Odoo abre la base de datos una vez al inicio de un proceso de trabajo y mantiene el acceso en memoria. Si se reemplaza el archivo durante el funcionamiento, no ocurre ningún cambio. Hemos replicado la situación eliminando el archivo con acceso abierto. Las consultas continuaron ejecutándose y respondieron desde el archivo ya eliminado. Para la práctica, esto significa que una actualización solo tiene efecto tras un reinicio, y un trabajo programado que renueva el archivo semanalmente funcionará en vano mientras nadie reinicie el servicio.

La segunda condición se llama proxy_mode

Incluso con el archivo correcto, el país permanece vacío si Odoo funciona detrás de un proxy inverso y proxy_mode falta en la configuración. Odoo entonces ve la dirección del proxy, generalmente 127.0.0.1. Para una dirección privada, cada base de datos geográfica devuelve un resultado vacío, completamente correcto.

Ambas causas se ven idénticas en el panel de control.

Por lo tanto, conviene verificarlas por separado en lugar de adivinar en un solo lugar.

Dos fuentes gratuitas, ambas con obligación de citar

Ninguna de las bases de datos útiles es de fabricación propia, y ambas son gratuitas:

Fuente Cuenta necesaria Actualización Edición
DB-IP Lite no mensual Cita (CC BY 4.0)
MaxMind GeoLite2 sí, gratuito semanal Cita (CC BY-SA 4.0)

Hemos probado DB-IP Lite contra la llamada que Odoo realiza internamente. El archivo se identifica como DBIP-Country-Lite y resuelve 8.8.8.8 en formato EE. UU., una dirección IPv4 alemana y una dirección IPv6 alemana cada una en formato DE. Para una estadística por países, esto es suficiente.

La atribución de nombre es obligatoria según la licencia. Para DB-IP, la mención debe ser «Este producto incluye datos de IP2Country de DB-IP.com», y para MaxMind «Este producto incluye datos GeoLite2 creados por MaxMind». Debe colocarse en el lugar donde se publique el análisis, habitualmente en el pie de página o en la política de privacidad.

Ambos proveedores también venden versiones más precisas. Quienes necesiten ciudades, zonas horarias o operadores de red, encontrarán las condiciones en sus páginas de precios. Para la pregunta de qué país visitó un usuario, las versiones gratuitas son suficientes.

Cuatro pasos para delimitar el error

  1. ¿Existe realmente un .mmdb en el directorio?

    bash ls -la /usr/share/GeoIP/

  2. ¿La configuración apunta a este archivo y está proxy_mode establecida?

    bash grep -E "^(geoip_country_db|proxy_mode)" /etc/odoo/odoo.conf

  3. ¿El archivo responde a la llamada que Odoo realiza internamente?

    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)"

    Se espera el tipo de base de datos y US.

  4. ¿Introducen las nuevas visitas un país? Solo esta verificación descarta proxy_mode como causa.

El paso 3 es el crucial, ya que accede a la misma biblioteca en la misma ruta que el servidor. Si responde correctamente pero la estadística sigue vacía, la dirección del visitante no se registrará.

Cuando la instalación sigue haciendo lo incorrecto en silencio

El problema de formato no fue el único error silencioso de ese día. Aparecieron dos patrones más, y ambos afectan a cualquier tipo de instalación de servidor, ya sea en contenedor o en una máquina clásica.

La herramienta geoipupdate está en Debian en el componente contrib. Quienes utilizan una base mínima a menudo solo tienen mainactivado. La instalación falla entonces con 'Package 'geoipupdate' has no installation candidate', aunque el paquete está listado en la página de Debian. El mensaje es engañoso, pues el nombre es conocido, solo falta una versión instalable. Una mirada a la página del paquete muestra el componente, una mirada a las fuentes del paquete muestra si está activado.

Desde entonces obtenemos la herramienta directamente del fabricante, con una versión fija y suma de comprobación verificada. Esto funciona igual en cualquier sistema Debian, independientemente de si las líneas están en un Dockerfile o en un Ansible-Playbook:

curl -fsSLo geoipupdate.deb \
    "https://github.com/maxmind/geoipupdate/releases/download/v8.0.0/geoipupdate_8.0.0_linux_amd64.deb"
echo "6616449c83038b5a92908d0d6eee01595e594995248872ec5183c8488201f0fb  geoipupdate.deb" | sha256sum -c -
dpkg -i geoipupdate.deb

El segundo patrón afecta a las versiones fijadas. Teníamos una versión de Python fijada que ya tenía dos sucesores. La compilación seguía funcionando porque los estados de parche antiguos se conservaban en los registros. Un pin que falla genera una notificación. Un pin que simplemente continúa envejeciendo en silencio, y eventualmente la aplicación corre sobre una base que nadie eligió conscientemente. Comparamos ahora automáticamente el estado fijado con el actual de la misma serie y hacemos que la pipeline emita una advertencia en cuanto ambos divergen.

Por cierto, la base de datos geográfica no está integrada en ninguna instalación. Su distribución no está cubierta por derechos de licencia, y debido a que los rangos de IP se reasignan constantemente, una copia incluida se vuelve obsoleta de todos modos. Se carga en tiempo de ejecución antes de que arranque el proceso del servidor y reside en un dispositivo de almacenamiento permanente en lugar de en la imagen.

Desde la reestructuración, nuestra página de configuración indica claramente si la determinación de países está funcionando y nombra la fuente de datos utilizada. Quien quiera replicar esto no necesita una cuenta ni un contrato: un archivo de DB-IP, una entrada en la configuración y un reinicio.

Archivo
New module makes Odoo websites readable for AI assistants
A new ownERP module prepares Odoo websites for ChatGPT, Perplexity, and Claude. A preview from the ongoing testing phase.