mviewer / mviewerstudio

mviewer generator
GNU General Public License v3.0
15 stars 25 forks source link

Pas d'affichage de l'application crééé via mviewerstudio #289

Closed SebastienGrall closed 9 months ago

SebastienGrall commented 9 months ago

Bonjour,

J'ai installé mviewer (via github dans le dossier /home/user, pas de docker) et mviewerstudio (via le script d'installation python dans /home/user/ également) sur un serveur (ubuntu, serveur web : nginx). J'arrive à accéder en ligne au générateur mviewerstudio et à créer un projet. Par contre une fois le projet enregistré je n'arrive à prévisualiser l'application, ni à accéder à celle-ci quand je l'ai publié. J'ai l'erreur suivante :

image

Si je rafraîchis la page, je reviens à l'accueil et je sélectionne "ouvrir un projet existant", je vois bien l'application mais je ne peux pas la modifier. J'ai le message : image

Je peux par contre la supprimer.

Les fichiers sont bien présents sur le serveur dans le dossier /var/www/mviewer/apps/store/public/c8427e881a23/

Je sèche sur l'origine du problème (un problème de droit de lecture?)

Merci

Gaetanbrl commented 9 months ago

Bonjour, Pouvez-vous me partager la configuration front de votre application (le json) ?

merci

SebastienGrall commented 9 months ago

Dans le dossier /var/www/mviewer/apps/store/ j'ai un fichier register.json mais pas dans le dossier de l'application en elle-même où j'ai un document xml et des dossiers (tmp, preview, dossier du nom de l'appli.). C'est un fichier que je dois créer manuellement? ou qui doit être créé automatiquement par le générateur?

Merci

Gaetanbrl commented 9 months ago

Il y a en effet une partie de configuration qui est importante :

https://mviewerstudio.readthedocs.io/fr/stable/doc_tech/install_python.html#configuration https://mviewerstudio.readthedocs.io/fr/stable/doc_tech/config_front.html#config-front

Avez-vous pu suivre ces instructions ?

SebastienGrall commented 9 months ago

