strx-odoo-updater
Wrapper de click-odoo-update con soporte de checkpoint y reanudación
automática. Evita reprocesar módulos ya actualizados cuando la migración
falla a mitad.
El problema
click-odoo-update ejecuta la actualización completa dentro de una sola
transacción (Registry.new()). Si el proceso es interrumpido (OOM killer,
error SQL, timeout), PostgreSQL hace rollback y todos los checksums
almacenados se revierten — aunque 150 de los 200 módulos ya se hubieran
actualizado correctamente.
La siguiente ejecución vuelve a procesar los 200 módulos desde cero.
La solución
strx-odoo-updater actualiza módulo por módulo. Cada módulo se
ejecuta en un subproceso independiente (odoo-bin -u <module> --stop-after-init) que tiene su propia transacción y hace su propio
commit. Tras cada módulo exitoso guarda el progreso en
ir_config_parameter:
Clave en ir_config_parameter |
Contenido |
|---|---|
strx.update_resume.checkpoint |
JSON: lista de módulos completados |
strx.update_resume.failed |
JSON: lista de módulos fallidos |
strx.update_resume.last_update |
ISO timestamp del último progreso |
Al reiniciar tras un fallo, el script lee el checkpoint y salta automáticamente los módulos ya completados.
Instalación
# Desde PyPI (recomendado):
pip install strx-odoo-updater
# Dentro del venv de Odoo 16:
/opt/odoo16/venv16/bin/pip install strx-odoo-updater
# Modo editable (para desarrollo):
pip install -e /opt/odoo16/strx_tools/strx_odoo_updater
Dependencias
| Paquete | Requerido | Notas |
|---|---|---|
psycopg2 |
Sí | Conexión directa a PostgreSQL |
click-odoo-contrib |
Opcional | Para cálculo exacto de checksums |
odoo-bin |
En PATH/env | Ejecutable de Odoo (no pip) |
Uso rápido
# Exportar PYTHONPATH si Odoo no está instalado como paquete pip:
export PYTHONPATH=/opt/odoo16/odoo-server:$PYTHONPATH
# Primera ejecución (o reanudación tras fallo):
strx-odoo-updater \
-c /opt/odoo16/conf/odoo-server.conf \
-d mi_base_de_datos \
--i18n-overwrite \
--skip-failed
# Ver qué módulos quedan pendientes (sin ejecutar nada):
strx-odoo-updater -c ... -d ... --list-only
# Limpiar checkpoint y empezar desde cero:
strx-odoo-updater -c ... -d ... --reset
# Sin pase final de click-odoo-update:
strx-odoo-updater -c ... -d ... --no-final-update
Referencia de opciones CLI
| Opción | Descripción |
|---|---|
-c, --config PATH |
Archivo de configuración de Odoo (requerido) |
-d, --database NAME |
Nombre de la base de datos (requerido) |
--i18n-overwrite |
Sobreescribir traducciones existentes |
--reset |
Elimina el checkpoint y sale |
--list-only |
Lista módulos pendientes/completados sin actualizar |
--skip-failed |
Continúa aunque un módulo falle (registra el fallo y sigue) |
--no-final-update |
Omite el pase final de click-odoo-update |
Variables de entorno
Permiten reusar el paquete en diferentes instalaciones de Odoo sin modificar el código:
| Variable | Default | Descripción |
|---|---|---|
ODOO_BIN |
/opt/odoo16/odoo-server/odoo-bin |
Ruta al ejecutable odoo-bin |
CLICK_ODOO_UPDATE |
<venv>/bin/click-odoo-update |
Ruta a click-odoo-update |
ODOO_SERVER_PATH |
/opt/odoo16/odoo-server |
Raíz del servidor para PYTHONPATH |
Ejemplo para Odoo 17 en otro servidor
export ODOO_BIN=/opt/odoo17/odoo-bin
export ODOO_SERVER_PATH=/opt/odoo17
export CLICK_ODOO_UPDATE=/opt/odoo17/venv/bin/click-odoo-update
export PYTHONPATH=/opt/odoo17:$PYTHONPATH
strx-odoo-updater -c /opt/odoo17/conf/odoo.conf -d produccion --skip-failed
Flujo interno
strx-odoo-updater
│
├─ Conecta a PostgreSQL directo (lee configuración de odoo.conf)
├─ Detecta módulos con checksums distintos (igual que click-odoo-update)
│ └─ Fallback: módulos con state='to upgrade'
├─ Lee checkpoint de ir_config_parameter
├─ Calcula: pendientes = detectados - ya_completados
│
└─ Para cada módulo pendiente:
├─ odoo-bin -u <module> --stop-after-init --no-http (subprocess)
├─ returncode == 0?
│ ├─ SÍ → checkpoint += module, actualiza checksum, commit
│ └─ NO → failed += module
│ └─ --skip-failed? continúa : detiene y guarda estado
│
└─ Al finalizar (sin fallos):
├─ click-odoo-update (pase final: detecta 0 diferencias)
└─ Limpia checkpoint de ir_config_parameter
Uso como librería Python
from strx_odoo_updater.core import (
_connect,
_get_modules_to_update,
_load_checkpoint,
_save_checkpoint,
_update_single_module,
_sync_checksum,
)
conn = _connect("/etc/odoo/odoo.conf", "mi_bd")
pending = _get_modules_to_update(conn, "/etc/odoo/odoo.conf")
done = _load_checkpoint(conn)
for module in pending:
if module in done:
continue
ok = _update_single_module("/etc/odoo/odoo.conf", "mi_bd", module)
if ok:
done.add(module)
_save_checkpoint(conn, done)
_sync_checksum(conn, module)
conn.close()
Casos de uso
Migración de base de datos (Odoo 12 → 16)
Durante migraciones largas (200+ módulos), es habitual encontrar errores SQL
que detienen el proceso. Con strx-odoo-updater:
- Se ejecuta hasta el módulo problemático
- Se diagnostica y corrige el error en la BD
- Se vuelve a ejecutar — continúa desde donde quedó, no desde cero
Servidor con poca RAM (OOM killer)
Si el proceso es matado por el sistema operativo por falta de memoria:
# El módulo que causó el OOM queda registrado en .failed
# Los módulos anteriores están en el checkpoint
# Próxima ejecución: salta los ya completados, reintenta el fallido
strx-odoo-updater -c ... -d ... --skip-failed
Actualización nocturna desatendida
#!/bin/bash
# /etc/cron.d/odoo-update — ejecuta a las 2am
export PYTHONPATH=/opt/odoo16/odoo-server:$PYTHONPATH
/opt/odoo16/venv16/bin/strx-odoo-updater \
-c /opt/odoo16/conf/odoo-server.conf \
-d produccion \
--i18n-overwrite \
--skip-failed \
>> /var/log/odoo/strx-updater.log 2>&1
Diagnóstico del checkpoint
-- Ver estado del checkpoint directamente en PostgreSQL:
SELECT key,
left(value, 120) as value_preview,
write_date
FROM ir_config_parameter
WHERE key LIKE 'strx.update_resume.%'
ORDER BY key;
-- Limpiar checkpoint manualmente:
DELETE FROM ir_config_parameter WHERE key LIKE 'strx.update_resume.%';
Desarrollo
git clone <repo>
cd strx_tools/strx_odoo_updater
pip install -e ".[dev]"
pytest tests/
Estructura del proyecto
strx_odoo_updater/
├── pyproject.toml ← Configuración del paquete pip
├── README.md ← Este archivo
└── strx_odoo_updater/
├── __init__.py ← Versión del paquete
├── core.py ← Lógica principal (importable)
└── cli.py ← Entry point del comando CLI
Publicar nueva versión a PyPI
# 1. Actualizar version en pyproject.toml y __init__.py
# 2. Construir y publicar:
cd strx_odoo_updater/
pip install build twine
python -m build
twine upload dist/*
Licencia
OPL-1 — © STRACONX S.A.
Metadata
Release files for strx-odoo-updater 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| strx_odoo_updater-1.0.1.tar.gz | 11.4 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| strx_odoo_updater-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.0 kB
Release files / strx_odoo_updater-1.0.1.tar.gz
| Download URL | strx_odoo_updater-1.0.1.tar.gz |
|---|---|
| Size | 11.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2cff70f3e6307983bae19325391087b8b99e1af6aa69c296e2a6a1e406cf1bd4
|
|
BLAKE2b-256 checksum How to use checksums |
291e56039123bc601a8e1a8dae297665ca3a7594781a661b35ee5a857563f24f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / strx_odoo_updater-1.0.1-py3-none-any.whl
| Download URL | strx_odoo_updater-1.0.1-py3-none-any.whl |
|---|---|
| Size | 9.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f388a45393257c63194a99af229492ca7cf873200c5f603e2eae3c7c076562cd
|
|
BLAKE2b-256 checksum How to use checksums |
2c8e89a15b1532602d929601792de23cf9a355d47f7dd27bf3271ff92e8657f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Security for strx-odoo-updater 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.