Différences entre les versions de « Overpass »
m (→Replicate ID) |
m (→Replicate ID) |
||
Ligne 186 : | Ligne 186 : | ||
=== Replicate ID === | === Replicate ID === | ||
Le "replicate ID" est l'identifiant de la version des données, qui sera mis à jour en même temps que les données. Attention, sa valeur diffère selon la source des mises à jour (minute, heure ou journée). Dans les données clonées, il s'agit du | Le "replicate ID" est l'identifiant de la version des données, qui sera mis à jour en même temps que les données. Attention, sa valeur diffère selon la source des mises à jour (minute, heure ou journée). Dans les données clonées, il s'agit du "replicate ID" à la minute. | ||
Il faut donc d'abord connaitre le "replicate ID" des données clonées : | Il faut donc d'abord connaitre le "replicate ID" des données clonées : |
Version du 19 avril 2021 à 15:48
Overpass est une API permettant d'interroger des données OSM.
1 Mise en place d'un serveur Overpass (Debian)
Ce qui suit indique la méthodologie pour mettre en place une API Overpass sur un serveur Debian avec les données OSM mondiales et historiques ("ATTIC") mises à jour une fois par heure.
Les données mondiales sont utilisées car les tests sur un export de données (France) n'ont pas été concluants. Une mise à jour à l'heure a été décidée plutôt qu'à la minute pour soulager le serveur.
1.1 Pré-requis
- Un serveur avec un disque d'au moins 500 Go, de préférence un SSD, et au moins 8 Go de mémoire RAM.
- Un nom de domaine pointant vers le serveur.
1.2 Création d'un utilisateur système
sudo adduser overpass --system --shell /bin/bash --group
sudo passwd overpass
1.3 Création de répertoires
sudo mkdir -p "/opt/osm-3s/database/"
sudo mkdir "/opt/osm-3s/replicate/"
sudo mkdir "/opt/osm-3s/logs/"
sudo chown overpass:overpass -R /opt/osm-3s
1.4 Installation d'Overpass
1.4.1 Téléchargement
sudo wget https://dev.overpass-api.de/releases/osm-3s_v0.7.56.9.tar.gz -P /usr/local/src/
sudo tar -xvf /usr/local/src/osm-3s_v0.7.56.9.tar.gz -C /usr/local/src/
sudo chown overpass:overpass -R /usr/local/src/osm-3s_v0.7.56.9
1.4.2 Compilation et installation
cd /usr/local/src/osm-3s_v0.7.56.9
sudo -u overpass ./configure CXXFLAGS="-O2" --prefix=/opt/osm-3s/osm-3s_v0.7.56.9
sudo apt-get install -y g++ make expat libexpat1-dev zlib1g-dev
sudo -u overpass make
sudo -u overpass make install
1.5 Installation d'Apache
1.5.1 Installation
sudo apt-get install -y apache2 libapache2-mod-auth-openidc python-certbot-apache
sudo a2enmod cgid
sudo a2enmod ext_filter
sudo a2enmod headers
sudo a2enmod setenvif
sudo a2enmod rewrite
1.5.2 Configuration
Fichier de configuration "/etc/apache2/sites-available/000-default.conf" :
<VirtualHost *:80>
ServerName nom_de_domaine
ServerAdmin mail_de_contact
DocumentRoot /var/www/html
DirectoryIndex index.html interpreter
ExtFilterDefine gzip mode=output cmd=/bin/gzip
ScriptAlias /api /opt/osm-3s/osm-3s_v0.7.56.9/cgi-bin/
LogLevel error
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/opt/osm-3s/osm-3s_v0.7.56.9/cgi-bin/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
</VirtualHost>
Note : le domaine "nom_de_domaine" lié à l'adresse IP du serveur doit être configuré dans les DNS du domaine.
1.5.3 Service
Activation et redémarrage du service :
sudo systemctl enable apache2
sudo systemctl restart apache2
1.5.4 Pare-feu (Nftables)
inet filter input tcp dport {80,443} ct state new,established accept
inet filter output tcp sport {80,443} ct state established accept
1.5.5 Certificat Let's Encrypt
sudo certbot -d nom_de_domaine --apache -n --agree-tos --email mail_de_contact
sudo certbot enhance -d nom_de_domaine -n --redirect --apache --cert-name nom_de_domaine
Note : le renouvellement automatique est mis en place dans "/etc/cron.d/certbot".
1.6 Données OSM
Avant de pouvoir utiliser l'API, il faut charger les données OSM. La méthode la plus rapide (plusieurs heures tout de même) et la plus complète est de cloner les données à l'instant T.
1.6.1 Clonage des données
su - overpass -c 'nohup /opt/osm-3s/osm-3s_v0.7.56.9/bin/download_clone.sh --db-dir=/opt/osm-3s/database --source=http://dev.overpass-api.de/api_drolbr/ --meta=attic > /opt/osm-3s/logs/download_clone.file &'
Lorsque le clonage est terminé, le répertoire "/opt/osm-3s/database" pèse environ 326 Go.
"nohup" permet d'exécuter la commande en tâche de fond (la session peut être fermée). Le fichier "/opt/osm-3s/logs/download_clone.file" contiendra les messages renvoyés par la commande.
1.6.2 Test
Une fois le clonage terminé, on vérifie que l'API trouve bien les données en exécutant "osm3s_query" et en entrant une requête (restaurants de Corse) :
/opt/osm-3s/osm-3s_v0.7.56.9/bin/osm3s_query --db-dir=/opt/osm-3s/database
<query type="node"><bbox-query n="41.969574" s="41.886688" w="8.630362" e="8.848629"/><has-kv k="amenity" v="restaurant"/></query><print/>
"Ctrl+D" pour sortir.
1.7 Dispatcher
"Dispatcher" est l'application qui permettra aux clients distants d'interroger les données OSM. Elle doit fonctionner en permanence comme un service :
su - overpass -c 'nohup /opt/osm-3s/osm-3s_v0.7.56.9/bin/dispatcher --osm-base --db-dir=/opt/osm-3s/database --attic --rate-limit=2 > /opt/osm-3s/logs/dispatcher.file &'
Une deuxième instance doit être lancée pour gérer les "areas" (cf. plus loin) :
sudo cp -R /usr/local/src/osm-3s_v0.7.56.9/rules /opt/osm-3s/database/
sudo chown overpass:overpass -R /opt/osm-3s/database/rules
su - overpass -c 'nohup /opt/osm-3s/osm-3s_v0.7.56.9/bin/dispatcher --areas --db-dir=/opt/osm-3s/database > /opt/osm-3s/logs/dispatcher_areas.file &'
Les paramètres de "dispatcher" sont les suivants :
- --osm-base : dispatcher dédié aux "données".
- --areas : dispatcher dédié aux "areas".
- --meta : renvoie les métadonnées.
- --attic : renvoie les métadonnées et les données historiques.
- --db-dir=$DB_DIR : emplacement de la base de données.
- --terminate : arrête le programme.
- --status : affiche le statut du programme.
- --my-status : affiche les informations du client.
- --show-dir : affiche l'emplacement de la base de données.
- --purge=pid : oublie le "pid".
- --query_token : affiche le "pid" de la requête du client de même IP.
- --space=number : définit la limite de mémoire pour le total de tous les processus, en octets.
- --time=number : définit la limite d'unité de temps pour le total de tous les processus, en octets.
- --rate-limit=number : définit le nombre maximal autorisé d'accès simultanés depuis une IP unique.
1.8 Mise à jour
Pour le moment, les données OSM accessibles par l'API sont celles issues du clonage à un instant T.
Pour mettre à jour les données, deux autres applications doivent fonctionner en permanence (la première pour récupérer les données, la deuxième pour les intégrer dans la base).
Les mises à jour mondiales peuvent être récupérées chaque minute, chaque heure ou chaque jour.
- Les MAJ à la minute (en moyenne de 10 Ko à 2 Mo) génèrent beaucoup de fichiers et ne laissent jamais le serveur au repos.
- Les MAJ à l'heure (en moyenne de 1 Mo à 15 Mo) s’intègrent en base en 15 à 40 minutes et laissent du répit au serveur.
- Les MAJ à la journée (en moyenne de 40 Mo à 140 Mo) sont plus lourdes mais ne nécessitent qu'une seule intégration par jour.
Dans la suite, nous configurerons une MAJ à l'heure pour avoir un équilibre entre fraicheur des données et charge du serveur.
1.8.1 Replicate ID
Le "replicate ID" est l'identifiant de la version des données, qui sera mis à jour en même temps que les données. Attention, sa valeur diffère selon la source des mises à jour (minute, heure ou journée). Dans les données clonées, il s'agit du "replicate ID" à la minute.
Il faut donc d'abord connaitre le "replicate ID" des données clonées :
tail /opt/osm-3s/database/replicate_id
> 4495994
Dans cet exemple, l'identifiant est "4495994". Celui-ci correspond à la structure des dossiers sur "planet.openstreetmap.org" pour les mises à jour à la minute. A quelle date correspond-il ?
- Pour cela, rajouter des 0 en début de chaîne pour obtenir une chaîne de 9 caractères : "004495994".
- Ensuite ajouter un / tous les 3 caractères : "004/495/994".
- Rajouter le suffixe ".state.txt" : "004/495/994.state.txt".
- Rajouter le préfixe "https://planet.openstreetmap.org/replication/minute/" : "https://planet.openstreetmap.org/replication/minute/004/495/994.state.txt".
- Ouvrir l'URL obtenue pour afficher le contenu du fichier :
#Mon Apr 12 14:11:14 UTC 2021
sequenceNumber=4495994
timestamp=2021-04-12T14\:11\:12Z
Les données datent donc du 12/04/2021 à 14H11 (temps universel, +2H en France, heure d'été).
Pour les mettre à jour à partir des données par heure, il faut trouver le "replicate id" équivalent des MAJ par heure le plus proche du 12/04/2021 à 14H11, certainement vers 14H00 (c'est à dire à l'heure antérieure la plus proche). Pour cela, il faut se rendre sur "https://planet.openstreetmap.org/replication/hour/000/" et rechercher le bon fichier à l'aide de l'horodatage des fichiers :
Le bon candidat semble être "223.state.txt" :
#Mon Apr 12 14:02:14 UTC 2021
sequenceNumber=75223
timestamp=2021-04-12T14\:00\:00Z
En effet, le "replicate id" par heure "75223" est daté du 12/04/2021 à 14H00. Donc si l'on applique les mises à jour à partir de la suivante ("75224"), notre base sera bien à jour heure par heure.