Différences entre les versions de « Legi.py »

De Wiki Seb35
Aller à la navigation Aller à la recherche
(création de documentation, pour moi ou toute personne intéressée)
 
(détail)
 
(2 versions intermédiaires par le même utilisateur non affichées)
Ligne 3 : Ligne 3 :
Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0.
Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0.


Dans la chaîne de traitement, legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70].
Dans la chaîne de traitement de [[Archéo Lex]], legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70].


== Installation sous Debian 10 sur un serveur ==
== Installation sous Debian 10 ==


:''Cette section explique comment installer avec Git legi.py et mettre en place les mises à jour quotidiennes.''
:''Cette section explique comment installer legi.py avec Git et mettre en place les mises à jour quotidiennes.''
:''Procédure écrite et testée en mai 2021.''


Le code de legi.py sera placé dans <code>/opt/legi.py</code>, les données XML officielles dans <code>/srv/data/legi/xml</code> et la base de données résultat dans <code>/srv/data/legi/sql</code>.
 
Les commandes sont ici utilisées avec sudo puisque cela a vocation à être un service « système ».
 
; Pré-requis
* Système : Debian 10
* Connectivité : IPv4 nécessaire (d’une part pour le téléchargement sur Github puisque celui-ci n’a pas encore l’IPv6 [sic], d’autre part pour les téléchargements quotidiens depuis la DILA)
* Ressources :
** téléchargement initial : ≈ 3 Gio
** téléchargements quotidiens : ≈ 1 Mio, sauf lors d’un ré-export complet de la base XML une fois par an (≈ 1 Gio dans ce cas)
** stockage du XML compressé : ≈ 3-4 Gio
** stockage de la base SQL : ≈ 4 Gio
** CPU/mémoire : peu consommateur sauf lors du calcul initial, 1-2 Gio est suffisant, avoir plus de ressources augmente la vitesse notamment du calcul initial
 
=== Installation des dépendances ===
 
Paquets généraux :
sudo apt-get install -y git gcc g++ python3-pip python3-setuptools python3-dev
À part git, les suivants sont nécessaires pour la compilation du paquet Python « hunspell » lors de l’installation avec pip.
 
Paquets spécifiques :
sudo apt-get install -y libarchive13 hunspell hunspell-fr libhunspell-dev
 
=== Installation de legi.py ===
 
sudo mkdir /opt/legi.py
sudo git clone <nowiki>https://github.com/Legilibre/legi.py</nowiki> /opt/legi.py
cd /opt/legi.py
sudo pip3 install -r requirements.txt
 
=== Création de la mise à jour quotidienne ===
 
Cette mise à jour est programmée avec un timer systemd et un utilisateur système dédié.
 
