Debian/Stretch/FR:Installation

From OpenStreetMap Wiki
Jump to navigation Jump to search

Installation d'un serveur OSM sur Debian 9 / Stretch

Documentation

Debian/Jessie/FR:Installation

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 (...)