SPB Git
8.3 KB · 134 lines python
1"""maclustr-dispatch — configuration centrale.23Tout tourne SUR la passerelle (M1M32). Python 3.9 (système macOS) : pas de syntaxe > 3.9.4"""5import os67USER = "simon-pierreboucher"8HOME = os.path.expanduser("~")9GATEWAY = "M1M32"10DOMAIN = "maclustr.io"11LAN_PREFIX = "192.168.2."12SSH_KEY = os.path.join(HOME, ".ssh", "id_ed25519")          # clé « maclustr-m1m32 », autorisée sur tous les nœuds13STATE = os.path.join(HOME, "dispatch")                          # état : apps/, stage/, registry.json, lan.json, logs/14APPS_DIR = os.path.join(STATE, "apps")15STAGE_DIR = os.path.join(STATE, "stage")16LOG_DIR = os.path.join(STATE, "logs")17REGISTRY = os.path.join(STATE, "registry.json")18LAN_CACHE = os.path.join(STATE, "lan.json")19SCAN_CACHE = os.path.join(STATE, "scan.json")20NGROK_CFG = os.path.join(HOME, "Library", "Application Support", "ngrok", "ngrok.yml")21RUN_DIR = "~/dispatch-run"                                      # sur les nœuds : ecosystem PM2 générés22SUDO_PW_FILE = os.path.join(STATE, ".sudo")                     # mot de passe sudo des nœuds (0600), pour `prepare`2324# Inventaire statique (alias -> cœurs, RAM Go, modèle). Les IP LAN sont découvertes en live.25NODES = {26    "M3U96a": {"cores": 32, "ram_gb": 96, "model": "Mac Studio"},27    "M3U96b": {"cores": 32, "ram_gb": 96, "model": "Mac Studio"},28    "M2U64":  {"cores": 24, "ram_gb": 64, "model": "Mac Studio"},29    "M4M64a": {"cores": 16, "ram_gb": 64, "model": "Mac Studio"},30    "M4M64b": {"cores": 16, "ram_gb": 64, "model": "Mac Studio"},31    "M4BP48": {"cores": 16, "ram_gb": 48, "model": "MacBook Pro"},32    "M4BP36": {"cores": 14, "ram_gb": 36, "model": "MacBook Pro"},33    "M4M36":  {"cores": 14, "ram_gb": 36, "model": "Mac Studio"},34    "M2M32":  {"cores": 12, "ram_gb": 32, "model": "Mac Studio"},35    "M2M32b": {"cores": 12, "ram_gb": 32, "model": "Mac Studio"},36    "M2M32c": {"cores": 12, "ram_gb": 32, "model": "Mac Studio"},37    "m4mc":   {"cores": 12, "ram_gb": 24, "model": "Mac mini"},38    "M1M32":  {"cores": 10, "ram_gb": 32, "model": "Mac Studio"},39    "m4ma":   {"cores": 10, "ram_gb": 24, "model": "Mac mini"},40    "m4mb":   {"cores": 10, "ram_gb": 16, "model": "Mac mini"},41    "m2m16":  {"cores": 10, "ram_gb": 16, "model": "Mac mini"},42    "M3BA24": {"cores": 8,  "ram_gb": 24, "model": "MacBook Air"},43    "M3BA16": {"cores": 8,  "ram_gb": 16, "model": "MacBook Air"},44    "m2m8a":  {"cores": 8,  "ram_gb": 8,  "model": "Mac mini"},45    "m2m8b":  {"cores": 8,  "ram_gb": 8,  "model": "Mac mini"},46    "m4md":   {"cores": 10, "ram_gb": 16, "model": "Mac mini"},      # ajouté 2026-09-04 (Mac16,10, M4, 100.78.227.79)47    "M1M64":  {"cores": 10, "ram_gb": 64, "model": "Mac Studio"},    # ajouté 2026-09-08 (Mac13,1, M1 Max, loué, hors LAN — voir REMOTE_NODES)48    "m2m16b": {"cores": 10, "ram_gb": 16, "model": "Mac mini"},      # ajouté 2026-09-08 (Mac14,12, M2 Pro, loué, hors LAN — voir REMOTE_NODES)49    "m1m16":  {"cores": 8,  "ram_gb": 16, "model": "Mac mini"},      # ajouté 2026-09-08 (Macmini9,1, M1, loué, hors LAN — voir REMOTE_NODES)50    "m2m16c": {"cores": 8,  "ram_gb": 16, "model": "Mac mini"},      # ajouté 2026-09-08 (Mac14,3, M2, loué, hors LAN — voir REMOTE_NODES)51    "m4me":   {"cores": 10, "ram_gb": 16, "model": "Mac mini"},      # ajouté 2026-09-08 (Mac16,10, M4, loué Macly, hors LAN — voir REMOTE_NODES)52    "m4mf":   {"cores": 10, "ram_gb": 16, "model": "Mac mini"},      # ajouté 2026-09-09 (Mac16,10, M4, loué Macly, hors LAN — voir REMOTE_NODES)53    "m4mg":   {"cores": 10, "ram_gb": 16, "model": "Mac mini"},      # ajouté 2026-09-09 (Mac16,10, M4, loué rentamac, Chypre, via gate1.rentamac.io:27335 — voir REMOTE_NODES)54}5556# Nœuds HORS LAN : IP publique fixe + autre utilisateur + autre mot de passe sudo. Ils ne sont pas trouvés par le57# balayage 192.168.2.x : `discover` s'y connecte directement et vérifie le marqueur ~/.maclustr-node.58REMOTE_NODES = {59    "M1M64": {"host": "45.74.241.221", "user": "simon", "sudo_pw_file": os.path.join(STATE, ".sudo-M1M64")},60    "m2m16b": {"host": "208.52.154.68", "user": "administrator", "sudo_pw_file": os.path.join(STATE, ".sudo-m2m16b")},61    "m1m16":  {"host": "207.254.29.71", "user": "administrator", "sudo_pw_file": os.path.join(STATE, ".sudo-m1m16")},62    "m2m16c": {"host": "207.254.29.128", "user": "administrator", "sudo_pw_file": os.path.join(STATE, ".sudo-m2m16c")},63    "m4me":   {"host": "45.74.245.36",   "user": "simon",         "sudo_pw_file": os.path.join(STATE, ".sudo-m4me")},64    "m4mf":   {"host": "45.74.245.37",   "user": "simon",         "sudo_pw_file": os.path.join(STATE, ".sudo-m4mf")},65    # m4mg : Mac derrière NAT chez rentamac ; joint via la passerelle SSH du fournisseur. Le port 27335 est porté par66    # ~/.ssh/config de la passerelle M1M32 (`Host gate1.rentamac.io` → Port 27335), mld n'a pas de notion de port.67    "m4mg":   {"host": "gate1.rentamac.io", "user": "rentamac",   "sudo_pw_file": os.path.join(STATE, ".sudo-m4mg")},68}697071def _remote(key):72    for alias, r in REMOTE_NODES.items():73        if key in (alias, r["host"]):74            return r75    return None767778def user_of(key=None):79    """Utilisateur SSH d'un nœud (alias ou IP) — simon-pierreboucher partout sauf REMOTE_NODES."""80    r = _remote(key) if key else None81    return r["user"] if r else USER828384def home_of(key=None):85    return "/Users/%s" % user_of(key)868788def sudo_pw_file(key=None):89    r = _remote(key) if key else None90    return r["sudo_pw_file"] if r else SUDO_PW_FILE919293# Nœuds réservés : inéligibles au placement automatique (sauf app épinglée dessus).94RESERVED = {95    "M3U96b": "réservé à hfmarketdata (lac FirstRate Data) depuis le 2026-09-04",96    "M1M64": "nœud distant hors LAN (loué, user simon) : pas de LAN 192.168.2.x ni de gardiens Ka → placement seulement avec --node",97    "m2m16b": "nœud distant hors LAN (loué, user administrator) : pas de LAN 192.168.2.x ni de gardiens Ka → placement seulement avec --node",98    "m1m16": "nœud distant hors LAN (loué, user administrator) : pas de LAN 192.168.2.x ni de gardiens Ka → placement seulement avec --node",99    "m2m16c": "nœud distant hors LAN (loué, user administrator) : pas de LAN 192.168.2.x ni de gardiens Ka → placement seulement avec --node",100    "m4me": "nœud distant hors LAN (loué Macly, user simon) : pas de LAN 192.168.2.x ni de gardiens Ka → placement seulement avec --node",101    "m4mf": "nœud distant hors LAN (loué Macly, user simon) : pas de LAN 192.168.2.x ni de gardiens Ka → placement seulement avec --node",102    "m4mg": "nœud distant hors LAN (loué rentamac, user rentamac, via gate1.rentamac.io:27335) : pas de LAN ni de gardiens Ka → placement seulement avec --node",103}104105# Rôles : gateway = jamais d'app ; worker = éligible. Un nœud absent du scan est « offline ».106ROLES = {alias: ("gateway" if alias == GATEWAY else "worker") for alias in NODES}107108# Runtimes que `prepare` sait installer via Homebrew, et comment les détecter sur un nœud.109RUNTIME_CHECKS = {110    "node":        "test -x /opt/homebrew/bin/node",111    "pnpm":        "test -x /opt/homebrew/bin/pnpm",112    "pm2":         "test -x /opt/homebrew/bin/pm2",113    "ngrok":       "(test -x /opt/homebrew/bin/ngrok || test -x $HOME/bin/ngrok) && test -f \"$HOME/Library/Application Support/ngrok/ngrok.yml\"",114    "python@3.14": "test -x /opt/homebrew/opt/python@3.14/bin/python3.14",115    "python@3.13": "test -x /opt/homebrew/opt/python@3.13/bin/python3.13",116    "python@3.12": "test -x /opt/homebrew/opt/python@3.12/bin/python3.12",117    "uv":          "test -x /opt/homebrew/bin/uv || test -x $HOME/.local/bin/uv",118    "uv-python@3.12": "ls -d $HOME/.local/share/uv/python/cpython-3.12* >/dev/null 2>&1",119    "redis":       "test -x /opt/homebrew/bin/redis-server && redis-cli ping >/dev/null 2>&1",120    "docker":      "test -x /opt/homebrew/bin/docker",121    "postgresql@17": "test -x /opt/homebrew/opt/postgresql@17/bin/postgres",122    "brew":        "test -x /opt/homebrew/bin/brew",123    "git":         "test -x /opt/homebrew/bin/git || test -x /usr/bin/git",124}125BREW_FORMULAE = {126    "node": "node", "pnpm": "pnpm", "pm2": "pm2", "python@3.14": "python@3.14", "python@3.13": "python@3.13",127    "python@3.12": "python@3.12", "uv": "uv", "redis": "redis", "docker": "docker", "postgresql@17": "postgresql@17", "git": "git",128}129BREW_CASKS = {"ngrok": "ngrok"}130131os.makedirs(APPS_DIR, exist_ok=True)132os.makedirs(STAGE_DIR, exist_ok=True)133os.makedirs(LOG_DIR, exist_ok=True)134
Files · 45787cb0f5540e86ea4e53a6714968c3ca1137c2
Menu

Theme