Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
database:sinp-aura:gn2pg [2024/02/20 13:39] – [Installer le Dashboard Gn2Pg] jpmilcentdatabase:sinp-aura:gn2pg [2026/03/05 13:43] (Version actuelle) – [Principes pour les données transmises] jpmilcent
Ligne 15: Ligne 15:
   * Afficher la table : ''gn2pg_lpo.data_json''   * Afficher la table : ''gn2pg_lpo.data_json''
   * Trier les données par ordre décroissant du champ ''update_ts''. La date la plus récente devrait s'afficher en premier   * Trier les données par ordre décroissant du champ ''update_ts''. La date la plus récente devrait s'afficher en premier
-  * Le champ "id_date" contient l'id_synthese à copier.+    * La date ''update_ts'' et la valeur du champ ''id_data'' du dernier enregistrement devrait correspondre au dernier log de Gn2Pg : ''2024-11-18 15:37:53,851 - DEBUG - store_postgresql:store_1_data - 43682513'' 
 +  * Le champ "id_data" contient l'id_synthese à copier.
   * Modifier ensuite le fichier ''~/data/gn2pg/config/lpo_config.toml'' sur le serveur hébergeant //Gn2Pg//.   * Modifier ensuite le fichier ''~/data/gn2pg/config/lpo_config.toml'' sur le serveur hébergeant //Gn2Pg//.
     * Ajouter/Modifier le paramètre ''filter_n_up_id_synthese'' et lui associer l'id synthese précédemment copié comme valeur.     * Ajouter/Modifier le paramètre ''filter_n_up_id_synthese'' et lui associer l'id synthese précédemment copié comme valeur.
Ligne 24: Ligne 25:
   * Nous gardons la contrainte d’unicité entre ''id_source'' et ''entité_source_pk_value''.   * Nous gardons la contrainte d’unicité entre ''id_source'' et ''entité_source_pk_value''.
     * Avec la fourniture du « vrai » identifiant produit par le producteur au niveau du champs additionnel sous la clé « ''source_id_data'' ».     * Avec la fourniture du « vrai » identifiant produit par le producteur au niveau du champs additionnel sous la clé « ''source_id_data'' ».
-  * Pas d’utilisation de l’UUID à ce stade car effets de bords qui pourront s’avérer problématiques selon les usages. +  * Jusqu'à la version v1.6.9, pas d’utilisation de l’UUID car effets de bords qui s’avérent problématiques selon les usages. Utilisation de l'UUID à partir de la version 1.8.0
-  * Les champs ''identifier'' et ''email'' des données sur les utilisateurs devront avoir la valeur ''NULL''. C'est important pour éviter tout conflit avec les utilisateurs créant des comptes directement depuis les interfaces. Pour éviter aussi des bugs au niveau de l'inscription et du renouvellement des mots de passe, il y a un index unique sur ces 2 champs. Enfin, même si cela crée des doublons, nous distinguerons les entrées dans la table ''t_roles'' pour les utilisateurs s'inscrivant au SINP vis à vis des entrées générées par GN2PG ou les scripts d'intégrations des données au format CSV. La fonction se chargeant d'insérer les utilisateurs dans la table ''t_roles'' de GeoNature a été modifiée pour insérer ''NULL'' dans le champ ''email'' et l'email dans le champ ''additional_data'' sous l'attribut ''gn2pg_data.email''.+  * Les champs ''identifier'' et ''email'' des données sur les utilisateurs devront avoir la valeur ''NULL''. C'est important pour éviter tout conflit avec les utilisateurs créant des comptes directement depuis les interfaces. Pour éviter aussi des bugs au niveau de l'inscription et du renouvellement des mots de passe, il y a un index unique sur ces 2 champs. Enfin, même si cela crée des doublons, nous distinguerons les entrées dans la table ''t_roles'' pour les utilisateurs s'inscrivant au SINP vis à vis des entrées générées par GN2PG ou les scripts d'intégrations des données au format CSV.
   * Le champ ''meta_validation_date'' de la synthèse du fournisseur utilisera l'alias ''validation_date'' soit : ''s.meta_validation_date AS validation_date''   * Le champ ''meta_validation_date'' de la synthèse du fournisseur utilisera l'alias ''validation_date'' soit : ''s.meta_validation_date AS validation_date''
   * Le champ ''additional_data'' de la synthèse du fournisseur utilisera l'alias ''donnees_additionnelles'' soit : ''s.additional_data::text AS donnees_additionnelles''   * Le champ ''additional_data'' de la synthèse du fournisseur utilisera l'alias ''donnees_additionnelles'' soit : ''s.additional_data::text AS donnees_additionnelles''
