# Groupe Ka — Développement direct sur les nœuds (remote-first) > **MAJ 2026-09-04 — passerelle M1M32 + `mld`.** spbgit (bare repos `~/srv/git/*.git`, git.spboucher.ai) a déménagé de M3U96a vers **M1M32**. L'alias `Host gitsrv` de chaque nœud (et du laptop) pointe désormais vers M1M32 (`MacStudio-de-simon-pierre-8.local` en LAN, `M1M32.maclustr.io` depuis le laptop), clé `~/.ssh/ka_guardian_ed25519` par nœud autorisée sur M1M32 ; les repos de M3U96a n'utilisent plus de chemin local. Les apps sont déployées/migrées par l'orchestrateur **maclustr-dispatch** (`~/Desktop/cluster-skill/mld …`, registre `cluster-registry.json`) : **les nœuds ci-dessous peuvent changer — `mld status` fait foi.** Nouveaux emplacements du 2026-09-04 : immo-ka → M3U96b, house-ka → M3U96a, resto-ka → M4M64a, food-ka → M2U64, rent-ka → M4M64b, ka-stats → M4M64a, uqo-eval → M2U64. Pousseur Ka (`com.ka.pousseur`) installé sur M3U96a/b, M2U64, M4M64a/b, M4M36, M2M32 ; `~/.ka-pousseur-repos` mis à jour automatiquement par `mld` (inscription à l'arrivée, retrait au départ). Les anciens `~/srv/git` et `~/srv/spbgit` de M3U96a sont renommés `*.old-20260904` (backups 20 Go inclus). > **MAJ 2026-09-04 (soir) — consommateurs du registre.** Les gardiens **ka2/ka4/ka6** (`orchestrator/registry.py`, copie `M4M36:~/ka-guardian-spool/registry.json` poussée par `mld` + tirée par le launchd `com.ka.registry-sync`) et la console **admin-ka** (`server/registry.js`, copie `~/apps/admin-ka/data/registry.json`, tirage ssh 2 min, `~/ka-orchestrator/CLAUDE.md` régénéré) lisent désormais **le registre mld** pour savoir où tourne chaque app : nœud, IP LAN, répertoire, port, process PM2. Plus aucune table d'emplacements en dur chez eux ; `mld subscribers` sur M1M32 liste les abonnés. Après un `mld move` d'une app Ka vers un nœud jamais équipé : `~/Desktop/Groupe-KA/apps-web/ka-guardian/deploy/deploy.sh runners ` (+ `courier`, `pousseur`) — la liste des nœuds y est elle aussi dérivée du registre ; admin-ka pose seul `~/.adminka/perm-mcp.js` + `~/.claude/CLAUDE.md` sur le nouveau nœud. ⚠️ **M2U64 n'a pas de session graphique** (console = root) : pas de domaine launchd `gui/501` → les services y sont des **LaunchDaemons** système (`/Library/LaunchDaemons/com.ka.*`, `UserName` + `HOME`), posés par `deploy.sh` via sudo (`KA_SUDO_PW` dans `~/.ka-guardian.env` du laptop). **Depuis le 2026-08-17, la source de vérité des 12 projets Ka est le repo git SUR LE NŒUD de déploiement**, plus les copies `~/Desktop/*` du laptop. Toute session Claude sur le laptop travaille sur le repo du nœud via SSH : édition, build, restart PM2, `git commit` et `git push` se font sur le nœud. ## Table des projets | App | Nœud | Dir sur le nœud | Port | Domaine | Process PM2 | |------------|---------|-------------------|-------|----------------------|-------------| | groupe-ka | M3U96b | `~/apps/groupe-ka`| 8110 | www.groupe-ka.com | groupe-ka + groupe-ka-ngrok | | lou-ka | M3U96b | `~/apps/lou-ka` | 8095 | www.lou-ka.com | lou-ka-web + lou-ka-sync + lou-ka-ngrok | | api-ka | M3U96b | `/opt/api-ka` | 8000 | www.api-ka.com | apika-api + apika-scheduler + apika-ngrok | | crea-ka | M3U96b | `~/apps/crea-ka` | 8160 | www.crea-ka.com | crea-ka-web + crea-ka-sync + crea-ka-ngrok | | resto-ka | M3U96b | `~/apps/resto-ka` | 8115 | www.resto-ka.com | resto-ka + resto-ka-sync + resto-ka-ngrok | | vrai-prix | M3U96a | `~/apps/vrai-prix`| 8090 | www.vrai-prix.com | vrai-prix + vrai-prix-ngrok + vrai-prix-ingest (cron 08:00) + vrai-prix-cost-sync (cron 05:15, connecteurs méthode du coût → data/cost.db) + vrai-prix-immoka-sync (cron 03:30, snapshot Immo-Ka depuis M4M64b via LAN + ré-évaluation → data/immoka.db, table vp_eval, data/marche-stats.json) — ajoutés 2026-09-08 ; data/ hors git et hors sync mld ; épinglé M3U96a | | sorti-ka | M3U96a | `~/apps/sorti-ka` | 8120 | www.sorti-ka.com | sorti-ka-web + sorti-ka-sync + sorti-ka-ngrok | | house-ka | M4M64b | `~/apps/house-ka` | 8098 | www.house-ka.com | house-ka-web + house-ka-sync + house-ka-ngrok | | immo-ka | M4M64a | `~/apps/immo-ka` | 8096 | www.immo-ka.com | immo-ka-web + immo-ka-sync + immo-ka-ngrok | | fabri-ka | M4M64a | `~/fabri-ka` | 8097 | www.fabri-ka.com | fabri-ka-web + fabri-ka-sync + fabri-ka-ngrok | | auto-ka | M4M64b | `~/auto-ka` | 8095 | www.auto-ka.com | auto-ka-web + auto-ka-sync + auto-ka-ngrok | | food-ka | M4M64b | `~/apps/food-ka` | 8097 | www.food-ka.com | food-ka-web + food-ka-sync + food-ka-ngrok | | trouve-ka | M2M32 | `~/trouve-ka` | 3000 | www.trouve-ka.com | tk-web/tk-api/tk-crawler-1,2/tk-enrichment/tk-scheduler + docker (postgres, redis) + com.trouveka.ngrok | | home-ka | M4M36 | `~/apps/home-ka` | 8099 | www.home-ka.com | home-ka-web + home-ka-sync + home-ka-ngrok | Détails de déploiement (start commands, notes historiques) : `~/Desktop/cluster-skill/cluster-deployments.json`. ## Serveur git central = spbgit (git perso de Simon-Pierre) - Le serveur git est **spbgit**, le git personnel : https://git.spboucher.ai (PAS GitHub — le compte GitHub spboucher-ai a déjà été suspendu, ne compter que sur spbgit). Stockage : bare repos `~/srv/git/.git` sur **M3U96a**. - Remote `origin` de chaque repo de nœud : - Sur M3U96a (vrai-prix, sorti-ka) : chemin local `/Users/simon-pierreboucher/srv/git/.git`. - Sur les autres nœuds : `gitsrv:srv/git/.git` — alias SSH `gitsrv` ajouté en **tête** du `~/.ssh/config` de M3U96b, M4M64a, M4M64b et M2M32 (2026-08-17) : ``` Host gitsrv ControlMaster no ControlPath none HostName MacStudio-de-simon-pierre-2.local # M3U96a via mDNS LAN (192.168.2.87) User simon-pierreboucher StrictHostKeyChecking accept-new ``` ⚠️ SSH inter-nœuds via Tailscale (`*.maclustr.io`) est bloqué par ACL → `gitsrv` passe par le LAN/mDNS. ⚠️ Le bloc doit rester AVANT `Host *` (sinon le ControlPath global casse : « socket path too long »). ⚠️ `ControlMaster no` obligatoire (même raison). - **Push depuis un nœud** : fonctionne grâce à l'agent forwarding (le laptop a `ForwardAgent yes` global) — donc pousser pendant une session SSH ouverte depuis le laptop. **Depuis le 2026-08-24, le push AUTONOME marche aussi** (missions headless des gardiens ka2/ka4/ka6, cron) : la clé `~/.ssh/ka_guardian_ed25519` de chaque nœud (M3U96b, M4M64a, M4M64b) est autorisée sur M3U96a et déclarée en `IdentityFile` dans le bloc `Host gitsrv` — vérifié sans agent SSH. Sur M3U96a l'origin est un chemin local (aucune clé requise). Les consignes des gardiens exigent désormais `git push origin main` après chaque mission. ⚠️ MAIS les missions elles-mêmes (descendants du runner python) sont bloquées par macOS 26 LNP (« no route to host ») : le **pousseur launchd `com.ka.pousseur`** (chaîne binaires Apple, repos dans `~/.ka-pousseur-repos`, tick 5 min) pousse les commits en attente sur M3U96a/b + M4M64a/b. Le rollback du runner est **ciblé** : il ne reverte que les commits `[ka*]` (jamais reset --hard ni revert de plage) puis laisse le pousseur pousser les reverts. ## Workflow Claude (laptop) 1. **Lire** : `ssh "cd && git status && git log --oneline -5"`. 2. **Éditer** : petits changements via `ssh` (sed/python heredoc) ; changements substantiels : `scp :/ /tmp/`, éditer localement avec les outils, `scp` retour. Ne jamais éditer les copies `~/Desktop/*`. 3. **Builder/tester sur le nœud** (venv/node_modules y sont déjà), puis `pm2 restart ` et healthcheck. 4. **Committer + pousser sur le nœud** : `ssh "cd && git add -A && git commit -m '...' && git push origin main"`. 5. **Mettre à jour** `cluster-deployments.json` (notes + `updated`) comme d'habitude. ## Copies laptop (`~/Desktop/*`) — statut Miroirs SECONDAIRES, ne plus y travailler (faire `git pull origin main` pour consulter) : groupe-ka, lou-ka, qc_house_eval/vrai-prix, qc-store (=fabri-ka), food-ka, api-ka, trouve-ka, crea-ka, resto-ka, sorti-ka. **immo-ka et auto-ka n'ont AUCUNE copie laptop** — le nœud + bare repo sont les seules copies. ## État initial de la migration (2026-08-17) Repos git installés dans les 12 dirs de nœud, HEAD aligné sur `origin/main` sans toucher aux fichiers (apps non interrompues). Fichiers trackés manquants restaurés (`git checkout`) : fabri-ka `data/enrich_cache/` (3278 fichiers, jamais rsyncés), lou-ka docs ×7, immo-ka frontend ×7, api-ka logs ×1, trouve-ka docs ×1. `.claude/` exclu du statut via `.git/info/exclude` partout. WIP laptop non commité transféré/vérifié sur les nœuds : food-ka (SSO KA ID + favoris — backend déjà présent, 7 fichiers frontend rsyncés), resto-ka et groupe-ka (déjà identiques sur nœud). **Drift entièrement committé + poussé le 2026-08-17 — les 12 repos de nœud sont PROPRES** (commits « État du nœud / WIP committé depuis le nœud » : lou-ka c556557, groupe-ka 6c76595, resto-ka c9f9e09, food-ka 6004efe, immo-ka 5a9aa9d, fabri-ka 20a2569, sorti-ka 69b8641). Gitignores ajoutés à cette occasion : lou-ka `data/uploads/`, sorti-ka `*.log`, immo-ka `data/vraiprix.db` (1,6 Go) + `*.bak-*` ; trouve-ka `services/tmp-stage/` exclu via `.git/info/exclude` (doublons exacts de fichiers trackés). Les copies laptop sont maintenant EN RETARD sur origin — faire `git pull` avant toute consultation.