Post

uMap (Debian 11 + Python + PostgreSQL + PostGIS)

uMap (Debian 11 + Python + PostgreSQL + PostGIS)

uMap est un outil en ligne d’édition et de partage de cartes. Il permet de créer des itinéraires, de marquer des points d’intérets, de délimiter des zones, de choisir le fond de carte le plus approprié, etc…
Il est proposé sur Framacarte en partenariat avec OpenStreetMap France.(Framalibre uMap)

Prérequis

Un serveur debian avec nginx avec un domaine et certificats.

1
2
3
4
5
6
7
8
9
   Static hostname: server32771
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 0e0cc9839fc64a049ba55e3248fab176
           Boot ID: fc9dee6d430a4ad582844d08643f1bb0
    Virtualization: kvm
  Operating System: Debian GNU/Linux 11 (bullseye)
            Kernel: Linux 5.10.0-16-cloud-amd64
      Architecture: x86-64

nginx version: nginx/1.20.2
OpenSSL 1.1.1n 15 Mar 2022

Installer les différents paquets Python , PostgreSQL, PostGIS, Git, etc..

1
2
3
4
sudo apt install postgresql postgresql-server-dev-13 postgis \
python3-pip git python3-virtualenv virtualenvwrapper python3-dev python3-setuptools \
libtiff5-dev libjpeg62-turbo-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev \
tcl8.6-dev tk8.6-dev python3-tk 

Build Packages From Source in Debian (ex build-dep )

1
sudo apt install devscripts

Python3 imaging library Pillow (ex python-imaging)

1
sudo apt install python3-pil

Pour éviter l’erreur nginx + uwsgi: -- unavailable modifier requested: 0 --
Pour Python 3 , installer le plugin python pour uWSGI

1
sudo apt install uwsgi-plugin-python3 

si vous utilisez un fichier ini pour configurer votre application uWSGI, ajoutez plugins = python à la section [uwsgi] et cela devrait résoudre ce problème.

Utilisateur umap

En tant que root sur votre serveur, créer un compte utilisateur umap et son dossier** /home/umap** dans lequel seront copiés les fichiers avec les droits d’accès correspondants.

1
2
useradd -N umap -m
usermod -s /bin/bash umap

Environnement python

Se connecter en utilisateur umap

1
2
su umap 
cd /home/umap

Création environnement virtuel Python :

1
2
virtualenv -p python3 /home/umap
source /home/umap/bin/activate

Le prompt : (umap) umap@server32771:~$

Installation des librairies requises

1
2
pip install django-appconf
exit # sortir environnement

PostgreSQL

Création base de données
Ajoutez tout d’abord un utilisateur umap et sa base de données associée dans PostgreSQL :

1
2
sudo -u postgres createuser umap
sudo -u postgres createdb umap -O umap

Puis crée l’extension PostGis

1
2
3
4
sudo -u postgres psql umap
CREATE EXTENSION postgis;

(\q pour sortir de psql)

uMap

Installation serveur

Se connecter en utilisateur umap et dans l’environnement

1
2
3
su umap
cd /home/umap
source /home/umap/bin/activate

Installer le projet umap

1
pip install umap-project 

Créer le fichier de configuration local

1
wget https://raw.githubusercontent.com/umap-project/umap/master/umap/settings/local.py.sample -O local.py

Référencer le dans env

1
export UMAP_SETTINGS=`pwd`/local.py

Configuration uMap, édition fichier local.py

1
2
cp umap/settings/local.py.sample umap/settings/local.py
nano umap/settings/local.py

Dans ce fichier, il est important de définir les paramètres :

  • SECRET_KEY : une longue chaîne de caractères aléatoires
  • DEBUG = False
  • ADMINS avec vos identifiants et adresse email
  • SOCIAL_AUTH_OPENSTREETMAP_KEY, SOCIAL_AUTH_OPENSTREETMAP_SECRET et AUTHENTICATION_BACKENDS si vous voulez proposer à vos utilisateurs d’avoir un compte pour gérer leurs cartes (nous recommandons OpenStreetMap ici mais vous pouvez aussi utiliser Twitter, Github ou Bitbucket)
  • UMAP_DEMO_SITE = False
  • SITE_URL = “https://votre-site.org”
  • SHORT_SITE_URL = “https://votre-site.org” (vous pouvez utiliser un nom de domaine plus court s’il est configuré comme un alias du nom de domaine principal)
  • MAPQUEST_KEY pour permettre la recherche de lieu

Les paramètres à modifier dans la configuration uMap local.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SECRET_KEY = 'TemplePoutureSavonAconageNormeRibaudGoutteLunule'

DEBUG = False

ADMINS = (
    ('umap', 'map@cinay.eu'),
)

UMAP_DEMO_SITE = False

SITE_URL = "https://umap.yanfi.space"
SHORT_SITE_URL = "https://umap.yanfi.space"

# For static deployment
STATIC_ROOT = '/home/umap/var/static'

# For users' statics (geojson mainly)
MEDIA_ROOT = '/home/umap/var/data'

MAPQUEST_KEY = 'UatCgkjev5zvaR4uWEdNivx63tXDOno7'

remplir la base de données

