Depuis le passage au serveur Rust, la mise à jour réseau d'un fournisseur (ex. Sovacom) échouait sur « Request timed out » : chromiumoxide coupe toute commande de page au bout de 30 s, en dur (REQUEST_TIMEOUT de CommandFuture), sans tenir compte du request_timeout du navigateur. Or toute l'extraction Qlik tient dans un seul Runtime.evaluate de plusieurs minutes. Playwright, côté TS, n'avait pas cette limite. PageQlik::evaluer lance désormais le script sans l'attendre, puis relève son résultat par des évaluations courtes (20 ms → 1 s). Aucune commande CDP n'approche plus les 30 s, quelle que soit la durée de l'extraction ; la recherche produit, qui passe par la même fonction, en profite aussi. Tests : - tests/faux-qlik : faux Qlik Sense (HTTPS, NTLM → ticket → cookie, page avec jeton CSRF, mini-moteur Engine) ; - extraction_faux_qlik (ignoré par défaut) : extraction complète de bout en bout avec un vrai Chromium, y compris contre celui de l'image de prod ; - fenetre_identique_au_ts : fenêtre 12 mois identique à l'ancien TS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DTseDg4hw2m9tGUJsqPt57
CollectFlow
CollectFlow est une application de révision d'assortiment et d'analyse de performances des produits en point de vente, conçue pour consolider les données issues de plusieurs fournisseurs et magasins.
Architecture
| Partie | Technologie | Dossier |
|---|---|---|
| Serveur (API, base, FF Nancy, Qlik, synchro nocturne) | Rust — Axum, sqlx, chromiumoxide | server/ |
| Interface | React 19 + Tailwind 4, compilée en fichiers statiques par Vite | src/ |
Un seul binaire Rust sert l'API JSON (/api/..., dont l'API publique /api/v1) et l'interface compilée. Plus de Node.js à l'exécution.
Prérequis
- Docker et Docker Compose (déploiement)
- PostgreSQL 16+ (base séparée, non fournie par le conteneur)
- Pour développer : Rust stable (
rustup) et Node.js 22+
Lancer avec Docker
L'image est construite par GitHub Actions à chaque mise à jour de main et publiée sur ghcr.io/r0m1k3/collectflow:latest. Le docker-compose.yml la récupère à chaque démarrage (pull_policy: always) : une nouvelle version s'installe au prochain docker compose up -d, sans rien compiler sur le serveur.
# Une seule fois, si le paquet GHCR est privé (jeton GitHub avec le droit read:packages) :
echo <JETON> | docker login ghcr.io -u <utilisateur-github> --password-stdin
# Démarrer / mettre à jour :
docker compose up -d
L'application est accessible sur http://localhost:5643. Elle est attachée au réseau Docker externe nginx_default pour être exposée derrière le reverse proxy Nginx (docker network create nginx_default s'il n'existe pas).
Construire l'image localement plutôt que la télécharger : docker compose build.
Données et réglages
Le volume collectflow-data (/app/data) conserve les réglages saisis dans Paramètres (.db-config.json : base, Qlik, API FF, synchro nocturne), les comptes de secours (users.json) et le secret de session (.auth-secret, si AUTH_SECRET n'est pas défini). Il est repris tel quel depuis l'ancienne version Node : comptes et mots de passe restent valables (seules les sessions ouvertes sont à refaire).
Variables d'environnement utiles : DATABASE_URL, AUTH_SECRET, FF_API_BASE_URL, QLIK_HOST / QLIK_USER / QLIK_PWD (et les réglages fins QLIK_*), PG_STATEMENT_TIMEOUT_MS, FF_CACHE_TTL_S, RUST_LOG (niveau de journalisation ; par défaut info, avec sqlx et Chromium limités aux avertissements).
Développement local
# Serveur (port 5643) — tables créées et compte admin/admin initialisé au premier démarrage
cd server
DATABASE_URL=postgres://postgres:postgres@localhost/collectflow cargo run
# Interface (port 5173, /api relayé vers le serveur)
npm install
npm run dev
Vérifications : cargo test (dans server/), npm run lint, npm run build.
Structure
server/src/— serveur Rust, un module par domaine :auth(sessions, clés d'API),ff(base miroir et API FF Nancy),qlik(données réseau),grid(révision d'assortiment, API/api/v1),produits,admin(comptes, paramètres, synchronisation nocturne).server/sql/init.sql— schéma joué (idempotent) à chaque démarrage.src/— interface React :app/(écrans, mêmes dossiers que les URL),features/*par domaine,components/partagés,router.tsx(table des routes),lib/rpc.ts(appels au serveur).server/PORTING.md— contrat entre l'interface et le serveur (actions, données de pages, routes).