Incremental Odoo module updater with checkpoint/resume support
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file strx_odoo_updater-1.0.1.tar.gz.
File metadata
- Download URL: strx_odoo_updater-1.0.1.tar.gz
- Upload date:
- Size: 11.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2cff70f3e6307983bae19325391087b8b99e1af6aa69c296e2a6a1e406cf1bd4
|
|
| MD5 |
372ee38b7b3c5d9c98336cddeadca734
|
|
| BLAKE2b-256 |
291e56039123bc601a8e1a8dae297665ca3a7594781a661b35ee5a857563f24f
|
File details
Details for the file strx_odoo_updater-1.0.1-py3-none-any.whl.
File metadata
- Download URL: strx_odoo_updater-1.0.1-py3-none-any.whl
- Upload date:
- Size: 9.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f388a45393257c63194a99af229492ca7cf873200c5f603e2eae3c7c076562cd
|
|
| MD5 |
ca2d923ef72653f24bf91be422dbc253
|
|
| BLAKE2b-256 |
2c8e89a15b1532602d929601792de23cf9a355d47f7dd27bf3271ff92e8657f4
|