Noter que la mise à jour est programmée ici du lundi au vendredi entre 23:15 et 23:30 et toutes les 12 heures : selon [https://github.com/Legilibre/salon/issues/18 ces stats], l’heure de livraison étant variable, souvent entre 21:00 et 23:00, mais parfois plus tard ; on pourrait programmer une vérification de la présence de livraison du jour à partir de 20:00 (ce que je fais pour Archéo Lex). La vérification toutes les 12 heures est notamment pour le cas d’un ordinateur de bureau, pas forcément allumé en soirée.
 
Sur la pérennité de la livraison via FTP, il a été annoncé par la DILA le 29 novembre 2019 (lors de l’inauguration des nouvelles API) que cela était pérenne.
 
Note d’implémentation : j’utilise ici wget pour faire le téléchargement même si legi.py a un utilitaire dédié, plus par conviction personnelle qu’il est préférable d’utiliser les outils existants plutôt que de les réimplémenter.
 
sudo adduser --system --home / --shell /usr/bin/sh --no-create-home --disabled-password legi
sudo mkdir -p /usr/local/lib/systemd/system
sudo vi /usr/local/lib/systemd/system/legi-database-update.service # copier le contenu ci-dessous
sudo vi /usr/local/lib/systemd/system/legi-database-update.timer # copier le contenu ci-dessous
sudo systemctl daemon-reload
sudo mkdir -p /var/log/legi /srv/data/legi/{xml,sql}
sudo chown -R legi /var/log/legi /srv/data/legi
sudo systemctl start legi-database-update.timer
sudo systemctl enable legi-database-update.timer
 
; /usr/local/lib/systemd/system/legi-database-update.service
[Unit]
Description=LEGI database update
Documentation=<nowiki>https://github.com/Legilibre/legi.py</nowiki>
[Service]
Type=oneshot
WorkingDirectory=/opt/legi.py
ExecStartPre=wget -c -N --no-remove-listing --no-verbose -nH -P /srv/data/legi/xml '<nowiki>ftp://echanges.dila.gouv.fr/LEGI/*.tar.gz</nowiki>'
ExecStart=python3 -m legi.tar2sqlite /srv/data/legi/sql/legi.sqlite /srv/data/legi/xml
User=legi
StandardOutput=file:/var/log/legi/update.log
 
; /usr/local/lib/systemd/system/legi-database-update.timer
[Unit]
Description=Run LEGI database update
[Timer]
OnCalendar=Mon..Fri *-*-* 11/12:15:00
RandomizedDelaySec=900
[Install]
WantedBy=timers.target
 
=== Lancement initial ===
 
On peut lancer le calcul initial tout de suite :
sudo systemctl start legi-database-update.service --no-block
sudo systemctl status legi-database-update.service
 
Ce calcul initial mettra quelques heures, variable selon la vitesse de téléchargement et les ressources CPU/mémoire disponible.
 
== Utilisation au quotidien ==
 
sqlite3 /srv/data/legi/sql/legi.sqlite

Version actuelle datée du 9 mai 2021 à 20:59

En légistique numérique, legi.py transforme la base de données LEGI, contenant les lois consolidées, produite officiellement par la DILA et consistant en des fichiers XML, en une base SQL (SQLite uniquement).

Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0.

Dans la chaîne de traitement de Archéo Lex, legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans une Pull Request que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [1].

Installation sous Debian 10

Cette section explique comment installer legi.py avec Git et mettre en place les mises à jour quotidiennes.
Procédure écrite et testée en mai 2021.

Le code de legi.py sera placé dans /opt/legi.py, les données XML officielles dans /srv/data/legi/xml et la base de données résultat dans /srv/data/legi/sql.

Les commandes sont ici utilisées avec sudo puisque cela a vocation à être un service « système ».

Pré-requis
  • Système : Debian 10
  • Connectivité : IPv4 nécessaire (d’une part pour le téléchargement sur Github puisque celui-ci n’a pas encore l’IPv6 [sic], d’autre part pour les téléchargements quotidiens depuis la DILA)
  • Ressources :
    • téléchargement initial : ≈ 3 Gio
    • téléchargements quotidiens : ≈ 1 Mio, sauf lors d’un ré-export complet de la base XML une fois par an (≈ 1 Gio dans ce cas)
    • stockage du XML compressé : ≈ 3-4 Gio
    • stockage de la base SQL : ≈ 4 Gio
    • CPU/mémoire : peu consommateur sauf lors du calcul initial, 1-2 Gio est suffisant, avoir plus de ressources augmente la vitesse notamment du calcul initial

Installation des dépendances

Paquets généraux :

sudo apt-get install -y git gcc g++ python3-pip python3-setuptools python3-dev

À part git, les suivants sont nécessaires pour la compilation du paquet Python « hunspell » lors de l’installation avec pip.

Paquets spécifiques :

sudo apt-get install -y libarchive13 hunspell hunspell-fr libhunspell-dev

Installation de legi.py

sudo mkdir /opt/legi.py
sudo git clone https://github.com/Legilibre/legi.py /opt/legi.py
cd /opt/legi.py
sudo pip3 install -r requirements.txt

Création de la mise à jour quotidienne

Cette mise à jour est programmée avec un timer systemd et un utilisateur système dédié.

Noter que la mise à jour est programmée ici du lundi au vendredi entre 23:15 et 23:30 et toutes les 12 heures : selon ces stats, l’heure de livraison étant variable, souvent entre 21:00 et 23:00, mais parfois plus tard ; on pourrait programmer une vérification de la présence de livraison du jour à partir de 20:00 (ce que je fais pour Archéo Lex). La vérification toutes les 12 heures est notamment pour le cas d’un ordinateur de bureau, pas forcément allumé en soirée.

Sur la pérennité de la livraison via FTP, il a été annoncé par la DILA le 29 novembre 2019 (lors de l’inauguration des nouvelles API) que cela était pérenne.

Note d’implémentation : j’utilise ici wget pour faire le téléchargement même si legi.py a un utilitaire dédié, plus par conviction personnelle qu’il est préférable d’utiliser les outils existants plutôt que de les réimplémenter.

sudo adduser --system --home / --shell /usr/bin/sh --no-create-home --disabled-password legi
sudo mkdir -p /usr/local/lib/systemd/system
sudo vi /usr/local/lib/systemd/system/legi-database-update.service # copier le contenu ci-dessous
sudo vi /usr/local/lib/systemd/system/legi-database-update.timer # copier le contenu ci-dessous
sudo systemctl daemon-reload
sudo mkdir -p /var/log/legi /srv/data/legi/{xml,sql}
sudo chown -R legi /var/log/legi /srv/data/legi
sudo systemctl start legi-database-update.timer
sudo systemctl enable legi-database-update.timer
/usr/local/lib/systemd/system/legi-database-update.service
[Unit]
Description=LEGI database update
Documentation=https://github.com/Legilibre/legi.py

[Service]
Type=oneshot
WorkingDirectory=/opt/legi.py
ExecStartPre=wget -c -N --no-remove-listing --no-verbose -nH -P /srv/data/legi/xml 'ftp://echanges.dila.gouv.fr/LEGI/*.tar.gz'
ExecStart=python3 -m legi.tar2sqlite /srv/data/legi/sql/legi.sqlite /srv/data/legi/xml
User=legi
StandardOutput=file:/var/log/legi/update.log
/usr/local/lib/systemd/system/legi-database-update.timer
[Unit]
Description=Run LEGI database update

[Timer]
OnCalendar=Mon..Fri *-*-* 11/12:15:00
RandomizedDelaySec=900

[Install]
WantedBy=timers.target

Lancement initial

On peut lancer le calcul initial tout de suite :

sudo systemctl start legi-database-update.service --no-block
sudo systemctl status legi-database-update.service

Ce calcul initial mettra quelques heures, variable selon la vitesse de téléchargement et les ressources CPU/mémoire disponible.

Utilisation au quotidien

sqlite3 /srv/data/legi/sql/legi.sqlite