PnX-SI / GeoNature-atlas

Application WEB permettant de générer des fiches espèces publiques à partir d'observations faune/flore
GNU General Public License v3.0
44 stars 48 forks source link

[Debian 12] Retours d'installation Atlas 1.6.1 - plateforme régionale #501

Open pbarille opened 11 months ago

pbarille commented 11 months ago

Bonjour,

Nous sommes en cours de migration de notre atlas vers une machine basée sur debian 12.
Voici notre partage d'expérience sur cette installation, nous sommes bien sûr preneurs de vos retours.

Requirements.txt

Nous avons dû faire évoluer la version de greenlet qui posait des problèmes lors su lancement du script d'installation de l'application. Nous somme partis sur la version 3.0.2.

atlas_ref_geo.sql

Nous avons ajouté AND l.enable = trueà la ligne 68 pour ne sélectionner que notre région en ayant pris soin de modifier la table ref_geo.l_areas en amont pour ne garder que notre région avec le statut enable

CREATE MATERIALIZED VIEW atlas.t_layer_territoire AS
WITH d AS (
    SELECT st_union(geom) , b.type_name
    FROM ref_geo.l_areas l
    JOIN ref_geo.bib_areas_types b USING(id_type)
    WHERE REPLACE(b.type_code, ' ', '_') = :type_territoire AND l.enable = true
    GROUP BY b.type_name
)
SELECT
 1::int as gid,
 type_name as nom,
 st_area(st_union)/10000 as surf_ha,
 st_area(st_union)/1000000 as surf_km2,
 ST_Perimeter(st_union)/1000 as perim_km,
 st_transform(st_union, 4326) as  the_geom
FROM d;

atlas_synthese.sql

Nous avons modifié la requête de création de la vue syntheseff de la sorte pour gagner en performances :

CREATE OR REPLACE VIEW synthese.syntheseff
 AS
 WITH obs_data AS (
         SELECT DISTINCT ON (s.id_synthese) s.id_synthese,
            s.cd_nom,
            s.id_dataset,
            s.date_min AS dateobs,
            s.observers AS observateurs,
            (s.altitude_min + s.altitude_max) / 2 AS altitude_retenue,
                CASE
                    WHEN dl.cd_nomenclature::text = '1'::text THEN st_transform(sa_com.centroid, 4326)
                    WHEN dl.cd_nomenclature::text = '2'::text THEN st_transform(sa_m10.centroid, 4326)
                    WHEN dl.cd_nomenclature::text = '3'::text THEN st_transform(sa_dep.centroid, 4326)
                    ELSE st_transform(s.the_geom_point, 4326)
                END AS the_geom_point,
            s.count_min AS effectif_total,
            dl.cd_nomenclature::integer AS diffusion_level
           FROM synthese.synthese s
             LEFT JOIN ( SELECT sa_com_1.id_synthese,
                    a_com.centroid
                   FROM synthese.cor_area_synthese sa_com_1
                     JOIN ref_geo.l_areas a_com ON sa_com_1.id_area = a_com.id_area
                     JOIN ref_geo.bib_areas_types t_com ON a_com.id_type = t_com.id_type AND t_com.type_code::text = 'COM'::text
                     JOIN atlas.l_communes c_com ON st_intersects(st_transform(a_com.centroid, 4326), c_com.the_geom)) sa_com ON sa_com.id_synthese = s.id_synthese
             LEFT JOIN ( SELECT sa_m10_1.id_synthese,
                    a_m10.centroid
                   FROM synthese.cor_area_synthese sa_m10_1
                     JOIN ref_geo.l_areas a_m10 ON sa_m10_1.id_area = a_m10.id_area
                     JOIN ref_geo.bib_areas_types t_m10 ON a_m10.id_type = t_m10.id_type AND t_m10.type_code::text = 'M10'::text
                     JOIN atlas.l_communes c_m10 ON st_intersects(st_transform(a_m10.centroid, 4326), c_m10.the_geom)) sa_m10 ON sa_m10.id_synthese = s.id_synthese
             LEFT JOIN ( SELECT sa_dep_1.id_synthese,
                    a_dep.centroid
                   FROM synthese.cor_area_synthese sa_dep_1
                     JOIN ref_geo.l_areas a_dep ON sa_dep_1.id_area = a_dep.id_area
                     JOIN ref_geo.bib_areas_types t_dep ON a_dep.id_type = t_dep.id_type AND t_dep.type_code::text = 'DEP'::text
                     JOIN atlas.l_communes c_dep ON st_intersects(st_transform(a_dep.centroid, 4326), c_dep.the_geom)) sa_dep ON sa_dep.id_synthese = s.id_synthese
             LEFT JOIN synthese.t_nomenclatures dl ON s.id_nomenclature_diffusion_level = dl.id_nomenclature
             LEFT JOIN synthese.t_nomenclatures st ON s.id_nomenclature_observation_status = st.id_nomenclature
          WHERE (NOT dl.cd_nomenclature::text = '4'::text OR s.id_nomenclature_diffusion_level IS NULL) AND st.cd_nomenclature::text = 'Pr'::text
        )
 SELECT d.id_synthese,
    d.id_dataset,
    d.cd_nom,
    d.dateobs,
    d.observateurs,
    d.altitude_retenue,
    d.the_geom_point,
    d.effectif_total,
    c.insee,
    d.diffusion_level
   FROM obs_data d
     JOIN atlas.l_communes c ON st_intersects(d.the_geom_point, c.the_geom);

