Commit d5cc1fc9 authored by Regis Greau's avatar Regis Greau

Merge branch 'fusion' into 'master'

Fusion

See merge request open-source/tuiles/tuileslb!1
parents 453194f3 b6ef1296
# Tuileslb
Permet de monter un loadbalancer de serveur de tuiles pour [tuilesft](https://git.beta.pole-emploi.fr/open-source/tuiles/tuilesft).
Permet de monter une infrastructure de serveur de tuiles.
Ce docker ouvre un port 80 et un port 443.
***Tuilelb est une implémentation du projet opensource [tileserver](https://hub.docker.com/r/klokantech/tileserver-gl/).***
Ce document traite de :
- L'installation du load balancer de serveur de tuiles
- le parametrage
- L'installation du projet git
- Le montage d'une architecture serveur de tuiles
- des exemples de parametrage
- la fabrication d'une carte au format .mbtiles
# Installation
......@@ -19,45 +24,155 @@ Le projet peut se paramétrer au niveau des ports, token... par le biais du fich
***Pour l'installation de docker, suivre les prérequis en annexes.***
## Paramétrage
# Montage d'une architecture serveur de tuiles avec 2 serveurs + 1 load balancer
On considerera que :
- le domaine maps.domain.tld pointe le load balancer
- le domaine mapsft1.domain.tld pointe le premier serveur de tuiles
- le domaine mapsft2.domain.tld pointe le deuxième serveur de tuiles
- docker et docker-compose sont installés (voir annexes plus bas)
Et on considèrera que le projet git est cloné :
```
$> git clone ssh://git@git.beta.pole-emploi.fr:23/open-source/tuiles/tuileslb.git
$> cd tuileslb
```
## Serveur de répartition de charge: load balancer à l'adresse `maps.domain.tld`
Création d'abord d'un .env :
```
SSL=letsencrypt
USE_CACHE=true
MAPS_TOKEN=0bf68e49728c59e806807d4bf9082b53f94a6c096ae33434ad4b1e2686b97efe
BALANCER_IPLIST=mapsft1.domain.tld mapsft2.domain.tld
```
Puis copie d'une carte de la planete Terre dans `data/` et démarrage du conteneur :
```
tuileslb$> cp planet.mbtiles data/
tuileslb$> docker-compse up -d --build
```
## Premier serveur de tuiles
Création d'abord d'un .env : (utilisation du token du load balancer)
```
URL_DOWNLOADMAP=https://maps.domain.tld/0bf68e49728c59e806807d4bf9082b53f94a6c096ae33434ad4b1e2686b97efe/planet.mbtiles
```
Puis démarrage du conteneur :
```
tuileslb$> docker-compse up -d --build
```
## Deuxième serveur de tuiles (identique au premier)
Création d'abord d'un .env : (utilisation du token du load balancer)
```
URL_DOWNLOADMAP=https://maps.domain.tld/0bf68e49728c59e806807d4bf9082b53f94a6c096ae33434ad4b1e2686b97efe/planet.mbtiles
```
Puis démarrage du conteneur :
```
tuileslb$> docker-compse up -d --build
```
# Paramétrage
L'application peut se paramétrer par le biais d'un fichier `.env` à créer à la racine du projet :
Paramètre | Options | Defaut |
-----------------------|:-------------------------------------------|:-------------------|
DOMAIN | nom de domaine web | maps.domaine.tld |
HTTP_PORT | port http | 80 |
HTTP_PORTS | port https | 443 |
BALANCER_IPLIST | liste des IP de serveurs de tuiles | 127.0.0.1 |
SSL | true\|false\|letsencrypt | letsencrypt |
SSL_LETSENCRYPTMAIL | mail de référence letsencrypt | root@$DOMAIN |
MAPS_TOKEN | token de l'url de téléchargement de la map | (valeur aléatoire) |
Paramètre | Options | Defaut |
-----------------------|:------------------------------------------------------------------|:-------------------|
DOMAIN | nom de domaine web | maps.domaine.tld |
HTTP_PORT | port http | 80 |
HTTP_PORTS | port https | 443 |
BALANCER_IPLIST | liste des IP de serveurs de tuiles (ce qui active le repartiteur) | 127.0.0.1 |
SSL | true\|false\|letsencrypt | false |
SSL_LETSENCRYPTMAIL | mail de référence letsencrypt | root@$DOMAIN |
MAPS_TOKEN | token permettant à d'autres serveurs de télécharger la map | (valeur aléatoire) |
USE_CACHE | true (=500m)\|false\|valeur (ex: 1000m): active un cache nginx | false |
USE_MAP | nom du fichiier de la map (.mbtiles) dans /data | (vide) |
URL_DOWNLOADMAP | URL de la map a télécharger et utiliser | (vide) |
## Différentes configurations et parametrage
***Exemple de fichier `.env` en mode répartiteur de charge :***
```
MAPS_TOKEN=0bf68e49728c59e806807d4bf9082b53f94a6c096ae33434ad4b1e2686b97efe
BALANCER_IPLIST=mapsft1.domain.tld:81 mapsft2.domain.tld mapsft3.domain.tld
```
***Dans cet exemple, le conteneur sera lancé en mode repartiteur de charge vers 3 autres serveurs, dont un ouvert sur port 81***
Exemple de fichier .env:
***Autre exemple avec ssl de fichier `.env` en mode répartiteur de charge :***
```
HTTP_PORT=81
SSL=letsencrypt
HTTP_PORT=80
HTTPS_PORT=443
DOMAIN=maps.domain.tld
MAPS_TOKEN=0bf68e49728c59e806807d4bf9082b53f94a6c096ae33434ad4b1e2686b97efe
BALANCER_IPLIST=mapsft1.domain.tld:81 mapsft2.domain.tld mapsft3.domain.tld
USE_CACHE=1000m # Spécifie un cache de requete de 1 go
```
***Dans cet exemple, le répartiteur de charge va chercher un certificat ssl letsencrypt***
***Note: le [projet de frontal de tuiles](https://git.beta.pole-emploi.fr/open-source/tuiles/tuilesft) propose un serveur de tuiles capable d'être servi par le loadbalancer.***
***Le loadbalancer peut devenir serveur de dépot commun de la map grâce au paramètre MAPS_TOKEN***
Le répartiteur de charge peut se servir lui-même en ajoutant l'ip 127.0.0.1, auquel cas il devient lui aussi serveur de tuiles.
Une fois le fichier `.env` renseigné, relancer l'application par :
***Exemple simple suivant sans ssl :***
```
tuileslb$> sudo docker-compose up -d --build
DOMAIN=maps.domain.tld
MAPS_TOKEN=0bf68e49728c59e806807d4bf9082b53f94a6c096ae33434ad4b1e2686b97efe
BALANCER_IPLIST=127.0.0.1 mapsft1.domain.tld:81 mapsft2.domain.tld mapsft3.domain.tld
```
***Ici MAPS_TOKEN permet à un serveur de tuile de télécharger une map sur ce serveur***
Le serveur ouvrira alors les ports `81` et `443` (dans l'exemple) et proposera une url de téléchargement sur `https://maps.domain.tld/0bf68e49728c59e806807d4bf9082b53f94a6c096ae33434ad4b1e2686b97efe/<fichier>.mbtiles`.
Il repartira la charge sur mapsft1.domain.tld:81, mapsft2.domain.tld et mapsft3.domain.tld.
## Configuration en serveur de tuiles
Les serveurs de tuiles servis par le répartiteur de charge peuvent être montés avec le même projet.
L'absence d'un fichier `.env` montera un simple serveur de tuiles. Toutefois il est conseillé de lui fournir quelques paramètres.
Exemple de fichier `.env` pour un noeud serveur de tuiles servi par le répartiteur de charge :
```
URL_DOWNLOADMAP=https://maps.domain.tld/0bf68e49728c59e806807d4bf9082b53f94a6c096ae33434ad4b1e2686b97efe/planet.mbtiles
```
***Dans cet exemple, le conteneur va tenter de télécharger une map sur le serveur de répartition avant de lancer le serveur de tuiles***
# Informations sur le fonctionnement
Un serveur de tuiles peut donc télécharger une carte au format `.mbtiles` via un serveur commun grâce à l'utilisation de `MAPS_TOKEN`. Ce paramètre doit rester rester secret et éviter d'utiliser des caractères alphanumériques uniquement.
Si possible utiliser pour `MAPS_TOKEN` un hash sha256.
Le paramètre `URL_DOWNLOADMAP` peut être utiliser pour spécifier à un noeud de se synchnoniser avec une autre carte. (téléchargement)
La carte téléchargée par chaque noeud est d'abord comparée en taille avec celle présente sur le disque. Si la carte est absente, ou différente en taille, un nouveau téléchargement se lance avant de rendre disponible le service de tuiles.
Les cartes téléchargées sont stockées dans le répertoire `data/`. Pour réinitialiser les cartes, il faut effacer le contenu de ce répertoire.
Pour la persistence des données il est souhaitable de partager les répertoires suivants avec l'host :
- /data
- /etc/nginx/conf.d/.templates
- /etc/nginx/ssl
- /etc/letsencrypt
- /var/cache/munin/www
- /var/cache/nginx
- /var/log/nginx
- /var/lib/munin
# Fabrication d'une carte au format `.mbtiles`
Il faut utiliser le projet open source [openmaptiles](git clone https://github.com/openmaptiles/openmaptiles)
```
$> git clone https://github.com/openmaptiles/openmaptiles
$> cd openmaptiles
openmaptiles$> ./quickstart.sh france # Calcule la carte de france sur la base des données d'Open Street Map
```
***Fonctionnement***
> Si SSL est à false, seul le port HTTP_PORT répondra au web.
> Si SSL est à true, alors les fichiers de certificat et clef privés devront être stockés dans loadbalancer/etc/nginx/ssl sous les noms respectifs: `fullchain.pem` et `privkey.pem`.
Un fichier `.env` peut être paramétré pour spécifier des profondeurs de zoom ainsi que d'autres infos.
***La carte générée est accessible dans `./data/` au format `.mbtiles`. Le fichier peut être copié sur le serveur servant de dépôt (voir plus haut).***
# Annexes
......
version: "2.2"
services:
tuileslb:
tuiles:
restart: always
privileged: true
hostname: tuileslb
hostname: tuiles
build:
context: .
dockerfile: ./dockerfile_loadbalancer
dockerfile: ./dockerfile_tuiles
args: