GeotrekCE / Geotrek-admin

Paths management for National Parks and Tourism organizations
https://geotrek.fr
BSD 2-Clause "Simplified" License
132 stars 76 forks source link

2.104.1 / Erreur migration MenuITem #4046

Closed mviadere-openig closed 6 months ago

mviadere-openig commented 6 months ago

Geotrek version : 2.104.1 Python version : 3.8.10 Django version : 3.2.25 PostgreSQL version : 16.2 PostGIS version : 3.4

Suite à la mise à jour 2.104.1, plusieurs error 500 interne pour accéder à al signalétique, créer un tronçon, etc.

Message d'erreur dans dpkg-reconfigure Geotrek-admin :

Traceback (most recent call last):
  File "/usr/sbin/geotrek", line 20, in <module>
    execute_from_command_line(sys.argv)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/core/management/base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/core/management/base.py", line 398, in execute
    output = self.handle(*args, **options)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/geotrek/common/management/commands/migrate.py", line 14, in handle
    super().handle(*args, **options)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/core/management/base.py", line 89, in wrapped
    res = handle_func(*args, **kwargs)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 244, in handle
    post_migrate_state = executor.migrate(
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/db/migrations/executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/db/migrations/executor.py", line 227, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/db/migrations/migration.py", line 126, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/db/migrations/operations/special.py", line 190, in database_forwards
    self.code(from_state.apps, schema_editor)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/geotrek/flatpages/migrations/0011_migrate_flatpage_data.py", line 151, in create_menu_items_from_flatpages
    menu_item = MenuItem.objects.create(**menu_kwargs)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/db/models/query.py", line 451, in create
    obj = self.model(**kwargs)
  File "/opt/geotrek-admin/lib/python3.8/site-packages/django/db/models/base.py", line 503, in __init__
    raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
TypeError: MenuItem() got an unexpected keyword argument 'title_fr

Message d'erreur Sentry :

exception
UndefinedTable: ERREUR:  la relation « flatpages_flatpage_portals » n'existe pas
LINE 1: ...AS Col1 FROM "flatpages_flatpage" LEFT OUTER JOIN "flatpages...

query

SELECT COUNT(*)
FROM
  (SELECT DISTINCT flatpages_flatpage.id AS Col1
   FROM flatpages_flatpage
   LEFT OUTER JOIN flatpages_flatpage_portals ON (flatpages_flatpage.id = flatpages_flatpage_portals.flatpage_id)
   LEFT OUTER JOIN flatpages_menuitem ON (flatpages_flatpage.id = flatpages_menuitem.page_id)
   WHERE (flatpages_flatpage.published_fr
          AND (flatpages_flatpage_portals.targetportal_id IN (%s)
               OR flatpages_menuitem.id IN
                 (SELECT U0.id
                  FROM flatpages_menuitem U0
                  INNER JOIN flatpages_menuitem_portals U1 ON (U0.id = U1.menuitem_id)
                  WHERE (U0.published_fr
                         AND U1.targetportal_id IN (%s)))))) subquery
                                                             ^
camillemonchicourt commented 6 months ago

OK, dans la 2.104, on a ajouté tout le nouveau système des "Eléments de menu" (MenuItems) pour une gestion bien plus complète des pages statiques et des menus.

On a fait de nombreux tests et pas rencontré le soucis que tu remontes, notamment sur notre serveur de DEMO (https://geotrekdemo.ecrins-parcnational.fr/signage/list/), mais il y a peut-être eu un soucis de migration de données, ou autre.

On regarde ça.

marcantoinedupre commented 6 months ago

Merci pour le ticket et les infos détaillées.

En première analyse :

Vérification du schéma de la BD : dernière migration appliquée

select * from django_migrations where app = 'flatpages' order by applied desc limit 1;

Je m'attend à ce que le résultat soit la migration 0010_create_model_MenuItem.

Pourrais-tu me fournir les infos/données suivantes :

Pour rétablir l'instance :

camillemonchicourt commented 6 months ago

@mviadere-openig, quand tu as faire la mise à jour de Geotrek-admin (apt-get upgrade), tu as avoir des messages d'erreur à ce moment, non ? Si oui, les as-tu encore à nous partager ?

mviadere-openig commented 6 months ago

Merci pour ton retour @marcantoinedupre

Résultat de la requête select * from django_migrations where app = 'flatpages' order by applied desc limit 1; geotrekdb=# select * from django_migrations where app = 'flatpages' order by applied desc limit 1; id | app | name | applied
-----+-----------+----------------------------+------------------------------- 451 | flatpages | 0010_create_model_MenuItem | 2024-04-03 14:21:57.470568+02 (1 ligne)

ta version de départ pour la migration ? Si tu parles de la version de geotrek-admin : 2.104.0. si tu parles de la version précédente, 2.103.2 la version de Ubuntu Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal

les valeurs des settings suivants : les LANGUAGES pour lesquels l'instance est configurée fr en

un dump de la BD en cours de migration Je ne savais pas qu'on pouvait faire un dump de la BDD pendant une migration, et je ne sais pas comment faire, si tu as plus d'informations je suis preneur

un dump de la BD avant la migration (le backup) Si tu veux un backup de la BDD avant la migration de ce matin, je dois contacter notre hébergeur pour qu'il active une instance de la vm datant d'hier matin, pour ensuite récupérer le backup, cela risque de prendre du temps.

downgrader Geotrek en 2.103.2 devrait fonctionner : sudo apt-get install geotrek-admin=2.103.2 (vérifier la dénomination exacte du paquet selon la version de Ubuntu) Je pense que pour le moment je vais m'en tenir à cette élément. J'ai téléchargé le fichier .deb correspondant à la bonne release et j'ai fait un sudo dpkg -i geotrek-admin_2.103.2.ubuntu20.04_amd64.deb pour downgrade, cela a résolu le problème.

mviadere-openig commented 6 months ago

@camillemonchicourt Désolé je n'ai plus accès à ces logs, sauf si tu as une commande spécifique avec un grep qui me permet d'aller chercher dans les syslog l'heure précise où j'ai fait la mise à jour.

marcantoinedupre commented 6 months ago

un dump de la BD en cours de migration

Je disais « en cours » car il y avait plusieurs scripts de migration qui devait s'exécuter séquentiellement pour cette montée de version. Comme le 2nd a échoué on est dans un état "en cours". Mais pour faire un dump ça se fait de la manière habituelle avec la commande pg_dump :

Voici la commande avec le user et le dbname par défaut de geotrek-admin :

pg_dump -h 127.0.0.1 -U geotrek geotrekdb --format=custom geotrekdb > geotrek_menu_item_migration.dump

Il se peut que ce dump soit suffisant pour que je trouve la cause et fasse la correction. Est-ce que tu peux m'envoyer un lien pour le télécharger sur mon adresse mail : marc-antoine.dupre at makina-corpus.com ? :pray:

un dump de la BD avant la migration (le backup)

Je vais commencer le debug avec le dump "en cours" et je pense que ça sera suffisant.

mviadere-openig commented 6 months ago

ah D'accord, tu parlais d'un dump "classique", je t'envoie ça !

marcantoinedupre commented 6 months ago

Je n'ai pas réussi à reproduire l'erreur avec une migration de bout en bout vers geotrek-admin 2.104.1, c-à-d où tous les scripts de migration sont exécutés à la suite par la même commande migrate. Or la mise à jour du paquet .deb de geotrek-admin ne fait qu'une exécution de migrate.

Mais je reproduis l'erreur en appliquant uniquement le script de migration

docker compose run --rm web ./manage.py migrate flatpages 0010_create_model_MenuItem

puis dans un deuxième temps

docker compose run --rm web ./manage.py migrate flatpages 0011_migrate_flatpages_data

La PR #4048 inclut un bugfix pour protéger la migration de ce cas particulier d'exécution séparée des scripts de migration. Sans avoir été au fond du problème je pense que l'erreur est corrigée.

camillemonchicourt commented 6 months ago

Corrigé dans la 2.104.2.