154 lines
6.4 KiB
Markdown
154 lines
6.4 KiB
Markdown
# RefBoard AYON
|
|
|
|
Kollaborative Referenz-Bildwand (PureRef-on-the-web), umgebaut für den
|
|
AYON-only-Betrieb. Fork von [metalfinger/refboard](https://github.com/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.local` mit 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 (Branch `ayon-integration`)
|
|
- `compose.yaml` — Stack (inkl. `ayon-private_default` external network:
|
|
RefBoard erreicht AYON unter `http://ayon-private-server-1:5000`)
|
|
- `.env` — `JWT_SECRET`, `REFBOARD_API_KEY`, `AYON_EXCHANGE_URL`
|
|
- `data/` — SQLite + FS-Storage
|
|
- nginx: `/etc/nginx/sites-enabled/refboard.conf` → `refboard.niklashmotion.art`
|
|
(WebSocket-Upgrade, 250 M Upload)
|
|
- Wichtig nach `docker compose up -d`: das `ayon-private_default`-Netz ist
|
|
als `external: true` deklariert 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.zip` und der A-Record existieren.
|
|
|
|
### 1. Addon installieren (im AYON-Klon, NICHT im Original)
|
|
|
|
```bash
|
|
# 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.art`
|
|
- `api_key`: `refboard_api_key` (Secret existiert bereits im AYON-Secret-Store
|
|
und muss denselben Wert wie `REFBOARD_API_KEY` in der RefBoard-`.env` haben)
|
|
|
|
### 4. Benutzen
|
|
|
|
1. AYON-Launcher starten und ein Projekt öffnen
|
|
2. Task auswählen → Kontext-/Aktionsmenü → **„RefBoard öffnen"**
|
|
3. Browser geht auf, automatisch eingeloggt als der eigene AYON-User, im
|
|
Board der Task
|
|
4. 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
|
|
|
|
```bash
|
|
# 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)
|