docs: README v2 — galerie multi-pages, style du site, documentation, contact
1 changed file +109 −38
modified
README.md
+109 −38
@@ -1,30 +1,55 @@ | |||||
| 1 | <!-- Auteur : Simon-Pierre Boucher — contact@spboucher.ai --> | 1 | <!-- Auteur : Simon-Pierre Boucher — contact@spboucher.ai --> | ||
| 2 | 2 | ||||
| 3 | −# Resto·Ka | 3 | +<p align="center"> | ||
| 4 | − | 4 | + <a href="https://www.resto-ka.com"><img src="https://www.resto-ka.com/og.png" width="760" alt="Resto·Ka — Chaque resto, chaque plat, chaque prix"></a> | ||
| 5 | −**Tous les restaurants du Québec — menus complets et prix réels, comparables et cherchables dans les 17 régions.** | 5 | +</p> | ||
| 6 | − | 6 | +<h1 align="center">Resto·Ka</h1> | ||
| 7 | −[](https://www.resto-ka.com) | 7 | +<p align="center"><b>Chaque resto, chaque plat, chaque prix</b></p> | ||
| 8 | − | ||||
| 9 | − | ||||
| 10 | − | ||||
| 11 | 8 | ||||
| 12 | − | 9 | +<p align="center"> | ||
| 13 | − | 10 | + <a href="https://www.resto-ka.com"><img src="https://img.shields.io/website?url=https%3A%2F%2Fwww.resto-ka.com&style=flat-square&label=www.resto-ka.com&up_color=f08c00&up_message=en%20ligne" alt="Site"></a> | ||
| 14 | − | 11 | + <a href="https://www.resto-ka.com/doc/"><img src="https://img.shields.io/badge/📖_documentation-%2Fdoc-f08c00?style=flat-square" alt="Documentation"></a> | ||
| 15 | − | 12 | + <a href="https://www.resto-ka.com/doc/resto-ka-documentation.pdf"><img src="https://img.shields.io/badge/guide-PDF-f08c00?style=flat-square" alt="PDF"></a> | ||
| 16 | − | 13 | + <img src="https://img.shields.io/badge/n%C5%93ud-M3U96b-1f6feb?style=flat-square" alt="Nœud"> | ||
| 14 | + <img src="https://img.shields.io/badge/port-8115-141814?style=flat-square" alt="Port"> | ||||
| 15 | + <img src="https://img.shields.io/badge/process-PM2-2b037a?style=flat-square" alt="PM2"> | ||||
| 16 | +</p> | ||||
| 17 | +<p align="center"> | ||||
| 18 | + <img src="https://img.shields.io/badge/Python-3.14-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python"> | ||||
| 19 | + <img src="https://img.shields.io/badge/FastAPI-API-009688?style=flat-square&logo=fastapi&logoColor=white" alt="FastAPI"> | ||||
| 20 | + <img src="https://img.shields.io/badge/React_18-Vite_+_TS-087EA4?style=flat-square&logo=react&logoColor=white" alt="React"> | ||||
| 21 | + <img src="https://img.shields.io/badge/SQLite-menus_+_prix-003B57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite"> | ||||
| 22 | + <img src="https://img.shields.io/badge/Groupe-KA-f08c00?style=flat-square" alt="Groupe KA"> | ||||
| 23 | +</p> | ||||
| 17 | 24 | ||||
| 18 | **Resto·Ka** ([www.resto-ka.com](https://www.resto-ka.com)) est l'**agrégateur exhaustif des restaurants du Québec** : chaque resto, chaque plat, chaque prix — dans les 17 régions administratives, au même endroit, comparable et cherchable **par resto ou par plat**. Les prix sont des **prix takeout réels, non majorés**, captés sur la plateforme de commande des restos eux-mêmes (pas sur les apps de livraison, majorées de 25-30 %). | 25 | **Resto·Ka** ([www.resto-ka.com](https://www.resto-ka.com)) est l'**agrégateur exhaustif des restaurants du Québec** : chaque resto, chaque plat, chaque prix — dans les 17 régions administratives, au même endroit, comparable et cherchable **par resto ou par plat**. Les prix sont des **prix takeout réels, non majorés**, captés sur la plateforme de commande des restos eux-mêmes (pas sur les apps de livraison, majorées de 25-30 %). | ||
| 19 | 26 | ||||
| 20 | **En chiffres** (base de production) : **14 091 restaurants** référencés (découverte OpenStreetMap, 17/17 régions), **79 159 plats avec prix**, **738 restos avec menu complet**, **24 chaînes suivies**, 98 % des items avec photo, 99 % géolocalisés. Pour qui ? Quiconque veut répondre à « qu'est-ce que je mange, où, et combien ça coûte ? » sans ouvrir quinze applis — là où les apps de livraison majorent et où les annuaires (Google, Yelp) n'ont ni menus structurés ni prix comparables. | 27 | **En chiffres** (base de production) : **14 091 restaurants** référencés (découverte OpenStreetMap, 17/17 régions), **79 159 plats avec prix**, **738 restos avec menu complet**, **24 chaînes suivies**, 98 % des items avec photo, 99 % géolocalisés. Pour qui ? Quiconque veut répondre à « qu'est-ce que je mange, où, et combien ça coûte ? » sans ouvrir quinze applis — là où les apps de livraison majorent et où les annuaires (Google, Yelp) n'ont ni menus structurés ni prix comparables. | ||
| 21 | 28 | ||||
| 22 | −## Captures d'écran | 29 | +## Visite guidée | ||
| 23 | − | 30 | + | ||
| 24 | −<p align="center"> | 31 | +<table> | ||
| 25 | − <img src="docs/screenshots/resto-ka-desktop.png" width="640" alt="Accueil — desktop"> | 32 | + <tr> | ||
| 26 | − <img src="docs/screenshots/resto-ka-mobile.png" width="200" alt="Accueil — mobile"> | 33 | + <td align="center"><img src="docs/screenshots/resto-ka-desktop.png" width="420"><br><sub><b>Accueil — recherche par resto ou par plat (desktop)</b></sub></td> | ||
| 27 | −</p> | 34 | + <td align="center"><img src="docs/screenshots/resto-ka-mobile.png" width="220"><br><sub><b>Accueil — version mobile</b></sub></td> | ||
| 35 | + </tr> | ||||
| 36 | + <tr> | ||||
| 37 | + <td align="center"><img src="frontend/public/doc/img/etape1.png" width="420"><br><sub><b>Étape 1 · Cherchez un resto ou un plat depuis l'accueil</b></sub></td> | ||||
| 38 | + <td align="center"><img src="frontend/public/doc/img/etape2.png" width="420"><br><sub><b>Étape 2 · Parcourez les restos d'une ville</b></sub></td> | ||||
| 39 | + </tr> | ||||
| 40 | + <tr> | ||||
| 41 | + <td align="center"><img src="frontend/public/doc/img/etape3.png" width="420"><br><sub><b>Étape 3 · Ouvrez la fiche d'un restaurant</b></sub></td> | ||||
| 42 | + <td align="center"><img src="frontend/public/doc/img/etape4.png" width="420"><br><sub><b>Étape 4 · Comparez le marché sur /stats</b></sub></td> | ||||
| 43 | + </tr> | ||||
| 44 | + <tr> | ||||
| 45 | + <td align="center"><img src="docs/screenshots/accueil.png" width="420"><br><sub><b>Accueil — variante pleine page</b></sub></td> | ||||
| 46 | + <td align="center"><img src="docs/screenshots/fiche.png" width="420"><br><sub><b>Fiche restaurant — menu structuré et prix contextualisés</b></sub></td> | ||||
| 47 | + </tr> | ||||
| 48 | + <tr> | ||||
| 49 | + <td align="center"><img src="docs/screenshots/plats.png" width="420"><br><sub><b>Recherche par plat — 79 159 items, groupés par marque</b></sub></td> | ||||
| 50 | + <td align="center"><img src="docs/screenshots/stats.png" width="420"><br><sub><b>Tableau de bord /stats — le marché resto en chiffres</b></sub></td> | ||||
| 51 | + </tr> | ||||
| 52 | +</table> | ||||
| 28 | 53 | ||||
| 29 | ## Fonctionnalités | 54 | ## Fonctionnalités | ||
| 30 | 55 | ||||
@@ -38,6 +63,37 @@ | |||||
| 38 | - **Connexion KA ID** (SSO Groupe KA), favoris unifiés « Mon univers Ka », tableau de bord `/stats` + rapports PDF (catalogue + ReportBuilder), widget **KA Agent** (chat IA). | 63 | - **Connexion KA ID** (SSO Groupe KA), favoris unifiés « Mon univers Ka », tableau de bord `/stats` + rapports PDF (catalogue + ReportBuilder), widget **KA Agent** (chat IA). | ||
| 39 | - **Registre des sources** — `data/sources.json`, à consulter avant tout ajout (statut et raison des sources non connectables). | 64 | - **Registre des sources** — `data/sources.json`, à consulter avant tout ajout (statut et raison des sources non connectables). | ||
| 40 | 65 | ||||
| 66 | +## API (endpoints principaux) | ||||
| 67 | + | ||||
| 68 | +Servis par `restoka/web.py` (FastAPI) sur le port 8115. | ||||
| 69 | + | ||||
| 70 | +| Endpoint | Rôle | | ||||
| 71 | +|---|---| | ||||
| 72 | +| `GET /api/restaurants` | recherche de restos (ville, région, cuisine, texte libre, pagination) | | ||||
| 73 | +| `GET /api/restaurants/{uid}` | fiche complète : menu structuré par contexte de prix, photos, coordonnées | | ||||
| 74 | +| `GET /api/restaurants/{uid}/prices` | historique des prix des items du resto | | ||||
| 75 | +| `GET /api/restaurants/{uid}/inspections` | inspections/permis (enrichissements MAPAQ) | | ||||
| 76 | +| `GET /api/dishes` | recherche par plat dans les 79 159 items, groupée par marque | | ||||
| 77 | +| `GET /api/facets` · `GET /api/sources` | facettes de filtres, registre des sources | | ||||
| 78 | +| `GET /api/stats` · `/api/stats/dashboard` · `/report` · `/catalog` · `POST /api/stats/report/custom` | tableau de bord + rapports PDF (catalogue et personnalisés) | | ||||
| 79 | +| `GET /api/favorites` · `POST /api/favorites/toggle` | favoris « Mon univers Ka » (session KA ID) | | ||||
| 80 | +| `POST /api/sync` | déclenchement d'une synchronisation | | ||||
| 81 | +| `GET /healthz` | santé du service | | ||||
| 82 | +| `GET /doc/` | guide d'utilisation en ligne | | ||||
| 83 | + | ||||
| 84 | +## Connecteurs | ||||
| 85 | + | ||||
| 86 | +Auto-enregistrés dans `restoka/connectors/` (requests direct / Firecrawl / Scrapfly + cache détail dans `base.py`, résilience `_resilient.py`) : | ||||
| 87 | + | ||||
| 88 | +| Connecteur | Rôle | | ||||
| 89 | +|---|---| | ||||
| 90 | +| `osm` | découverte OpenStreetMap (Overpass) — 13 500+ établissements nommés, 17/17 régions | | ||||
| 91 | +| `ueat` | connecteur templatisé UEAT (API GraphQL) — menus takeout réels de 29 intégrations de chaînes | | ||||
| 92 | +| `siteresto` | menus publiés sur le site des restos indépendants | | ||||
| 93 | +| `sitefinder` | découverte du site web / de la plateforme de commande d'un resto | | ||||
| 94 | +| `ubereats` | complément livraison (prix marqués `delivery`, jamais prioritaires sur un menu salle) | | ||||
| 95 | +| `yelp` · `yelp_scrape` | enrichissement annuaire via yelp.ca (notes, nombre d'avis, gamme de prix, catégories, fermetures) | | ||||
| 96 | + | ||||
| 41 | ## Architecture | 97 | ## Architecture | ||
| 42 | 98 | ||||
| 43 | Pipeline (patron Lou·Ka) : **connecteurs → normalisation → déduplication → SQLite → API/frontend**. | 99 | Pipeline (patron Lou·Ka) : **connecteurs → normalisation → déduplication → SQLite → API/frontend**. | ||
@@ -51,11 +107,13 @@ Pipeline (patron Lou·Ka) : **connecteurs → normalisation → déduplication | |||||
| 51 | 107 | ||||
| 52 | Processus PM2 sur le nœud : | 108 | Processus PM2 sur le nœud : | ||
| 53 | 109 | ||||
| 54 | −| Processus | Rôle | | 110 | +| Processus | Rôle | Cadence | | ||
| 55 | −|---|---| | 111 | +|---|---|---| | ||
| 56 | −| `resto-ka` | serveur FastAPI (API + frontend) sur le port **8115** | | 112 | +| `resto-ka` | serveur FastAPI (API + frontend) sur le port **8115** | continu | | ||
| 57 | −| `resto-ka-sync` | boucle de synchronisation hebdomadaire (`run.py watch`) | | 113 | +| `resto-ka-sync` | boucle de synchronisation (`run.py watch 168`) | cycle hebdomadaire (168 h) | | ||
| 58 | −| `resto-ka-ngrok` | tunnel ngrok vers **www.resto-ka.com** | | 114 | +| `resto-ka-ngrok` | tunnel ngrok vers **www.resto-ka.com** | continu | | ||
| 115 | + | ||||
| 116 | +Points de configuration notables (variables d'environnement, sans secrets dans le repo) : clés Scrapfly/Firecrawl des connecteurs, secret SSO partagé avec le hub KA ID. Le registre des sources vit dans `data/sources.json` ; la base SQLite de prod est gitignorée. | ||||
| 59 | 117 | ||||
| 60 | ## Structure du repo | 118 | ## Structure du repo | ||
| 61 | 119 | ||||
@@ -63,13 +121,19 @@ Processus PM2 sur le nœud : | |||||
| 63 | resto-ka/ | 121 | resto-ka/ | ||
| 64 | ├── run.py # point d'entrée CLI (sync / watch / serve) | 122 | ├── run.py # point d'entrée CLI (sync / watch / serve) | ||
| 65 | ├── restoka/ # cœur Python : web, db, ingest, dedup, geocode, regions, schema, normalize, auth, stats… + connectors/ | 123 | ├── restoka/ # cœur Python : web, db, ingest, dedup, geocode, regions, schema, normalize, auth, stats… + connectors/ | ||
| 66 | −├── frontend/ # React 18 + Vite + TypeScript — design éditorial sharp Groupe KA | 124 | +├── frontend/ # React 18 + Vite + TypeScript — design éditorial sharp Groupe KA + public/doc/ (guide) | ||
| 67 | ├── data/ # sources.json (registre) + base SQLite de prod (gitignorée) | 125 | ├── data/ # sources.json (registre) + base SQLite de prod (gitignorée) | ||
| 68 | ├── scripts/ # scripts d'appoint (captures, déploiement) | 126 | ├── scripts/ # scripts d'appoint (captures, déploiement) | ||
| 69 | ├── tests/ # 45 tests pytest (fixtures réelles hors ligne) | 127 | ├── tests/ # 45 tests pytest (fixtures réelles hors ligne) | ||
| 70 | └── docs/ # captures d'écran + docs connecteurs | 128 | └── docs/ # captures d'écran + docs connecteurs | ||
| 71 | ``` | 129 | ``` | ||
| 72 | 130 | ||||
| 131 | +## Documentation | ||||
| 132 | + | ||||
| 133 | +- **Guide en ligne** : [www.resto-ka.com/doc/](https://www.resto-ka.com/doc/) — à quoi sert le site, le parcours en 4 étapes (recherche → restos d'une ville → fiche → /stats), d'où viennent les données, FAQ. | ||||
| 134 | +- **Guide PDF** : [resto-ka-documentation.pdf](https://www.resto-ka.com/doc/resto-ka-documentation.pdf) — la même documentation, téléchargeable. | ||||
| 135 | +- Les captures du guide sont versionnées dans `frontend/public/doc/img/` (etape1 → etape4). | ||||
| 136 | + | ||||
| 73 | ## Développement (remote-first) | 137 | ## Développement (remote-first) | ||
| 74 | 138 | ||||
| 75 | **La source de vérité est le repo git sur le nœud M3U96b** (`~/apps/resto-ka`) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, build, `pm2 restart`, puis commit/push depuis le nœud. | 139 | **La source de vérité est le repo git sur le nœud M3U96b** (`~/apps/resto-ka`) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, build, `pm2 restart`, puis commit/push depuis le nœud. | ||
@@ -99,19 +163,26 @@ pm2 restart resto-ka # après un changement en production | |||||
| 99 | 163 | ||||
| 100 | ## Écosystème Groupe KA | 164 | ## Écosystème Groupe KA | ||
| 101 | 165 | ||||
| 102 | −- [groupe-ka.com](https://www.groupe-ka.com) — portail du groupe et compte unique KA ID | 166 | +| Plateforme | Vocation | | ||
| 103 | −- [lou-ka.com](https://www.lou-ka.com) — logements à louer | 167 | +|---|---| | ||
| 104 | −- [immo-ka.com](https://www.immo-ka.com) — propriétés à vendre | 168 | +| [groupe-ka.com](https://www.groupe-ka.com) | portail du groupe et compte unique KA ID | | ||
| 105 | −- [vrai-prix.com](https://www.vrai-prix.com) — estimation immobilière | 169 | +| [lou-ka.com](https://www.lou-ka.com) | logements à louer | | ||
| 106 | −- [auto-ka.com](https://www.auto-ka.com) — véhicules | 170 | +| [immo-ka.com](https://www.immo-ka.com) | propriétés à vendre | | ||
| 107 | −- [fabri-ka.com](https://www.fabri-ka.com) — produits québécois | 171 | +| [vrai-prix.com](https://www.vrai-prix.com) | estimation immobilière | | ||
| 108 | −- [food-ka.com](https://www.food-ka.com) — épicerie et alimentation | 172 | +| [auto-ka.com](https://www.auto-ka.com) | véhicules | | ||
| 109 | −- [resto-ka.com](https://www.resto-ka.com) — restaurants *(ce repo)* | 173 | +| [fabri-ka.com](https://www.fabri-ka.com) | produits québécois | | ||
| 110 | −- [sorti-ka.com](https://www.sorti-ka.com) — sorties et événements | 174 | +| [food-ka.com](https://www.food-ka.com) | épicerie et alimentation | | ||
| 111 | −- [job-ka.com](https://www.job-ka.com) — emplois | 175 | +| [resto-ka.com](https://www.resto-ka.com) | restaurants *(ce repo)* | | ||
| 112 | −- [crea-ka.com](https://www.crea-ka.com) — créateurs de contenu | 176 | +| [sorti-ka.com](https://www.sorti-ka.com) | sorties et événements | | ||
| 113 | −- [trouve-ka.com](https://www.trouve-ka.com) — petites annonces | 177 | +| [job-ka.com](https://www.job-ka.com) | emplois | | ||
| 114 | −- [api-ka.com](https://www.api-ka.com) — API de données | 178 | +| [crea-ka.com](https://www.crea-ka.com) | créateurs de contenu | | ||
| 179 | +| [trouve-ka.com](https://www.trouve-ka.com) | petites annonces | | ||||
| 180 | +| [api-ka.com](https://www.api-ka.com) | API de données | | ||||
| 181 | + | ||||
| 182 | +## Contact | ||||
| 183 | + | ||||
| 184 | +**Simon-Pierre Boucher** — fondateur, Groupe KA | ||||
| 185 | +📧 [contact@spboucher.ai](mailto:contact@spboucher.ai) | ||||
| 115 | 186 | ||||
| 116 | --- | 187 | --- | ||
| 117 | 188 | ||||
| 118 | 189 | ||||