iris-server-hosts: gpu-hosts zu allgemeinen Hosts weiterentwickeln, SSH-Felder aus den Plugin-Konfigurationen entfernen #115
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/iris-plugins#115
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Warum
Plugins, die einen Rechner brauchen, trugen in ihren eigenen Einstellungen SSH-Felder („Anderer Rechner (SSH-Ziel …)“, „Erweitert: SSH-Schlüssel“ in
whisper,heartmula,marker,qwen-tts-linux,comfyui-bridge;comfyui-bridge/python/comfyui_client.pylas ein SSH-Ziel aus der Plugin-Konfiguration).gpu-hostsverwaltete Hosts, den gemeinsamen Schlüssel und die Einrichtung bereits, war aber nach der GPU benannt, obwohl immer mehr Plugins nur einen Rechner brauchen (geplant:iris-forgejo, iris-plugins#113; ein Nextcloud-Plugin, das komplette Nextcloud-Server einrichtet).Spezifikation
Hosts statt GPU-Hosts.
gpu-hostsheißtiris-server-hostsund führt schlicht „Hosts“. „Dieser Iris-Server“ (self) ist immer ein Host. Adresse und Schlüssel eines Hosts stehen genau einmal dort (host-add,host-probe, Einrichtung), in keiner Plugin-Konfiguration, auch nicht unter „Erweitert“.Zugang zu Hosts. SSH-Adresse und Schlüssel werden nur in diesem Plugin konfiguriert, auch der Zugang zu „Dieser Iris-Server“ (Fenster: Passwort einmalig, Befehl
self-authorize).Fähigkeiten. Beim Prüfen erkannt und im Host-Eintrag gespeichert: GPU (mit VRAM und Treiber), Docker, Betriebssystem/Architektur. Die GPU ist eine erkannte Eigenschaft wie jede andere, nicht die Art des Eintrags. Ein Host ohne
checked_atgilt als ungeprüft und wird beim Öffnen der Verwaltung einmal eingelesen.Laufzeit. Ein Plugin speichert nur die Host-Kennung (
host_id,self), nie Adresse oder Schlüssel. Der Server löst die Kennung auf (SSH-Ziel plus Schlüssel), byte-genau auf Mac- und Linux-Server; Plugins ohne eigene Server-Route bekommen eine Resolver-Route. Ein Plugin-Skript liest nie die Datei eines fremden Plugins. Die Verknüpfungs-Maschinerie vongpu-hosts(Nachziehen, Abweichungen,GPU_PLUGINS-Tabelle) entfällt.Anforderungen. Das Manifest-Feld
host_capabilitiesnennt, was ein Plugin von seinem Rechner verlangt; der Server prüft bei Picker, Installation und Anwenden. Der Picker-Parameterneeds=…ergänzt es je Aufruf, lockert es nie (ComfyUI: GPU und Docker). Der Picker liefertGET /hosts/targets.Installations-Sperre. Ein Plugin lässt sich nur installieren, wenn mindestens ein Rechner alle seine Anforderungen erfüllt (nicht jede Anforderung irgendein Rechner). Kein passender Host: nicht installierbar, keine Leiche im System. Dieselbe reine Funktion auf Plugin-Kern, Linux-Server und Mac-Seite; der Restore-Bericht führt gesperrte Plugins als
blocked.Harter Schnitt, beide Server gleichzeitig. ID
iris-server-hosts, RouteGET /hosts/targets, Storeiris_server_hosts.json, Python-Module, Tests, Mac-Seite (IrisHosts/,GPUHost/), Store-Material, Doku, PLAN.md, Gedächtnis. Keine Übergangszeit für alte Aufrufer, keine automatische Migration.Die fünf GPU-Plugins (heartmula, whisper, marker, qwen-tts-linux, comfyui-bridge) werden ausgeschaltet, ihre Dateien bleiben. Ihre
ssh_target-Felder sind später die Quelle für die Umstellung, je Plugin in einem eigenen Issue (Picker mitneeds,host_idstattssh_target, Panel ohne SSH-Felder).Nicht in diesem Issue: der Check-Knopf auf der Iris-Seite (prüft alle Plugins gegen ihre Hosts: da, ansprechbar, verbindbar; bei Ausfall Plugins markiert und gesperrt) und die Umstellung der einzelnen Plugins: eigene Issues.
Stand
GET /hosts/targetsmitneeds,host_capabilities, Auflösunghost_id→ Ziel, Installations-Sperre (Plugin-Repo, Linux-Server, Mac-Seite)iris_server_hosts.json, Host-Kern inIris/IrisHosts/GET /hosts/targetslive gegen die Mac-App geprüft (selfseit Iris PR #84 auch in der Mac-Route)scripts/build-gpu-host-bundle.sh, Referenz-Eintrag fürIrisHosts/, Store-Material, Gedächtnis, MutationstestsBetroffen: die fünf genannten Plugins,
iris-server-hostsselbst, Linux- und Mac-Server. Verwandt: iris-plugins#113 (iris-forgejo). Verlauf mit PRs und Messungen steht in den Kommentaren.SSH-Host und Schlüssel nur noch in gpu-hosts: Plugin-Konfigurationen verlieren die SSH-Felderto iris-server-hosts: gpu-hosts zu allgemeinen Hosts weiterentwickeln, SSH-Felder aus den Plugin-Konfigurationen entfernenPräzisierung (2026-10-17)
Auf Alfs Wunsch zugeschnitten:
gpu-hostswird zuiris-server-hosts(allgemeine „Hosts“, GPU ist eine erkannte Eigenschaft). Weitere Plugins bauen darauf auf, zuerstiris-forgejo(#113), danach ein Nextcloud-Einrichtungs-Plugin, das einen Host braucht. Titel und Beschreibung entsprechend angepasst; die Frage der Umbenennung steht neu bei „Noch zu entscheiden“.PR #117 gemergt: docs(iris-forgejo): Hosts über iris-server-hosts (bisher gpu-hosts) (#113, #115)
#117
Commits:
Entscheidungen (grill-me, 2026-10-18)
Die vier offenen Punkte sind entschieden; die Beschreibung bleibt die Spezifikation.
Laufzeit — wie der Host ins Plugin kommt
Umfang dieses Issues
Bauabschnitte
Folgt in separaten Issues: Plugin für Plugin auf das neue System umstellen (Picker mit needs, host_id statt ssh_target, Panel ohne SSH-Felder); Iris-Seite Check-Knopf.
PR #121 gemergt: docs(iris-server-hosts): Grill-me-Entscheidungen zur Weiterentwicklung (#115)
#121
Commits:
PR #122 gemergt: feat(iris-server-hosts): gpu-hosts umbenannt, Kennung statt SSH-Ziel, Fähigkeiten im Host-Eintrag (#115)
#122
Commits:
PR #38 gemergt: feat(hosts): gpu_targets umbenannt zu hosts_targets, Kennung statt SSH-Ziel, needs-Filter (iris/iris-plugins#115)
iris/iris-linux-server#38
Commits:
Linux-Server-Hälfte von #115 gemergt (PR #38, main = 64493c7).
Was gebaut wurde
app/gpu_targets.py→app/hosts_targets.py,app/gpu_targets_routes.py→app/hosts_targets_routes.py; RouteGET /gpu-hosts/targets→GET /hosts/targets.resolve()/target_from_body()akzeptieren nur noch die Host-Kennung (host_id,self), nie die Adresse; das altessh_target-Feld im Panel-Body wird nicht mehr gelesen.list_targets(needs=…)filtert nachhost_capabilitiesaus der Manifest-Anforderung;selfist immer ein Host, die Anforderungen entscheiden, nie die Hardware des Servers.plugins_routes.py(start-server, test-connection),heartmula/marker/whisper/qwen-tts-linux-Routen; Fehlermeldung „Kein GPU-Rechner gewählt“ → „Kein Rechner gewählt“.Was gemessen wurde
tests/test_hosts_targets.py: 7 Tests, lokal und im Container gegen den Deploy-Stand grün..venv/bin/pytest -m "not slow"lokal gegen den laufenden Server: 414 passed. Die 14 Fehlerschaltungen sind Backup-Timesouts, Qwen-TTS-Backend down (503) und Vault-Git-Umgebung — gegen HEAD ohne diese Änderung identisch, also nicht von ihr.alf@iris-servernachdocker compose up -d --build --force-recreate:GET /healthok;GET /hosts/targetsliefertselfmit echter SSH-Sonde (RTX 4090 + 3090 Ti, Docker, Ubuntu 26.04.1);needs=gpu/needs=docker/needs=gpu&needs=docker→self;needs=rechner(unbekannte Fähigkeit) → leer; alte Route/gpu-hosts/targets→ 404.tests/test_plugins.py::test_plugin_start_server_reports_ssh_failure_without_crashingauf den neuen Vertrag gestellt: neuer Fixtureunreachable_hostschreibt einen Host-Eintrag mit unerreichbarer Adresse iniris_server_hosts.jsonund entfernt ihn danach; neuer Testtest_plugin_start_server_requires_a_known_hostprüft 400 ohne Kennung und bei unbekannter Kennung.Grenzen / offen
heartmula,comfyui-bridge,marker,qwen-tts-linux,whisper) holen weiterhin/gpu-hosts/targets— die Route ist auf dem Linux-Server jetzt 404, der Picker bleibt dort leer (dercatch-Pfad), das „Erweitert“-Feld funktioniert. Die Plugin-seitige Picker-Umstellung ist in #115 als separate Schritte vorgesehen.GPUHostRegistry.swift,IrisRemoteServer.swift,GPUHostPluginKey.swift) und/hosts/targetsdort sind die andere Hälfte von #115 und stehen noch aus.app/email_config_store.py(die Datei kopiert erst der Dockerfile-Build ausvendored/ins Image) — Muster wietests/test_videowatch_queue_items.py.PR #39 gemergt: docs(hosts): Chronik zum Host-Ziele-Umbau (iris/iris-plugins#115)
iris/iris-linux-server#39
Commits:
PR #77 gemergt: feat(iris-server-hosts): Mac-Seite — Host-Kern, Kennung statt SSH-Ziel, Fähigkeiten (iris/iris-plugins#115)
iris/Iris#77
Commits:
Stand (2026-10-18): Kern und Mac-Seite gemergt, GPU-Plugins aus
Gemergt
iris-server-hosts0.3.0: Manifest-Feldhost_capabilities,panel_api(overview,public-key,host-add,host-probe,host-update,host-remove,setup-start,setup-status), Kerniris_server_hosts_core.py/iris_server_hosts_ssh.py(SondePROBE_COMMAND+parse_probe), Tests, Store-Material.gpu_targets*.py→hosts_targets*.py, RouteGET /hosts/targets,resolve()/target_from_body()lesen nur noch die Kennung (keinssh_targetim Panel-Body),list_targets(needs=…)nachhost_capabilities, Aufrufer mitgezogen; 7 Unit-Tests grün, Suite 414 passed, live aufalf@iris-serververifiziert (echte Sonde: RTX 4090 + 3090 Ti, Docker, Ubuntu 26.04.1), alte Route 404.5e13259Mac-Seite,cdcd927Prüfprogramm. RouteGET /gpu-hosts/targets→GET /hosts/targetsmitneeds-Filter; wiederholte Parameter (?needs=gpu&needs=docker, wie die Linux-Route sie als Liste liest) gingen inqueryParamsvorher verloren, deshalbHTTPRequest.queryValues. Alle zehn Panel-Aufrufstellen (whisper / heartmula / marker / qwen-tts-linux jetest-connection+install, comfyui-bridgestart-server+test-connection) lösen nur nochhost_idauf, nie eine Adresse; „Kein GPU-Rechner gewählt" → „Kein Rechner gewählt".gpu_hosts.json→iris_server_hosts.json(die beiden Host-Einträge mitgezogen,linksraus). Eine Sonde fragt jetzt Grafikkarte, Docker und Betriebssystem in einem SSH-Aufruf. Neuer Foundation-KernIris/IrisHosts/:IrisHostStore(Iris-Ordner überIRIS_APP_SUPPORT_DIR,host_id→ Ziel),IrisHostCapabilities(Sondentext wörtlich wiehosts_targets.py, Anforderungen, Picker-Eintrag),IrisHostRegistry,IrisHostPluginKey(eine Pfaddefinition statt der doppelten).Prüfprogramm
scripts/gpu-host-harness→scripts/iris-hosts-harness:run.shnimmt jetztIris/GPUHost/undIris/IrisHosts/, eine neue Datei in einem dieser Ordner läuft automatisch mit, neue Funktionalität bekommt einenMARK-Abschnitt. 26 neue Checks (Sonde auswerten, Anforderungen, Picker-Eintrag, Host-Liste anlegen/lesen/Idempotenz, Picker-Auflösung, Schlüssel idempotent); die Fixturesprobe-*.txtsind wörtlichtests/fakes.py, der Programm-Kopf nennt die Paritäts-Referenzen beider Server — ein Check, der dort anders steht, zeigt eine Abweichung zwischen den Servern. Der Lauf setztIRIS_APP_SUPPORT_DIRauf einen Temp-Ordner und räumt ihn auf: die echten Iris-Dateien bleiben unangetastet. Zwei Funde, die der Xcode-Build durchließ: CrashIndex out of rangebei leerem Betriebssystem-Abschnitt (Rechner ohne/etc/os-release; Swifts?? [""]fällt nur bei fehlendem Schlüssel um, Pythonsor [""]bei leerer Sammlung) und ein zu strenger eigener Check (URL-Gleichheit schließt das Verzeichnis-Flag ein,appendingPathComponentsetzt es nie).Bauabschnitte
GET /hosts/targetsmit needs-Filter, Manifest-Feldhost_capabilities, Auflösunghost_id→ SSH-Ziel plus Schlüssel. Offen: die Installations-Sperre (kein passender Host → Plugin nicht installierbar) ist nicht verifiziert; der Mac-Server wertethost_capabilitiesaus dem Manifest nicht aus —handleHostTargetsfiltert nur nach demneeds-Query (auf dem Linux-Server kommt die Anforderung alsneedsan der Route an).iris_server_hosts.json, GPUHost-Dateien (GPUHostPluginKey→IrisHostPluginKey,GPUHostSetupModelträgt die Grafikkarte alscapabilitiesein).gpu-hostssind deinstalliert; ihre*_plugin_config.jsonund die per-Plugin-Schlüssel inssh/bleiben unangetastet — sie sind die Quelle für die Umstellung je Plugin im eigenen Issue.plans/GPU-HOST-SETUP-APP.mdundCLAUDE-Key-Files-Referenz.mdauf den neuen Pfad gestellt, Iris-PLAN.mdum Phase 98 erweitert (mit Lessons Learned). Offen:scripts/build-gpu-host-bundle.sh, Referenz-Eintrag fürIrisHosts/, Store-Material, Gedächtnis, Mutationstests.Noch offen
iris-server-hostsauf dem Mac installieren (kein GPU-Plugin ist mehr installiert).GET /hosts/targetsgegen die neu gebaute App live verifizieren (needs-Matrix, Sonde aufalf@iris-server)./gpu-hosts/targets→ 404 auf beiden Servern, Picker bleibt dort leer (dercatch-Pfad); gehört in die Plugin-für-Plugin-Folge-Issues.PR #78 gemergt: feat(hosts): host_capabilities aus dem Manifest wird ausgewertet, needs ergänzt sie (iris/iris-plugins#115)
iris/Iris#78
Commits:
PR #40 gemergt: feat(hosts): host_capabilities aus dem Manifest wird ausgewertet, needs ergänzt sie (iris/iris-plugins#115)
iris/iris-linux-server#40
Commits:
PR #126 gemergt: feat(iris-server-hosts): Installations-Sperre — ein Rechner muss alle Anforderungen erfüllen (#115)
#126
Commits:
PR #41 gemergt: feat(hosts): Installations-Sperre in der Installationsroutine, ein Rechner muss alle Anforderungen erfüllen (iris/iris-plugins#115)
iris/iris-linux-server#41
Commits:
PR #79 gemergt: feat(iris-hosts): Installations-Sperre — ein Rechner muss alle Anforderungen erfüllen, Prüfprogramm und Restore-Bericht (iris/iris-plugins#115)
iris/Iris#79
Commits:
PR #42 gemergt: test(hosts): Gate-Tests der Installations-Sperre (iris/iris-plugins#115)
iris/iris-linux-server#42
Commits:
PR #80 gemergt: test(iris-hosts): IrisHostProbe — die Sperre mit Attrappen-Sonde, ohne sie wäre PR #79 unvollständig (iris/iris-plugins#115)
iris/Iris#80
Commits:
Statusbericht — Installations-Sperre gebaut (Bauabschnitt 1, Entscheidung 5)
Die Entscheidung: Ein Plugin lässt sich nur installieren, wenn mindestens ein Rechner alle seine Anforderungen erfüllt — nicht jeder Anforderung irgendein Rechner. Zwei Rechner, von denen einer nur eine Grafikkarte hat und der andere nur Docker, erfüllen zusammen kein Plugin, das beides verlangt. Kein passender Host → das Plugin lässt sich nicht installieren (keine Leiche im System). Der Check-Knopf in Iris bleibt ein eigenes Issue.
Gebaut als dieselbe reine Funktion auf allen drei Seiten — die Parität ist der Vertrag, nicht ein Implementierungsdetail:
iris_server_hosts_core.unmet_requirementshosts_targets.unmet_requirementsplugin_installer.install_plugin_from_archive, vor dem ersten Schritt, der etwas anfasst (Treiber-Gruppe, Verzeichnis, Hook)IrisHostCapabilities.unmetRequirementsPluginManager.importPlugin, ebenso vor dem ersten SchreibschrittLeere Liste heißt: es gibt so einen Rechner; sonst die Anforderungen, die dem besten fehlen; ohne Rechner alle.
Fähigkeiten über dieselbe Sonde wie der Picker (
hosts_with_capabilities→gate_blockers):selfper Sonde, die Hosts der Liste ebenfalls, ein Rechner, der nicht antwortet, behält seine gespeicherten Fähigkeiten.list_targets()ist auf dieselbe Basis gestellt — Picker und Sperre sehen jetzt dieselben Rechner. Ohne Anforderung prüft die Sperre nichts und läuft ohne Netzwerkzugriff.Restore-Bericht:
blockedals neues Feld, auf beiden Seiten dasselbe (PluginRestoreSummaryin Swift, der Sync-Bericht inplugin_installer.py). Ein gesperrtes Plugin ist nie installiert; ohne das Feld fiele es aus dem Bericht heraus, als wäre der Restore gelungen.importPlugingibt die Blocker zurück, weil der Restore sie braucht.Anforderung aus dem Manifest braucht zwei Leser:
manifest_capabilitiesliest sie aus dem installierten Plugin (die Route kennt die ID über den cfg_token). Die Sperre braucht das Manifest des Pakets, das gerade installiert wird — dafürmanifest_requirements(manifest)als gemeinsame Basis über dem Dict.Verifiziert:
maxgegenmin).test_plugin_install_gate.pyneu — reine lokale Unit-Tests ohne Server und ohne Netzwerk, jeder Fall prüft, dass vor der Sperre nichts angefasst wurde;test_hosts_targets.py+8).Commits:
2a9b5a1(plugins, PR #126) ·0bac9f6+32cb78b(linux-server, PR #41, #42) ·e25ed80+046be00(Iris, PR #79, #80).Zwei Stolpersteine, die diese Session gezeigt hat:
shipohne-animmt neue Dateien nicht mit — die neue Gate-Testdatei undIrisHostProbe.swiftwaren im ersten PR ihres Repos nicht enthalten, während der Code, der sie aufruft, schon gemergt war. Build und Prüfprogramm waren lokal grün, weil beide die Datei fanden; das Repo war unvollständig.Offen in #115: Bauabschnitt 3 (die fünf GPU-Plugins deaktivieren, Dateien bleiben) und Bauabschnitt 4 (Restflächen umbenennen, Veröffentlichen nur auf Alfs Wort). Die Plugin-für-Plugin-Umstellung und der Iris-Check-Knopf bleiben eigene Issues.
PR #128 gemergt: fix(iris-server-hosts): ungeprüfte Hosts beim Öffnen einlesen, Anzeige „noch nicht geprüft“ (iris/iris-plugins#115)
#128
Commits:
Fix: ungeprüfte Hosts (PR #128, main =
97fd005)Befund: Nach der Migration von
gpu_hosts.jsonstanden beide Mac-Hosts nur mitcapabilities: {gpus: []}im Store (keindocker,os,checked_at) und wurden nie neu eingelesen. Das Panel zeigte „keine Grafikkarte · kein Docker“, obwohlssh.probe()gegen beide Einträge RTX 4090 + 3090 Ti, Docker und Ubuntu 26.04.1 liefert.Fix:
overviewliest Hosts ohnechecked_ateinmal ein (nicht während einer Einrichtung; unerreichbare bleiben ungeprüft und werden nicht gespeichert). Die Anzeige sagt „noch nicht geprüft“, solangechecked_atfehlt.Geprüft: 76 Tests grün (2 neu), Mutationstest 67 von 67 (3 neu). Installierte Kopie auf dem Mac synchronisiert; der Linux-Server hat das Plugin nicht installiert.
Grenze: Ein dauerhaft unerreichbarer, ungeprüfter Host verzögert jedes Öffnen bis zum SSH-Timeout (40 s). Am echten Panel noch nicht nachgeprüft.
PR #129 gemergt: docs(iris-server-hosts): PLAN.md auf den Stand von #115 gebracht (iris/iris-plugins#115)
#129
Commits:
PR #130 gemergt: docs(iris-server-hosts): Live-Prüfung von /hosts/targets auf dem Mac, Lücke bei self (iris/iris-plugins#115)
#130
Commits:
Live-Prüfung von
GET /hosts/targetsauf dem Mac (2026-10-19)Geprüft: laufende Iris-App (Xcode-Debug-Build von 10:35, Port 8765, Bearer-Token) mit der echten Host-Liste.
needs,needs=gpu,needs=docker,needs=gpu&needs=dockerneeds=rechner(unbekannte Fähigkeit)/gpu-hosts/targetsDie Fähigkeiten kommen aus einer frischen SSH-Sonde je Anfrage, die gespeicherten Werte sind jetzt gefüllt (Fix aus #128 greift).
Lücke: Die Mac-Route liefert keinen Eintrag „Dieser Iris-Server“ (
self), der Linux-Server schon. Die Spezifikation sagt,selfist immer ein Host. Offen: entscheiden, ob die Mac-Routeselfführt (Mac ohne NVIDIA und Docker würde beineeds=…ohnehin herausgefiltert).Nicht geprüft: der Weg über
cfg_token(Manifest-Anforderung eines installierten Plugins); beide Einträge192.168.178.153undiris-serversind derselbe Rechner und erscheinen doppelt im Picker.PR #84 gemergt: feat(iris-hosts): Dieser Iris-Server (self) in Picker-Route, Auflösung und Installations-Sperre (iris/iris-plugins#115)
iris/Iris#84
Commits:
PR #131 gemergt: docs(iris-server-hosts): self in der Mac-Route, Stand im Plan (iris/iris-plugins#115)
#131
Commits:
„Dieser Iris-Server“ (
self) in der Mac-Route (Iris PR #84, main = 49a34bf)Geändert: Die Mac-Seite führt jetzt wie der Linux-Server den Eintrag
self(„Dieser Iris-Server“) vor der Host-Liste, in drei Stellen zugleich: Picker-RouteGET /hosts/targets, Auflösung (host_idself→benutzer@Adresse) und Installations-Sperre (PluginManager). Gemeinsame Quelle istIrisHostStore.entriesWithSelf. Das Ziel istIRIS_SERVER_HOST, sonst<LocalHostName>.local;localhost,127.…und fehlender Benutzer ergeben kein Ziel, wieself_target()auf dem Linux-Server.Geprüft: Prüfprogramm
scripts/iris-hosts-harnessgrün, 10 neue Checks (Zielbildung, Vorrang der Umgebungsvariable, Ablehnung von localhost, Reihenfolge, Auflösung, Verhalten ohne Ziel). Iris-Scheme baut (BUILD SUCCEEDED, eigener DerivedData-Ordner, die laufende App blieb unberührt).Offen / Grenzen:
~/.ssh/authorized_keys(Remote Login ist an). Die Sonde vonselffindet deshalb nichts:selferscheint ohne Anforderung, erfüllt aber keine (leere Fähigkeiten), bis der Zugang eingerichtet ist. Der Linux-Server trägt den Schlüssel mit einem Hilfscontainer selbst ein; für den Mac ist das nicht entschieden (es ändert die SSH-Zulassung des Nutzers).IrisClientnicht gebaut (teilt die Datei).PR #132 gemergt: feat(iris-server-hosts): Zugang zu Dieser Iris-Server im Plugin einrichten (self-authorize) (iris/iris-plugins#115)
#132
Commits:
Zugang zu „Dieser Iris-Server“ wird im Plugin eingerichtet (PR iris-plugins, main =
7a47742)Vorgabe (Alf, 2026-10-19): Der SSH-Zugriff ist nur in
iris-server-hostszu konfigurieren, in keinem anderen Plugin. Der Mac-Eintragself(Iris PR #84) fand mangels Schlüssel in~/.ssh/authorized_keysnichts; das lässt sich jetzt im Plugin beheben.Geändert:
overviewliefert zusätzlichself(Name, Ziel, erreichbar, Fähigkeiten), gelesen bei jedem Öffnen, nichts gespeichert; es steht nie in der Host-Liste.self-authorize {password}trägt den gemeinsamen Schlüssel einmalig mit dem Passwort des Benutzers ein (derselbe Weg wiehost-addmit Passwort; das Passwort wird nie gespeichert oder zurückgegeben).core.self_target, dieselbe Regel wieIrisHostStore.selfTarget(Mac) undhosts_targets.self_target(Linux):IRIS_SERVER_HOST, sonst<LocalHostName>.local;localhost/127.…ergeben kein Ziel.Geprüft: 85 Tests grün (9 neu: erreichbar/unerreichbar/ohne Ziel, Passwort nötig und vorher kein SSH-Aufruf, Schlüssel eintragen und danach erreichbar, falsches Passwort ohne Leck, Zielbildung), Mutationstest 72 von 72 (5 neu, eine überlebte zuerst und führte zu einem stärkeren Test). Echter lesender Lauf von
overviewgegen eine Kopie der Host-Liste:self=alflewerken@Mac-Studio.local, nicht erreichbar (Schlüssel fehlt, wie erwartet), beide Hosts mit Docker. Installierte Kopie auf dem Mac synchronisiert (vorher identisch mit HEAD).Offen / Grenzen:
PR #133 gemergt: fix(iris-server-hosts): scutil mit absolutem Pfad, sonst fehlt self im Fenster (iris/iris-plugins#115)
#133
Commits:
Fix: „Dieser Iris-Server“ fehlte im Fenster (main =
e50a9ff)Befund: Alfs Screenshot zeigte nach dem vorigen PR keine Karte „Dieser Iris-Server“. Die echte Route
POST /plugins/iris-server-hosts/api/overviewlieferte keinself. Ursache: Die App startet Panel-Skripte mitPATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin,scutilliegt aber in/usr/sbin. Der Aufruf scheiterte lautlos, der Bonjour-Name blieb leer, die Zielbildung ergab kein Ziel. Mit genau diesem PATH nachgestellt:selffehlt; nach dem Fix vorhanden.Fix:
scutilmit absolutem Pfad. Neuer Test (der Aufruf nutzt/usr/sbin/scutil), 86 Tests grün, Mutationstest 73 von 73. Installierte Kopie synchronisiert; die laufende App liefert jetztself=alflewerken@Mac-Studio.local, nicht erreichbar (Schlüssel fehlt).Offen: Das Passwort-Einrichten selbst ist weiter nicht echt gelaufen. Die Mac-App selbst (Swift) nutzt die SystemConfiguration-API und ist von dem PATH-Problem nicht betroffen.
PR #134 gemergt: docs(iris-server-hosts): Live-Prüfung mit self auf dem Mac, Befund zu macOS-Betriebssystem (iris/iris-plugins#115)
#134
Commits:
Live-Prüfung nach dem Einrichten des Zugangs (2026-10-19)
Alf hat im Fenster „Hosts“ bei „Dieser Iris-Server“ das Passwort eingetragen. Danach (laufende App, Bearer-Token):
overview(Plugin)selferreichbar,~/.ssh/authorized_keysenthält den Plugin-Schlüssel (1 Zeile)GET /hosts/targetsself,192.168.178.153,iris-server?needs=gpu,?needs=docker,?needs=gpu&needs=docker?needs=rechner/gpu-hosts/targetsselfführt die Liste an und fällt bei GPU- und Docker-Anforderung heraus, wie vorgesehen: der Mac hat keine NVIDIA-Karte, unddockerist im PATH der SSH-Sitzung nicht erreichbar (/Applications/Docker.appist installiert, es gibt aber keindockerunter/usr/local/binoder/opt/homebrew/bin).Befund: Die Sonde meldet für den Mac kein Betriebssystem. Sie liest
/etc/os-release, das macOS nicht hat;sw_versliefert „macOS 26.6.2“. Der Sondentext ist auf allen drei Seiten wörtlich gleich (PluginPROBE_COMMAND, Linuxhosts_targets.PROBE_COMMAND, MacIrisHostCapabilities.probeCommand) und müsste überall zugleich geändert werden. Nicht entschieden. Auswirkung heute gering, weil kein Pluginosverlangt.Nicht geprüft: der Weg über ein
cfg_token(Manifest-Anforderung eines installierten Plugins).Folge-Issue: Zustandsanzeige im Marktplatz und Rechnerwahl bei „Laden“ → iris/Iris#85
Beim Testen von Marker (iris-plugins#135) zeigte sich, dass der Marktplatz die Erstinstallation ablehnt („braucht Einrichtungsfragen“) und die Rechnerwahl nirgends bei „Laden“ stattfindet. Daraus ist in einer Grill-me-Runde ein eigenes Feature entstanden, das die Plugin-Umstellung hier trägt:
iris/Iris#85
config-status(Grün konfiguriert, Gelb muss konfiguriert werden, Rot Fehler bei der Prüfung); der Marktplatz zeigt ihn am „Konfigurieren“-Knopf der Kachel und in Einstellungen → Plugins.local_mode, zum Beispiel Marker), mindestens ein passender Host → Plugin installieren und das Konfigurationsfenster mit dem Picker öffnen.config-statuszuerst.gpu-hosts 0.2.3entfernt.Plan:
obsidian-docs/plans/PLUGIN-KONFIGURATION.md(Iris-Vault).