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%

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

This reverts commit 4dd0d6cdd0b5e62fb57e35c9aa28020b38d9adff.
Simon-Pierre Boucher committed 1 mo ago (Aug 24, 2026) parent 4dd0d6c

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