Debian/Stretch/FR:Installation
Installation d'un serveur OSM sur Debian 9 / Stretch
Documentation
Environnement
Cette installation a été testée sur une machine physique :
- GT72S 6QE
Les caractéristiques :
- CPU : Intel(R) Core(TM) i7-6820HK CPU @ 2.70GHz
- RAM : 16 Go
- Disque dur : 128 Go SSD
Le serveur web répondra sur :
- openstreetmap.debian pour délivrer la carte glissante
- tile.openstreetmap.debian pour délivrer les tuiles
Pour information : Ce serveur a un stockage de masse monté sur /home. Toutes les références aux différents répertoires et les appels de commandes auront pour racine /home. Cette racine est a adaptée fonction de l'architecture sur laquelle est reproduite la procédure d'installation décrite de cet article.
Pré-requis
On met à jour le système :
# en tant que root apt-get update apt-get upgrade
Puis, on installe quelques utilitaires basiques :
apt-get install sudo htop multitail zip unzip git wget curl
Comptes dédiés dans le système et les applications
Pour des raisons de sécurité, on n'exécutera pas les processus ou services en tant que root. Pour se faire, on crée un utilisateur "sudo-é" osm qui sera utilisé par la suite.
Le compte pour la base de données se nommera également osm. Il aura le même mot de passe que le compte UNIX.
La base de données qui va accueillir les données se nommera aussi osm.
En tant que root, on crée l'utilisateur osm :
# en tant que root adduser osm
on ajoute maintenant cet utilisateur au groupe des sudousers :
adduser osm sudo
Organisation du système de fichiers
Toutes les données et les fichiers vont être regroupés dans un répertoire /data/ :
data/ ├── backup ├── db │ └── postgresql └── osm ├── dumps <=== Répertoire de stockage des fichiers de données (ex : fichiers PBF) ├── mapnik ├── mod_tile <=== Répertoire de stockage de l'outils mod_tile ├── renderd ├── styles <=== Répertoire de stockage des stockage des feuilles de styles pour le rendu des cartes ├── tiles <=== Répertoire de stockage des tuiles générées (cache) └── www
On crée l'arborescence des répertoires dans le répertoire /home :
# on passe en root sudo -s cd /home mkdir data cd data mkdir backup mkdir db mkdir db/postgresql mkdir osm mkdir osm/dumps mkdir osm/mapnik mkdir osm/mod_tile mkdir osm/renderd mkdir osm/styles mkdir osm/tiles mkdir osm/www # on change les droits du répertoire osm chown -R osm:osm /home/data/osm/
Installation de PostgreSQL et PostGIS
Pour l'installation de PostgreSQL, le lecteur est invité à lire les notes d'installations sur le site officiel de ce projet Open Source (cf. https://www.postgresql.org/download/linux/debian/).
Et, en décembre 2018, on a :
- Debian 9.5
- postgreSQL 11.0
- PostGIS 2.5
L'installation se fait via l'exécution des commandes suivantes :
# on passe en root sudo -s # on installe postgre et postgis apt-get install postgresql-11-postgis-2.5
Pour la configuration de postgreSQL, nous mettrons en place une règle pour fonctionner localement au serveur. Pour ce faire, on édite le fichier de configuration de PostgreSQL :
nano /etc/postgresql/11/main/pg_hba.conf
Puis, on y ajoute les lignes suivantes (si besoin :
# TYPE DATABASE USER ADDRESS METHOD # pour acces depuis IP fixe host all all 127.0.0.1/32 md5 host all all ::1/128 md5
Puis, dans le fichier postgresql.conf, nous allons mettre à jour quelques paramètres :
nano -c /etc/postgresql/11/main/postgresql.conf
Puis, on change des réglages sur la mémoire :
shared_buffers = 128MB # min 128kB work_mem = 16MB # min 64kB maintenance_work_mem = 128MB # min 1MB
Et, on indique qu'on ne veut pas d'autovacuum :
autovacuum = off # Enable autovacuum subprocess? 'on'
Enfin, on redémarre le service PostgreSQL :
service postgresql restart
Maintenant, on crée un tablespace spécifique pour pouvoir stocker la bases de données et donc les données de OSM dans /home/data/db/ :
# on est en root et on change les droits du répertoire chown -R postgres:postgres /home/data/db # toujours en tant que root, on passe sur le compte admin de postgreSQL # car c'est lui qui va passer des commandes à PostgreSQL > su postgres > psql -c "CREATE TABLESPACE osm LOCATION '/home/data/db/';" CREATE TABLESPACE
Maintenant, on crée l'utilisateur dans postgreSQL osm :
# toujours en tant que root, on passe sur le compte admin de postgreSQL su postgres # on crée un utilisateur osm dans postgreSQL createuser osm # on lui donne le même mot de passe que le compte système > psql -c "ALTER USER osm WITH PASSWORD '#votremdp#';" ALTER ROLE
Pour information, si vous voulez que osm soit un super utilisateur dans PostgreSQL :
createuser osm --superuser
Maintenant, on crée la base de données osm dans le tablespace osm et appartenant à l'utilisateur osm :
# on crée la base de données osm appartenant à osm dans le tablespace osm createdb -E UTF8 -O osm --tablespace osm osm # on installe l'extension hstore dans la base : psql -c "CREATE EXTENSION hstore;" -d osm CREATE EXTENSION # et postgis : psql -c "CREATE EXTENSION postgis;" -d osm CREATE EXTENSION # ok : on sort (ou ctrl-d) exit
Intégration des données OSM
Choix d'un style de carte pour le rendu
Voir https://github.com/mapnik/mapnik/wiki/StyleShare pour une liste des styles disponibles.
- le style OSM officiel en CartoCSS : https://github.com/gravitystorm/openstreetmap-carto
- le style OSM FR en CartoCSS : https://github.com/cquest/osmfr-cartocss
- le style OSM Bright en CartoCSS de Mapbox : https://github.com/mapbox/osm-bright
- le style OSM Open Streets en CartoCSS de Mapbox : https://github.com/mapbox/open-streets-style
Installation du style officiel OSM
Le style officiel OSM : https://github.com/gravitystorm/openstreetmap-carto
Au préalable, on installe les polices qui sont nécessaires :
sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted fonts-hanazono ttf-unifont
Et maintenant, on installe le style officiel :
# se connecter avec l'utilisateur osm su osm cd /home/data/osm/styles/ # on clone le dépôt git git clone https://github.com/gravitystorm/openstreetmap-carto.git # on récupère toutes les données requises par le style cd openstreetmap-carto/ cp scripts/get-shapefiles.py ./ ./get-shapefiles.py -f # world_boundaries/* : 50 Mo # simplified-land-polygons-complete-3857/simplified_land_polygons.shp : 25 Mo # ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.shp : # land-polygons-split-3857/land_polygons.shp: 460 Mo # antarctica-icesheet-polygons-3857/icesheet_polygons.shp : 50 Mo # antarctica-icesheet-outlines-3857/icesheet_outlines.shp : 50 Mo # pour voir la place que ça prend du -sh 1.8G
Maintenant, on configure le fichier de configuration du style pour qu'il soit exploitable par renderd via mapnik. Il faut changer le nom de la base de données (gis -> osm).
# database name sed -i 's/dbname: "gis"/dbname: "osm"/' project.mml # carto.css -> mapnik xml stylesheet carto project.mml > style.xml
Sous la distribution Stretch, la dernière instruction (ci-dessus) de création de feuille de style échouera avec le message suivant :
carto: Unexpected token s
En effet, les versions de l'application carto est trop ancienne dans les dépôts DEBIAN de Stretch, d'où l'erreur (c.q.f.d. ;) ) :
carto -v > carto 0.9.5 (Carto map stylesheet compiler)
Pour installer une version plus récente, on effectuera les opérations suivantes sous l'utilisateur root (on passera par le projet nodejs pour installer une version plus récente de carto):
# Dans le home directory de root cd ~ # Désinstallation de nodejs apt-get remove nodejs # Installation des paquets pré-requis apt-get install curl software-properties-common # Installation de la version LTS de nodejs curl -sL https://deb.nodesource.com/setup_8.x | sudo bash - apt-get install -y nodejs # Installation de carto npm install -g @mapbox/carto # Vérification carto -v > carto 0.16.3 (Carto map stylesheet compiler)
On relance la commande de création de la feuille de style sous l'utilisateur osm et dans le répertoire /home/data/osm/styles/openstreetmap-carto :
su osm cd /home/data/osm/styles/openstreetmap-carto/ # carto.css -> mapnik xml stylesheet carto project.mml > style.xml
Installation d'osm2pgsql
On installe le logiciel osm2pgsql permettant de charger des fichiers PBF, dump OpenStreetMap, en base postgreSQL :
apt install osm2pgsql
Pour plus d'information sur le format PBF ("Protocolbuffer Binary Format"), le lecteur est invité à suivre le lien suivant PBF Format.
Récupération du dernier dump de la France
En tant que utilisateur osm, on récupère le dernier dump de la France :
su - osm cd /home/data/osm/dumps/ wget http://download.geofabrik.de/europe/france-latest.osm.pbf
Il est fortement recommandé de tester l'installation sur une zone géographique restreintes, comme par exemple l'île de France :
wget http://download.geofabrik.de/europe/france/ile-de-france-latest.osm.pbf
Chargement du dump pbf en base de données
Maintenant, il s'agit d'intégrer ce dump dans la base de données "osm" de postgreSQL. Les options :
- -d <base de données> : spécifie le nom de la base de données cible
- --slim : indispensable sur les machine avec peu de RAM. Cela va créer les données temporaires dans la base de données au lieu de les charger en mémoire RAM
- --cache <xxx> : Seulement pour le mode slim, utilise jusqu'à xxx Mo de RAM pour la mise en cache des nœuds
- --number-processes <xxx> : nombre de core / CPU à utiliser
- -S <fichier feuille de style> : donne le chemin d'acccés à la feuille style associé au rendu
- --tag-transform-script <fichier lua> : définit une transformation de balise Lua à utiliser à la place de la transformation de balise C intégrée.
Pour plus d'informations sur les options possibles pour cet outil, le lecteur est invité à lire la page officiel de cet outil : https://github.com/openstreetmap/osm2pgsql/blob/master/docs/usage.md
osm2pgsql -d osm --hstore --slim --cache 4000 --number-processes 4 -S ../styles/openstreetmap-carto/openstreetmap-carto.style --tag-transform-script ../styles/openstreetmap-carto/openstreetmap-carto.lua ile-de-france-latest.osm.pbf
Il est important que le rôle dans la base de données et le compte unix qui lance cette commande aient le même mot de passe. Cela évite de gérer une authentification dans les scripts d'importations.
Pour savoir quel quantité de RAM allouer à osm2pgsql, la commande free -m -h -t peut aider.
Lors du chargement, les commandes suivantes aident à voir la consommation de ressources :
- htop pour processeur et RAM
- sudo du -sh /home/data/db/ pour la place consommée par la base de données
Enfin, on lancera un script spécifique pour l'indexation :
psql -d osm -f indexes.sql
Mise en place d'un serveur WEB apache avec le module tile (mod_tile)
Installation d'apache
En pré-requis, il est nécessaire d'installer le paquet Apache2 via la commande suivante :
sudo apt-get install apache2
Pour tester, il suffit d'ouvrir un navigateur WEB et de rensiegner l'adresse IP du serveur WEB ou une adresse sur la boucle locale (toutes les adresses IPv4 comprises entre 127.0.0.1 et 127.255.255.255 dont la plus utilisée est 127.0.0.1). En pratique, nous devons voir la page par défaut d'apache.
Création des virtualhost
Une fois fait, on configure 2 virtualhost qui répondront sur :
openstreetmap.debian (avec pour documentroot : /home/data/osm/www)
tile.openstreetmap.debian (avec pour documentroot : /home/data/osm/tiles)
Pour se faire, on exécute les commandes suivantes pour créer les fichiers de configuration des virtualhosts :
# en tant que root sudo -s cd /etc/apache2/sites-available/
Puis, on crée les fichiers de configuration des virtualhost :
nano openstreetmap.debian.conf
Son contenu :
# ----------------------------------------------------------------------- # openstreetmap.debian # ----------------------------------------------------------------------- <VirtualHost openstreetmap.debian:80> ServerName openstreetmap.debian ServerAlias www.openstreetmap.debian DocumentRoot /home/data/osm/www/ <Directory /home/data/osm/> Options Indexes Includes FollowSymLinks AllowOverride None Require all granted </Directory> ErrorLog /var/log/apache2/openstreetmap.debian_error.log CustomLog /var/log/apache2/openstreetmap.debian.log combined ServerAdmin webmaster@mydomain.tld </VirtualHost>
Pour le deuxième :
nano tile.openstreetmap.debian.conf
Son contenu :
# ----------------------------------------------------------------------- # tile.openstreetmap.debian # ----------------------------------------------------------------------- <VirtualHost tile.openstreetmap.debian:80> ServerName tile.openstreetmap.debian DocumentRoot /home/data/osm/tiles/ <Directory /home/data/osm/tiles> Options Indexes Includes FollowSymLinks AllowOverride None Require all granted </Directory> ErrorLog /var/log/apache2/tile.openstreetmap.debian_error.log CustomLog /var/log/apache2/tile.openstreetmap.debian.log combined ServerAdmin webmaster@mydomain.tld </VirtualHost>
Modifier, son fichier hosts en locale pour que les URLs répondent :
nano /etc/hosts
En y ajoutant la ligne suivante :
127.0.0.1 tile.openstreetmap.debian openstreetmap.debian www.openstreetmap.debian
On active les virtualhost, via les commandes suivantes :
a2ensite openstreetmap.debian a2ensite tile.openstreetmap.debian
Enfin, on redémarre le service apache :
service apache2 reload
Enfin, on teste les URLs http://openstreetmap.debian et http://tile.openstreetmap.debian.
installation de mod_tile et renderd
Pour comprendre ce qu'est le système mod_tile, il suffit de se rendre sur la page suivante : Mod tile
Le projet Tile n'est pas dans les dépôts officiels de DEBIAN, on passera donc par une compilation de ce dernier pour installer le module tile pour Apache.
En tant qu'utilisateur OSM :
# en tant que utilisateur osm su osm cd /home/data/osm # on clone mod_tile pour le compiler et l'installer git clone https://github.com/openstreetmap/mod_tile.git chown -R osm:osm mod_tile/ cd mod_tile # on repasse en root sudo -s apt-get install autoconf libtool mapnik-utils libmapnik-dev node-carto apache2-dev 0 upgraded, 186 newly installed, 0 to remove and 0 not upgraded. Need to get 134 MB of archives. After this operation, 552 MB of additional disk space will be used. Do you want to continue? [Y/n] y # on compile ./autogen.sh ./configure make make install make install-mod_tile
On se retrouve avec un module apache mod_tile.so dans le répertoire /usr/lib/apache2/modules/.
On active le module mod_tile pour apache :
echo "LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so" > /etc/apache2/mods-available/tile.load a2enmod tile service apache2 restart
Configuration de renderd
Il faut maintenant modifier la configuration de renderd installé en même temps que mod_tile.
Renderd est le démon qui va être sollicité par le serveur web pour le calcul des tuiles de cartes.
# en tant que root sudo -s # on copie la configuration initiale cp /home/data/osm/mod_tile/renderd.conf /usr/local/etc/renderd.conf # et on édite nano /usr/local/etc/renderd.conf
Et, le contenu du fichier renderd.conf doit reprendre les paramètres suivants :
[renderd] socketname=/var/run/renderd/renderd.sock num_threads=2 tile_dir=/home/data/osm/tiles stats_file=/var/run/renderd/renderd.stats [mapnik] plugins_dir=/usr/lib/mapnik/3.0/input font_dir=/usr/share/fonts/truetype font_dir_recurse=1 [default] URI=/ TILEDIR=/home/data/osm/tiles XML=/home/data/osm/styles/openstreetmap-carto/style.xml HOST=tile.openstreetmap.debian TILESIZE=256
Ensuite, on installe renderd comme démon dans le système au même titre que apache ou postgresql :
# toujours en tant de root cd /home/data/osm/mod_tile/ # correction du fichier sed -i 's/DAEMON=\/usr\/bin\/$NAME/DAEMON=\/home\/data\/osm\/mod_tile\/$NAME/' debian/renderd.init sed -i 's/DAEMON_ARGS=""/DAEMON_ARGS=" -c \/usr\/local\/etc\/renderd.conf"/' debian/renderd.init sed -i 's/RUNASUSER=www-data/RUNASUSER=osm/' debian/renderd.init # Installation cp /home/data/osm/mod_tile/debian/renderd.init /etc/init.d/renderd chmod a+x /etc/init.d/renderd # on l'active systemctl daemon-reload service renderd start # check service renderd status
L'exécution de la dernière commande devrait donner :
● renderd.service - LSB: Mapnik rendering daemon Loaded: loaded (/etc/init.d/renderd; generated; vendor preset: enabled) Active: active (running) since Fri 2018-12-28 08:52:00 CET; 43s ago Docs: man:systemd-sysv-generator(8) Process: 5122 ExecStop=/etc/init.d/renderd stop (code=exited, status=0/SUCCESS) Process: 5161 ExecStart=/etc/init.d/renderd start (code=exited, status=0/SUCCESS) CGroup: /system.slice/renderd.service └─5182 /home/data/osm/mod_tile/.libs/renderd -c /usr/local/etc/renderd.conf
Enfin, on fait en sorte que ce service soit démarré à chaque redémarrage du serveur :
apt-get install rcconf sysv-rc-conf sysv-rc-conf
On cochera les mêmes cases que pour apache2 et postgresql, soit : 2, 3, 4, 5.
Pour info : service --status-all
permet de connaître tous les services qui tournent.
Mise en route d'un virtualhost utilisant le mod_tile
On modifie le fichier de configuration du virtualhost tile.openstreetmap.debian pour y rajouter le support du mod_tile :
# en tant que root su - nano /etc/apache2/sites-available/tile.openstreetmap.debian.conf
#----------------------------------------------------------------------- # tile.openstreetmap.debian #----------------------------------------------------------------------- <VirtualHost *:80> ServerName tile.openstreetmap.debian DocumentRoot /data/osm/tiles/ <Directory /data/osm/tiles> Options Indexes Includes FollowSymLinks AllowOverride None Require all granted </Directory> # mod_tile pour OSM LoadTileConfigFile /usr/local/etc/renderd.conf ModTileRenderdSocketName /var/run/renderd/renderd.sock # Timeout before giving up for a tile to be rendered ModTileRequestTimeout 0 # Timeout before giving up for a tile to be rendered that is otherwise missing ModTileMissingRequestTimeout 30 ErrorLog /var/log/apache2/tile.openstreetmap.debian_error.log CustomLog /var/log/apache2/tile.openstreetmap.debian.log combined ServerAdmin webmaster@mydomain.tld </VirtualHost>
On recharge apache :
service apache2 reload
A ce stade, il vaut mieux redémarrer le serveur car les modifications dans la configuration de renderd ne semblent pas effective sans (parfois) un redémarrage.
reboot
On surveille le log d'erreur pour voir si quelque chose passe :
tail -f /var/log/apache2/tile.openstreetmap.debian_error.log
On vérifie :
- http://tile.openstreetmap.debian/mod_tile/ ==> donne les stats sur le service de rendu
- http://tile.openstreetmap.debian/0/0/0.png ==> La tuile de mapmonde
On peut également vérifier en ligne de commande :
wget --spider http://tile.openstreetmap.debian/0/0/0.png
En cas de problèmes...
On peut lancer renderd en mode verbeux :
service renderd stop cd /home/data/osm/mod_tile su osm -c "./renderd -f -c /usr/local/etc/renderd.conf"
Et, ne pas oublier de créer le répertoire /var/run/renderd/ (pour gérer l'exécution du processus renderd) :
# En tant que root su - mkdir /var/run/renderd/ chown osm:osm /var/run/renderd/ -R chmod 775 /var/run/renderd/ -R
La carte glissante / slippy map
Le service de tuile est actif et répond sur http://tile.openstreetmap.debian. Maintenant, on met en place une carte pour aller l'utiliser et vérifier que tout fonctionne correctement.
On va utiliser le code de démo pour OpenLayers3 : http://openlayers.org/en/latest/examples/xyz.html
# en tant que root cd /home/data/osm/www/ nano index.html
Le code de la page :
<!DOCTYPE html> <html> <head> <title>XYZ</title> <link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" type="text/css"> <script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script> <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script> </head> <body> <div id="map" class="map"></div> <script> var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.XYZ({ url: 'http://tile.openstreetmap.debian/{z}/{x}/{y}.png' }) }) ], view: new ol.View({ center: [-472202, 7530279], zoom: 12 }) }); </script> </body> </html>
Enjoy : http://openstreetmap.debian/
Note : redémarrer la machine si les tuiles n'apparaissent pas du premier coup.
Erreurs rencontrées
Problème de lancement de renderd : problème sur l'importation du fichier PBF
A la première importation des données via l'outil osm2pgsql via la commande suivante sans spécifier la feuille de style et les transformation lua :
osm2pgsql -d osm --hstore --slim --cache 4000 --number-processes 4 france-latest.osm.pbf
L'erreur suivante empêche le lancement du service renderd :
An error occurred while loading the map layer 'default': Could not create datasource for type: 'shape' encountered during parsing of layer 'world'
Problème de lancement de renderd : problème de paramétrage
Rechercher le chemin du plugin mapnik par :
mapnik-config --input-plugins
Puis, modifier le fichier /usr/local/etc/renderd.conf avec le chemin donné.
Problème de version de l'outils carto dans les dépôts DEBIAN
L'application carto est trop ancienne dans les dépôts DEBIAN de Stretch.
La mise à jour de cette dernière est détaillée dans le chapitre relatant de l'installation du style de rendu de la cartogaphie.
Problème Postgis Plugin: ERROR: column "name" does not exist
Ce problème peut apparaître lors du rendu avec renderd car il manque le nom de colonne name dans la requête SQL du style officiel OSM style.xml.
Ouvrir le fichier style.xml, chercher la requête et ajouter la colonne name :
(...) SELECT way, way_pixels, name, COALESCE(wetland, landuse, "natural") AS feature FROM (SELECT name, way, ('landuse_' || (CASE WHEN landuse IN (...)