SPB Git forge
2commits 1branches 0releases
196.0 KBsize
maindefault branch
1 h agolast push
Python 100%
3.9 KB · 65 lines markdown
Rendered Raw Blame History
1# maclustr-mobile — les iPhones comme nœuds du cluster MacLustr23Un iPhone ne peut ni recevoir de SSH ni travailler en arrière-plan. Les iPhones du cluster4**tirent** donc leur travail : l'app **MacLustr iOS ≥ 4.3.0** (onglet **Nœud**, TestFlight)5s'enregistre auprès de ce coordinateur, envoie un battement toutes les 20 s (batterie,6thermique, réseau, mémoire) et fait du long-poll sur `/api/worker/next` ; chaque job est7exécuté sur l'iPhone puis renvoyé sur `/api/worker/result`.89```10 laptop / apps / scripts ──POST /api/jobs──▶  maclustr-mobile (M4M64a:9320, PM2, py3.9 stdlib)11                        ◀──GET /api/jobs/{id}/wait──          ▲ long-poll /api/worker/next12                                                              │ POST /api/worker/result, /heartbeat13 maclustr-agentd (9210) ──GET /api/workers (loopback)──▶      │14   → /api/cluster.mobile, /health.mobileOnline      iPhone 17 Pro Max ×3 (app MacLustr, onglet Nœud, Tailscale)15```1617## Types de jobs1819| type | payload | résultat |20|---|---|---|21| `http.fetch` | `url`, `method`, `headers`, `body`/`bodyBase64`/`json`, `timeoutS`, `maxBytes` (2 Mo), `wantJson` | `status`, `headers`, `body` ou `bodyBase64`, `finalUrl`, `bytes`, `durationMs` — la requête part de l'IP de l'iPhone (Wi-Fi ou cellulaire) |22| `js.run` | `code` (définit `function main(args)`), `args`, `timeoutS` | `value` (retour JSON de `main`), `logs`. API : `ml.http(url, {method, headers, body, timeout})` synchrone, `ml.log`, `ml.sleep(ms)`, `ml.now()`, `ml.device`, `ml.worker`, `console.log` |23| `sys.info` | — | modèle, puce, iOS, batterie, thermique, mémoire, disque, réseau |24| `ping` | `t` | `pong`, écho, heure de l'appareil |2526Champs communs : `target` (nom d'un iPhone, sinon n'importe lequel), `tag` (regrouper un lot), `timeoutS`,27`maxAttempts` (3). Un job dont le bail expire (app fermée, iPhone en arrière-plan) est re-mis en file ;28une erreur réseau/timeout est rejouée, une erreur « métier » (exception JS, HTTP 4xx) ne l'est pas.2930## Utilisation3132```bash33mlmobile nodes                                   # iPhones connus : en ligne, batterie, thermique, jobs34mlmobile ping ; mlmobile info --on iph17a35mlmobile fetch https://www.centris.ca/fr --raw --on iph17a36mlmobile run script.js --args '{"q":"immo"}'      # function main(args){ … return … }37mlmobile fetch-list urls.txt --out out.jsonl      # 1 fetch par URL, réparti sur tous les iPhones38mlmobile map script.js items.json                 # 1 job JS par élément, résultats agrégés39mlmobile jobs --state failed ; mlmobile job <id> ; mlmobile cancel <id>40```4142API directe : `curl -H "Authorization: Bearer $MOBILE_TOKEN" http://M4M64a.maclustr.io:9320/api/workers`.4344## Déploiement (mld)4546```bash47scp deploy/maclustr-mobile.json M1M32:~/dispatch/apps/maclustr-mobile.json48mld stage ~/Desktop/Cluster/maclustr-mobile maclustr-mobile     # .mldignore exclut ios/ et data/49mld deploy maclustr-mobile                                      # épinglé M4M64a (même hôte qu'agentd)50```5152Aucune route publique : les iPhones et le laptop joignent `http://M4M64a.maclustr.io:9320` par Tailscale53(l'app Tailscale doit être connectée sur l'iPhone, comme pour l'onglet Cluster). Pour exposer publiquement :54DNS `A mobile.maclustr.io → 51.161.112.61` puis `mld tunnel route` ; changer l'URL dans Nœud → Réglages.5556Jeton unique `MOBILE_TOKEN` (manifeste, app iOS, `agentd config.json → mobile_token`).57Données : `~/apps/maclustr-mobile/data/mobile.db` (workers, jobs 7 jours).5859## Côté iPhone6061Installer MacLustr (TestFlight) → onglet **Nœud** → **Mode nœud**. Réglages : nom (défaut dérivé du nom62de l'appareil), URL, jeton, jobs simultanés (1–6), écran allumé. Garder l'iPhone **branché** et l'app63**ouverte sur l'onglet** ; iOS suspend l'app en arrière-plan (le coordinateur re-met alors les jobs en file).64Pour du 24/7 : Réglages iOS → Accessibilité → Accès guidé sur l'app MacLustr.65