1
umap migrate

importer en cache les fichiers statiques

1
umap collectstatic
1
2
3
Loaded local config from /home/umap/local.py

336 static files copied to '/home/umap/var/static'.

créer le compte administrateur uMap

1
umap createsuperuser  
1
2
3
4
5
6
Loaded local config from /home/umap/local.py
Username (leave blank to use 'umap'): 
Email address: umap@lxcyan.local
Password: 
Password (again): 
Superuser created successfully

Démarrer le serveur pour test

1
umap runserver 0.0.0.0:8000
1
2
3
4
5
6
7
8
9
10
Loaded local config from /home/umap/local.py
Loaded local config from /home/umap/local.py
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
July 30, 2022 - 10:26:24
Django version 2.2.17, using settings 'umap.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

Saisir l’adresse dans un navigateur : http://45.145.166.178:8000
uMap est fonctionnel. La page d’accueil sur l’URL http://45.145.166.178:8000/ tourne mais il ne sera pas encore possible de créer des cartes tant qu’on aura pas ajouté des fonds de carte.

Fonds de carte

Pour cela, se connecter avec le compte admin précédemment créé sur http://45.145.166.178:8000/admin et cliquez sur « Tile layers → Ajouter ».

OpenTopoMap

IGN Topo

OSM Fr

Configurer HTTP API

Se connecter en utilisateur umap et dans l’environnement

1
2
3
su umap
cd /home/umap
source /home/umap/bin/activate

Créez un fichier nommé /home/umap/uwsgi_params, avec ce contenu (sans y apporter de modification)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

Créez ensuite un fichier de configuration pour uWSGI

1
nano /home/umap/uwsgi.ini

Et collez ce contenu. Vérifiez les chemins et le nom d’utilisateur au cas où vous auriez personnalisé certains d’entre eux pendant ce tutoriel. Si vous avez suivi toutes les étapes du tutoriel sans faire aucun changement, vous pouvez l’utiliser tel quel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[uwsgi]
uid = umap
gid = users
# Python related settings
# the base directory (full path)
chdir           = /home/umap/
# umap's wsgi module
module          = umap.wsgi
# the virtualenv (full path)
home            = /home/umap 

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 4
# the socket (use the full path to be safe
socket          = /home/umap/uwsgi.sock
# ... with appropriate permissions - may be needed
chmod-socket    = 666
stats           = /home/umap/stats.sock
# clear environment on exit
vacuum          = true
plugins         = python3

Nginx umap.yanfi.space

Nous allons maintenant configurer uMap pour le rendre accessible depuis un nom de domaine avec Nginx.
Installez nginx

1
sudo apt-get install nginx

Créer un fichier de configuration

1
nano /home/umap/uwsgi-nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# the upstream component nginx needs to connect to
upstream umap {
    server unix:///home/umap/uwsgi.sock;
}

# configuration of the server
server {
    listen 80;
    listen [::]:80;
    server_name umap.yanfi.space;
    return 301 https://$host$request_uri;
}

server {
    # the port your site will be served on
    listen      443 http2;
    listen   [::]:443 http2;
    # the domain name it will serve for
    server_name umap.yanfi.space ;

    ssl_certificate /etc/ssl/private/yanfi.space-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/yanfi.space-key.pem;

    # TLS 1.3 only
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
 
    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/ssl/private/yanfi.space-fullchain.pem;
    resolver 1.1.1.1 valid=300s;

    # STS conf
    add_header Strict-Transport-Security max-age=15768000; # six months

    # max upload size
    client_max_body_size 25M;   # adjust to taste

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  umap;
        include     /home/umap/uwsgi_params;
    }
}

Certificats

Vérifier

1
openssl s_client -servername umap.yanfi.space -connect umap.yanfi.space:443 2>/dev/null | openssl x509 -noout -dates
1
2
notBefore=Jul 30 12:21:44 2022 GMT
notAfter=Oct 28 12:21:43 2022 GMT

Activer et redémarrer les services

Quitter la session umap, simplement en tapant ctrl+D (Vous devriez maintenant être connecté en tant que votre utilisateur normal)

Activer le fichier de configuration de Nginx :

1
sudo ln -s /home/umap/uwsgi-nginx.conf /etc/nginx/conf.d/umap.conf

Activer le fichier de configuration de uWSGI :

1
sudo ln -s /home/umap/uwsgi.ini /etc/uwsgi/apps-enabled/umap.ini

Vérifier nginx et relancer

1
2
sudo nginx -t
sudo systemctl restart uwsgi nginx

Maintenant vous devriez accéder à votre serveur via votre url et créer des maps
Lien https://umap.yanfi.space/

Annexe

Clé OpenStreetMap

Pour obtenir les clés OpenStreetMap, il faut que vous ayez enregistré un compte sur openstreetmap.org.
Dans « Mes options »
« paramètres OAuth » ajoutez une « application cliente ».


Clé MapQuest

Pour obtenir la clé MapQuest, rendez-vous sur developer.mapquest.com et remplissez le formulaire pour obtenir votre clé d’API.


Se connecter sur le compte et éditer la clé

Cet article est sous licence CC BY 4.0 par l'auteur.