SPB Git forge

spb/immo-ka

Public

Immo-Ka — agrégateur des propriétés à vendre au Québec (73 connecteurs, ~40 000 annonces, React+FastAPI)

112commits 1branches 0releases
125.4 MBsize
maindefault branch
13 days agolast push
Python 47.5% HTML 27.9% TypeScript 15.5% CSS 7.2% JavaScript 2%

docs: README v3 — chiffres live vérifiés, pastilles dynamiques, sections complètes

Simon-Pierre Boucher committed 1 mo ago (Aug 24, 2026) parent e28883c

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