SPB Git forge
3commits 1branches 0releases
2.9 MBsize
maindefault branch
1 h agolast push
HTML 57.2% Shell 19.1% Python 11.2% CSS 7.4% JavaScript 5.1%
25.4 KB · 1,181 lines json
Raw Blame History
1{2 "updated": "2026-09-10",3 "contact": {4  "email": "contact@spboucher.ai",5  "owner": "Simon-Pierre Boucher",6  "site": "https://www.spboucher.ai",7  "git": "https://git.spboucher.ai"8 },9 "sites": {10  "staug": {11   "name": "Saint-Augustin-de-Desmaures",12   "region": "Québec, Canada",13   "lat": 46.741,14   "lon": -71.458,15   "kind": "lan",16   "operator": "MacLustr (LAN privé)",17   "note": "Le cœur du cluster : 21 Macs sur un réseau local 10 GbE, deux NAS UGREEN."18  },19  "bhs": {20   "name": "Beauharnois",21   "region": "Québec, Canada",22   "lat": 45.313,23   "lon": -73.873,24   "kind": "ovh",25   "operator": "OVHcloud BHS8",26   "note": "Passerelle principale du MacLustr Tunnel et deux serveurs de réserve. ≈ 10 ms du LAN."27  },28  "gra": {29   "name": "Gravelines",30   "region": "Hauts-de-France, France",31   "lat": 50.987,32   "lon": 2.128,33   "kind": "ovh",34   "operator": "OVHcloud GRA1",35   "note": "Passerelle secondaire : secours et présence européenne."36  },37  "ist": {38   "name": "Istanbul",39   "region": "Turquie",40   "lat": 41.008,41   "lon": 28.978,42   "kind": "rented",43   "operator": "Macly (réseau Erlion)",44   "note": "Huit Macs dédiés loués : un Mac Studio M1 Max 64 Go et sept Mac mini."45  },46  "atl": {47   "name": "Atlanta",48   "region": "Géorgie, États-Unis",49   "lat": 33.786,50   "lon": -84.406,51   "kind": "rented",52   "operator": "MacStadium",53   "note": "Mac mini M2 Pro dédié."54  },55  "dub": {56   "name": "Dublin",57   "region": "Irlande",58   "lat": 53.335,59   "lon": -6.252,60   "kind": "rented",61   "operator": "MacStadium",62   "note": "Deux Mac mini dédiés (M1, M2)."63  },64  "lim": {65   "name": "Limassol",66   "region": "Chypre",67   "lat": 34.687,68   "lon": 33.037,69   "kind": "rented",70   "operator": "rentamac",71   "note": "Mac mini M4 derrière NAT, joint par la passerelle SSH du fournisseur."72  }73 },74 "totals": {75  "macs": 33,76  "ovh": 4,77  "apps": 36,78  "sites": 3579 },80 "nodes": [81  {82   "id": "M3U96a",83   "group": "lan",84   "site": "staug",85   "model": "Mac Studio",86   "chip": "M3 Ultra",87   "tier": "ultra",88   "cores": 32,89   "gpu": 80,90   "ram": 96,91   "disk": 926,92   "ip": "192.168.2.87",93   "role": "Nœud maître de calcul et d'applications",94   "desc": "Le plus gros nœud du cluster. Héberge la console Administration·Ka et une grappe d'applications Next.js/FastAPI (QC26, RareIndex, Fetcha, PolyLLM, UQO).",95   "tags": [96    "worker",97    "apps",98    "calcul"99   ]100  },101  {102   "id": "M3U96b",103   "group": "lan",104   "site": "staug",105   "model": "Mac Studio",106   "chip": "M3 Ultra",107   "tier": "ultra",108   "cores": 32,109   "gpu": 80,110   "ram": 96,111   "disk": 926,112   "ip": "192.168.2.82",113   "role": "Réservé à HF Market Data",114   "desc": "Sert le lac de données FirstRate (353 Go de séries intraday, DuckDB) derrière www.hfmarketdata.io. Réservé : aucune autre app n'y est placée.",115   "tags": [116    "worker",117    "data",118    "réservé"119   ]120  },121  {122   "id": "M2U64",123   "group": "lan",124   "site": "staug",125   "model": "Mac Studio",126   "chip": "M2 Ultra",127   "tier": "ultra",128   "cores": 24,129   "gpu": 76,130   "ram": 64,131   "disk": 926,132   "ip": "192.168.2.107",133   "role": "Nœud d'applications sans session graphique",134   "desc": "Tourne en LaunchDaemon (headless). Héberge SPB Cloud, vQuant, UQO Éval, Food·Ka et les consoles MacLustr.",135   "tags": [136    "worker",137    "apps",138    "headless"139   ]140  },141  {142   "id": "M4M64a",143   "group": "lan",144   "site": "staug",145   "model": "Mac Studio",146   "chip": "M4 Max",147   "tier": "max",148   "cores": 16,149   "gpu": 40,150   "ram": 64,151   "disk": 926,152   "ip": "192.168.2.83",153   "role": "Applications + agent de supervision",154   "desc": "Héberge maclustr-agentd (:9210), la source des apps macOS et iOS MacLustr, ce site www.maclustr.io, ainsi que Lou·Ka, Fabri·Ka, Ka·Stats, UQO-Chat et PDB API.",155   "tags": [156    "worker",157    "apps",158    "monitoring"159   ]160  },161  {162   "id": "M4M64b",163   "group": "lan",164   "site": "staug",165   "model": "Mac Studio",166   "chip": "M4 Max",167   "tier": "max",168   "cores": 16,169   "gpu": 40,170   "ram": 64,171   "disk": 926,172   "ip": "192.168.2.78",173   "role": "Applications Groupe Ka + index",174   "desc": "API·Ka (Postgres 17 + Redis), Groupe Ka, Immo·Ka, Auto·Ka, CancerIndex, WebSensor, UQO IMM1003.",175   "tags": [176    "worker",177    "apps",178    "postgres"179   ]180  },181  {182   "id": "M4BP48",183   "group": "lan",184   "site": "staug",185   "model": "MacBook Pro",186   "chip": "M4 Max",187   "tier": "max",188   "cores": 16,189   "gpu": 40,190   "ram": 48,191   "disk": 926,192   "ip": "192.168.2.80",193   "role": "Nœud de calcul",194   "desc": "Portable intégré au cluster ; disponible pour les jobs distribués (uv, Python 3.12).",195   "tags": [196    "worker",197    "calcul"198   ]199  },200  {201   "id": "M4BP36",202   "group": "lan",203   "site": "staug",204   "model": "MacBook Pro",205   "chip": "M4 Max",206   "tier": "max",207   "cores": 14,208   "gpu": 32,209   "ram": 36,210   "disk": null,211   "ip": "192.168.2.133",212   "role": "Nœud de calcul (mobile)",213   "desc": "Portable, souvent hors ligne : nœud d'appoint pour le calcul distribué.",214   "tags": [215    "worker",216    "calcul"217   ]218  },219  {220   "id": "M4M36",221   "group": "lan",222   "site": "staug",223   "model": "Mac Studio",224   "chip": "M4 Max",225   "tier": "max",226   "cores": 14,227   "gpu": 40,228   "ram": 36,229   "disk": 460,230   "ip": "192.168.2.69",231   "role": "Gardiens Ka",232   "desc": "Héberge les trois agents gardiens ka2, ka4 et ka6 qui surveillent, réparent et poussent les apps Groupe Ka.",233   "tags": [234    "worker",235    "agents"236   ]237  },238  {239   "id": "M2M32",240   "group": "lan",241   "site": "staug",242   "model": "Mac Studio",243   "chip": "M2 Max",244   "tier": "max",245   "cores": 12,246   "gpu": 38,247   "ram": 32,248   "disk": 460,249   "ip": "192.168.2.90",250   "role": "Nœud de calcul",251   "desc": "Docker, Node, Python : nœud générique pour le calcul et les déploiements mld.",252   "tags": [253    "worker",254    "calcul"255   ]256  },257  {258   "id": "M2M32b",259   "group": "lan",260   "site": "staug",261   "model": "Mac Studio",262   "chip": "M2 Max",263   "tier": "max",264   "cores": 12,265   "gpu": 38,266   "ram": 32,267   "disk": 460,268   "ip": "192.168.2.77",269   "role": "Nœud de calcul",270   "desc": "Nœud générique, ex-flotte de scraping Trouve-Ka.",271   "tags": [272    "worker",273    "calcul"274   ]275  },276  {277   "id": "M2M32c",278   "group": "lan",279   "site": "staug",280   "model": "Mac Studio",281   "chip": "M2 Max",282   "tier": "max",283   "cores": 12,284   "gpu": 30,285   "ram": 32,286   "disk": 460,287   "ip": "192.168.2.89",288   "role": "Nœud de calcul",289   "desc": "Nœud générique pour les jobs Python distribués.",290   "tags": [291    "worker",292    "calcul"293   ]294  },295  {296   "id": "m4mc",297   "group": "lan",298   "site": "staug",299   "model": "Mac mini",300   "chip": "M4 Pro",301   "tier": "pro",302   "cores": 12,303   "gpu": 16,304   "ram": 24,305   "disk": 460,306   "ip": "192.168.2.75",307   "role": "Nœud de calcul",308   "desc": "Mac mini M4 Pro, nœud générique.",309   "tags": [310    "worker",311    "calcul"312   ]313  },314  {315   "id": "M1M32",316   "group": "lan",317   "site": "staug",318   "model": "Mac Studio",319   "chip": "M1 Max",320   "tier": "max",321   "cores": 10,322   "gpu": 32,323   "ram": 32,324   "disk": 460,325   "ip": "192.168.2.76",326   "role": "Passerelle du cluster",327   "desc": "Porte d'entrée : héberge spbgit (git.spboucher.ai, dépôts bare de toutes les apps) et l'orchestrateur mld qui place, déploie, migre et répare chaque application. Aucune app métier n'y tourne.",328   "tags": [329    "gateway",330    "git",331    "orchestrateur"332   ]333  },334  {335   "id": "m4ma",336   "group": "lan",337   "site": "staug",338   "model": "Mac mini",339   "chip": "M4",340   "tier": "base",341   "cores": 10,342   "gpu": 10,343   "ram": 24,344   "disk": 460,345   "ip": "192.168.2.73",346   "role": "Nœud de calcul",347   "desc": "Mac mini M4, nœud générique.",348   "tags": [349    "worker"350   ]351  },352  {353   "id": "m4mb",354   "group": "lan",355   "site": "staug",356   "model": "Mac mini",357   "chip": "M4",358   "tier": "base",359   "cores": 10,360   "gpu": 10,361   "ram": 16,362   "disk": 228,363   "ip": "192.168.2.74",364   "role": "Nœud de calcul",365   "desc": "Mac mini M4, nœud générique.",366   "tags": [367    "worker"368   ]369  },370  {371   "id": "m4md",372   "group": "lan",373   "site": "staug",374   "model": "Mac mini",375   "chip": "M4",376   "tier": "base",377   "cores": 10,378   "gpu": 10,379   "ram": 16,380   "disk": 228,381   "ip": "192.168.2.110",382   "role": "Nœud de calcul",383   "desc": "Mac mini M4 ajouté le 4 septembre 2026.",384   "tags": [385    "worker"386   ]387  },388  {389   "id": "m2m16",390   "group": "lan",391   "site": "staug",392   "model": "Mac mini",393   "chip": "M2 Pro",394   "tier": "pro",395   "cores": 10,396   "gpu": 16,397   "ram": 16,398   "disk": 460,399   "ip": "192.168.2.85",400   "role": "Nœud de calcul",401   "desc": "Mac mini M2 Pro, nœud générique.",402   "tags": [403    "worker"404   ]405  },406  {407   "id": "M3BA24",408   "group": "lan",409   "site": "staug",410   "model": "MacBook Air",411   "chip": "M3",412   "tier": "base",413   "cores": 8,414   "gpu": 10,415   "ram": 24,416   "disk": 460,417   "ip": "192.168.2.81",418   "role": "Nœud d'appoint",419   "desc": "MacBook Air, nœud d'appoint pour le calcul léger.",420   "tags": [421    "worker"422   ]423  },424  {425   "id": "M3BA16",426   "group": "lan",427   "site": "staug",428   "model": "MacBook Air",429   "chip": "M3",430   "tier": "base",431   "cores": 8,432   "gpu": 10,433   "ram": 16,434   "disk": 460,435   "ip": "192.168.2.70",436   "role": "Nœud d'appoint",437   "desc": "MacBook Air, nœud d'appoint.",438   "tags": [439    "worker"440   ]441  },442  {443   "id": "m2m8a",444   "group": "lan",445   "site": "staug",446   "model": "Mac mini",447   "chip": "M2",448   "tier": "base",449   "cores": 8,450   "gpu": 10,451   "ram": 8,452   "disk": 460,453   "ip": "192.168.2.84",454   "role": "Nœud léger",455   "desc": "Mac mini M2 8 Go : tâches légères et tests.",456   "tags": [457    "worker"458   ]459  },460  {461   "id": "m2m8b",462   "group": "lan",463   "site": "staug",464   "model": "Mac mini",465   "chip": "M2",466   "tier": "base",467   "cores": 8,468   "gpu": 10,469   "ram": 8,470   "disk": 228,471   "ip": "192.168.2.72",472   "role": "Nœud léger",473   "desc": "Mac mini M2 8 Go : tâches légères et tests.",474   "tags": [475    "worker"476   ]477  },478  {479   "id": "M1M64",480   "group": "rented",481   "model": "Mac Studio",482   "chip": "M1 Max",483   "tier": "max",484   "cores": 10,485   "gpu": 32,486   "ram": 64,487   "disk": 1800,488   "site": "ist",489   "provider": "Macly",490   "location": "Istanbul, Turquie",491   "role": "Nœud distant à grande mémoire",492   "desc": "Mac Studio loué, 64 Go et 1,8 To : réservé aux déploiements explicites (mld deploy --node M1M64).",493   "tags": [494    "distant",495    "réservé"496   ]497  },498  {499   "id": "m2m16b",500   "group": "rented",501   "model": "Mac mini",502   "chip": "M2 Pro",503   "tier": "pro",504   "cores": 10,505   "gpu": 16,506   "ram": 16,507   "disk": 926,508   "site": "atl",509   "provider": "MacStadium",510   "location": "Atlanta, États-Unis",511   "role": "Nœud distant",512   "desc": "Mac mini M2 Pro dédié, raccordé au tunnel MacLustr.",513   "tags": [514    "distant",515    "réservé"516   ]517  },518  {519   "id": "m1m16",520   "group": "rented",521   "model": "Mac mini",522   "chip": "M1",523   "tier": "base",524   "cores": 8,525   "gpu": 8,526   "ram": 16,527   "disk": 926,528   "site": "dub",529   "provider": "MacStadium",530   "location": "Dublin, Irlande",531   "role": "Nœud distant",532   "desc": "Mac mini M1 dédié.",533   "tags": [534    "distant",535    "réservé"536   ]537  },538  {539   "id": "m2m16c",540   "group": "rented",541   "model": "Mac mini",542   "chip": "M2",543   "tier": "base",544   "cores": 8,545   "gpu": 10,546   "ram": 16,547   "disk": 926,548   "site": "dub",549   "provider": "MacStadium",550   "location": "Dublin, Irlande",551   "role": "Nœud distant",552   "desc": "Mac mini M2 dédié.",553   "tags": [554    "distant",555    "réservé"556   ]557  },558  {559   "id": "m4me",560   "group": "rented",561   "model": "Mac mini",562   "chip": "M4",563   "tier": "base",564   "cores": 10,565   "gpu": 10,566   "ram": 16,567   "disk": 228,568   "site": "ist",569   "provider": "Macly",570   "location": "Istanbul, Turquie",571   "role": "Nœud distant",572   "desc": "Mac mini M4 dédié, amorcé à distance (DeskIn + script), PM2 en LaunchDaemon.",573   "tags": [574    "distant",575    "réservé"576   ]577  },578  {579   "id": "m4mf",580   "group": "rented",581   "model": "Mac mini",582   "chip": "M4",583   "tier": "base",584   "cores": 10,585   "gpu": 10,586   "ram": 16,587   "disk": 228,588   "site": "ist",589   "provider": "Macly",590   "location": "Istanbul, Turquie",591   "role": "Nœud distant",592   "desc": "Jumeau de m4me.",593   "tags": [594    "distant",595    "réservé"596   ]597  },598  {599   "id": "m4mg",600   "group": "rented",601   "model": "Mac mini",602   "chip": "M4",603   "tier": "base",604   "cores": 10,605   "gpu": 10,606   "ram": 16,607   "disk": 228,608   "site": "lim",609   "provider": "rentamac",610   "location": "Limassol, Chypre",611   "role": "Nœud distant (Méditerranée)",612   "desc": "Derrière NAT, joint par la passerelle SSH du fournisseur. Xcode complet préinstallé.",613   "tags": [614    "distant",615    "réservé",616    "europe"617   ]618  },619  {620   "id": "m4mh",621   "group": "rented",622   "model": "Mac mini",623   "chip": "M4",624   "tier": "base",625   "cores": 10,626   "gpu": 10,627   "ram": 16,628   "disk": 228,629   "site": "ist",630   "provider": "Macly",631   "location": "Istanbul, Turquie",632   "role": "Nœud distant",633   "desc": "Mac mini M4 dédié, ajouté le 10 septembre 2026.",634   "tags": [635    "distant",636    "réservé"637   ]638  },639  {640   "id": "m1m16b",641   "group": "rented",642   "model": "Mac mini",643   "chip": "M1",644   "tier": "base",645   "cores": 8,646   "gpu": 8,647   "ram": 16,648   "disk": 228,649   "site": "ist",650   "provider": "Macly",651   "location": "Istanbul, Turquie",652   "role": "Nœud distant",653   "desc": "Mac mini M1 dédié, ajouté le 10 septembre 2026.",654   "tags": [655    "distant",656    "réservé"657   ]658  },659  {660   "id": "m4mi",661   "group": "rented",662   "model": "Mac mini",663   "chip": "M4",664   "tier": "base",665   "cores": 10,666   "gpu": 10,667   "ram": 16,668   "disk": 228,669   "site": "ist",670   "provider": "Macly",671   "location": "Istanbul, Turquie",672   "role": "Nœud distant",673   "desc": "Mac mini M4 dédié, ajouté le 10 septembre 2026.",674   "tags": [675    "distant",676    "réservé"677   ]678  },679  {680   "id": "m4mj",681   "group": "rented",682   "model": "Mac mini",683   "chip": "M4",684   "tier": "base",685   "cores": 10,686   "gpu": 10,687   "ram": 16,688   "disk": 228,689   "site": "ist",690   "provider": "Macly",691   "location": "Istanbul, Turquie",692   "role": "Nœud distant",693   "desc": "Mac mini M4 dédié, ajouté le 10 septembre 2026.",694   "tags": [695    "distant",696    "réservé"697   ]698  },699  {700   "id": "m4mk",701   "group": "rented",702   "model": "Mac mini",703   "chip": "M4",704   "tier": "base",705   "cores": 10,706   "gpu": 10,707   "ram": 16,708   "disk": 228,709   "site": "ist",710   "provider": "Macly",711   "location": "Istanbul, Turquie",712   "role": "Nœud distant",713   "desc": "Mac mini M4 dédié, ajouté le 10 septembre 2026.",714   "tags": [715    "distant",716    "réservé"717   ]718  },719  {720   "id": "BHS64",721   "group": "ovh",722   "model": "OVH ADVANCE-2",723   "chip": "AMD EPYC 4345P",724   "tier": "epyc",725   "cores": 16,726   "threads": true,727   "gpu": 0,728   "ram": 64,729   "disk": 960,730   "site": "bhs",731   "provider": "OVHcloud",732   "location": "Beauharnois, Québec",733   "role": "Passerelle principale MacLustr Tunnel",734   "desc": "Point d'entrée public de tous les sites : hub WireGuard 10.67.0.1 + Caddy (TLS Let's Encrypt automatique). EPYC 4345P 8 c/16 t, 64 Go DDR5 ECC, 2 × 960 Go NVMe RAID 1, 3 Gbit/s, Ubuntu 24.04. ≈ 10 ms depuis le cluster.",735   "tags": [736    "gateway",737    "wireguard",738    "caddy",739    "linux"740   ]741  },742  {743   "id": "BHS64b",744   "group": "ovh",745   "model": "OVH ADVANCE-2",746   "chip": "AMD EPYC 4345P",747   "tier": "epyc",748   "cores": 16,749   "threads": true,750   "gpu": 0,751   "ram": 64,752   "disk": 960,753   "site": "bhs",754   "provider": "OVHcloud",755   "location": "Beauharnois, Québec",756   "role": "Serveur de réserve",757   "desc": "Jumeau de BHS64 : EPYC 4345P 8 c/16 t, 64 Go DDR5 ECC, 2 × 960 Go NVMe RAID 1, 3 Gbit/s, Ubuntu 24.04. Réservé pour un usage à venir, hors tunnel.",758   "tags": [759    "linux",760    "réserve"761   ]762  },763  {764   "id": "BHS128",765   "group": "ovh",766   "model": "OVH ADVANCE-1",767   "chip": "AMD EPYC 4245P",768   "tier": "epyc",769   "cores": 12,770   "threads": true,771   "gpu": 0,772   "ram": 128,773   "disk": 960,774   "site": "bhs",775   "provider": "OVHcloud",776   "location": "Beauharnois, Québec",777   "role": "Serveur de réserve à grande mémoire",778   "desc": "EPYC 4245P 6 c/12 t, 128 Go DDR5, 2 × 960 Go NVMe RAID 1, 3 Gbit/s, Ubuntu 24.04. Prêt à accueillir une application ou une base de données exigeante ; hors tunnel.",779   "tags": [780    "linux",781    "réserve",782    "128 Go"783   ]784  },785  {786   "id": "R9128",787   "group": "ovh",788   "model": "OVH RISE-L",789   "chip": "AMD Ryzen 9 9950X",790   "tier": "ryzen",791   "cores": 32,792   "threads": true,793   "gpu": 0,794   "ram": 128,795   "disk": 960,796   "site": "gra",797   "provider": "OVHcloud",798   "location": "Gravelines, France",799   "role": "Passerelle secondaire (Europe)",800   "desc": "Hub WireGuard 10.66.0.1 + Caddy : secours et présence européenne du tunnel. Ryzen 9 9950X 16 c/32 t, 128 Go DDR5, 2 × 960 Go NVMe RAID 1, 1 Gbit/s, Ubuntu 24.04.",801   "tags": [802    "gateway",803    "wireguard",804    "caddy",805    "linux",806    "europe"807   ]808  }809 ],810 "appGroups": [811  {812   "id": "ka",813   "name": "Groupe Ka",814   "blurb": "L'écosystème immobilier, automobile, alimentaire et emploi du Québec : une famille de plateformes qui partagent identité (KA ID), données (API·Ka) et gardiens autonomes."815  },816  {817   "id": "data",818   "name": "Données & intelligence",819   "blurb": "Indices, marchés et infrastructures de données servis en API publiques."820  },821  {822   "id": "uqo",823   "name": "Enseignement UQO",824   "blurb": "Outils de cours interactifs, tuteur IA et ateliers d'évaluation immobilière."825  },826  {827   "id": "platform",828   "name": "Plateforme MacLustr",829   "blurb": "Les services qui font tourner le cluster lui-même."830  },831  {832   "id": "spb",833   "name": "SPB",834   "blurb": "Sites et services personnels."835  }836 ],837 "apps": [838  {839   "id": "groupe-ka",840   "group": "ka",841   "name": "Groupe Ka",842   "domain": "www.groupe-ka.com",843   "node": "M4M64b",844   "port": 8110,845   "desc": "Portail du groupe : vision, univers, dossier investisseurs."846  },847  {848   "id": "lou-ka",849   "group": "ka",850   "name": "Lou·Ka",851   "domain": "www.lou-ka.com",852   "node": "M4M64a",853   "port": 8095,854   "desc": "Location résidentielle : annonces, carte 3D, Lou-Ka Score."855  },856  {857   "id": "immo-ka",858   "group": "ka",859   "name": "Immo·Ka",860   "domain": "www.immo-ka.com",861   "node": "M4M64b",862   "port": 8096,863   "desc": "Propriétés à vendre : 70 000+ annonces, analyses de prix, KA Scores."864  },865  {866   "id": "vrai-prix",867   "group": "ka",868   "name": "Vrai-Prix",869   "domain": "www.vrai-prix.com",870   "node": "M3U96a",871   "port": 8090,872   "desc": "Évaluation hédonique, méthode du coût, statistiques de marché."873  },874  {875   "id": "auto-ka",876   "group": "ka",877   "name": "Auto·Ka",878   "domain": "www.auto-ka.com",879   "node": "M4M64b",880   "port": 8095,881   "desc": "Marché automobile : véhicules, prix, fiches v3."882  },883  {884   "id": "fabri-ka",885   "group": "ka",886   "name": "Fabri·Ka",887   "domain": "www.fabri-ka.com",888   "node": "M4M64a",889   "port": 8097,890   "desc": "Artisans, fabricants et ateliers du Québec."891  },892  {893   "id": "food-ka",894   "group": "ka",895   "name": "Food·Ka",896   "domain": "www.food-ka.com",897   "node": "M2U64",898   "port": 8097,899   "desc": "Alimentation : produits, commerces, prix."900  },901  {902   "id": "sorti-ka",903   "group": "ka",904   "name": "Sorti·Ka",905   "domain": "www.sorti-ka.com",906   "node": "M3U96a",907   "port": 8120,908   "desc": "Sorties, événements et activités."909  },910  {911   "id": "job-ka",912   "group": "ka",913   "name": "Job·Ka",914   "domain": "www.job-ka.com",915   "node": "M3U96a",916   "port": 8096,917   "desc": "Emplois et carrières."918  },919  {920   "id": "api-ka",921   "group": "ka",922   "name": "API·Ka",923   "domain": "www.api-ka.com",924   "node": "M4M64b",925   "port": 8000,926   "desc": "API unifiée du groupe : Postgres 17, Redis, 24 outils agent."927  },928  {929   "id": "ka-stats",930   "group": "ka",931   "name": "Ka·Stats",932   "domain": "www.ka-stats.com",933   "node": "M4M64a",934   "port": 8140,935   "desc": "Observatoire statistique des univers Ka."936  },937  {938   "id": "admin-ka",939   "group": "ka",940   "name": "Administration·Ka",941   "domain": "www.administration-ka.com",942   "node": "M3U96a",943   "port": 3300,944   "desc": "Console d'administration multi-sites, pilotée par le registre mld."945  },946  {947   "id": "ka2",948   "group": "ka",949   "name": "Gardien ka2",950   "domain": "www.ka2.bot",951   "node": "M4M36",952   "port": 8799,953   "desc": "Agent gardien autonome : surveillance et réparation."954  },955  {956   "id": "ka4",957   "group": "ka",958   "name": "Gardien ka4",959   "domain": "www.ka4.bot",960   "node": "M4M36",961   "port": 8899,962   "desc": "Agent gardien autonome."963  },964  {965   "id": "ka6",966   "group": "ka",967   "name": "Gardien ka6",968   "domain": "www.ka6.bot",969   "node": "M4M36",970   "port": 8999,971   "desc": "Agent gardien autonome."972  },973  {974   "id": "hfmarketdata",975   "group": "data",976   "name": "HF Market Data",977   "domain": "www.hfmarketdata.io",978   "node": "M3U96b",979   "port": 8090,980   "desc": "Données de marché haute fréquence : actions, futures, options, fondamentaux SEC. API + MCP."981  },982  {983   "id": "rareindex",984   "group": "data",985   "name": "RareIndex",986   "domain": "www.rareindex.io",987   "node": "M3U96a",988   "port": 8210,989   "desc": "Intelligence de marché des objets de collection : 212 connecteurs."990  },991  {992   "id": "cancerindex",993   "group": "data",994   "name": "CancerIndex",995   "domain": "www.cancerindex.io",996   "node": "M4M64b",997   "port": 8250,998   "desc": "Index mondial des cancers : 9 510 entités NCIt, 13 connecteurs, pgvector."999  },1000  {1001   "id": "websensor",1002   "group": "data",1003   "name": "WebSensor",1004   "domain": "www.websensor.io",1005   "node": "M4M64b",1006   "port": 8260,1007   "desc": "Détection de changements web : 4 000+ capteurs, 16 connecteurs."1008  },1009  {1010   "id": "fetcha",1011   "group": "data",1012   "name": "Fetcha",1013   "domain": "www.fetcha.co",1014   "node": "M3U96a",1015   "port": 8220,1016   "desc": "Infrastructure d'accès web intelligent : scrape, crawl, map, SDK."1017  },1018  {1019   "id": "polyllm",1020   "group": "data",1021   "name": "PolyLLM",1022   "domain": "www.polyllm.io",1023   "node": "M3U96a",1024   "port": 8240,1025   "desc": "Une interface, tous les modèles : 9 fournisseurs, Arena, BYOK."1026  },1027  {1028   "id": "vquant",1029   "group": "data",1030   "name": "vQuant",1031   "domain": "www.vquant.ai",1032   "node": "M2U64",1033   "port": 5000,1034   "desc": "Terminal quantitatif : indices, portefeuilles, MFA."1035  },1036  {1037   "id": "qc26",1038   "group": "data",1039   "name": "QC26",1040   "domain": "www.qc26.ca",1041   "node": "M3U96a",1042   "port": 8200,1043   "desc": "L'élection québécoise 2026 en données : sondages, Monte Carlo, revue de presse."1044  },1045  {1046   "id": "pdb-api",1047   "group": "data",1048   "name": "PDB API",1049   "domain": "www.pdb-api.co",1050   "node": "M4M64a",1051   "port": 8270,1052   "desc": "Explorateur et API de la base SPID (FastAPI + DuckDB)."1053  },1054  {1055   "id": "uqo-eval",1056   "group": "uqo",1057   "name": "UQO Éval",1058   "domain": "www.uqo-eval.app",1059   "node": "M2U64",1060   "port": 8150,1061   "desc": "Atelier d'évaluation immobilière : hédonique, coût, à vendre, marché."1062  },1063  {1064   "id": "uqo-imm1003",1065   "group": "uqo",1066   "name": "UQO IMM1003",1067   "domain": "www.uqo-imm1003.app",1068   "node": "M4M64b",1069   "port": 8160,1070   "desc": "Notes de cours interactives et séances vidéo."1071  },1072  {1073   "id": "uqo-imm1033",1074   "group": "uqo",1075   "name": "UQO IMM1033",1076   "domain": "www.uqo-imm1033.app",1077   "node": "M3U96a",1078   "port": 8161,1079   "desc": "Notes de cours interactives et séances vidéo."1080  },1081  {1082   "id": "uqo-chat",1083   "group": "uqo",1084   "name": "UQO-Chat",1085   "domain": "www.uqo-chat.app",1086   "node": "M4M64a",1087   "port": 8190,1088   "desc": "Tuteur IA des cours IMM1003 et IMM1033, sur invitation."1089  },1090  {1091   "id": "maclustr-www",1092   "group": "platform",1093   "name": "www.maclustr.io",1094   "domain": "www.maclustr.io",1095   "node": "M4M64a",1096   "port": 8280,1097   "desc": "Cette page : vitrine du cluster, inventaire et état live des nœuds et des applications."1098  },1099  {1100   "id": "maclustr-agentd",1101   "group": "platform",1102   "name": "maclustr-agentd",1103   "domain": null,1104   "node": "M4M64a",1105   "port": 9210,1106   "desc": "Agent de supervision : métriques des 33 nœuds, santé des apps, état du tunnel. Alimente les apps macOS et iOS MacLustr et ce site."1107  },1108  {1109   "id": "maclustr-console",1110   "group": "platform",1111   "name": "Console MacLustr",1112   "domain": "console.maclustr.io",1113   "node": "M2U64",1114   "port": 3000,1115   "desc": "Console web du cluster."1116  },1117  {1118   "id": "maclustr-appmanager",1119   "group": "platform",1120   "name": "App Manager",1121   "domain": "app.maclustr.io",1122   "node": "M2U64",1123   "port": 8787,1124   "desc": "Gestionnaire d'applications."1125  },1126  {1127   "id": "maclustr-nodepages",1128   "group": "platform",1129   "name": "Node Pages",1130   "domain": "node.maclustr.io",1131   "node": "M2U64",1132   "port": 8003,1133   "desc": "Pages de bord par nœud."1134  },1135  {1136   "id": "spbgit",1137   "group": "platform",1138   "name": "spbgit",1139   "domain": "git.spboucher.ai",1140   "node": "M1M32",1141   "port": 7420,1142   "desc": "Forge git privée : dépôts bare de toutes les apps, source de vérité du code."1143  },1144  {1145   "id": "spboucher-ai",1146   "group": "spb",1147   "name": "spboucher.ai",1148   "domain": "www.spboucher.ai",1149   "node": "M2U64",1150   "port": 3100,1151   "desc": "Site personnel."1152  },1153  {1154   "id": "spb-cloud",1155   "group": "spb",1156   "name": "SPB Cloud",1157   "domain": "cloud.spboucher.ai",1158   "node": "M2U64",1159   "port": 5001,1160   "desc": "Nuage privé : fichiers, partage, OTP, réorganisation IA."1161  }1162 ],1163 "tunnel": {1164  "gateways": [1165   {1166    "id": "BHS64",1167    "ip": "51.161.112.61",1168    "site": "Beauharnois, Québec",1169    "primary": true,1170    "wg": "10.67.0.0/24"1171   },1172   {1173    "id": "R9128",1174    "ip": "51.255.75.61",1175    "site": "Gravelines, France",1176    "primary": false,1177    "wg": "10.66.0.0/24"1178   }1179  ]1180 }1181}