Oui j'ai réalisé l'installation à l'aide du script. Les dossiers mviewer et mviewerstudio sont dans mon répertoire /home/user. J'ai créé les répertoires de stockage dans /var/www/mviewer et celui des log également. J'ai repris à l'identique le fichier mviewerstudio.service (j'ai juste changé le user) Le service mviewerstudio renvoie bien un système actif via systemctl status mviewerstudio Le fichier config.json est bien présent dans /home/sebastien/mviewerstudio/srv/python/mviewerstudio_backend/static/apps/ Je ne l'ai par contre pas modifié :

{
    "app_conf": {
        "studio_title": "Mviewer Studio",
        "mviewer_version":  "3.9",
        "mviewerstudio_version":  "4.0.1",
        "api": "api/app",
        "store_style_service": "api/style",
        "mviewer_instance": "/mviewer/",
        "publish_url": "/mviewer/?config=apps/public/{{config}}.xml",
        "conf_path_from_mviewer": "apps/store/",
        "mviewer_short_url": {
            "used": true,
            "apps_folder": "store",
            "public_folder": "public"
        },
        "external_themes": {
            "used": true,
            "url": "https://geobretagne.fr/minicatalog/csv"
        },
        "user_info": "api/user",
        "proxy": "proxy/?url=",
        "user_info_visible": true,
        "app_form_placeholders": {
            "app_title": "Kartenn",
            "logo_url": "https://geobretagne.fr/pub/logo/region-bretagne.jpg",
            "help_file": "mviewer_help.html"
        },
        "map": {
            "center": [-307903.74898791354, 6141345.088741366],
            "zoom": 7
        },
        "baselayers": {
            "positron": {
                "id": "positron",
                "thumbgallery": "img/basemap/positron.png",
                "title": "CartoDb",
                "label": "Positron",
                "type": "OSM",
                "url": "https://{a-c}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
                "attribution": "Map tiles by  <a href=\"https://cartodb.com/attributions\">CartoDb</a>, under  <a href=\"https://creativecommons.org/licenses/by/3.0/\">CC BY 3.0 </a>"
            },
            "ortho_ign": {
                "id": "ortho_ign",
                "thumbgallery": "img/basemap/ortho.jpg",
                "title": "IGN",
                "label": "Photographies aériennes IGN",
                "type": "WMTS",
                "url": "https://wxs.ign.fr/choisirgeoportail/geoportail/wmts?",
                "layers": "ORTHOIMAGERY.ORTHOPHOTOS",
                "format": "image/jpeg",
                "fromcapacity": "false",
                "attribution": "<a href='https://geoservices.ign.fr' target='_blank'><img src='https://geoservices.ign.fr/images/logoIGN.png'></a>",
                "style": "normal",
                "matrixset": "PM",
                "maxzoom": "22"
            },
            "darkmatter": {
                "id": "darkmatter",
                "thumbgallery": "img/basemap/darkmatter.png",
                "title": "CartoDb",
                "label": "Dark Matter",
                "type": "OSM",
                "url": "https://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",
                "maxzoom": "20",
                "attribution": "Map tiles by  <a href=\"https://cartodb.com/attributions\">CartoDb</a>, under  <a href=\"https://creativecommons.org/licenses/by/3.0/\">CC BY 3.0 </a>"
            },
            "esriworldimagery": {
                "id": "esriworldimagery",
                "thumbgallery": "img/basemap/esriworldwide.jpg",
                "title": "Esri",
                "label": "Esri world imagery",
                "type": "OSM",
                "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
                "attribution": "<a href=\"https://www.arcgis.com/home/item.html?id=10df2279f9684e4a9f6a7f08febac2a9\" target=\"_blank\" >Esri world imagery</a>"
            },
            "ortho1": {
                "id": "ortho1",
                "thumbgallery": "img/basemap/ortho.jpg",
                "title": "GéoBretagne",
                "label": "Photo aérienne actuelle GéoBretagne",
                "type": "WMTS",
                "url": "https://tile.geobretagne.fr/gwc02/service/wmts",
                "layers": "satellite",
                "format": "image/png",
                "style": "_null",
                "matrixset": "EPSG:3857",
                "fromcapacity": "false",
                "attribution": "<a href=\"https://geobretagne.fr/geonetwork/srv/fre/catalog.search#/metadata/3a0ac2e3-7af1-4dec-9f36-dae6b5a8c731\" target=\"_blank\" >partenaires GéoBretagne - Megalis Bretagne - IGN - PlanetObserver</a>"
            },
            "ortho_ir": {
                "id": "ortho_ir",
                "thumbgallery": "img/basemap/ir.jpg",
                "title": "GéoBretagne",
                "label": "Photo aérienne infra rouge GéoBretagne",
                "type": "WMTS",
                "url": "https://geobretagne.fr/geoserver/gwc/service/wmts",
                "layers": "photo:ir-composite",
                "format": "image/jpeg",
                "style": "_null",
                "matrixset": "EPSG:3857",
                "fromcapacity": "false",
                "attribution": "<a href=\"https://geobretagne.fr/geonetwork/srv/fre/catalog.search#/metadata/434b82a8-8d3c-4d9f-9eb3-0485f1a63eb6\" target=\"_blank\" >partenaires GéoBretagne - Megalis Bretagne - IGN</a>"
            },
            "osm_google": {
                "id": "osm_google",
                "thumbgallery": "img/basemap/osm_google.png",
                "title": "GéoBretagne",
                "label": "OpenStreetMap GéoBretagne",
                "type": "WMS",
                "url": "https://osm.geobretagne.fr/gwc01/service/wms",
                "layers": "osm:google",
                "format": "image/png",
                "attribution": "GéoBretagne. Données : les contributeurs d'<a href=\"https://www.openstreetmap.org/\" target=\"_blank\">OpenStreetMap </a>,  <a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">ODbL </a>"
            },
            "osm": {
                "id": "osm",
                "thumbgallery": "img/basemap/osm.png",
                "title": "OSM",
                "label": "OpenStreetMap",
                "type": "OSM",
                "url": "https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png",
                "attribution": "Données : les contributeurs d'<a href=\"https://www.openstreetmap.org/\" target=\"_blank\">OpenStreetMap </a><a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">ODbL </a>"
            },
            "osm_bzh": {
                "id": "osm_bzh",
                "thumbgallery": "img/basemap/osm.png",
                "title": "OSM BZH",
                "label": "OpenStreetMap en breton",
                "type": "OSM",
                "maxzoom": "20",
                "url": "https://tile.openstreetmap.bzh/br/{z}/{x}/{y}.png",
                "attribution": "Kendaolerien <a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a>"
            },
            "plan_ign": {
                "id": "plan_ign",
                "thumbgallery": "img/basemap/scan-express.jpg",
                "title": "IGN",
                "label": "Plan IGN v2",
                "type": "WMTS",
                "url": "https://wxs.ign.fr/choisirgeoportail/geoportail/wmts?",
                "layers": "GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2",
                "format": "image/png",
                "fromcapacity": "false",
                "attribution": "<a href='https://geoservices.ign.fr' target='_blank'><img src='https://geoservices.ign.fr/images/logoIGN.png'></a>",
                "style": "normal",
                "matrixset": "PM",
                "maxzoom": "22"
            }
        },
        "data_providers": {
            "csw": [{
                    "title": "Catalogue GéoBretagne",
                    "url": "https://geobretagne.fr/geonetwork/srv/fre/csw",
                    "baseref": "https://geobretagne.fr/geonetwork/srv/eng/catalog.search?node=srv#/metadata/"
                },
                {
                    "title": "Catalogue Région Bretagne",
                    "url": "https://kartenn.region-bretagne.fr/geonetwork/srv/fre/csw",
                    "baseref": "https://kartenn.region-bretagne.fr/geonetwork/srv/fre/catalog.search#/metadata/"
                },
                {
                    "title": "Catalogue de la Région Grand Est",
                    "url": "https://datagrandest.fr/geonetwork/srv/fre/csw",
                    "baseref": "https://datagrandest.fr/geonetwork/srv/eng/catalog.search?node=srv#/metadata/"
                }
            ],
            "wms": [{
                "title": "Serveur WMS de la Région",
                "url": "https://ows.region-bretagne.fr/geoserver/rb/wms"
            }]
        },
        "default_params": {
            "layer": {
                "info_format": "text/html"
            }
        }
    }
}
Gaetanbrl commented 9 months ago

J'ai créé les répertoires de stockage dans /var/www/mviewer

Est-ce que vous avez installé un mviewer ou seulement créé le répertoire "mviewer" ?

SebastienGrall commented 9 months ago

J'ai cloné le répertoire depuis git dans /home/user et j'ai lancé

cd mviewer
npm install

en lançant npm start j'ai bien image

Voici mon fichier mviewerstudio.service

[Unit]
 Description=mviewerstudio
 After=network.target

 [Service]
 User=sebastien
 Environment="EXPORT_CONF_FOLDER=/var/www/mviewer/apps/store/"
 Environment="CONF_PUBLISH_PATH_FROM_MVIEWER=apps/prod"
 Environment="CONF_PATH_FROM_MVIEWER=apps/store"
 Environment="MVIEWERSTUDIO_PUBLISH_PATH=/var/www/mviewer/apps/prod"
 Environment="DEFAULT_ORG=public"
 Environment="LOG_LEVEL=INFO"
 WorkingDirectory=/home/sebastien/mviewerstudio/srv/python
 ExecStart=/home/sebastien/mviewerstudio/srv/python/.venv/bin/gunicorn \
     -b 127.0.0.1:5007 \
     --access-logfile /var/log/mviewerstudio/gunicorn-access.log \
     --log-level info \
     --error-logfile /var/log/mviewerstudio/gunicorn-error.log \
     mviewerstudio_backend.app:app

 [Install]
 WantedBy=multi-user.target
SebastienGrall commented 9 months ago

Voici également ce que j'ai utilisé pour le lancement de l’application avec Flask

source .venv/bin/activate
export FLASK_APP=python/mviewerstudio_backend.app
export CONF_PATH_FROM_MVIEWER=apps/store
export EXPORT_CONF_FOLDER=/home/sebastien/mviewer/apps/store/
export MVIEWERSTUDIO_PUBLISH_PATH=/home/sebastien/mviewer/apps/prod
export CONF_PUBLISH_PATH_FROM_MVIEWER=apps/prod
export DEFAULT_ORG=megalis
flask run -p 5007
Gaetanbrl commented 9 months ago

Le lancement de mviewer avec NPM n'est utilisé que pour tester mviewer seul ou pour développer mviewer.

Il est conseillé que votre mviewer doit être accessible / publié avec un serveur web type Apache ou Nginx si vous débutez et c'est dans tous les cas obligatoire pour une mise en production (mais c'est vous qui choisissez au final selon votre connaissance de l'outil).

Mviewer permet de réaliser des cartes à partir de fichiers de configuration XML. Pour faciliter la création des fichiers de configuration, Mviewer studio a été créé. Il permet de créer des XML avec une interface clic / bouton.

Lorsque Mviewer studio créé une carte, il va la déposer dans un répertoire au sein de votre Mviewer (/store par défaut). Lorsque vous cliqué sur "publier" elle va aller dans le répertoire Mviewer qui sert à publier la carte sur un lien "partageable" sur le serveur Web (une copie vers le répertoire /public ou /prod selon votre préférence).

Dans tous les cas, il faut que le fichier config.json soit adapté comme indiqué dans la documentation et selon les répertoires créent.

Si vous avez un répertoire public et store, il faut que votre mviewer contienne bien les répertoires /store et /public (vérifier bien ces deux répertoire existent avec les bons droits pour que mviewerstudio puisse y écrire ses cartes).

Je vois par exemple que votre fichier config.json spécifie un répertoire /public pour le paramètre public_folder alors que le nom du répertoire public semble être "/prod" dans les autres fichiers. Le problème peut venir de là.

Ce fichier config.json permet aussi de spécifier où est localisé le mviewer à appeler pour que mviewer studio construire l'URL du xml et renvoi vers le bon lien pour prévisualiser ou télécharger une carte. Par défaut la valeur est "mviewer_instance": "/mviewer/", donc vous devez avoir un mviewer accessible via une URL de ce type par défaut (c'est le cas avec votre config actuelle).