ALTER TABLE synthese.syntheseff
    OWNER TO geonatadmin;

7.atlas.vm_communes.sql

Nous avons commenté la ligne 9 pour ne pas exécuter la requête spatiale qui prend un temps assez conséquent en ayant là aussi pris soin de ne garder au statut enableque les communes de notre territoire

-- Communes contenues entièrement dans le territoire

CREATE MATERIALIZED VIEW atlas.vm_communes AS
SELECT c.insee,
c.commune_maj,
c.the_geom,
st_asgeojson(st_transform(c.the_geom, 4326)) as commune_geojson
FROM atlas.l_communes c
--JOIN atlas.t_layer_territoire t ON ST_CONTAINS(ST_BUFFER(t.the_geom,200), c.the_geom)
;

CREATE UNIQUE INDEX ON atlas.vm_communes (insee);
CREATE INDEX index_gist_vm_communes_the_geom ON atlas.vm_communes USING gist (the_geom);

12.atlas.t_mailles_territoire.sql

La requête initiale a fait crashé postgres à chaque fois que nous l'avons lancé via le script de déploiement.
Nous l'avons réécrite de la sorte :

DROP TABLE IF EXISTS atlas.t_mailles_territoire;

-- MV for having only meshs of the territory
CREATE TABLE atlas.t_mailles_territoire
AS 
/*SELECT
st_transform(c.geom, 4326) AS the_geom,
st_asgeojson(st_transform(c.geom, 4326)) AS geojson_maille,
c.id_area AS id_maille
FROM ref_geo.l_areas c
JOIN ref_geo.bib_areas_types t ON t.id_type = c.id_type
JOIN atlas.t_layer_territoire mt ON ST_intersects(c.geom,st_transform(mt.the_geom, find_srid('ref_geo', 'l_areas', 'geom')))
WHERE c.enable = true AND t.type_code = :type_maille;*/

WITH mailles AS (
    SELECT 
        st_transform(c.geom, 4326) AS the_geom, 
        st_asgeojson(st_transform(c.geom, 4326)) AS geojson_maille,
        c.id_area AS id_maille  
        FROM ref_geo.l_areas c
        JOIN ref_geo.bib_areas_types t ON t.id_type = c.id_type
        WHERE c.enable = true AND t.type_code = :type_maille
        )

SELECT mailles.the_geom, geojson_maille, id_maille
FROM mailles, atlas.t_layer_territoire
WHERE st_intersects(mailles.the_geom,atlas.t_layer_territoire.the_geom)
;

CREATE UNIQUE INDEX t_mailles_territoire_id_maille_idx ON atlas.t_mailles_territoire USING btree (id_maille);

Configuration Apache

Nous avons eu quelques soucis avec les configurations apache pour faire cohabiter atlas et geonature sur le même serveur.

La configuration suivante fonctionne très bien mais a rendu geonature inaccessible :

<Location />
    ProxyPass http://127.0.0.1:8080/
    ProxyPassReverse http://127.0.0.1:8080/
 </Location>

La configuration suivante nous a renvoyé des erreurs 404 pour l'accès à atlas, nous avions pourtant modifié le config.py pour pointer sur /atlas également :

<Location /atlas>
    ProxyPass  http://127.0.0.1:8080/atlas
    ProxyPassReverse  http://127.0.0.1:8080/atlas
