Skip to main content

strx-odoo-updater

PyPI version Python License: OPL-1

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:

  1. Se ejecuta hasta el módulo problemático
  2. Se diagnostica y corrige el error en la BD
  3. 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)

Source distribution for strx-odoo-updater 1.0.1
File Size Uploaded Provenance
strx_odoo_updater-1.0.1.tar.gz 11.4 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for strx-odoo-updater 1.0.1
File Interpreter ABI Platform
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.

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page