Installer sur un VPS, pas à pas
Déployer Tournevia sur un VPS Linux derrière Coolify ou un autre proxy HTTPS, avec chaque étape telle qu’elle a été exécutée sur un vrai serveur.
Ce guide installe Tournevia sur un VPS Linux dont les ports 80 et 443 appartiennent déjà à un proxy inverse HTTPS qui obtient les certificats, comme le Traefik installé par Coolify. Tournevia fonctionne comme un projet Docker distinct, à côté des autres services ; le proxy dirige votre nom d’hôte vers lui et gère le certificat.
Chaque étape ci-dessous a été exécutée le 20 octobre 2026 sur un VPS Ubuntu 24.04 de 2 vCPU et 8 Go qui fait aussi tourner Coolify 4 et une douzaine d’autres conteneurs. Les durées indiquées proviennent de ce serveur. Remplacez planner.example.com par votre nom d’hôte.
Si rien n’occupe les ports 80 et 443 de votre serveur, utilisez plutôt le proxy HTTPS fourni avec votre propre certificat : voir Installer Tournevia.
Ce qu’il vous faut
- Un serveur Linux AMD64 avec Docker Engine et Compose 2.24.4 ou plus récent, et un shell root. Vérifiez avec
docker compose version. - Des ressources adaptées à votre journée. 2 vCPU et 8 Go conviennent jusqu’à environ 100 livraisons par jour dans une ville ; voir Prérequis et dimensionnement. Prévoyez environ 2 Go de disque pour les images, les données routières et le graphe.
- Un proxy HTTPS qui découvre les conteneurs Docker. Avec Coolify, c’est Traefik sur le réseau Docker
coolify, avec un résolveur de certificats nomméletsencrypt.docker network lsaffiche le réseau. - Un nom d’hôte dont l’enregistrement DNS A pointe vers le serveur.
getent hosts planner.example.comdoit afficher l’adresse du serveur.
1. Récupérer les sources
mkdir -p /srv/tournevia
git clone https://github.com/HBlackfoxx/tournevia.git /srv/tournevia/kit
cd /srv/tournevia/kitCette commande clone le dépôt Tournevia. Un kit vérifié, extrait dans /srv/tournevia/kit, fonctionne de la même façon : voir obtenir et vérifier un kit. Sur le serveur d’essai, les sources ont été copiées sous forme d’archive du commit, car le dépôt n’était pas encore publié. Les commandes suivantes s’exécutent depuis /srv/tournevia/kit.
2. Construire les images
docker build -f deploy/Dockerfile.vroom -t france-vrp-vroom:1.14.0 .
docker build --target runtime -t tournevia-app:1 .La première commande construit le solveur de tournées, la seconde l’application. Choisissez un nom d’image que vous reconnaîtrez, ici tournevia-app:1. Sur le serveur d’essai, elles ont pris 1 min 55 s et 33 s, les deux CPU occupés ; les autres services ont continué de fonctionner.
3. Construire le graphe routier
mkdir -p deploy/runtime
curl -fL -o deploy/runtime/ile-de-france.osm.pbf https://download.geofabrik.de/europe/france/ile-de-france-latest.osm.pbf
sha256sum deploy/runtime/ile-de-france.osm.pbf
VALHALLA=$(python3 -c "import json; print(json.load(open('deploy/engines.json'))['valhalla_image'])")
docker run --rm --memory 3g --memory-swap 3g --cpus 2 --entrypoint python3 \
-v "$PWD/deploy/runtime:/data" -v "$PWD/deploy:/workspace:ro" "$VALHALLA" \
/workspace/build_graph.py region --accept-new-extract- L’extrait Île-de-France fait environ 340 Mo ; au débit de Geofabrik, son téléchargement a pris 5 min 49 s.
- Notez la date et l’empreinte SHA-256 affichée par
sha256sum: elles entrent dans le libellé des données à l’étape 4. - La construction a pris 2 min 16 s. Les plafonds
--memory 3get--cpus 2l’empêchent de prendre la mémoire dont les autres services ont besoin ; une construction Île-de-France reste sous 3 Go. --accept-new-extractest nécessaire, car les tests et les mesures du kit ont porté sur l’extrait du 22 septembre 2026, que Geofabrik ne publie plus. Avec un extrait plus récent, vérifiez les résultats à l’étape 7 avant de vous y fier.
Le graphe est écrit dans deploy/runtime/region (330 Mo). Pour toute la France, voir Toute la France : il faut un serveur plus grand.
4. Préparer l’installation
python3 scripts/start_server.py --directory /srv/tournevia/private \
--origin https://planner.example.com --behind-proxy coolify \
--routing-config region/valhalla.json \
--dataset "Geofabrik Ile-de-France downloaded 2026-10-20 (sha256 314d51020bf1); static OSM speeds" \
--image tournevia-app:1 --prepare-onlyIndiquez votre nom d’hôte, la date et l’empreinte de votre extrait et votre nom d’image. --behind-proxy coolify désigne le réseau Docker du proxy ; --routing-config exécute le routeur dans l’installation, sur un réseau privé. Cette commande ne démarre rien. Elle crée /srv/tournevia/private, lisible par root seulement, avec les secrets générés dans workspace.env et le lien privé de première utilisation dans private-setup.url, et vérifie la configuration fusionnée.
Sur un serveur partagé avec d’autres services, abaissez le plafond de mémoire du routeur de 4 Go à 3 Go :
sed -i 's/^ROUTING_MEMORY=.*/ROUTING_MEMORY=3g/' /srv/tournevia/private/workspace.envworkspace.env contient aussi les noms Traefik : PROXY_HTTPS_ENTRYPOINT, PROXY_HTTP_ENTRYPOINT et PROXY_CERT_RESOLVER valent les https, http et letsencrypt de Coolify. Pour Dokploy, le réseau est dokploy-network et les points d’entrée sont websecure et web. Un autre proxy transmet votre nom d’hôte à http://edge:8080 sur le réseau partagé ; il doit transmettre l’adresse du visiteur dans X-Forwarded-For, comme le font Traefik et Caddy. Tous les paramètres figurent dans la référence de configuration.
5. Démarrer
Exécutez la même commande sans --prepare-only :
python3 scripts/start_server.py --directory /srv/tournevia/private \
--origin https://planner.example.com --behind-proxy coolify \
--routing-config region/valhalla.json \
--dataset "Geofabrik Ile-de-France downloaded 2026-10-20 (sha256 314d51020bf1); static OSM speeds" \
--image tournevia-app:1
docker ps --format '{{.Names}} {{.Status}}' | grep tournevia-serverLe démarrage a pris 25 s sur le serveur d’essai. Cinq conteneurs fonctionnent : la base, le routeur, l’API, le worker et le serveur web edge. Aucun ne publie de port sur l’hôte : seul edge rejoint le réseau du proxy. Sur le serveur d’essai, le proxy avait obtenu le certificat du nom d’hôte moins d’une minute après le démarrage.
6. Créer l’entreprise
cat /srv/tournevia/private/private-setup.urlOuvrez dans votre navigateur l’adresse de la ligne URL=. Elle ouvre la configuration initiale en deux étapes : l’entreprise et son dépôt, trouvé par son adresse puis vérifié sur la carte, puis le compte administrateur ; voir Installer Tournevia. Le lien ne fonctionne que tant que l’installation est vide ; ne l’envoyez jamais aux exploitants.
Un court guide propose ensuite d’ajouter les véhicules, le format des numéros de livraison et les premières livraisons, ou d’essayer avec des livraisons d’exemple fictives, qu’un administrateur retire ensuite dans Paramètres → Données d’exemple ; voir Bien démarrer. Le serveur d’essai ne contient que des données fictives et sert de démonstration publique.
7. Vérifier avant usage
- Le navigateur affiche le site sans avertissement de certificat, et
http://planner.example.comredirige vershttps://. - Vous pouvez vous connecter, enregistrer une modification et la retrouver.
- Un calcul aboutit à un résultat vérifiable. Sur le serveur d’essai, les dix livraisons d’exemple fictives ont été calculées en 3,3 à 4,6 s, validation réussie et tracé routier sur chaque trajet.
- Les autres sites du serveur répondent toujours.
free -mlaisse de la place aux autres services. Sur le serveur d’essai, au moins 5,6 Go sont restés disponibles pendant le premier calcul ; après trois calculs, le routeur occupait 0,9 Go, Tournevia environ 1,1 Go au total, et 4,9 Go restaient disponibles.
8. Sauvegarder
L’outil de sauvegarde s’exécute sur le serveur avec les paquets Python du kit. Installez-les une fois :
apt install python3-venv
python3 -m venv /srv/tournevia/venv
/srv/tournevia/venv/bin/pip install -r /srv/tournevia/kit/backend/requirements.txtSi apt refuse parce qu’une installation de paquets précédente a été interrompue, terminez-la d’abord avec dpkg --configure -a, à un moment calme : elle peut redémarrer des services du système. Le serveur d’essai était dans cet état ; plutôt que de modifier les paquets système pendant l’essai, python3 -m venv --without-pip /srv/tournevia/venv suivi du script officiel get-pip.py de pip y a donné le même environnement.
Ensuite, depuis /srv/tournevia/kit :
/srv/tournevia/venv/bin/python scripts/database_backup.py --workspace /srv/tournevia/private backup --output /srv/tournevia/private/backups/$(date -u +%Y%m%dT%H%M%SZ).dump
/srv/tournevia/venv/bin/python scripts/database_backup.py --workspace /srv/tournevia/private restore /srv/tournevia/private/backups/FICHIER.dumpLa sauvegarde a pris 1,6 s avec les données fictives. Le contrôle de restauration la charge dans une base séparée et affiche son contenu, sans toucher aux données en service. Copiez les sauvegardes hors du serveur : une sauvegarde conservée uniquement sur le VPS disparaît avec lui. Chiffrement, planification et élagage : voir Sauvegarde et restauration.
9. Le nettoyage Docker de Coolify
Le nettoyage Docker de Coolify (forcé chaque nuit sur le serveur d’essai, sinon lorsque l’occupation du disque dépasse son seuil) supprime les images Docker inutilisées qu’il n’a pas créées et vide le cache de construction. Les conteneurs Tournevia en service conservent leurs images. L’image du solveur de l’étape 2 et toute image précédente de l’application sont supprimées : avant une mise à jour, sauvegardez l’image actuelle comme à l’étape 10. Si les réglages serveur de Coolify suppriment aussi les volumes inutilisés, n’arrêtez jamais Tournevia avec docker compose down, qui laisserait le volume de sa base inutilisé ; le lanceur et docker compose stop le conservent.
10. Passer à une nouvelle version
Construisez la nouvelle version depuis une copie séparée, sauvegardez l’image actuelle, mettez à jour avec le kit installé, puis mettez le kit à jour :
git clone --branch NOUVELLE_VERSION https://github.com/HBlackfoxx/tournevia.git /srv/tournevia/build
cd /srv/tournevia/build
docker image inspect france-vrp-vroom:1.14.0 >/dev/null 2>&1 || docker build -f deploy/Dockerfile.vroom -t france-vrp-vroom:1.14.0 .
docker build --target runtime -t tournevia-app:2 .
docker save -o /srv/tournevia/private/backups/tournevia-app-1.tar tournevia-app:1
cd /srv/tournevia/kit
/srv/tournevia/venv/bin/python scripts/start_server.py --directory /srv/tournevia/private --upgrade-image tournevia-app:2
git -C /srv/tournevia/kit fetch && git -C /srv/tournevia/kit checkout NOUVELLE_VERSION
rm -rf /srv/tournevia/buildLa mise à jour sauvegarde d’abord la base ; si la sauvegarde échoue, rien ne change. Elle a pris 19 s sur le serveur d’essai, sauvegarde comprise, et tous les plans enregistrés étaient encore là ensuite. Les démarrages suivants utilisent le nouveau nom d’image avec --image. Pour revenir en arrière, voir Mise à jour : docker load -i restaure l’image sauvegardée.
Recherche d’adresses sur un petit serveur
L’index d’adresses hébergé chez vous demande environ 6 Go de mémoire, ce qui ne tient pas à côté d’autres services sur un serveur de 8 Go. Tournevia peut à la place interroger le service public de la Base Adresse Nationale de l’IGN, sans compte. Sans rien changer sur le serveur, un administrateur l’active pour son entreprise pendant la configuration initiale ou dans Paramètres → Recherche d’adresses. Pour l’imposer à toutes les entreprises de l’installation, ajoutez plutôt deux lignes à workspace.env, puis relancez la commande de démarrage de l’étape 5 :
printf 'GEOCODER_URL=https://data.geopf.fr/geocodage\nGEOCODER_DATASET=Base Adresse Nationale via IGN Géoplateforme (Licence Ouverte 2.0)\n' >> /srv/tournevia/private/workspace.envChaque adresse recherchée est alors envoyée à l’IGN, y compris celles des lignes CSV sans coordonnées : décidez-en avec le propriétaire des données de livraison. Le serveur d’essai, une démonstration aux données fictives, l’utilise ; les recherches sur le site en service ont renvoyé les numéros attendus. Pour le désactiver, décochez l’option dans Paramètres → Recherche d’adresses, ou, si vous l’avez imposé, supprimez les deux lignes et relancez la commande de démarrage.
Ce qui n’a pas été essayé sur ce serveur
Une journée de 250 livraisons, le graphe France et l’index d’adresses hébergé n’ont pas été exécutés sur le VPS de 2 vCPU et 8 Go ; leurs besoins mesurés figurent dans Prérequis et dimensionnement. Le retour à une version précédente et l’installation avec le certificat fourni n’ont pas non plus été exécutés sur un VPS.