</Location>

Nous avons trouvé la solution suivante qui est fonctionnelle et qui nous convient sur l'organisation des urls :

ProxyPass /geonature !
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/

Merci ! Bonne journée, Pascal

cc @MathieuLagarde

camillemonchicourt commented 11 months ago

OK merci pour ce retour. Nous n'avons pas encore sorti de version officiellement compatible Debian 12, car pas encore testé. Donc merci pour ce retour, et tant mieux si il n'y a que ce petit ajustement.

Intéressant pour les modifications des SQL, mais je ne suis pas certain qu'il faille se baser par défaut sur le contenu du champs l.enable = true pour les communes à remonter, car peu de structures ont renseigné ce champs et ça compliquerait la tache et la compréhension (déjà bien complexe) pour les nouveaux utilisateurs. Mais à voir...

Intéressant pour les autres optimisations. Il faudrait se pencher sur ça, mais nous n'avons pas de ressources sur le projet GeoNature-atlas actuellement, donc nous concentrons sur GeoNature.

J'espère qu'il sera possible prochainement de faire un gros travail de ménage, de simplification et d'optimisations sur GeoNature-atlas, car ça devient de plus en plus dense et complexe et il y aurait matière à optimiser et simplifier.

gildeluermoz commented 11 months ago

Je confirme aussi que l'install se passe bien sur debian 12 avec, pour ma part, une version de greenlet==1.1.3 dans le requirements.txt. Dans mon cas, il s'agissait d'une migration de serveur avec une version existante de l'atlas en 1.5.1 vers 1.6.1. J'ai donc migré la base de données sans modifications autres que le SQL proposé dans la version 1.6.0.

Concernant Apache, de mon côté, je suis sur sous domaine, donc l'atlas aussi à une url à la racine. j'utilise le IncludeOptional /etc/apache2/conf-available/geonature.conf dans le virtualhost de GeoNature mais le fichier de la conf apache /etc/apache2/conf-available/geonature.conf doit être mise à jour car il est prévu pour une utilisation de GN sur un domaine principal, tel que https://mondomaine.xy/geonature. Il faut retirer des /geonature dans les Alias, RewriteRule, AliasMatch et Location

ceci fonctionne avec l'url ci-dessus

/etc/apache2/sites-available/geonature-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName geonature.mondomaine.xy

    <Directory /home/geonatureadmin/geonature/frontend/dist>
       Require all granted
    </Directory>

    IncludeOptional /etc/apache2/conf-available/geonature.conf

    ErrorLog "/var/log/apache2/geonature_error.log"
    CustomLog "/var/log/apache2/geonature_access.log" combined

SSLCertificateFile /etc/letsencrypt/live/geonature.mondomaine.xy/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/geonature.mondomaine.xy/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

/etc/apache2/conf-available/geonature.conf

# Alias: first have precedence, so static & media aliases must be defined before /geonature alias

Alias "/api/media" "/home/geonatureadmin/geonature/backend/media"
<Directory "/home/geonatureadmin/geonature/backend/media">
    Require all granted
    AllowOverride None
    Options -Indexes
</Directory>

Alias "/api/static" "/home/geonatureadmin/geonature/backend/static"
<Directory "/home/geonatureadmin/geonature/backend/static">
    Require all granted
    AllowOverride None
    Options -Indexes
</Directory>

# CUSTOM STATIC FILE
RewriteEngine On
# Define STATIC_FILE environment variable
RewriteRule "^/api/static/(.*)$" - [env=STATIC_FILE:$1,chain]
# Test if custom static file exists (not tested for non static file thanks to previous chain flag)
RewriteCond "/home/geonatureadmin/geonature/custom/%{ENV:STATIC_FILE}" -f
# If so, redirect to custom static file instead of default static file
RewriteRule "^/api/static/(.*)$" "/home/geonatureadmin/geonature/custom/$1" [L]
<Directory "/home/geonatureadmin/geonature/custom">
    Require all granted
    AllowOverride None
    Options -Indexes
</Directory>

AliasMatch "^(.*)$" "/home/geonatureadmin/geonature/frontend/dist$1"
<Directory "/home/geonatureadmin/geonature/frontend/dist">
    Require all granted
</Directory>

