Debian/Jessie/FR:Installation
Installation d'un serveur OSM sur Debian 8 / Jessie
Documentation
https://wiki.debian.org/OSM/tileserver/jessie
https://switch2osm.org/fr/servir-des-tuiles/construire-un-serveur-de-tuiles-depuis-des-paquets/
http://wiki.openstreetmap.org/wiki/Mod_tile
https://ircama.github.io/osm-carto-tutorials/tile-server-ubuntu/
Environnement
Cette installation a été testée sur une machine virtuelle avec les caractéristiques suivantes :
- 1 CPU
- 2 Gb RAM
- 40 Go de disque
Et sur une installation fraîche Debian 8.6 réalisée depuis le CD d'installation.
Le serveur web répondra sur :
- openstreetmap.debian pour la carte glissante
- tile.openstreetmap.debian pour les tuiles
Organisation
Toutes les données et les fichiers vont être regroupés dans un répertoire /data/ :
- data/
- backup/
- db/
- postgresql/
- osm/
- dumps/
- mapnik/
- mod_tile/
- renderd/
- styles/
- tiles/
- www/
Comptes dédiés dans le système et les applications
Pour ne pas lancer les process ou services en tant que root on crée un utilisateur standard (mais 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".
On se connecte en root sur la machine et on commence par créer l'utilisateur osm.
Préparatifs
On commence par faire une mise à jour 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
On ajoute l'utilisateur osm :
# en tant que root adduser osm Adding user `osm' ... Adding new group `osm' (1002) ... Adding new user `osm' (1001) with group `osm' ... Creating home directory `/home/osm' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for osm Enter the new value, or press {{key press|ENTER}} for the default Full Name []: OpenStreetMap Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y # on ajoute maintenant cet utilisateur au groupe des sudousers adduser osm sudo Adding user `osm' to group `sudo' Done. # il faut redémarrer pour que ça prenne effet reboot
On se reconnecte en ssh avec l'utilisateur osm pour la suite des opérations.
ssh osm@openstreetmap.debian
On crée l'arborescence des répertoires :
# on passe en root sudo -s cd / 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 /data/osm/
PostgreSQL / PostGIS
Novembre 2016 / Debian 8.6 : postgreSQL 9.4 + PostGIS 2.1
# on passe en root sudo -s # on maj ce qui doit être fait au cas où apt-get update # on installe postgre et postgis apt-get install postgresql-9.4-postgis-2.1 postgresql-contrib-9.4 0 upgraded, 49 newly installed, 0 to remove and 0 not upgraded. Need to get 29.5 MB of archives. After this operation, 119 MB of additional disk space will be used. Do you want to continue? [Y/n] y
On va maintenant configurer postgreSQL pour laisser entrer une connexion depuis une IP fixe. Ceci afin de pouvoir se connecter via pgAdmin, par exemple. Cela facilitera les opérations de maintenance courante depuis la machine hôte de la VM, par exemple.
# on édite le fichier de conf de postgre nano /etc/postgresql/9.4/main/pg_hba.conf
Descendre dans le bas du fichier et rajouter
# TYPE DATABASE USER ADDRESS METHOD # pour acces depuis IP fixe host all all 192.168.0.21/32 md5 # pour acces libre /!\ # host all all 0.0.0.0/0 md5
Maintenant il faut dire au serveur postgresql d'écouter le réseau
nano -c /etc/postgresql/9.4/main/postgresql.conf
Aller ligne 60 et rajouter ou modifier pour mettre :
listen_addresses = '*'
On change également 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'autovaccum
autovacuum = off # Enable autovacuum subprocess? 'on'
On redémarre posgreSQL
service postgresql restart
Maintenant on crée un tablespace spécifique pour pouvoir stocker la bases et donc les données de OSM dans /data/db/
# on est en root et on change les droits du répertoire chown -R postgres:postgres /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 '/data/db/';" CREATE TABLESPACE
Maintenant on crée l'utilisateur 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 (vous suivez ?)
# 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
# création d'un répertoire dédié cd /data/ sudo mkdir osm chown -R osm osm/ # on passe en utilisateur OSM su osm cd /data/osm/ mkdir dumps cd dumps # installation du logiciel permettant de charger une base postgreSQL apt install osm2pgsql
Chargement initial d'un dump complet dans la base de données
en tant que utilisateur osm cd /data/osm/dumps/ # on récupère un dump wget http://download.geofabrik.de/europe/france/bretagne-latest.osm.pbf
Maintenant il s'agit d'intégrer ce dump dans la base de données "osm" de postgreSQL. Les options :
- -d XXX : 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 XXXX Only for slim mode: Use up to num many MB of RAM for caching nodes
- --number-processes X : nombre de core / CPU à utiliser
!TODO! vérifier impact du style d'import : -S | --style
sudo apt-get install osm2pgsql osm2pgsql -d osm --hstore --slim --cache 1000 bretagne-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'import.
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 /data/db/ pour la place consommée par la base de données
Serveur web apache + mod_tile
apache + vhost
Novembre 2016 : apache 2.4
sudo apt-get install apache2
Testez en allant sur l'adresse IP du serveur. On doit tomber sur la page par défaut de apache.
Maintenant on va configurer 2 vhost qui répondront sur :
openstreetmap.debian ou www.openstreetmap.debian -> /data/osm/www
tile.openstreetmap.debian -> /data/osm/tiles
# en tant que root sudo -s # pour test touch /data/osm/www/openstreetmap.debian touch /data/osm/tiles/tile.openstreetmap.debian cd /etc/apache2/sites-available/ nano openstreetmap.debian.conf
# ----------------------------------------------------------------------- # openstreetmap.debian # ----------------------------------------------------------------------- <VirtualHost *:80> ServerName openstreetmap.debian ServerAlias www.openstreetmap.debian DocumentRoot /data/osm/www/ <Directory /data/osm/www> 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>
nano 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> ErrorLog /var/log/apache2/tile.openstreetmap.debian_error.log CustomLog /var/log/apache2/tile.openstreetmap.debian.log combined ServerAdmin webmaster@mydomain.tld </VirtualHost>
On redémarre apache et on teste les url http://openstreetmap.debian et http://tile.openstreetmap.debian
service apache2 reload
installation de mod_tile et renderd
# en tant que utilisateur osm cd /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 /usr/lib/apache2/modules/
et un fichier /usr/local/etc/renderd.conf prouvant que renderd a été installé.
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 ln -s /etc/apache2/mods-available/tile.load /etc/apache2/mods-enabled/
Choix d'un style de carte
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
On va partir sur le style officiel OSM : https://github.com/gravitystorm/openstreetmap-carto
# se connecter avec l'utilisateur osm su osm cd /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 ./<br> ./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.6G
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
On lance aussi un script spécifique pour l'indexation :
psql -d gis -f indexes.sql
configuration de renderd
Il faut maintenant modifier la configuration de renderd.
Renderd est le démon (daemon) qui va être sollicité par le serveur web pour le calcul des tuiles de cartes.
# en tant que root sudo -s cd /data/osm/renderd # on sauvegarde la conf initiale mv /usr/local/etc/renderd.conf renderd.conf_org # on edite nano /usr/local/etc/renderd.conf
Contenu du fichier renderd.conf :
[renderd] socketname=/var/run/renderd/renderd.sock num_threads=2 tile_dir=/data/osm/tiles stats_file=/var/run/renderd/renderd.stats [mapnik] plugins_dir=/usr/lib/mapnik/2.2/input font_dir=/usr/share/fonts/truetype font_dir_recurse=1 [default] URI=/ TILEDIR=/data/osm/tiles XML=/data/osm/styles/openstreetmap-carto/style.xml HOST=tile.openstreetmap.debian TILESIZE=256
Maintenant on installe renderd comme démon dans le système au même titre que apache ou postgresql.
# toujours en tant de root cd /data/osm/mod_tile/ # correction du fichier sed -i 's/DAEMON=\/usr\/bin\/$NAME/DAEMON=\/usr\/local\/bin\/$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 /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
Normalement : il ne devrait pas y avoir d'erreur relative aux sources de données utilisées par le style.
# service renderd status ● renderd.service - LSB: Mapnik rendering daemon Loaded: loaded (/etc/init.d/renderd) Active: active (running) since Sat 2016-11-26 07:30:08 CET; 1s ago Process: 31645 ExecStop=/etc/init.d/renderd stop (code=exited, status=0/SUCCESS) Process: 31651 ExecStart=/etc/init.d/renderd start (code=exited, status=0/SUCCESS) CGroup: /system.slice/renderd.service └─31659 /usr/local/bin/renderd -c /usr/local/etc/renderd.conf Nov 26 07:30:08 osm-debian renderd[31657]: DEBUG: Loading font: /usr/share/fonts/truetype/dejavu/DejaVuSerifCondensed-Italic.ttf Nov 26 07:30:08 osm-debian renderd[31657]: DEBUG: Loading font: /usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf Nov 26 07:30:08 osm-debian renderd[31657]: DEBUG: Loading font: /usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Oblique.ttf Nov 26 07:30:08 osm-debian renderd[31657]: DEBUG: Loading font: /usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf Nov 26 07:30:08 osm-debian systemd[1]: Started LSB: Mapnik rendering daemon. Nov 26 07:30:08 osm-debian renderd[31651]: Starting Mapnik rendering daemon: renderd. Nov 26 07:30:08 osm-debian renderd[31659]: Loading parameterization function for Nov 26 07:30:08 osm-debian renderd[31659]: Loading parameterization function for Nov 26 07:30:08 osm-debian renderd[31659]: Starting stats thread Nov 26 07:30:10 osm-debian renderd[31659]: Using web mercator projection settings Nov 26 07:30:10 osm-debian renderd[31659]: Using web mercator projection settings
Maintenant on fait en sorte qu'il soit démarré tout seul au reboot.
aptitude install rcconf sysv-rc-conf sysv-rc-conf
Cocher 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 vhost utilisant le mod_tile
On modifie le fichier de conf du vhost tile.openstreetmap.debian pour y rajouter le support du mod_tile.
# en tant que root 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 ->
On peut également vérifier en ligne de commande :
wget --spider http://tile.openstreetmap.debian/0/0/0.png
En cas de pb, on peut lancer renderd en mode verbeux :
service renderd stop su osm -c "renderd -f -c /usr/local/etc/renderd.conf"
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.
On va utiliser le code de démo pour OpenLayers3 : http://openlayers.org/en/latest/examples/xyz.html
# en tant que root cd /data/osm/www/ nano index.html
Le code de la page :
<!DOCTYPE html> <html> <head> <title>OSM tile server debian</title> <link rel="stylesheet" href="https://openlayers.org/en/v3.19.1/css/ol.css" type="text/css"> <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x --> <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script> <script src="https://openlayers.org/en/v3.19.1/build/ol.js"></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.
Débogguer
apache
Suivre ce qu'il se passe dans les logs apache
# en tant que root cd /var/log/apache2/ multitail -f openstreetmap.debian.log openstreetmap.debian_error.log tile.openstreetmap.debian.log tile.openstreetmap.debian_error.log
renderd
Lancer renderd en mode verbeux :
service renderd stop su osm -c "renderd -f -c /usr/local/etc/renderd.conf"
Cette erreur :
renderd[9140]: An error occurred while loading the map layer 'default': Could not create datasource for type: 'shape' encountered during parsing of layer 'world' in Layer at line 245 of '/data/osm/styles/openstreetmap-carto/style.xml'
est peut-être causée par le fait que mapnik ne va pas chercher ses plugins pour lire les fichiers au bon endroit, c'est-à-dire /usr/lib/mapnik/2.2/input.
La commande suivante permet de le vérifier et de corriger éventuellement :
mapnik-config --input-plugins