Odoo es un software estupendo. Lo más interesante que ha ocurrido en lo que podemos llamar software de gestión en general en varias décadas.
Escrito en Python, código abierto, bien mantenido… La lista de sus virtudes es larga e impresionante. Pero no hay nada perfecto, y en la opinión de quien esto escribe, lo más doloroso es lo difícil y frustrante que es actualizarlo de una versión a otra.
Odoo vende su servicio de actualización, lo cual me parece estupendo; de alguna forma hay que pagar las nóminas. Y en caso de empresas que lo usan con bastante retorno, sin duda mi recomendación es pagar a Odoo SA la cantidad razonable que piden por una suscripción Enterprise básica, usar su servicio, y seguir adelante.
Pero siempre hay casos en que esto no es deseable. Para una empresa que necesita rascar todo lo que pueda circunstancialmente, o que está usando Odoo para unas pocas tareas que no justifican pagar por mantenerlo, por ejemplo. Y entonces, ¿qué?
Entonces, los estupendos camaradas de la Odoo Community Association, entre los que hay destacados integradores y colaboradores de Odoo, tienen OpenUpgrade.
OpenUpgrade funciona, o al menos a mí me ha funcionado cuando lo he necesitado. Pero las instrucciones para usarlo son, en mi opinión, mejorables. En particular, porque asumen que quien necesita hacer una actualización no solamente es un administrador/devops competente, sino que además es uno muy familiarizado con las tripas de Odoo.
Total. Que, sin más introducción, voy a pasar a describir cómo actualizar de Odoo 17 a 18. Hay más de una manera de pelar un gato, pero esta es mi favorita.
Parto de un Odoo 17 corriendo en Debian 12. Ya puestos a actualizar, vamos a aprovechar para desplegar una Debian 13 fresca y nuevecita y moverlo a esta; así, podemos dejar Odoo 17 intacto unas semanas por si hiciera falta echar mano de algún dato o (perdón por la expresión) volver atrás.
En nuestro servidor nuevo, instalamos Odoo de la manera habitual descrita en la documentación de Odoo. Sobre esto, una nota: Tuve que instalar pypdf2 a mano para que Odoo se quedara contento:
wget http://ftp.de.debian.org/debian/pool/main/p/pypdf2/python3-pypdf2_2.12.1-3+deb12u1_all.deb
sudo dpkg -i python3-pypdf2_2.12.1-3+deb12u1_all.deb
sudo apt-get update && sudo apt-get install odoo
No voy a entrar en la creación de un proxy inverso y las optimizaciones de rendimiento y seguridad que se pueden y conviene hacer, porque esa es otra historia y debe ser contada en otra ocasión.
Ya podemos copiar la base de datos, en una sola operación elegante. Aquí, el servidor origen se llama «odoo17.local» y la base de datos, en un derroche de creatividad, se llama «basededatos»:
ssh odoo17.local "sudo -u odoo pg_dump -U odoo -Fc basededatos" | sudo -u odoo pg_restore -U odoo -d basededatos
Copiar los ficheros y moverlos a su sitio:
rsync -auz odoo17.local:/var/lib/odoo/.local/share/Odoo/filestore .
sudo chown -R odoo:odoo filestore
sudo mv filestore /var/lib/odoo/.local/share/Odoo/
Y luego instalar OpenUpgrade desde git:
sudo mkdir -p /opt/openupgrade
sudo chown odoo:odoo /opt/openupgrade
sudo -u odoo -s
cd /opt
git clone https://github.com/OCA/OpenUpgrade.git openupgrade
Crearemos un venv de Python para tener la librería que necesita OpenUpgrade aislado, puesto que no la necesitaremos una vez terminemos la actualización. Todo esto lo estamos haciendo con el usuario odoo:
python3 -m venv venv
source venv/bin/activate
Y ya podemos instalar la librería:pip install git+https://github.com/OCA/openupgradelib.git@master#egg=openupgradelib
Con esto, ya tenemos todo lo necesario para correr nuestra actualización. Vamos a alterar PYTHONPATH para que Odoo pueda encontrar la librería que hemos instalado, porque si no lo hacemos, se ejecutará con el Python del sistema, que no la tiene:
PYTHONPATH=/usr/lib/python3/dist-packages:$PYTHONPATH python /usr/bin/odoo -c /etc/odoo/odoo.conf -d basededatos --upgrade-path=/opt/openupgrade/openupgrade_scripts/scripts --update=all --stop-after-init --load=base,web,openupgrade_framework --addons-path=/opt/openupgrade
Por supuesto, la vida no puede ser tan sencilla. Con esto ejecutaremos la migración, si, pero también nos encontraremos de morros contra algunos problemas en la base de datos debidos a los cambios de una versión a otra y que no son gestionados por OpenUpgrade. Por ejemplo:
2025-09-28 16:29:08,519 8219 ERROR basededatos odoo.sql_db: bad query: b'INSERT INTO "ir_act_window_view" ("act_window_id", "create_date", "create_uid", "sequence", "view_id", "view_mode", "write_date", "write_uid") VALUES ([...]) RETURNING "id"'
ERROR: duplicate key value violates unique constraint "act_window_view_unique_mode_per_action"
DETAIL: Key (act_window_id, view_mode)=(313, kanban) already exists.
Bueno. Pues Ya avisa OpenUpgrade en su documentación de que puede hacer falta ejecutar la migración varias veces (si todo va medio bien, es idempotente), arreglando cosas a mano cada vez. En el ejemplo de arriba, la solución es:
(venv) odoo@erp:/opt/openupgrade$ psql basededatos -c "DELETE FROM ir_act_window_view WHERE act_window_id = 313 AND view_mode = 'kanban';"
Para este juego de matamoscas, la verdad es que un LLM a mano ahorra bastante tiempo. No hay más que darle el comando y el error, y él solito genera el SQL para corregirlo. Yo he usado Claude, pero supongo que ChatGPT funcionará igual de bien.
Terminada la migración sin que ninguna línea diga ERROR (aunque WARNING y DEBUG habrá unas cuantas), ya tenemos nuestro Odoo actualizado. Solo queda verificar que todo va bien, y si queremos, hacer una limpieza en la base de datos eliminando cosas obsoletas. Hay un módulo de las Server Tools de OCA, llamado database cleanup, que lo hace automáticamente. También nos podemos librar de /opt/openupgrade (quizá pasados unos días) y del servidor de Odoo 17.