<Location "/api">
    ProxyPass http://127.0.0.1:8000/api
    ProxyPassReverse http://127.0.0.1:8000/api
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE application/json
        AddOutputFilterByType DEFLATE application/geo+json
    </IfModule>
</Location>

# Location: last have precedence so next blocks must be located after /api location block
<Location "/api/media">
    ProxyPass !
</Location>
<Location "/api/static">
    ProxyPass !
</Location>
gildeluermoz commented 11 months ago

Et... /etc/apache2/sites-available/atlas-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName atlas.mondomaine.xy

    # Configuration GeoNature-atlas
    <Location />
        ProxyPass  http://127.0.0.1:8080/
        ProxyPassReverse  http://127.0.0.1:8080/
    </Location>

SSLCertificateFile /etc/letsencrypt/live/atlas.mondomaine.xy/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/atlas.mondomaine.xy/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
camillemonchicourt commented 11 months ago

Concernant le fichier /etc/apache2/conf-available/geonature.conf, normalement (de mémoire) on n'a pas à le modifier manuellement. Le script https://github.com/PnX-SI/GeoNature/blob/master/install/06_configure_apache.sh se charge de le renseigner comme il faut et si on modifie l'URL de son GeoNature (pour le passer sur un sous-domaine par exemple), on le relance et cela regénère le fichier /etc/apache2/conf-available/geonature.conf comme il faut. Voir https://docs.geonature.fr/installation.html#configuration-apache

gildeluermoz commented 11 months ago

Ha cool. J'ignorais cette méthode. C'est bien pratique, je testerai. Merci

jpm-cbna commented 11 months ago

l'install se passe bien sur debian 12 avec, pour ma part, une version de greenlet==1.1.3 dans le requirements.txt.

Même constat, seul la mise à jour de la version de Greenlet vers 1.1.3 a été nécessaire pour l'installation sur Debian 12.

Par contre, côté performance, cela ne fonctionnait pas avec la release par défaut et une base GeoNature de 9 millions d'observations. J'ai du créer une branche feat/cbna intégrant les PR #393, #397, #402, #404, #406 et #454 pour que cela créé la base de l'Atlas en moins de 10mn.

Frangete commented 5 months ago

Super merci pour ce retour ! Sur la partie configuration d'apache, j'ai le meme soucis que vous sur la cohabitation entre geonature et atlas sur le meme serveur.

J'ai donc essayé votre solution en écrivant (C'est la première fois que je fais de la configuration apache)

ProxyPass /geonature ! ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/

dans /etc/apache2/sites-available/atlas.conf

Mais impossible de redémarrer le service.

AH00526: Syntax error on line 4 of /etc/apache2/sites-enabled/atlas.conf: ProxyPass|ProxyPassMatch can not have a path when defined in a location. Action 'restart' failed. The Apache error log may have more information.

Je suppose que cela ne s'écrit pas exactement comme ceci mais impossible de trouver la bonne solution. Comment avez-vous fais ?

j'ai indiqué "URL_APPLICATION = "" " dans config.py

Merci d'avance.

Configuration Apache

Nous avons eu quelques soucis avec les configurations apache pour faire cohabiter atlas et geonature sur le même serveur.

La configuration suivante fonctionne très bien mais a rendu geonature inaccessible :

<Location />
    ProxyPass http://127.0.0.1:8080/
    ProxyPassReverse http://127.0.0.1:8080/
 </Location>

La configuration suivante nous a renvoyé des erreurs 404 pour l'accès à atlas, nous avions pourtant modifié le config.py pour pointer sur /atlas également :

<Location /atlas>
    ProxyPass  http://127.0.0.1:8080/atlas
    ProxyPassReverse  http://127.0.0.1:8080/atlas
</Location>

Nous avons trouvé la solution suivante qui est fonctionnelle et qui nous convient sur l'organisation des urls :

ProxyPass /geonature !
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
pbarille commented 5 months ago

Bonjour,

J'ai bien la même chose concernant l'URL application.

Pour les confs apache, le fichier atlas.confse situe dans le dossier conf-available et non site-available sur mon serveur mais ce n'est peut-être pas là où ça se joue.

J'ai un ServerNamequi pointe vers mon nom de domaine (ou à défaut l'IP de mon serveur) de défini dans atlas.conf

Il faut également enlever les balise </Location></Location> dans atlas.conf pour que cela fonctionne, au vu de votre message d'erreur, peut-être sont-elles toujours présentes dans votre fichier.

