Debian/Jessie/FR:Installation

From OpenStreetMap Wiki
Jump to navigation Jump to search

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

    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 :

    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

    Lire : https://ircama.github.io/osm-carto-tutorials/tile-server-ubuntu/#debugging-apache-modtile-and-renderd

    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