Analyse et visualisation des zones de travail depuis un serveur Traccar
Trackteur Analyse interroge l'API Traccar, agrège les positions par jour et calcule les surfaces travaillées. Les résultats sont présentés dans une interface Web conviviale.
- Fonctionnalités
- Prérequis
- Installation
- Configuration
- Utilisation
- Production
- Structure du projet
- Contribution
- Licence
- OsmAnd
- Authentification avec gestion d'un utilisateur administrateur
- Récupération des positions via l'API REST Traccar
- Génération de zones journalières (DBSCAN + alphashape)
- Visualisation cartographique dynamique (Leaflet) avec affichage interactif des zones
- Menu de navigation mois/année pour parcourir les analyses
- Analyse planifiée chaque nuit grâce à APScheduler
- Stockage des données dans
instance/trackteur.db
- Python 3.8 ou supérieur
- Serveur Traccar accessible et jeton d'API
git clone <repo> && cd trackteur-analyse
pip install -r requirements.txtAu premier lancement, ouvrez l'application dans votre navigateur. Un assistant se lance automatiquement pour :
- Créer le compte administrateur
- Saisir l'URL et le token du serveur Traccar
- Choisir les appareils à suivre
- Lancer une analyse initiale
Les paramètres saisis sont enregistrés dans la base de données et restent
disponibles au redémarrage. Vous pouvez néanmoins les fournir via les variables
TRACCAR_AUTH_TOKEN et TRACCAR_BASE_URL (et TRACCAR_DEVICE_NAME si besoin)
pour surcharger la configuration.
Seule la variable FLASK_SECRET_KEY est obligatoire. Pour éviter la longue
analyse initiale à chaque démarrage, vous pouvez définir
SKIP_INITIAL_ANALYSIS=1.
Démarrer l'application :
# (optionnel) désactiver l'analyse initiale
export SKIP_INITIAL_ANALYSIS=1
python app.pyEn production, utilisez Gunicorn :
gunicorn wsgi:app --bind 0.0.0.0:8000Pour exécuter l'application comme un service systemd :
-
Créez
/etc/systemd/system/trackteur-analyse.service:[Unit] Description=Trackteur Analyse After=network.target [Service] User=trackteur WorkingDirectory=/opt/trackteur-analyse Environment="FLASK_SECRET_KEY=changer" ExecStart=/usr/bin/gunicorn wsgi:app --bind 0.0.0.0:8000 Restart=always [Install] WantedBy=multi-user.target
-
Rechargez systemd et démarrez le service :
sudo systemctl daemon-reload sudo systemctl enable --now trackteur-analyse.service
Accédez à http://localhost:5000. La page d'accueil liste les équipements, leur dernière position et les surfaces calculées. Vous pouvez lancer une analyse manuelle ou consulter le détail d'un équipement (zones par jour et carte interactive). Une analyse automatique a lieu chaque nuit à 2 h.
En plus de Traccar, l’application peut ingérer des positions via un endpoint compatible OsmAnd.
- Endpoint:
POST /osmand(JSON) ouGET /osmand(query) - Authentification: par équipement via le champ
token_api(facultatif). Si un token est renseigné sur l’équipement, il doit être fourni soit en paramètretoken=..., soit dans l’en-têteAuthorization: Bearer ...ouX-Token: .... - Appairage: créez un équipement OsmAnd dans la page Admin (champ “ID appareil”). Si un ID inconnu envoie des positions, un équipement est créé automatiquement avec
id_traccar=0etosmand_id.
Exemples d’appels:
- Requête GET simple:
/osmand?deviceid=48241179&lat=45.1234&lon=3.9876×tamp=2024-08-10T12:34:56Z&token=SECRETTOKEN
- JSON pour un seul appareil (optionnellement compressé en gzip avec
Content-Encoding: gzip):
POST /osmand
Content-Type: application/json
{
"device_id": "48241179",
"locations": [
{ "coords": {"latitude": 45.12, "longitude": 3.98}, "timestamp": "2024-08-10T12:34:56Z" },
{ "latitude": 45.13, "longitude": 3.99, "timestamp": 1723290000 }
]
}
Le même JSON peut être envoyé compressé en gzip en ajoutant l'en-tête Content-Encoding: gzip.
Notes:
- Les timestamps acceptés: UNIX (en secondes ou millisecondes), ISO8601 (
...Zou+00:00), ouYYYY-MM-DD HH:MM:SS. - Les champs
latitude/longitudepeuvent être fournis soit directement, soit viacoords: { latitude, longitude }. - Le champ optionnel
battery(oubatt) permet de transmettre le niveau de batterie de l'appareil. Il peut être un nombre (0‑100 ou 0–1) ou un objet{ "level": ... }; seule la valeur delevelest prise en compte. - L’ingestion OsmAnd met à jour
Equipment.last_positionet ajoute des lignesPositionmais ne déclenche pas d’analyse immédiate (elle reste planifiée). - Lors du polling Traccar, si les positions contiennent
batteryLeveloubatterydansattributes, ce niveau est également enregistré.
Voici les recommandations et étapes pour un déploiement sécurisé :
-
Reverse proxy HTTPS:
- Terminer TLS (nginx/traefik) devant l’app (Gunicorn).
- Forcer HTTPS et ajouter
Strict-Transport-Security(déjà géré siFORCE_HTTPS=1).
-
Variables d’environnement clés:
FLASK_SECRET_KEY: clé secrète obligatoire (longue et aléatoire).TRACCAR_AUTH_TOKEN,TRACCAR_BASE_URL(etTRACCAR_DEVICE_NAMEoptionnel) pour l’accès Traccar.TRACCAR_TIMEOUT(par défaut 10s) pour borner les appels réseau.SECURE_COOKIES=1pour sécuriser les cookies (Secure,SameSite=Lax).SESSION_COOKIE_SAMESITEpour ajuster la stratégie (Lax/Strict).START_SCHEDULER=0dans les workers web; lancer la tâche planifiée dans un processus dédié (voir ci‑dessous).SKIP_INITIAL_ANALYSIS=1pour éviter l’analyse initiale au boot si non désirée.SETUP_DISABLED=1pour désactiver l’assistant/setupen production après initialisation.- (Optionnel)
LOGIN_MAX_ATTEMPTS(défaut 10),LOGIN_WINDOW_SECONDS(défaut 900) pour le rate‑limit de/login.
-
Scheduler (analyse quotidienne):
- Ne démarrez PAS l’APScheduler dans tous les workers.
- Lancer un seul processus dédié avec
START_SCHEDULER=1, etSTART_SCHEDULER=0ailleurs. - Alternativement, exécuter l’analyse via un cron/worker externe qui appelle une commande dédiée (à ajouter si besoin).
-
Lancement service (exemple):
- Web:
START_SCHEDULER=0 SECURE_COOKIES=1 gunicorn wsgi:app -w 2 -b 0.0.0.0:8000 - Scheduler:
START_SCHEDULER=1 SECURE_COOKIES=1 gunicorn wsgi:app -w 1 -b 127.0.0.1:8001
- Web:
-
Bonnes pratiques sécurité:
- Ne jamais utiliser
python app.pyen prod (debugger Werkzeug dangereux). - Masquer le token Traccar (l’UI n’affiche plus la valeur enregistrée).
- Les actions mutantes utilisent POST + CSRF (déconnexion, relance d’analyse).
points.geojsonplafonné pour prévenir les abus; limitez l’accès ou activez du rate‑limit au besoin.
- Ne jamais utiliser
-
Sauvegarde/stockage:
- La base SQLite est stockée sous
instance/trackteur.db. Sauvegardez‑la régulièrement. - Protégez le dossier
instance/(droits système), et éviter de l’exposer au serveur HTTP.
- La base SQLite est stockée sous
app.py - Application Flask et routes principales
models.py - Modèles SQLAlchemy
zone.py - Récupération et traitement des positions
templates/ - Gabarits HTML (index, login, administration, équipement, assistant)
static/ - Export de carte Leaflet `carte_passages.html` et logo
Les issues et pull requests sont bienvenues pour signaler un bug ou proposer des améliorations.
Ce projet est distribué sous licence MIT.
