SPB Git
3.9 KB · 66 lines markdown
1# maclustr-dispatch — `mld`23Orchestrateur de déploiement du cluster MacLustr. Il tourne **sur la passerelle M1M32** et4déploie chaque application sur le **nœud le plus efficient** du cluster, via le LAN5(192.168.2.x, clé SSH `maclustr-m1m32` autorisée sur tous les nœuds).67```8laptop ──ssh──▶ M1M32 (passerelle : spbgit + mld + staging ~/dispatch/stage)9                  │  scan live (RAM libre, charge, disque, ports, runtimes)10                  │  choix du nœud (score) → rsync LAN → PM2/launchd → ngrok → healthcheck → registre11                  ▼12        M3U96a · M3U96b · M2U64 · M4M64a · M4M64b · M4M36 · M2M32 · …13```1415## Depuis le laptop1617`~/Desktop/cluster-skill/mld <commande>` relaie à la passerelle et rapatrie le registre18(`cluster-skill/cluster-registry.json`).1920| Commande | Effet |21|---|---|22| `mld scan` / `mld nodes` | sonde (ou relit) ressources + runtimes des nœuds |23| `mld apps` / `mld show <app>` | manifestes et emplacement courant |24| `mld pick <app>` · `mld pick --ram 4 --runtime node` | classement des nœuds pour une app / un besoin |25| `mld plan [apps…]` | plan de placement global (glouton, projection des ressources) |26| `mld stage <dir-local> <app>` | pousse un dossier du laptop dans le staging de la passerelle |27| `mld deploy <app> [--node X]` | staging → nœud choisi (auto sans `--node`), démarrage, santé, registre |28| `mld move <app> [--to X] [--from Y]` | migration : pré-copie à chaud, arrêt, delta final, déploiement, santé, retrait (rollback auto) |29| `mld stop/start/restart <app>` · `mld logs <app>` · `mld health <app>` | cycle de vie |30| `mld status [--live]` · `mld registry` | registre (`~/dispatch/registry.json` sur M1M32) |31| `mld retire <app>` | arrête et efface la copie du nœud |32| `mld prepare <nœud> [--ka-helpers]` | installe node/pnpm/pm2/ngrok/python via Homebrew, config ngrok, pm2 startup, marqueur ; `--ka-helpers` = pousseur Ka + alias `gitsrv` + clé autorisée sur la passerelle |33| `mld bootstrap <nœud>` | Xcode CLT + Homebrew sur un Mac vierge (sudo NOPASSWD temporaire) |34| `mld import <nœud>` | brouillons de manifestes depuis les PM2 vivants d'un nœud (`~/dispatch/apps/_drafts/`) |3536## Manifestes (`~/dispatch/apps/<app>.json`, mode 600)3738Un manifeste décrit *comment* tourne une app : `dir` (même chemin absolu sur tous les nœuds),39`processes` (PM2 : script, args, interpreter, cwd, env, cron_restart…), `ngrok` (domaine réservé →40processus `<app>-ngrok`), `launchd` (plists générés), `requires` (runtimes, RAM, ports),41`placement` (`pin`, `prefer`, `avoid` + raison), `sync_excludes`, `extra_paths`, `env_overrides`42(réécriture de `.env` au déploiement), `hooks.post_sync` / `post_start`, `ka_repo` (inscription au pousseur).43Gabarits : `{{HOME}}`, `{{NODE}}`, `{{LAN_IP}}`, `{{IP:<alias>}}`.4445## Scoring4647`0.45·RAM libre après placement + 0.25·cœurs idle + 0.10·disque + 0.15·cœurs − 0.04·apps hébergées48(+0.15 prefer, +0.05 si déjà sur ce nœud)`. Inéligible : hors ligne, rôle gateway (sauf épingle),49runtime manquant, RAM libre < besoin + 2 Go, disque, port occupé (hors nœud d'origine).5051## Ajouter un nœud52531. Activer *Session à distance* sur le Mac, autoriser la clé de la passerelle54   (`~/.ssh/id_ed25519.pub` de M1M32) et celle du laptop dans `~/.ssh/authorized_keys`.552. `echo <alias> > ~/.maclustr-node` sur le nœud ; ajouter l'alias dans `mld/config.py` (`NODES`).563. `mld discover` → `mld bootstrap <alias>` (si Mac vierge) → `mld prepare <alias>`.5758## Fichiers5960- `mld/config.py` inventaire statique, rôles, chemins, détection des runtimes61- `mld/nodes.py` découverte LAN, sonde · `mld/picker.py` score/plan · `mld/deploy.py` fetch/deploy/move/health62- `mld/render.py` ecosystem PM2 + plists · `mld/prepare.py` runtimes/bootstrap/ka-helpers · `mld/importer.py`63- `assets/` pousseur Ka (script + plist)6465Pas de dépendance : Python 3 système (3.9) + ssh/rsync (GNU rsync via Homebrew sur la passerelle).66
Files · 29a50362078452d2dd01b6b79868199cb58a3d0f
Menu

Theme