Notez qu'avec NPM (votre cas), le mviewerstudio par défaut ne trouvera pas mviewer publié à l'URL /mviewer/ mais localhost:5051 (c'est à adapter donc selon l'URL d'accès à votre mviewer).

Il en est de même pour l'URL de publication qui ne commence pas par /mviewer/ mais localhost:5051 avec NPM.

Je conseil également de ne pas utiliser l'URL courte (le paramètre mviewer_short_url.used doit être à false donc).

SebastienGrall commented 9 months ago

D'accord! Merci je comprends mieux. Du coup pour publier le mviewer il faut que je crée un fichier mviewer.service j'imagine, comme pour le mviewerstudio (si je ne passe pas par Docker)? Quand je lance avec NPM j'ai bien accès au l'application Démo à https://adressedemonserveur.fr/index.html Désolé je suis novice dans la gestion de serveur...

Gaetanbrl commented 9 months ago

Le fichier mviewer.service va concerner l'installation backend et surtout le démarrage sur votre serveur avec des variables d'environnements utiles à son fonctionnement (par exemple pour paramétrer l'emplacement des répertoires).

Pour mviewer je vous conseillerai fortement d'utiliser Apache ou Nginx. Il y a beaucoup d'exemples sur internet pour sa configuration.

Utiliser Nodejs pour le déployer n'est pas dans nos bonnes pratiques et nous n'encourageons pas cette méthode car le serveur exécuté par la commande npm start est un serveur de développement (doc : vite.js) et de test et n'est pas à utiliser pour votre mviewer courant.

La documentation mviewer est accessible ici : https://mviewerdoc.readthedocs.io/fr/stable/doc_tech/deploy.html#avec-un-serveur-web-apache

Gardez en tête également qu'une installation mviewer studio standard sans geOrchestra ne permet pas de gérer les accès avec login / password. Il vous faudra penser sécurité.

Gaetanbrl commented 9 months ago

Je vous rajoute des tuto nginx / apache :

SebastienGrall commented 9 months ago

C'est bon j'ai réussi à accéder au mviewer. J'avais déjà un serveur nginx mais j'avais fait une erreur dans le fichier de config mviewer.conf... Pour l'aspect sécurité du mviewerstudio, j'avais l'intention de paramétrer un accès par mot de passe via un .htpasswd du genre

    location / {
        try_files $uri $uri/ =404;
        auth_basic "Restricted Content";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }

Il n'y aura qu'un ou 2 utilisateurs du mviewerservice. Ce n'est pas une bonne idée?

Merci beaucoup pour l'aide en tout cas!

Gaetanbrl commented 9 months ago

Il n'y aura qu'un ou 2 utilisateurs du mviewerservice. Ce n'est pas une bonne idée?

Pour protéger l'accès à mviewerstudio je pense que ca dépend de votre besoin, ca devrait être déjà bien pour un petit nombre d'utilisateur.

Sachez seulement si un jour vous avez ce besoin, qu'avec la sécurité geOrchestra, vous pouvez les auteurs peuvent voir les cartes des autres auteurs du même organisme mais ne peuvent modifier que leurs propres cartes. Les cartes des autres organismes ne sont pas accessibles.

image

Aussi, pour votre cas, par défaut, les cartes sont dans un même répertoire d'un seul organisme. Par défaut, c'est l'organisme megalis mais je vous conseil de renseigner le nom de votre propre organisme pour que ce soit plus personnalisé :

Cela se change dans le fichier .service du backend : export DEFAULT_ORG=megalis

SebastienGrall commented 9 months ago

Ok super je garde ça en tête. Merci pour l'aide et pour l'outil bien sûr :-)