RefBoard AYON
Kollaborative Referenz-Bildwand (PureRef-on-the-web), umgebaut für den AYON-only-Betrieb. Fork von metalfinger/refboard (vollständige History erhalten).
Das Besondere: Es gibt keinen RefBoard-Login mehr. Nutzer öffnen Boards
aus dem AYON-Launcher heraus und sind automatisch mit ihrer AYON-Identität
eingeloggt. Boards gehören zu AYON-Tasks (<Projekt>/<Task-Pfad>), nicht zu
Personen. Alle Kollegen mit Projektzugriff arbeiten kollaborativ am selben
Board (Echtzeit, Socket.IO).
Architektur
Launcher (Task ausgewählt)
→ "RefBoard öffnen" (Server-Addon-Action)
→ POST /api/addons/refboard/<ver>/session (AYON-Auth via Bearer)
→ Addon prüft Projektzugriff, legt Single-Use-Ticket an (60 s TTL)
← { url: "https://<refboard>/b?ticket=…&project=…&task=…" }
→ Launcher öffnet Browser auf dieser URL
→ RefBoard-Frontend (Route /b) ruft POST /api/auth/ayon/exchange
→ RefBoard-Backend ⇄ Addon /exchange (server-to-server, X-API-Key)
→ Ticket wird atomar verbraucht (single-use) → Identität
→ RefBoard-Session-JWT wird gesetzt → weiter zum Task-Board
Beteiligte Komponenten:
| Komponente | Repo | Aufgabe |
|---|---|---|
| RefBoard AYON (dieses Repo) | Hermes/refboard-ayon |
Web-App: Canvas + Ticket-Auth + Task-Boards |
| AYON Server-Addon | Hermes/refboard-addon (ab v0.2.0) |
Ticket-Ausstellung, /exchange, Launcher-Action |
| AYON Server (private Instanz) | — | Identitätsquelle, Token-Prüfung, Access-Groups |
Warum ein Ticket statt des AYON-Tokens in der URL?
Der AYON-Session-Token ist langlebig und dürfte nie in Browser-History/Logs
landen. Das Ticket ist ein 32-Byte-Zufallswert, der genau einmal eingelöst
werden kann und nach 60 s verfällt — die OAuth-"Code"-Äquivalenz. Die
Identität kommt ausschließlich vom Addon (/exchange), niemals aus der URL.
Task-Boards
- Adresse/Name:
<project>/<task_path>(z. B.lumenfjord/assets/vegetation/fir/lookdev) - Board entsteht lazy beim ersten Öffnen in der Sammlung
AYON users-Tabelle bleibt intern bestehen (SQLite-Fremdschlüssel), wird aber nicht mehr als Login angezeigt; AYON-Nutzer bekommen Einträge<username>@ayon.localmit unbenutzbarem Passwort-Sentinel- Legacy-Login/Register-Routen sind noch vorhanden (für Alt-Instanz), im AYON-Betrieb jedoch ungenutzt
Deployment (orange)
- Container:
refboard-ayon, Host-Port 8003 → 8000 - Stack-Ordner:
/media/orange/RocketChat/refboard-ayon/(NVMe)repo/— dieser Code (Branchayon-integration)compose.yaml— Stack (inkl.ayon-private_defaultexternal network: RefBoard erreicht AYON unterhttp://ayon-private-server-1:5000).env—JWT_SECRET,REFBOARD_API_KEY,AYON_EXCHANGE_URLdata/— SQLite + FS-Storage
- nginx:
/etc/nginx/sites-enabled/refboard.conf→refboard.niklashmotion.art(WebSocket-Upgrade, 250 M Upload) - Wichtig nach
docker compose up -d: dasayon-private_default-Netz ist alsexternal: truedeklariert und überlebt Rebuilds dadurch
Environment
| Variable | Bedeutung |
|---|---|
JWT_SECRET |
Signatur-Secret der RefBoard-Sessions |
REFBOARD_API_KEY |
Shared Secret für /exchange (muss mit dem AYON-Secret refboard_api_key übereinstimmen) |
AYON_EXCHANGE_URL |
z. B. http://ayon-private-server-1:5000/api/addons/refboard/0.2.0/exchange |
STORAGE_BACKEND |
fs (FS-Storage) |
CORS_ORIGIN |
CORS-Origin (Default *) |
Setup in AYON (Schritt für Schritt)
Ausführen, sobald
refboard-0.2.0.zipund der A-Record existieren.
1. Addon installieren (im AYON-Klon, NICHT im Original)
# zip in den Server-Container entpacken
ssh orange@niklashmotion.art 'docker exec -i ayon-private-server-1 python3 -c "
import zipfile,io,os,sys
z=zipfile.ZipFile(io.BytesIO(sys.stdin.buffer.read()))
b=\"/addons/refboard/0.2.0\"
os.makedirs(b,exist_ok=True)
[open(os.path.join(b,n),\"wb\").write(z.read(n)) for n in z.namelist() if not n.endswith(\"/\")]
"' < refboard-0.2.0.zip
# AYON-Server neu starten (scannt /addons nur beim Start)
ssh orange@niklashmotion.art 'docker restart ayon-private-server-1'
2. Bundle (WebUI: Studio Settings → Bundles)
Neues Bundle anlegen, das die Addons des aktuellen Produktions-Bundles
enthält, aber refboard: 0.2.0, und als Produktion aktivieren.
3. Settings prüfen (WebUI: Studio Settings → Addons → RefBoard)
refboard_url:https://refboard.niklashmotion.artapi_key:refboard_api_key(Secret existiert bereits im AYON-Secret-Store und muss denselben Wert wieREFBOARD_API_KEYin der RefBoard-.envhaben)
4. Benutzen
- AYON-Launcher starten und ein Projekt öffnen
- Task auswählen → Kontext-/Aktionsmenü → „RefBoard öffnen"
- Browser geht auf, automatisch eingeloggt als der eigene AYON-User, im Board der Task
- Teilen: Kollegen wählen dieselbe Task → „RefBoard öffnen" → alle landen im selben Board und arbeiten in Echtzeit zusammen
Hinweise:
- Der Board-Name ist
<Projekt>/<Task-Pfad>; im Editor oben wird er als Titel angezeigt - Ohne Task-Auswahl gibt es keinen Action-Eintrag (Bewusst so gebaut: Boards sind taskbezogen)
- Tickets sind einmalig und 60 s gültig — bei „Invalid or expired ticket" einfach im Launcher erneut klicken
AYON-REST-API des Addons (v0.2.0)
Alle Routen unter /api/addons/refboard/0.2.0/:
| Endpoint | Methode | Auth | Zweck |
|---|---|---|---|
/health |
GET | AYON-User | Status + konfigurierte URL |
/session |
POST | AYON-User | {project_name, task_id?} → {url} (Ticket-URL) |
/exchange |
POST | X-API-Key |
{ticket} → {ayon_user, display_name, project, task} (single-use) |
Lokale Entwicklung / Tests
# Image bauen (ARM64-nativ auf orange getestet)
docker build -t refboard-ayon:latest .
# Container + Mock-Addon (Test-Double statt echtem AYON-Addon):
# /media/orange/RocketChat/refboard-ayon/mock-exchange.js (container :9000)
# /media/orange/RocketChat/refboard-ayon/e2e.sh (Container-interner E2E)
Der E2E (Ticket-Ausstellung → Exchange → Board-Zugriff → Single-Use → 2. Nutzer am selben Board) ist mit dem Mock grün getestet.
Noch offen
- A-Record
refboard→89.57.47.213(IONOS-Panel, einzeln anlegen) - danach:
certbot --nginx -d refboard.niklashmotion.art - Addon v0.2.0 installieren + Bundle (siehe oben)