GeotrekCE / Geotrek-admin

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

Docker - PB docker-compose run --rm web update.sh #2641

Closed amandine-sahl closed 3 years ago

amandine-sahl commented 3 years ago

Je n'arrive pas à faire marcher Geotrek avec Docker. Lors de la migration j'obtiens les erreurs suivantes (testé avec la branche 2.57.0 et master)

  File "/opt/geotrek-admin/geotrek/core/urls.py", line 39, in <module>
    urlpatterns += registry.register(Path, PathEntityOptions, menu=(settings.PATH_MODEL_ENABLED and settings.TREKKING_TOPOLOGY_ENABLED))
  File "/opt/geotrek-admin/mapentity/registry.py", line 228, in register
    self.content_type_ids.append(model.get_content_type_id())
  File "/opt/geotrek-admin/mapentity/models.py", line 240, in get_content_type_id
    return ContentType.objects.get_for_model(cls).pk
  File "/opt/venv/lib/python3.8/site-packages/django/contrib/contenttypes/models.py", line 55, in get_for_model
    ct, created = self.get_or_create(
  File "/opt/venv/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/venv/lib/python3.8/site-packages/django/db/models/query.py", line 576, in get_or_create
    return self._create_object_from_params(kwargs, params)
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
    obj = self.create(**params)
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
    obj.save(force_insert=True, using=self.db)
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/base.py", line 753, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/base.py", line 790, in save_base
    updated = self._save_table(
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/base.py", line 895, in _save_table
    results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/base.py", line 933, in _do_insert
    return manager._insert(
  File "/opt/venv/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/venv/lib/python3.8/site-packages/django/db/models/query.py", line 1254, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "/opt/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1397, in execute_sql
    cursor.execute(sql, params)
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/opt/venv/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: null value in column "name" violates not-null constraint
DETAIL:  Failing row contains (30, null, core, path).
submarcos commented 3 years ago

Bonjour, çà serait possible d'envoyer plus de détail (la stack complete d'erreur / le resultat complet de la commande update.sh), sur les données partagées nous ne voyons pas quelle migration (et quelle table de base de données) peut être impacté. De pmlus, s'agit-il d'une mise à jour ou d'une premiere installation ?

gutard commented 3 years ago

J'imagine que la procédure suivie est celle là : https://geotrek.readthedocs.io/en/master/docker.html#docker et qu'il s'agit d'une installation from scratch. Le souci ne vient pas réellement d'une migration mais de la création des content types.

gutard commented 3 years ago

Je ne reproduis pas.

amandine-sahl commented 3 years ago

Gaël à bien cerné le problème Le problème survient avec une installation frèche de base

gutard commented 3 years ago

Pas de fichier custom.py ?

gutard commented 3 years ago

La base est bien vide au départ ?

amandine-sahl commented 3 years ago

Il y en a un qui est généré mais je n'ai pas surcouché de valeur

amandine-sahl commented 3 years ago

La base de données était vide mais à force de faire des tests il y avait un relicat de tables django.

J'ai créé une nouvelle base avec uniquement les extensions postgis et postgis_raster

J'obtiens l'erreur suivante :

Starting geotrek-admin_screamshotter_1 ... done
Postgres is up - executing command
Traceback (most recent call last):
  File "./manage.py", line 20, in <module>
    execute_from_command_line(sys.argv)
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "/opt/geotrek-admin/geotrek/common/management/commands/migrate.py", line 25, in handle
    super().handle(*args, **options)
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/base.py", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 75, in handle
    self.check(databases=[database])
  File "/opt/venv/lib/python3.8/site-packages/django/core/management/base.py", line 392, in check
    all_issues = checks.run_checks(
  File "/opt/venv/lib/python3.8/site-packages/django/core/checks/registry.py", line 70, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "/opt/venv/lib/python3.8/site-packages/django/core/checks/urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "/opt/venv/lib/python3.8/site-packages/django/core/checks/urls.py", line 23, in check_resolver
    return check_method()
  File "/opt/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 408, in check
    for pattern in self.url_patterns:
  File "/opt/venv/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/opt/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 589, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/opt/venv/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/opt/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 582, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/opt/geotrek-admin/geotrek/urls.py", line 41, in <module>
    urlpatterns.append(path('', include('geotrek.infrastructure.urls')))
  File "/opt/venv/lib/python3.8/site-packages/django/urls/conf.py", line 34, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/opt/geotrek-admin/geotrek/infrastructure/urls.py", line 13, in <module>
    urlpatterns = registry.register(models.Infrastructure, menu=settings.INFRASTRUCTURE_MODEL_ENABLED)
  File "/opt/geotrek-admin/mapentity/registry.py", line 232, in register
    return options.scan_views()
  File "/opt/geotrek-admin/mapentity/registry.py", line 64, in scan_views
    views_module = import_module(views_module_name)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/opt/geotrek-admin/geotrek/infrastructure/views.py", line 12, in <module>
    from .forms import InfrastructureForm
  File "/opt/geotrek-admin/geotrek/infrastructure/forms.py", line 38, in <module>
    class InfrastructureForm(BaseInfrastructureForm):
  File "/opt/venv/lib/python3.8/site-packages/django/forms/models.py", line 268, in __new__
    raise FieldError(message)
django.core.exceptions.FieldError: Unknown field(s) (name) specified for Infrastructure
submarcos commented 3 years ago

Je ne reproduis pas non plus sur une fresh install suivant la doc. Je ne sais pas si tu as deja essayé par la passé, mais peut etre que ton image de base n'est pas à jour.

Il faudrait réessayer :

docker pull geotrekce/admin:latest

et recommencer sur une base vierge et en supprimant le dossier var créé.

sinon tu peux nous donner :

amandine-sahl commented 3 years ago

_Il faudrait réessayer :

docker pull geotrekce/admin:latest

et recommencer sur une base vierge et en supprimant le dossier var créé._

J'obtiens toujours le même résultat => django.core.exceptions.FieldError: Unknown field(s) (name) specified for Infrastructure

sinon tu peux nous donner :

GEOTREK_VERSION=latest
SERVER_NAME=localhost
# Do not set POSTGRES_HOST to localhost if postgresql is on the same physical machine. Leave it empty.
POSTGRES_HOST=
POSTGRES_PORT=5432
POSTGRES_USER=geotrek
POSTGRES_PASSWORD=xxx
POSTGRES_DB=geotrekdb
WEB_PORT=8001
API_PORT=8002
le contenu de ton docker-compose.yml
version: "3"
services:
  memcached:
    image: memcached:1.5-alpine

  redis:
    image: redis:5.0-alpine
    volumes:
      - redis:/data

  convertit:
    image: makinacorpus/convertit:latest

  screamshotter:
    image: makinacorpus/screamshotter:v2

  celery:
    image: geotrekce/admin:${GEOTREK_VERSION:-latest}
    env_file:
      - .env
    volumes:
        - .:/opt/geotrek-admin
    depends_on:
      - memcached
      - redis
    user: ${UID:-0}:${GID:-0}
    command: celery -A geotrek worker -c 1

  web:
    image: geotrekce/admin:${GEOTREK_VERSION:-latest}
    env_file:
      - .env
    ports:
      - "${WEB_PORT:-8001}:8000"
    volumes:
        - .:/opt/geotrek-admin
    depends_on:
      - memcached
      - redis
      - screamshotter
      - convertit
    command: ./manage.py runserver 0.0.0.0:8000
    user: ${UID:-0}:${GID:-0}

  api:
    image: geotrekce/admin:${GEOTREK_VERSION:-latest}
    env_file:
      - .env
    ports:
      - "${API_PORT:-8002}:8000"
    volumes:
        - .:/opt/geotrek-admin
    depends_on:
      - memcached
      - redis
    user: ${UID:-0}:${GID:-0}

volumes:
  postgres:
  redis:
amandine-sahl commented 3 years ago

J'ai fini par réussir à faire marcher le docker (enfin presque reste à servir les fichiers static) à partir d'une base existante. Si je pars d'une BD vièrge j'ai l'erreur signalée lors de mon premier message

fichier docker-compose.yml

version: "3"
services:
  memcached:
    image: memcached:1.5-alpine

  redis:
    image: redis:5.0-alpine
    volumes:
      - redis:/data

  convertit:
    image: makinacorpus/convertit:latest

  screamshotter:
    image: makinacorpus/screamshotter:latest

  celery:
    image: geotrekce/admin:${GEOTREK_VERSION:-latest}
    env_file:
      - .env
    volumes:
      - ./var:/opt/geotrek-admin/var
    depends_on:
      - memcached
      - redis
    user: ${UID:-0}:${GID:-0}
    command: celery -A geotrek worker -c 1

  web:
    image: geotrekce/admin:${GEOTREK_VERSION:-latest}
    env_file:
      - .env
    ports:
      - "${WEB_PORT:-8001}:8000"
    volumes:
      - ./var:/opt/geotrek-admin/var
    depends_on:
      - memcached
      - redis
      - screamshotter
      - convertit
    user: ${UID:-0}:${GID:-0}
    command: ./manage.py runserver 0.0.0.0:8000
    networks:
      default:
        aliases:
          - ${SERVER_NAME}

  api:
    image: geotrekce/admin:${GEOTREK_VERSION:-latest}
    env_file:
      - .env
    ports:
      - "${API_PORT:-8002}:8000"
    volumes:
      - ./var:/opt/geotrek-admin/var
    depends_on:
      - memcached
      - redis
    user: ${UID:-0}:${GID:-0}

volumes:
  postgres:
  redis:
submarcos commented 3 years ago

Ok merci. deja à premiere vue le premier fichier est le fichier de developement. C'est peut etre pour çà qu'on ne constate pas / ne reproduit pas l'erreur. Le code du repo que tu as en local est "monté" par un volume sur le conteneur. Il se peut que ce soit lui le fautif et qui cause l'erreur.

volumes:
- .:/opt/geotrek-admin 

Je vais regarder, mais nous uitilisons les docker-compose de prod sur nos instances, et les docker-compose de dev pour nos developpements sans probleme tous les jours et nous n'avons pas constaté de pb. essaie de commenter la ligner qui monte le code dans le conatiner.

Dans le second fichier, tu omets le montage du code et tu ne montes que le dossier var comme il faut, et la çà devrait mieux marcher (utilise directement le fichier de prod dans ce cas plutot qu'un mix entre les deux)

Les fichiers statiques et media doivent être servis par nginx, et sont disponibles dans var/static et var/media

submarcos commented 3 years ago

Il se peut aussi que les fichiers recommandés (docker-compose-dev.yml et docker-compose-prod.yml aient changé depuis ta 1ere installation, aussi je recommanderai de le recréer (cp docker-compose-dev.yml docker-compose.yml ou cp docker-compose-prod.yml docker-compose.yml)

amandine-sahl commented 3 years ago

J'ai essayer d'installer geotrek avec Docker mercredi, donc je ne pense pas que les problèmes soient liés à des changements non récupérés. Dans un premier temps j'ai scrupuleusement suivis la procédure décrite dans la documentation en utilisant le fichier docker-compose-prod et env-prod.dist et j'ai eu l'erreur (Failing row contains (3, null, admin, logentry)). Cette erreur apparait uniquement lors de la création d'une nouvelle base pas avec la mise à jour d'une base existante.

Ensuite seulement, pour comprendre le problème, j'ai bidouillé les fichiers docker-compose notamment pour charger le code de l'application.

submarcos commented 3 years ago

Bonjour, oui je me doute. les images docker et la procédure d'install sont testés dans la CI de test de geotrek, c'est à dire à chaque nouveau commit :

https://github.com/GeotrekCE/Geotrek-admin/blob/master/.circleci/config.yml#L40

ici on ajoute juste un container postgis 2.5 pour les tests de l'image de production (et on recupère l'image construite dans un job précédent), et on execute le update.sh dans la foulée.

Par acquis de conscience, j'ai testé tel que + avec une BDD en postgis 3.0, sans reproduire l'erreur. J'ai testé aussi avec la version de developement, sur master et sur le tag 2.57.0, sans reproduire l'erreur.

Par contre il y a eu un changement dernierement, si tu as un dossier env ou venv dans ton repo (que produisait geotrek precedemment), essaie de le supprimer avant de relancer. Il se peut aussi que l'ancienne version des dependences de geotrek remplace la version de l'image à cause du volume, ce qui pourrait causer ton erreur.

Tu peux retester en partant de 0 :

mode dev

mode prod

Tu ne devrais pas avoir de problème

amandine-sahl commented 3 years ago

Effectivement, après avoir supprimé le répertoire et reclonner le dépot, j'ai réussi à installer la base de données sans erreur. Merci pour les réponses à ce ticket