Bonne journée, Pascal

Frangete commented 4 months ago

Bonjour, je me permet de revenir vers vous.

J'ai réinstallé Géonature, citizen et Atlas sur un debian 12. J'ai également du changer greenlet==1.1.3 dans le requirements.txt

Mais voila Géonature n'est aussi plus accessible de mon coté.

J'ai une configuration en sous domaine avec gncitizen.mondomaine.xy, geonature.mondomaine.xy et atlas.mondomaine.xy. Mais dorénavant geonature.mondomaine.xy, mondomaine.xy et atlas.mondomaine.xy arrive tous sur le site d'atlas.

Dans atlas/configuration/config.py.example j'ai essayé de renseigner pour l'URL : "" ou "atlas.mondomaine.xy", mais cela ne change rien. Je peux d'ailleurs mettre n'importe quoi dans les guillemets et rien ne change (je relance bien 'sudo systemctl restart geonature-atlas' apres chaque changement).

voici mon fichier conf-availables/geonature.conf :


# Alias: first have precedence, so static & media aliases must be defined before /geonature alias

Alias "/api/media" "/home/geonatureadmin/geonature/backend/media"
<Directory "/home/geonatureadmin/geonature/backend/media">
    Require all granted
    AllowOverride None
    Options -Indexes
</Directory>

Alias "/api/static" "/home/geonatureadmin/geonature/backend/static"
<Directory "/home/geonatureadmin/geonature/backend/static">
    Require all granted
    AllowOverride None
    Options -Indexes
</Directory>

# CUSTOM STATIC FILE
RewriteEngine On
# Define STATIC_FILE environment variable
RewriteRule "^/api/static/(.*)$" - [env=STATIC_FILE:$1,chain]
# Test if custom static file exists (not tested for non static file thanks to previous chain flag)
RewriteCond "/home/geonatureadmin/geonature/custom/%{ENV:STATIC_FILE}" -f
# If so, redirect to custom static file instead of default static file
RewriteRule "^/api/static/(.*)$" "/home/geonatureadmin/geonature/custom/$1" [L]
<Directory "/home/geonatureadmin/geonature/custom">
    Require all granted
    AllowOverride None
    Options -Indexes
</Directory>

AliasMatch "^(.*)$" "/home/geonatureadmin/geonature/frontend/dist$1"
<Directory "/home/geonatureadmin/geonature/frontend/dist">
    Require all granted
</Directory>

<Location "/api">
    ProxyPass http://127.0.0.1:8000/api
    ProxyPassReverse http://127.0.0.1:8000/api
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE application/json
        AddOutputFilterByType DEFLATE application/geo+json
    </IfModule>
</Location>

# Location: last have precedence so next blocks must be located after /api location block
<Location "/api/media">
    ProxyPass !
</Location>
<Location "/api/static">
    ProxyPass !
</Location>

Et pour atlas.conf :


ServerName www.atlas.mondomaine.xy

<Location />
  ProxyPass http://127.0.0.1:8080/
  ProxyPassReverse http://127.0.0.1:8080/
</Location>

J'ai donc essayé de modifié atlas.conf pour bloqué l’accès au sous-domaine geonature pour atlas, mais cela bloque l’accès pour tout le serveur et aucune de ces versions n'a corrigé mon problème :

ServerName www.mondomaine.xy
ServerAlias www.*.mondomaine.xy
SetEnvIfNoCase Host "geonature\.mondomaine\.xy$" BAD_HOST
<Location />
  Order Deny,Allow
  Deny from env=BAD_HOST
  ProxyPass http://127.0.0.1:8080/
  ProxyPassReverse http://127.0.0.1:8080/
</Location>`
 ou encore 

`SetEnvIf Host "^atlas\.mondomaine\.xy$" BAD_HOST
<Location />
    Order Deny,Allow
    Deny from env=BAD_HOST
    ProxyPassReverse http://127.0.0.1:8080/
    ProxyPass http://127.0.0.1:8080/
</Location>

et

SetEnvIfNoCase Host "^atlas\.mondomaine\.xy$" BAD_HOST
<Location />
    Order Deny,Allow
    Deny from env=BAD_HOST
    ProxyPassReverse http://127.0.0.1:8080/
    ProxyPass http://127.0.0.1:8080/
</Location>

Quel est votre configuration de atlas.conf @gildeluermoz ?

Merci d'avance, Simon.