Ligne 32: Ligne 33:
     * « ''source_id_data'' »     * « ''source_id_data'' »
  
 +==== Modifications du code de to_synthese ====
 +  * Remplacement de la valeur du schéma ''gn2pg_import'' par ''gn2pg_flavia'' ou ''gn2pg_lpo''.
 +  * **La fonction se chargeant d'insérer les utilisateurs dans la table ''t_roles'' de GeoNature a été modifiée pour insérer ''NULL'' dans le champ ''email'' et l'email dans le champ ''additional_data'' sous l'attribut ''gn2pg_data.email''**.
 ===== Mise à jour de l'installation de Gn2Pg ===== ===== Mise à jour de l'installation de Gn2Pg =====
   * Sur le dépôt Github //sinp-<region>-data// :   * Sur le dépôt Github //sinp-<region>-data// :
Ligne 50: Ligne 54:
       * afficher la version actuellement installée de Pipenv via Pipx : ''pipx list''       * afficher la version actuellement installée de Pipenv via Pipx : ''pipx list''
       * mise à jour : ''pipx upgrade pipenv''       * mise à jour : ''pipx upgrade pipenv''
-      * vérifier la version de Pipenv : ''pipenv --version''+      * vérifier la version de Pipenv : ''%%pipenv --version%%''
     * Mettre à jour les dépendances des paquets Python : ''pipenv sync''     * Mettre à jour les dépendances des paquets Python : ''pipenv sync''
     * Se placer dans le dossier de gn2pg : '' cd ~/data/gn2pg/''      * Se placer dans le dossier de gn2pg : '' cd ~/data/gn2pg/'' 
