Revert "docs: README v3 — chiffres live vérifiés, pastilles dynamiques, sections complètes"
This reverts commit 4dd0d6cdd0b5e62fb57e35c9aa28020b38d9adff.
1 changed file +52 −131
modified
README.md
+52 −131
@@ -6,39 +6,23 @@ | ||
| 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 | −<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> | |
| 36 | − | |
| 37 | −*Les pastilles « propriétés / sources / villes » sont **dynamiques** : elles interrogent `https://www.immo-ka.com/api/stats` en direct.* | |
| 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> | |
| 38 | 22 | |
| 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. | |
| 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. | |
| 40 | 24 | |
| 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. | |
| 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. | |
| 42 | 26 | |
| 43 | 27 | ## Visite guidée |
| 44 | 28 | |
@@ -69,20 +53,6 @@ Les sites d'agences n'offrent pas de webhooks : Immo-Ka en reproduit l'équivale | ||
| 69 | 53 | </tr> |
| 70 | 54 | </table> |
| 71 | 55 | |
| 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 | − | |
| 86 | 56 | ## Fonctionnalités |
| 87 | 57 | |
| 88 | 58 | - **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). |
@@ -94,7 +64,7 @@ Les sites d'agences n'offrent pas de webhooks : Immo-Ka en reproduit l'équivale | ||
| 94 | 64 | - **Quartier** — aire de diffusion du recensement : revenu médian, loyer moyen, % locataires, proximité épiceries/parcs/soins (StatCan), îlot de chaleur (INSPQ). |
| 95 | 65 | - **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. |
| 96 | 66 | - **Stats** — tableau de bord `/stats` : volumes par type et bannière, écart prix demandé vs estimation Vrai-Prix, panneaux territoire + rapport PDF Groupe-KA. |
| 97 | −- **Agences** — registre par bannière → sous-agence (44 bannières, 424 bureaux), comptes d'annonces dédupliqués. | |
| 67 | +- **Agences** — registre par bannière → sous-agence, comptes d'annonces dédupliqués. | |
| 98 | 68 | - **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é. |
| 99 | 69 | - **SEO programmatique** — HTML complet rendu côté serveur, une page indexable par ville / type / ville+type, sitemaps et données structurées. |
| 100 | 70 | |
@@ -102,39 +72,35 @@ Les sites d'agences n'offrent pas de webhooks : Immo-Ka en reproduit l'équivale | ||
| 102 | 72 | |
| 103 | 73 | Toutes les données servies au frontend passent par une API JSON publique (FastAPI) : |
| 104 | 74 | |
| 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 | | |
| 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 | | |
| 120 | 87 | |
| 121 | 88 | ## Connecteurs & sources |
| 122 | 89 | |
| 123 | 90 | **105 connecteurs enregistrés** (paquet `immoka/connectors/`), un par source, orchestrés par la boucle d'ingestion : |
| 124 | 91 | |
| 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 | | |
| 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 | | |
| 131 | 98 | |
| 132 | 99 | - **Normalisation** : chaque annonce est projetée vers le schéma unique `PropertyListing` (`immoka/schema.py`). |
| 133 | 100 | - **Dédup** : par numéro Centris (`dup_hidden`) — une propriété affichée par 3 sites = 1 fiche, sources créditées. |
| 134 | 101 | - **Détection de changements** : upsert par **hash de contenu** ; retraits avec **délai de grâce** contre les ratés ponctuels d'un site. |
| 135 | 102 | - **Qualité** : couche `quality.py` + `imgaudit.py` — annonces publiées vs **quarantaine**, audit des images, golden record. |
| 136 | 103 | - **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`. | |
| 138 | 104 | |
| 139 | 105 | ## Architecture |
| 140 | 106 | |
@@ -144,10 +110,10 @@ Toutes les données servies au frontend passent par une API JSON publique (FastA | ||
| 144 | 110 | | `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 | |
| 145 | 111 | | `immoka/web.py` + `seo.py` | FastAPI : API JSON, rendu SEO serveur, service du build frontend | |
| 146 | 112 | | 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) | |
| 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`) | | |
| 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`) | | |
| 148 | 114 | | Frontend | React 18 + Vite + TypeScript, react-router, design system ka-ui, cartes `@groupe-ka/ka-maps` (Mapbox GL 3.28) | |
| 149 | 115 | |
| 150 | −**Processus PM2 (production, vérifiés live)** : | |
| 116 | +**Processus PM2 (production)** : | |
| 151 | 117 | |
| 152 | 118 | | Processus | Commande | Rôle | |
| 153 | 119 | |---|---|---| |
@@ -163,55 +129,9 @@ Toutes les données servies au frontend passent par une API JSON publique (FastA | ||
| 163 | 129 | | `frontend/` | SPA React 18 + Vite + TypeScript (pages, composants, ka-maps, ka-ui) | |
| 164 | 130 | | `data/` | bases SQLite (immoka.db + bases annexes) et registres d'agences JSON | |
| 165 | 131 | | `docs/` | captures d'écran, docs des connecteurs, rapports de validation | |
| 166 | −| `scripts/` | outillage : `gen_connector_docs.py` (fiches des connecteurs), `refresh_via_capitale.py`, `valider_rendu.py` (validation du rendu SSR) | | |
| 132 | +| `scripts/` | outillage (génération des docs connecteurs, rafraîchissement Via Capitale, validation du rendu) | | |
| 167 | 133 | | `run.py` / `requirements.txt` | point d'entrée CLI (`sync`, `watch`, `serve`, `list`, `geocode`, `poi`, `quartier`, …) et dépendances backend | |
| 168 | 134 | |
| 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 | − | |
| 215 | 135 | ## Documentation |
| 216 | 136 | |
| 217 | 137 | - **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. |
@@ -227,7 +147,21 @@ La **source de vérité est le repo git sur le nœud M4M64a** (`~/apps/immo-ka`) | ||
| 227 | 147 | ```bash |
| 228 | 148 | ssh M4M64a |
| 229 | 149 | cd ~/apps/immo-ka |
| 230 | −# … éditer, builder, pm2 restart … | |
| 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 | + | |
| 231 | 165 | git add <fichiers> && git commit && git push origin main |
| 232 | 166 | ``` |
| 233 | 167 | |
@@ -235,19 +169,6 @@ git add <fichiers> && git commit && git push origin main | ||
| 235 | 169 | |
| 236 | 170 | 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. |
| 237 | 171 | |
| 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 | − | |
| 251 | 172 | ## Écosystème Groupe KA |
| 252 | 173 | |
| 253 | 174 | | Plateforme | Univers | |
| 254 | 175 | |