Brocante est une PWA mobile-first pour photographier des objets en série, chercher des annonces comparables et estimer rapidement un prix de revente.
Le projet est volontairement simple : historique et photos restent dans le navigateur, l'API self-hosted ne possède pas de base de données utilisateur, et les connecteurs marketplace sont isolés derrière des providers conservateurs.
Prérequis : la version Node.js indiquée dans .node-version, npm 11 et Chromium pour Playwright.
npm ci
./node_modules/.bin/playwright install chromium
npm run devFrontend : http://localhost:5173
API : http://localhost:8787
Avant une PR :
npm run check
npm audit --omit=dev --audit-level=highLe gate mobile E2E utilise Chromium/Pixel 5 et WebKit/iPhone 12. Pour le lancer localement après un build :
npm run build -w @brocante/web
./node_modules/.bin/playwright install --with-deps chromium webkit
npm run e2e -w @brocante/webLa reconnaissance visuelle est optionnelle et utilise Ollama sur le serveur. Sans Ollama, le nom de l'objet peut être saisi avant l'analyse.
Vinted et Leboncoin sont des connecteurs web volontairement conservateurs : ils ralentissent les requêtes, limitent leur navigation et peuvent cesser de fonctionner si les sites changent ou refusent l'accès. Le projet n'ajoute pas de contournement CAPTCHA/anti-bot.
eBay utilise l'API Browse officielle quand EBAY_CLIENT_ID et EBAY_CLIENT_SECRET sont configurés côté serveur. Le provider reste désactivé par défaut dans la PWA et l'application doit rester utilisable sans eBay. Le token application OAuth est mis en cache en mémoire et n'est jamais envoyé au client. L'accès production aux Buy APIs dépend des conditions et de l'approbation eBay en vigueur ; il faut donc valider l'accès du compte développeur avant de considérer eBay comme une source disponible en production.
Le frontend est statique. L'API est prévue pour un VPS derrière HTTPS ; le docker-compose.yml ne l'expose que sur 127.0.0.1, exécute l'API en non-root/read-only, retire toutes les capabilities Linux puis ne réintroduit que SYS_CHROOT nécessaire au sandbox Chromium, et interdit l'escalade de privilèges. Le profil seccomp fourni garde le sandbox navigateur actif sans SYS_ADMIN ni mode privilégié.
Copie .env.example vers .env, configure au minimum un API_TOKEN en production, puis :
docker compose build --pull
docker compose up -d
curl --fail http://127.0.0.1:8787/healthPour la topologie HTTPS/reverse-proxy, le rollback et les incidents, suis docs/OPERATIONS.md plutôt que d'exposer directement l'API.
CI vérifie format, lint, TypeScript, tests unitaires, build, audit des dépendances, E2E mobiles Chromium/WebKit, image Docker, runtime non-root et lancement réel de Chromium sandboxé sous les mêmes restrictions de capabilities/seccomp que la configuration fournie. CodeQL tourne sur les changements et de façon planifiée. Les releases incluent des checksums et un SBOM CycloneDX.
Les réglages qui ne peuvent pas vivre dans Git — protection de main, Dependency Graph, secret scanning/push protection, private vulnerability reporting — sont listés dans docs/GITHUB_SETTINGS.md.