Ligne 73: Ligne 77:
   * Pour chaque schéma abritant les tables de Gn2Pg (ou //source//), il faut cloner le dépôt Gn2Pg. Ex. pour le SINP AURA (nous avons 2 //sources// : flavia, lpo) :   * Pour chaque schéma abritant les tables de Gn2Pg (ou //source//), il faut cloner le dépôt Gn2Pg. Ex. pour le SINP AURA (nous avons 2 //sources// : flavia, lpo) :
     * Se placer dans le dossier ''gn2pg/'' avec : ''cd ~/www/gn2pg/''     * Se placer dans le dossier ''gn2pg/'' avec : ''cd ~/www/gn2pg/''
-    * Cloner une première fois le dépôt en tant que //lpo// avec : ''git clone https://github.com/lpoaura/GN2PG.git lpo'' +    * Cloner une première fois le dépôt en tant que //lpo// avec : ''%%git clone https://github.com/lpoaura/GN2PG.git lpo%%'' 
-    * Cloner une seconde fois le dépôt en tant que //flavia// avec  : ''git clone https://github.com/lpoaura/GN2PG.git flavia'' +    * Cloner une seconde fois le dépôt en tant que //flavia// avec  : ''%%git clone https://github.com/lpoaura/GN2PG.git flavia%%'' 
-  * Pour chaque source : +  * Pour chaque source, nous allons réaliser manuellement les étapes présentes dans ''install/02_install_app.sh'' (pour les adapter à notre infrastructure) 
     * se placer dans le dossier de la source : ''cd ~/www/gn2pg/<source>/''     * se placer dans le dossier de la source : ''cd ~/www/gn2pg/<source>/''
     * Copier le fichier settings.ini : ''cp install/settings.ini.sample install/settings.ini''     * Copier le fichier settings.ini : ''cp install/settings.ini.sample install/settings.ini''
Ligne 97: Ligne 101:
 GUNICORN_LOG_LEVEL=debug GUNICORN_LOG_LEVEL=debug
 </code> </code>
 +    * Installer Poetry : ''pipx install poetry''
 +    * Installer les dépendances du Dashboard de Gn2pg avec : <code bash>
 +poetry config virtualenvs.create true --local
 +poetry config virtualenvs.in-project true --local
 +poetry install --extras=dashboard
 +</code>
 +    * Créer un fichier de service Sytemd : ''vi /etc/systemd/system/gb2pg-<source>.service'' (voir ci-dessous) 
 +      * Prendre en compte le service créé : ''systemctl daemon-reload''
 +      * Lancer le service : ''systemctl start gn2pg-<source>.service''
 +    * Si nécessaire, créer un fichier Logrotate (uniquement pour la première source) : ''vi /etc/logrotate.d/gn2pg'' (voir ci-dessous)
 +    * Si nécessaire, créer un fichier de config Nginx : '' vi /etc/nginx/site-available/gn2pg.conf '' (voir ci-dessous)
 +      * Lors de la création du fichier :
 +        * Activer le nouveau fichier de config : ''nginx_ensite gn2pg.conf''
 +        * Recharger Nginx : ''nginx-reload''
 +        * Récupérer le certificat SSL : '' certbot -d gn2pg.<domaine-sinp>''
 +      * Pour les sources suivantes, il faut seulement compléter le fichier config en ajoutant une nouvelle "location" et son proxy.
 +        * Recharger Nginx : ''nginx-reload''
 +    * Tester l'accès au site en https
 +      * Consulter les logs en cas de problème : ''ls /var/log/gn2pg/''
  
 +==== Fichier Nginx par défaut ====
 +<code nginx>
 +server {
 +    listen [::]:80 ipv6only=on;
 +    listen 80;
 +    
 +    server_name gn2pg.<domaine-sinp>;
 +    root /home/geonat/www/gn2pg/public;
 +
 +    satisfy any;
 +    allow <ip-v4-srv-web>;
 +    deny  all;
 +    auth_basic "Zone restreinte";
 +    auth_basic_user_file /etc/nginx/.htpasswd;
 +
 +    location /<source> {
 +        proxy_set_header X-Forwarded-Host $host:$server_port;
 +        proxy_set_header X-Forwarded-Server $host;
 +        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 +        proxy_set_header X-Forwarded-Proto $scheme;
 +        proxy_redirect off;
 +        proxy_buffering off;
 +
 +        proxy_read_timeout 30s;
 +        proxy_connect_timeout 10s;
 +        proxy_pass http://127.0.0.1:<source-port>;# ATTENTION : ne rien mettre après le port pour que le chemin complet soit passé à Gunicorn
 +    }
 +}
 +</code>
 +
 +==== Fichier Logrotate de Gn2Pg ====
 +<code>
 +/var/log/gn2pg/*.log {
 +    su geonat geonat
 +    daily
 +    rotate 8
 +    size 100M
 +    create
 +    compress
 +    postrotate
 +    systemctl reload gn2pg || true
 +    endscript
 +}
 +</code>
 +
 +==== Fichier Systemd de Gn2Pg ====
 +<code>
 +[Unit]
 +Description=GN2PG-<source>
 +After=network.target
 +#After=postgresql.service
 +
 +[Service]
 +Type=simple
 +User=geonat
 +Group=geonat
 +WorkingDirectory=/home/geonat/www/gn2pg/<source>/
 +Environment=GUNICORN_PROC_NAME=gn2pg
 +Environment=GUNICORN_NUM_WORKERS=4
 +Environment=GUNICORN_PORT=5001
 +Environment=GUNICORN_TIMEOUT=30
 +Environment=GUNICORN_LOG_FILE=/var/log/gn2pg/gn2pg-gunicorn.log
 +Environment=GUNICORN_LOG_LEVEL=info
 +EnvironmentFile=-/home/geonat/www/gn2pg/<source>/environ
 +ExecStart=/home/geonat/www/gn2pg/<source>/.venv/bin/gunicorn gn2pg.app.app:create_app() \
 +                --name "${GUNICORN_PROC_NAME}" --workers "${GUNICORN_NUM_WORKERS}" \
 +                --bind "${GUNICORN_HOST}:${GUNICORN_PORT}" --timeout="${GUNICORN_TIMEOUT}" \
 +                --log-file "${GUNICORN_LOG_FILE}" --log-level "${GUNICORN_LOG_LEVEL}"
 +ExecReload=/bin/kill -s HUP $MAINPID
 +TimeoutStartSec=10
 +TimeoutStopSec=5
 +PrivateTmp=true
 +StandardOutput=append:/var/log/gn2pg/gn2pg-<source>.log
 +StandardError=inherit
 +
 +[Install]
 +WantedBy=multi-user.target
 +</code>
  
 ==== Exemple de contenu pour index.html ==== ==== Exemple de contenu pour index.html ====
Ligne 146: Ligne 247:
 </html> </html>
    
 +</code>
 +
 +===== Requêtes SQL utiles pour Gn2Pg =====
 +<code sql>
 +-- Nbre de données récupérées depuis une date donnée
 +SELECT COUNT(*)
 +FROM gn2pg_lpo.data_json
 +WHERE update_ts > '2025-06-30';
 +
 +-- Nbre d'erreurs depuis une date donnée
 +SELECT COUNT(*)
 +FROM gn2pg_lpo.error_log
 +WHERE last_ts > '2025-06-22';
 +
 +-- Principaux types d'erreur différents
 +SELECT DISTINCT  split_part(error, e'\n', 1)
 +FROM gn2pg_lpo.error_log;
 </code> </code>
  • database/sinp-aura/gn2pg.1708436350.txt.gz
  • Dernière modification : 2024/02/20 13:39
  • de jpmilcent