docs: README v3 — chiffres live vérifiés, pastilles dynamiques, sections complètes
1 changed file +131 −52
modified
README.md
+131 −52
@@ -6,23 +6,39 @@ | ||
| 6 | 6 | |
| 7 | 7 | <p align="center"><b>Toutes les propriétés à vendre du Québec — maisons, condos, plex et terrains — réunies au même endroit, toujours à jour.</b></p> |
| 8 | 8 | |
| 9 | −<p align="center"> | |
| 10 | − <a href="https://www.immo-ka.com"><img src="https://img.shields.io/website?url=https%3A%2F%2Fwww.immo-ka.com&style=flat-square&label=www.immo-ka.com&up_color=e23744" alt="Site"></a> | |
| 11 | − <a href="https://www.immo-ka.com/doc/"><img src="https://img.shields.io/badge/📖_documentation-%2Fdoc-e23744?style=flat-square" alt="Documentation"></a> | |
| 12 | − <a href="https://www.immo-ka.com/doc/immo-ka-documentation.pdf"><img src="https://img.shields.io/badge/guide-PDF-e23744?style=flat-square" alt="Guide PDF"></a> | |
| 13 | − <img src="https://img.shields.io/badge/n%C5%93ud-M4M64a-1f6feb?style=flat-square" alt="Nœud"> | |
| 14 | − <img src="https://img.shields.io/badge/port-8096-555?style=flat-square" alt="Port"> | |
| 15 | − <img src="https://img.shields.io/badge/process-PM2-2b037a?style=flat-square" alt="PM2"> | |
| 16 | − <img src="https://img.shields.io/badge/Python-FastAPI-3776ab?style=flat-square&logo=python&logoColor=white" alt="Python FastAPI"> | |
| 17 | − <img src="https://img.shields.io/badge/React_18-Vite_%2B_TS-61dafb?style=flat-square&logo=react&logoColor=black" alt="React 18"> | |
| 18 | − <img src="https://img.shields.io/badge/SQLite-WAL-003b57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite"> | |
| 19 | − <img src="https://img.shields.io/badge/Ka_Maps-Mapbox_GL_3D-4264fb?style=flat-square" alt="Ka Maps"> | |
| 20 | − <img src="https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square" alt="Groupe KA"> | |
| 21 | −</p> | |
| 9 | +<div align="center"> | |
| 10 | + | |
| 11 | +<a href="https://www.immo-ka.com"><img src="https://img.shields.io/website?url=https%3A%2F%2Fwww.immo-ka.com&style=flat-square&label=www.immo-ka.com&up_color=e23744" alt="Site"></a> | |
| 12 | +<a href="https://www.immo-ka.com/doc/"><img src="https://img.shields.io/badge/📖_documentation-%2Fdoc-e23744?style=flat-square" alt="Documentation"></a> | |
| 13 | +<a href="https://www.immo-ka.com/doc/immo-ka-documentation.pdf"><img src="https://img.shields.io/badge/guide-PDF-e23744?style=flat-square" alt="Guide PDF"></a> | |
| 14 | +<img src="https://img.shields.io/badge/n%C5%93ud-M4M64a-1f6feb?style=flat-square" alt="Nœud"> | |
| 15 | +<img src="https://img.shields.io/badge/port-8096-555?style=flat-square" alt="Port"> | |
| 16 | +<img src="https://img.shields.io/badge/PM2-3_processus-2b037a?style=flat-square" alt="PM2"> | |
| 17 | + | |
| 18 | +<a href="https://www.immo-ka.com/api/stats"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.immo-ka.com%2Fapi%2Fstats&query=%24.total&label=propri%C3%A9t%C3%A9s&color=e23744&style=flat-square" alt="Propriétés (live)"></a> | |
| 19 | +<a href="https://www.immo-ka.com/api/stats"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.immo-ka.com%2Fapi%2Fstats&query=%24.sources&label=sources&color=e23744&style=flat-square" alt="Sources (live)"></a> | |
| 20 | +<a href="https://www.immo-ka.com/api/stats"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.immo-ka.com%2Fapi%2Fstats&query=%24.cities&label=villes&color=e23744&style=flat-square" alt="Villes (live)"></a> | |
| 21 | +<img src="https://img.shields.io/badge/banni%C3%A8res-44-234438?style=flat-square" alt="Bannières"> | |
| 22 | +<img src="https://img.shields.io/badge/sous--agences-424-234438?style=flat-square" alt="Sous-agences"> | |
| 23 | +<img src="https://img.shields.io/badge/connecteurs-105-234438?style=flat-square" alt="Connecteurs"> | |
| 24 | + | |
| 25 | +<img src="https://img.shields.io/badge/Python-FastAPI-3776ab?style=flat-square&logo=python&logoColor=white" alt="Python FastAPI"> | |
| 26 | +<img src="https://img.shields.io/badge/React_18-Vite_%2B_TS-61dafb?style=flat-square&logo=react&logoColor=black" alt="React 18"> | |
| 27 | +<img src="https://img.shields.io/badge/SQLite-WAL-003b57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite"> | |
| 28 | +<img src="https://img.shields.io/badge/Ka_Maps-Mapbox_GL_3D-4264fb?style=flat-square" alt="Ka Maps"> | |
| 29 | +<img src="https://img.shields.io/badge/PM2-prod-2b037a?style=flat-square&logo=pm2&logoColor=white" alt="PM2"> | |
| 30 | +<img src="https://img.shields.io/badge/ngrok-tunnel-1f1e37?style=flat-square&logo=ngrok&logoColor=white" alt="ngrok"> | |
| 31 | +<img src="https://img.shields.io/badge/KA_ID-SSO-e23744?style=flat-square" alt="KA ID"> | |
| 32 | +<img src="https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square" alt="Groupe KA"> | |
| 33 | +<a href="https://git.spboucher.ai"><img src="https://img.shields.io/badge/remote--first-spbgit-f05032?style=flat-square&logo=git&logoColor=white" alt="spbgit"></a> | |
| 34 | + | |
| 35 | +</div> | |
| 22 | 36 | |
| 23 | −**Immo-Ka** est un **agrégateur immobilier indépendant** pour la province de Québec. Chercher une propriété, c'est normalement jongler entre les sites de RE/MAX, Royal LePage, Sutton, Via Capitale, Century 21, DuProprio et des dizaines d'autres bannières — chacun avec sa navigation, ses filtres et son format. Immo-Ka retourne le problème : **un connecteur dédié par source** (105 connecteurs enregistrés — flux centraux de bannières, sous-agences en plan B, plateformes sans courtier) visite chaque site, **normalise chaque annonce vers un schéma unique** (`PropertyListing`), **déduplique par numéro Centris** et détecte les changements en continu, avec lien direct vers l'annonce originale. | |
| 37 | +*Les pastilles « propriétés / sources / villes » sont **dynamiques** : elles interrogent `https://www.immo-ka.com/api/stats` en direct.* | |
| 24 | 38 | |
| 25 | −Les sites d'agences n'offrent pas de webhooks : Immo-Ka en reproduit l'équivalent par **synchronisation périodique + hash de contenu** — ajouts, changements de prix et retraits (propriété vendue) détectés automatiquement, avec délai de grâce contre les ratés ponctuels. Couverture (métriques de l'agrégat) : **67 700+ propriétés actives** (67 705 au 2026-08-24), **48 sources**, **22 bannières**, **159 sous-agences**, **3 262 villes**. C'est le pendant « à vendre » de [Lou-Ka](https://www.lou-ka.com) (location), branché sur le moteur d'estimation [Vrai-Prix](https://www.vrai-prix.com) et sur le compte unique **KA ID** du Groupe KA. | |
| 39 | +**Immo-Ka** est un **agrégateur immobilier indépendant** pour la province de Québec. Chercher une propriété, c'est normalement jongler entre les sites de RE/MAX, Royal LePage, Sutton, Via Capitale, Century 21, DuProprio et des dizaines d'autres bannières — chacun avec sa navigation, ses filtres et son format. Immo-Ka retourne le problème : **un connecteur dédié par source** (105 connecteurs enregistrés, dont 72 connecteurs de sous-agences — flux centraux de bannières, sous-agences en plan B, plateformes sans courtier) visite chaque site, **normalise chaque annonce vers un schéma unique** (`PropertyListing`), **déduplique par numéro Centris** et détecte les changements en continu, avec lien direct vers l'annonce originale. | |
| 40 | + | |
| 41 | +Les sites d'agences n'offrent pas de webhooks : Immo-Ka en reproduit l'équivalent par **synchronisation périodique + hash de contenu** — ajouts, changements de prix et retraits (propriété vendue) détectés automatiquement, avec délai de grâce contre les ratés ponctuels. Couverture (métriques de l'agrégat) : **67 700 propriétés actives** (67 692 au 2026-08-24), **48 sources** avec annonces actives (62 au registre), **44 bannières**, **424 sous-agences**, **3 274 villes**. C'est le pendant « à vendre » de [Lou-Ka](https://www.lou-ka.com) (location), branché sur le moteur d'estimation [Vrai-Prix](https://www.vrai-prix.com) et sur le compte unique **KA ID** du Groupe KA. | |
| 26 | 42 | |
| 27 | 43 | ## Visite guidée |
| 28 | 44 | |
@@ -53,6 +69,20 @@ Les sites d'agences n'offrent pas de webhooks : Immo-Ka en reproduit l'équivale | ||
| 53 | 69 | </tr> |
| 54 | 70 | </table> |
| 55 | 71 | |
| 72 | +## Chiffres clés (au 2026-08-24, `/api/stats` live) | |
| 73 | + | |
| 74 | +| Mesure | Valeur | | |
| 75 | +|---|---| | |
| 76 | +| Propriétés actives (dédupliquées par Centris) | **67 692** | | |
| 77 | +| Sources avec annonces actives | **48** (registre : 62 sources — 54 actives, 6 à brancher, 2 inactives) | | |
| 78 | +| Bannières au registre des agences | **44** | | |
| 79 | +| Sous-agences (bureaux) au registre | **424** | | |
| 80 | +| Villes couvertes | **3 274** | | |
| 81 | +| Connecteurs enregistrés | **105** (dont 72 connecteurs de sous-agences) | | |
| 82 | +| Prix moyen demandé | **≈ 683 700 $** (min 400 $ · max 50 M$) | | |
| 83 | +| Annonces comparées au Vrai-Prix | **45 053** — écart médian **+8,8 %** vs estimation (48,3 % sur-évaluées de >10 %, 24,2 % alignées, 27,5 % sous l'estimation) | | |
| 84 | +| Base principale | `data/immoka.db` **1,3 Go** (WAL) + 9 bases annexes | | |
| 85 | + | |
| 56 | 86 | ## Fonctionnalités |
| 57 | 87 | |
| 58 | 88 | - **Recherche & filtres** — texte libre (adresse, ville, n° MLS), ville + secteur, type, agence, prix, chambres, salles de bain, superficie ; tri par prix ou récence ; état encodé dans l'URL (partageable). |
@@ -64,7 +94,7 @@ Les sites d'agences n'offrent pas de webhooks : Immo-Ka en reproduit l'équivale | ||
| 64 | 94 | - **Quartier** — aire de diffusion du recensement : revenu médian, loyer moyen, % locataires, proximité épiceries/parcs/soins (StatCan), îlot de chaleur (INSPQ). |
| 65 | 95 | - **Couches territoriales** — registre des loyers, zones inondables (BDZI), qualité de l'air, prix de l'essence, commerces et transport en commun, **estimation Hydro-Québec précalculée** lors de la sync. |
| 66 | 96 | - **Stats** — tableau de bord `/stats` : volumes par type et bannière, écart prix demandé vs estimation Vrai-Prix, panneaux territoire + rapport PDF Groupe-KA. |
| 67 | −- **Agences** — registre par bannière → sous-agence, comptes d'annonces dédupliqués. | |
| 97 | +- **Agences** — registre par bannière → sous-agence (44 bannières, 424 bureaux), comptes d'annonces dédupliqués. | |
| 68 | 98 | - **KA ID & favoris** — SSO du hub groupe-ka.com (JWT HS256), favoris partagés sur toutes les plateformes Ka ; widget de chat **KA Agent** intégré. |
| 69 | 99 | - **SEO programmatique** — HTML complet rendu côté serveur, une page indexable par ville / type / ville+type, sitemaps et données structurées. |
| 70 | 100 | |
@@ -72,35 +102,39 @@ Les sites d'agences n'offrent pas de webhooks : Immo-Ka en reproduit l'équivale | ||
| 72 | 102 | |
| 73 | 103 | Toutes les données servies au frontend passent par une API JSON publique (FastAPI) : |
| 74 | 104 | |
| 75 | −| Endpoint | Rôle | | |
| 76 | −|---|---| | |
| 77 | −| `GET /api/listings` | recherche paginée : texte libre, ville, type, agence, prix, chambres/sdb, superficie, tri | | |
| 78 | −| `GET /api/listings/{uid}` | fiche complète d'une annonce (photos, pièces, enrichissements, estimation) | | |
| 79 | −| `GET /api/listings.geojson` | flux GeoJSON pour la carte Ka Maps (grappes + marqueurs) | | |
| 80 | −| `GET /api/facets` | facettes dynamiques (villes, types, agences, fourchettes de prix) | | |
| 81 | −| `GET /api/sources` · `GET /api/agencies` | état des connecteurs et registre bannières → sous-agences | | |
| 82 | −| `GET /api/hydro` · `/api/commerces` · `/api/air` · `/api/gaz` · `/api/inondation` | couches territoriales d'une fiche | | |
| 83 | −| `GET /api/stats` · `/api/stats/dashboard` | métriques agrégées et tableau de bord | | |
| 84 | −| `GET /api/stats/report` · `/api/stats/catalog` · `POST /api/stats/report/custom` | rapports PDF Groupe-KA (standard et personnalisés) | | |
| 85 | −| `POST /api/sync` | déclenchement d'une synchronisation | | |
| 86 | −| `GET /robots.txt` · `/sitemap.xml` · `/sitemaps/{name}` · `/api/seo/resolve` | infrastructure SEO | | |
| 105 | +| Endpoint | Méthode | Description | | |
| 106 | +|---|---|---| | |
| 107 | +| `/api/listings` | GET | recherche paginée : texte libre, ville, type, agence, prix, chambres/sdb, superficie, tri | | |
| 108 | +| `/api/listings/{uid}` | GET | fiche complète d'une annonce (photos, pièces, enrichissements, estimation) | | |
| 109 | +| `/api/listings.geojson` | GET | flux GeoJSON pour la carte Ka Maps (grappes + marqueurs) | | |
| 110 | +| `/api/facets` | GET | facettes dynamiques (villes, types, agences, fourchettes de prix) | | |
| 111 | +| `/api/sources` | GET | état des 62 sources du registre (statut, connecteur, annonces actives, dernier sync) | | |
| 112 | +| `/api/agencies` | GET | registre bannières → sous-agences (44 bannières, 424 bureaux, comptes dédupliqués) | | |
| 113 | +| `/api/hydro` · `/api/commerces` · `/api/air` · `/api/gaz` · `/api/inondation` | GET | couches territoriales d'une fiche | | |
| 114 | +| `/api/stats` | GET | métriques agrégées live (total, sources, villes, prix, écarts Vrai-Prix par bannière) | | |
| 115 | +| `/api/stats/dashboard` | GET | données du tableau de bord `/stats` | | |
| 116 | +| `/api/stats/report` · `/api/stats/catalog` | GET | rapport PDF Groupe-KA standard et catalogue des blocs | | |
| 117 | +| `/api/stats/report/custom` | POST | rapport PDF personnalisé (sélection de blocs) | | |
| 118 | +| `/api/sync` | POST | déclenchement d'une synchronisation | | |
| 119 | +| `/robots.txt` · `/sitemap.xml` · `/sitemaps/{name}` · `/api/seo/resolve` | GET | infrastructure SEO | | |
| 87 | 120 | |
| 88 | 121 | ## Connecteurs & sources |
| 89 | 122 | |
| 90 | 123 | **105 connecteurs enregistrés** (paquet `immoka/connectors/`), un par source, orchestrés par la boucle d'ingestion : |
| 91 | 124 | |
| 92 | −| Famille de sources | Exemples | Technique d'extraction | | |
| 93 | −|---|---|---| | |
| 94 | −| Flux centraux de bannières | RE/MAX Québec, Royal LePage, Sutton, Via Capitale, Century 21, Proprio Direct | API JSON internes (Meilisearch, Algolia, source.immo, wp-json) | | |
| 95 | −| Sous-agences (plan B) | 159 bureaux — KW Distinction/Prestige/Urbain, eXp Québec, Barnes, Engel & Völkers, BHHS… | API du site du bureau, JSON-LD, sitemaps | | |
| 96 | −| Sans courtier / petites annonces | DuProprio, Kijiji, LesPAC, Facebook Marketplace | API publiques + extraction dédiée | | |
| 97 | −| Sites vitrines & SPA anti-bot | agences boutique (Charisma, Imcha, Immeubles Stuart…), GuideHabitation | JSON-LD génériques, sitemaps, Firecrawl en secours | | |
| 125 | +| Famille de sources | Exemples | Technique d'extraction | Cadence | | |
| 126 | +|---|---|---|---| | |
| 127 | +| Flux centraux de bannières | RE/MAX Québec, Royal LePage, Sutton, Via Capitale, Century 21, Proprio Direct | API JSON internes (Meilisearch, Algolia, source.immo, wp-json) | sync complète aux 4 h | | |
| 128 | +| Sous-agences (plan B) | 72 connecteurs de bureaux — KW Distinction/Prestige/Urbain, eXp Québec, Barnes, Engel & Völkers, BHHS… | API du site du bureau, JSON-LD, sitemaps | sync complète aux 4 h | | |
| 129 | +| Sans courtier / petites annonces | DuProprio, Kijiji, LesPAC, Facebook Marketplace | API publiques + extraction dédiée | sync complète aux 4 h | | |
| 130 | +| Sites vitrines & SPA anti-bot | agences boutique (Charisma, Imcha, Immeubles Stuart…), GuideHabitation | JSON-LD génériques, sitemaps, Firecrawl en secours | sync complète aux 4 h | | |
| 98 | 131 | |
| 99 | 132 | - **Normalisation** : chaque annonce est projetée vers le schéma unique `PropertyListing` (`immoka/schema.py`). |
| 100 | 133 | - **Dédup** : par numéro Centris (`dup_hidden`) — une propriété affichée par 3 sites = 1 fiche, sources créditées. |
| 101 | 134 | - **Détection de changements** : upsert par **hash de contenu** ; retraits avec **délai de grâce** contre les ratés ponctuels d'un site. |
| 102 | 135 | - **Qualité** : couche `quality.py` + `imgaudit.py` — annonces publiées vs **quarantaine**, audit des images, golden record. |
| 103 | 136 | - **Cadence** : resynchronisation complète **aux 4 heures** (`run.py watch 240`, processus `immo-ka-sync`), enrichissements (géocodage, POI, quartier, Vrai-Prix, Hydro-Québec) appliqués au fil de la sync. |
| 137 | +- **Supervision** : les connecteurs sont surveillés par les gardiens autonomes du Groupe KA (agents ka2/ka4/ka6, supervision api-ka), fiches docs générées par `scripts/gen_connector_docs.py`. | |
| 104 | 138 | |
| 105 | 139 | ## Architecture |
| 106 | 140 | |
@@ -110,10 +144,10 @@ Toutes les données servies au frontend passent par une API JSON publique (FastA | ||
| 110 | 144 | | `immoka/ingest.py` + `normalize.py` + `schema.py` | boucle de sync : normalisation vers `PropertyListing`, upsert par hash de contenu, dédup Centris (`dup_hidden`), délai de grâce sur les retraits | |
| 111 | 145 | | `immoka/web.py` + `seo.py` | FastAPI : API JSON, rendu SEO serveur, service du build frontend | |
| 112 | 146 | | Enrichissement | `geocode.py`, `poi.py`, `quartier.py`, `vraiprix.py`/`vraiprix_local.py`, `hydro.py`, `inondation.py`, `air.py`, `gaz.py`, `commerces.py`, `quality.py`/`imgaudit.py` (couche qualité + quarantaine) | |
| 113 | −| Base de données | **SQLite en mode WAL** : `data/immoka.db` (annonces) + bases annexes (`quartier.db`, `vraiprix.db`, `hydro.db`, `air.db`, `gaz.db`, `commerces.db`, `inondation.db`, `transit.db`, `rdl.db`) | | |
| 147 | +| Base de données | **SQLite en mode WAL** : `data/immoka.db` (annonces, 1,3 Go) + bases annexes (`quartier.db`, `vraiprix.db`, `hydro.db`, `air.db`, `gaz.db`, `commerces.db`, `inondation.db`, `transit.db`, `rdl.db`) | | |
| 114 | 148 | | Frontend | React 18 + Vite + TypeScript, react-router, design system ka-ui, cartes `@groupe-ka/ka-maps` (Mapbox GL 3.28) | |
| 115 | 149 | |
| 116 | −**Processus PM2 (production)** : | |
| 150 | +**Processus PM2 (production, vérifiés live)** : | |
| 117 | 151 | |
| 118 | 152 | | Processus | Commande | Rôle | |
| 119 | 153 | |---|---|---| |
@@ -129,9 +163,55 @@ Toutes les données servies au frontend passent par une API JSON publique (FastA | ||
| 129 | 163 | | `frontend/` | SPA React 18 + Vite + TypeScript (pages, composants, ka-maps, ka-ui) | |
| 130 | 164 | | `data/` | bases SQLite (immoka.db + bases annexes) et registres d'agences JSON | |
| 131 | 165 | | `docs/` | captures d'écran, docs des connecteurs, rapports de validation | |
| 132 | −| `scripts/` | outillage (génération des docs connecteurs, rafraîchissement Via Capitale, validation du rendu) | | |
| 166 | +| `scripts/` | outillage : `gen_connector_docs.py` (fiches des connecteurs), `refresh_via_capitale.py`, `valider_rendu.py` (validation du rendu SSR) | | |
| 133 | 167 | | `run.py` / `requirements.txt` | point d'entrée CLI (`sync`, `watch`, `serve`, `list`, `geocode`, `poi`, `quartier`, …) et dépendances backend | |
| 134 | 168 | |
| 169 | +## Démarrage rapide | |
| 170 | + | |
| 171 | +```bash | |
| 172 | +ssh M4M64a && cd ~/apps/immo-ka # source de vérité (remote-first) | |
| 173 | + | |
| 174 | +# Backend | |
| 175 | +python3 -m venv .venv && .venv/bin/pip install -r requirements.txt | |
| 176 | + | |
| 177 | +# Frontend (dev : npm run dev ; prod : build servi par FastAPI) | |
| 178 | +cd frontend && npm install && npm run build && cd .. | |
| 179 | + | |
| 180 | +# Ingestion et service | |
| 181 | +.venv/bin/python run.py list # lister les 105 connecteurs | |
| 182 | +.venv/bin/python run.py sync # synchroniser tout (ou : sync <source> …) | |
| 183 | +.venv/bin/python run.py serve 8096 # API + frontend + SSR → http://localhost:8096 | |
| 184 | +.venv/bin/python run.py watch 240 # boucle de resync (minutes) | |
| 185 | + | |
| 186 | +# Validation du rendu SSR | |
| 187 | +.venv/bin/python scripts/valider_rendu.py | |
| 188 | + | |
| 189 | +# Après un changement en prod | |
| 190 | +pm2 restart immo-ka-web # (ou immo-ka-sync selon le changement) | |
| 191 | +``` | |
| 192 | + | |
| 193 | +## Variables d'environnement | |
| 194 | + | |
| 195 | +Noms seulement — les valeurs vivent dans l'environnement du nœud (jamais dans le repo) : | |
| 196 | + | |
| 197 | +| Variable | Rôle | | |
| 198 | +|---|---| | |
| 199 | +| `IMMOKA_BASE_URL` | URL publique du site (canonicals, sitemaps) | | |
| 200 | +| `KA_SSO_SECRET` · `KA_HUB_URL` · `AUTH_SECRET` | SSO KA ID (JWT HS256) et hub groupe-ka.com | | |
| 201 | +| `GOOGLE_CLIENT_ID` · `GOOGLE_CLIENT_SECRET` | connexion Google (KA ID) | | |
| 202 | +| `HQ_CAPTCHA_KEY` · `HQ_CAPTCHA_PROVIDER` | résolution reCAPTCHA du flux d'estimation Hydro-Québec | | |
| 203 | +| `FIRECRAWL_API_KEY` · `SCRAPFLY_KEY` | rendu JS / anti-bot en secours pour certains connecteurs | | |
| 204 | +| `OXYLABS_PROXY` · `OXYLABS_PROXY_USER` · `OXYLABS_PROXY_PASS` | proxies résidentiels pour les sources qui l'exigent | | |
| 205 | +| `IMMOKA_<SOURCE>_DETAIL_LIMIT` (famille) | plafonds de fetch de fiches par connecteur (REMAX, DUPROPRIO, KIJIJI, SUTTON, EV, EXP, KW, …) + `IMMOKA_*_MAX_PAGES` | | |
| 206 | + | |
| 207 | +## Données & conformité | |
| 208 | + | |
| 209 | +- **Provenance** : uniquement les **pages et API publiques** des sites d'agences et de petites annonces ; aucune donnée derrière authentification. Chaque fiche **crédite sa ou ses sources** et pointe vers l'annonce originale. | |
| 210 | +- **Couches territoriales** : données ouvertes — recensement StatCan, îlots de chaleur INSPQ, zones inondables BDZI, qualité de l'air RSQAQ/PST, prix de l'essence (Régie de l'énergie via gazquebec), registre des loyers, GTFS transit. | |
| 211 | +- **Cadence & politesse** : sync complète aux 4 h, délais entre requêtes, retraits avec délai de grâce (jamais de suppression sur un raté ponctuel de la source). | |
| 212 | +- **Estimations** : les valeurs Vrai-Prix et Hydro-Québec sont des **estimations indicatives**, pas des évaluations professionnelles ; le prix affiché fait toujours foi chez la source. | |
| 213 | +- **Retrait** : toute source ou ayant droit peut demander le retrait de ses données (contact ci-dessous). | |
| 214 | + | |
| 135 | 215 | ## Documentation |
| 136 | 216 | |
| 137 | 217 | - **Guide d'utilisation en ligne** : [www.immo-ka.com/doc/](https://www.immo-ka.com/doc/) — visite pas à pas du site (accueil, recherche filtrée, fiche détail, carte), avec captures annotées. |
@@ -147,21 +227,7 @@ La **source de vérité est le repo git sur le nœud M4M64a** (`~/apps/immo-ka`) | ||
| 147 | 227 | ```bash |
| 148 | 228 | ssh M4M64a |
| 149 | 229 | cd ~/apps/immo-ka |
| 150 | − | |
| 151 | −# Backend | |
| 152 | −python3 -m venv .venv && .venv/bin/pip install -r requirements.txt | |
| 153 | − | |
| 154 | −# Frontend | |
| 155 | −cd frontend && npm install && npm run build && cd .. | |
| 156 | − | |
| 157 | −# Ingestion et service | |
| 158 | −.venv/bin/python run.py list # lister les connecteurs | |
| 159 | −.venv/bin/python run.py sync # synchroniser (ou : sync <source> …) | |
| 160 | −.venv/bin/python run.py serve 8096 # API + frontend | |
| 161 | − | |
| 162 | −# Après un changement en prod | |
| 163 | −pm2 restart immo-ka-web # (ou immo-ka-sync selon le changement) | |
| 164 | − | |
| 230 | +# … éditer, builder, pm2 restart … | |
| 165 | 231 | git add <fichiers> && git commit && git push origin main |
| 166 | 232 | ``` |
| 167 | 233 | |
@@ -169,6 +235,19 @@ git add <fichiers> && git commit && git push origin main | ||
| 169 | 235 | |
| 170 | 236 | En production sur le **nœud M4M64a** du cluster MacLustr (`~/apps/immo-ka`), servi sur le **port 8096** et exposé via un tunnel **ngrok** sur **[www.immo-ka.com](https://www.immo-ka.com)**. Trois processus PM2 : `immo-ka-web` (serveur), `immo-ka-sync` (boucle de sync aux 4 h), `immo-ka-ngrok` (tunnel). La base `data/` de prod est resynchronisée en continu — ne jamais l'écraser. |
| 171 | 237 | |
| 238 | +## Historique | |
| 239 | + | |
| 240 | +Jalons réels du repo (`git log`, 65 commits) : | |
| 241 | + | |
| 242 | +| Jalon | Commit | | |
| 243 | +|---|---| | |
| 244 | +| Naissance du site (agrégateur, thème rouge, quartier StatCan, Vrai-Prix) | `c69d1bd` → `9970966` | | |
| 245 | +| Stats v2 — `/stats` ultra complet + 5 rapports PDF (module commun Groupe KA) | `bc26ae5` | | |
| 246 | +| KA Agent v2 — widget plein écran, clavier mobile stable, Markdown streaming | `9646167` | | |
| 247 | +| Qualité + mobile — ~15 familles de connecteurs enrichies, quarantaine, imgaudit, Ka Maps parité Lou-Ka | `878916a` | | |
| 248 | +| Estimation Hydro-Québec live (2captcha) puis précalculée dans la boucle de sync | `abc4611` → `f0ecbc9` | | |
| 249 | +| Page documentation `/doc` (guide + captures + PDF) et README v2 | `b254290` · `530cdab` | | |
| 250 | + | |
| 172 | 251 | ## Écosystème Groupe KA |
| 173 | 252 | |
| 174 | 253 | | Plateforme | Univers | |
| 175 | 254 | |