Was der Workspace ist
Der Workspace ist der Dateimanager des Panels für Website-Dateien. Jede Anfrage ist ein asynchroner Job (/api/next/v1/web/sites/{nws_…}/workspace/…, /api/next/v1/jobs/…). Der Job läuft auf dem Web-Node der Website und wird strikt unter der eigenen UID/GID dieser Website ausgeführt.
Panel/Application ──SQL──▶ next_job ◀──SQL── nova-workspace-gateway (Control-Host, Fleet-Adresse:Port)
▲ mTLS 1.3, Ed25519, gepinnte Workspace-CA
│
Web-Node: nova-workspace-node (unprivilegiert) ──Unix-Socket──▶ nova-workspace-broker (root)
└─ libncp-workspace-v2.so, als Website-UID, unterhalb des Roots aus workspace-roots.json| Komponente | Host | Installiert durch |
|---|---|---|
| Gateway, Job-Sweeper | Control-Host | Application-Installer (nova-workspace-gateway-install.sh) |
| Node, Broker, Root-Mapping-Units, native Bibliothek | jeder Host mit der Rolle web | kombinierter Host: Stufe nova-workspace-node-install.sh des Application-Installers; separater Web-Node: install-nova-workspace-node.sh |
| Node-Zugangsdaten, Capability-Policy | Control-Host (Datenbank) und Web-Node (Dateien) | nova-workspace-fabric.php (Registrierung) |
Umfang in Version 1.0: Auflisten, Herunterladen und Vorschau (Text, Bild, PDF), Abbrechen von Jobs und – optional, siehe unten – Datei-Upload.
Voraussetzungen
- Installationsprofil v26. Das Gateway bindet an
fleet_network.listen_address:127.0.0.1auf einem Einzelhost, die private Fleet-Adresse, wenn Web-Nodes auf anderen Hosts laufen. Die Fleet-Exposure-Prüfung verweigert die Installation, wenn der Gateway-Port woanders lauscht. - Release mit nativem Plattform-Bundle (combined schema 2). Produktionshosts kompilieren nichts. Das Bundle ist an Plattform, Commit und den Digest der nativen Quellen in der
FILES.sha256der Application gebunden; jedes andere Bundle wird abgelehnt. - PHP auf Web-Hosts mit FFI, pcntl, posix, sodium, openssl und pdo_sqlite. Diese Module gehören zu den PHP-Paketen der Distribution, die die Web-Rolle installiert.
- Bildvorschau rendert die Application auf dem Control-Host mit
php-gd(Rollecontrolund kombiniertes Paket-Bundle). Auf einem vorbereiteten Host (expect-provisioned) brauchst du auf dem Control-Hostapt-get install php8.x-gd. Separate Web-Nodes brauchen es nicht. - Die Node-Zeile des Web-Hosts (
next_node) muss existieren, siehe unten.
PDF-Vorschau im Browser
Das Panel liest eine PDF-Datei über den Download-Pfad (GET …/workspace/files/{filename}/content, mit derselben Mandantenprüfung, denselben Lese-Jobs und dem Audit-Event workspace.filesystem.download wie ein Download) und zeichnet sie Seite für Seite mit dem mitgelieferten Mozilla pdf.js 6.3.289 (Apache-2.0) in ein Canvas.
- pdf.js wird erst geladen, wenn eine PDF-Vorschau geöffnet wird, und läuft in einem Modul-Worker vom Panel-Origin.
- PDF-JavaScript, XFA-Formulare, Links, Text- und Anmerkungsebenen sind abgeschaltet; nichts wird von fremden Quellen geladen.
- Dateien über 8 MB, Nicht-PDF-Dateien, passwortgeschützte PDFs und Browser, die pdf.js nicht laden können, erhalten einen Hinweis „nur Download“.
- Nicht eingebettete Schriften werden mit einer Systemschrift gezeichnet; JPEG-2000-Bilder und vordefinierte CJK-CMaps werden nicht mitgeliefert und können in der Vorschau fehlen.
- Der Server rendert keine PDFs mehr:
GET …/preview?representation=pdfantwortet mit 422WORKSPACE_PREVIEW_REQUEST_INVALID.
Ghostscript entfernen
Ghostscript ist nicht mehr Teil von Nova. Keine Host-Rolle und kein Paket-Bundle enthält ghostscript oder seine Abhängigkeiten (libgs*, fonts-urw-base35, poppler-data, libjbig2dec0). Ein Host, den eine frühere Version damit eingerichtet hat, behält das Paket: Kein upgrade, accept oder rollback entfernt es, und die Paketquittung führt es weiter unter installed_by_nova. Nachdem das Upgrade akzeptiert ist, kannst du es auf dem Control-Host entfernen, wenn nichts anderes es braucht:
apt-get -s autoremove # geplante Entfernungen zuerst prüfen
apt-get purge ghostscript && apt-get autoremove --purgeNode-Zeile anlegen
Lege die Node-Zeile ohne Capability-CSV an. <runtime> ist /etc/nova-controlpanel/application-runtime.json:
php /opt/nova-controlpanel/application/current/src/api/bin/nova-node-bootstrap.php bootstrap <runtime> <node_id> <server_ref> <legacy_id>node_id=node_plus 8–59 Zeichen,server_ref=srv_plus 8–59 Zeichen ausA–Z a–z 0–9 _ -(dieselbe Regel wie für die Node-Zertifikatsidentität). Ein andererserver_refwird mitNOVA_NODE_BOOTSTRAP_SERVER_REF_INVALIDabgelehnt, eine anderenode_idmitNOVA_NODE_BOOTSTRAP_ARGUMENTS_INVALID;node-issueerzwingt dieselbe Regel.- Eine Zeile aus einer älteren Version kann einen kürzeren oder fremden
server_reftragen;node-issuescheitert dann mitNOVA_WORKSPACE_NODE_SERVER_REF_INVALID. Repariere sie einmalig vor der Registrierung:
php …/nova-node-bootstrap.php repair-server-ref <runtime> <node_id> <current_server_ref> <new_server_ref>Die Reparatur wird auditiert (node.server-ref.repair). Sie wird verweigert, sobald irgendetwas den alten Wert bereits übernommen hat – Workspace-Zugangsdaten, Steuerbefehle, Workspace-Authority-Zustand, Upload oder Job (NOVA_NODE_SERVER_REF_IN_USE). Ein server_ref, der die Regel erfüllt, ist Identität und kann nicht geändert werden (NOVA_NODE_SERVER_REF_ALREADY_VALID).
Workspace-CA anlegen
Einmalig, auf dem Control-Host, als root:
php /opt/nova-controlpanel/application/current/src/api/application/bin/nova-workspace-fabric.php \
authority-init /root/nova-workspace-pkiVor der ersten Installation gibt es noch kein installiertes Release; dann führst du dieselbe Datei aus dem vertrauenswürdigen Quellbaum des Releases aus (php <checkout>/src/api/application/bin/nova-workspace-fabric.php authority-init ...). authority-init braucht keine Datenbank.
Der Befehl legt ein neues Verzeichnis mit Modus 0700 an:
workspace-ca.pemundworkspace-ca.key(Ed25519, 10 Jahre)gateway.crtundgateway.key(SANgateway.workspace.nova.invalid, höchstens 825 Tage)gateway-root-key
Er gibt die vier Werte workspace_gateway.*_source_file für das Installationsprofil aus. Das Verzeichnis darf nicht unterhalb von /etc/nova-controlpanel liegen und darf noch nicht existieren; der Befehl überschreibt nie eine PKI.
Bestehende Installation. Jede Installation mit Profil v3 oder neuer hat bereits installierte Gateway-Eingaben, auch mit workspace_gateway.enabled=false. Der Installer behält dann den installierten Root-Key (/etc/nova-controlpanel/workspace-gateway/root-key); eine root_key_source_file mit anderem Inhalt wird mit Gateway root key rotation requires a separate migration abgelehnt.
- Übernimm von den Werten, die
authority-initausgibt, nurcertificate_source_file,private_key_source_fileundnode_ca_source_file. - Lass
root_key_source_fileauf eine root-eigene Kopie des installierten Root-Keys zeigen (oder auf die Datei aus dem bisherigen Profil), nicht auf den neuengateway-root-key. - Zertifikat, privater Schlüssel und Node-CA werden beim nächsten
reconfigure/acceptausgetauscht. - Führe
node-issueerst aus, wenn diese Rekonfiguration akzeptiert ist: Es vergleicht die CA der PKI mit der installiertencredentials/node-ca.crt(sonstNOVA_WORKSPACE_GATEWAY_TRUST_MISMATCH). - Eine neue CA macht jeden unter der alten CA registrierten Node ungültig. Registriere diese Nodes neu mit
node-issue … --rotate.
Wichtig:
workspace-ca.keyist der einzige private CA-Schlüssel. Kein Installer kopiert ihn, und die Gateway- und Node-Installer lehnen eine*ca*.keyunterhalb ihrer Konfigurationsverzeichnisse ab. Bewahre das Verzeichnis auf Wechsel- oder Vault-Speicher auf und binde es nur fürauthority-initundnode-issueein. Das Gateway-Zertifikat musst du vor seinem Ablauf neu ausstellen.
Auf einem kombinierten Host aktivieren
Gemeint ist die Control Plane mit der Rolle web.
- Neuinstallation mit
workspace_gateway.enabled=falseundnative_workspace.enabled=falsesowie den Eingaben aus dem vorigen Abschnitt; dann kombiniertesinstallundaccept. Die Workspace-Node-Stufe installiert Broker, Root-Mapping-Units und Bibliothek; die Node-Unit bleibt bis zur Registrierung deaktiviert./etc/nova-controlpanel/workspace-node/workspace-roots.jsonwird aus/var/lib/nova-controlpanel-agent/web-state/storage.jsonveröffentlicht; eine Path-Unit aktualisiert sie bei jeder Änderung, ein 5-Minuten-Timer gleicht ab. - Rekonfiguration mit neuer Profildatei:
workspace_gateway.enabled=trueundnative_workspace.enabled=true, dann kombiniertesreconfigureundaccept. - Den Node des Hosts registrieren (alle Befehle als root, siehe unten).
- Abbrechen von Jobs aktivieren: Rekonfiguration mit
native_workspace.job_cancellation_enabled=true, dannaccept.
Registrierung, mit FABRIC = /opt/nova-controlpanel/application/current/src/api/application/bin/nova-workspace-fabric.php:
php $FABRIC node-request <node_id> /root/workspace-request.json # Schlüssel wird einmalig erzeugt, 0640 root:nova-workspace-node
php $FABRIC node-issue /root/nova-workspace-pki /root/workspace-request.json /root/workspace-bundle.json
php $FABRIC node-install /root/workspace-bundle.json # aktiviert den Node, wartet auf die Authentifizierung
php $FABRIC node-status <node_id> # workspace_policy/workspace_negotiated: truenode-issueerfasst die Zugangsdaten und setzt die Capability-Policy des Nodes in einer auditierten Transaktion auf den Workspace-Lesesatz. Es lehnt einen Node ab, dessen Policy zu etwas anderem gehört, und ohne--rotateauch zweite Zugangsdaten.node-installstellt die vorherigen Dateien und den Dienstzustand wieder her, wenn sich der Node nicht innerhalb von 45 Sekunden authentifiziert.
Einen separaten Web-Node aktivieren
Auf dem Web-Node:
- Host vorbereiten:
nova-host-bootstrap.py --roles web …, den Node Agent mit seiner Fabric-Registrierung (siehe Installation) und das kombinierte Release-Paket auf dem Node bereitstellen (STAGE). - Workspace-Node installieren (siehe unten). Installiert wird nur der Application-Code (kein Apache, keine Datenbank); das vorherige Release bleibt als Last-known-good erhalten, dazu kommen Broker, Root-Mapping-Units und Bibliothek. Auf einem Host mit
/etc/nova-controlpanel/application-runtime.jsonverweigert der Installer die Arbeit. - Node registrieren:
node-requestauf dem Web-Node; die Anfragedatei (nur öffentlicher Schlüssel) auf den Control-Host kopieren und dortnode-issueausführen; die Bundle-Datei zurückkopieren (kein privates Material) und auf dem Web-Nodenode-installausführen. Das Bundle enthält die Fleet-Adresse des Gateways;node-installschreibtnova-workspace-node.service.d/gateway-address.confmit genauIPAddressAllow=<gateway address>/32. Alle anderen Adressen bleiben gesperrt. - Firewall: Erlaube TCP zum Gateway-Port nur von der Fleet-Adresse des Web-Nodes aus, im Fleet-Netz.
sh STAGE/application/src/installer/application/install-nova-workspace-node.sh install STAGE/application / STAGE/payload/native.tar.gz
sh STAGE/application/src/installer/application/install-nova-workspace-node.sh accept STAGE/application /Uploads freischalten
Uploads laufen vom Browser zur Application (in Stücken, in einen begrenzten Spool auf dem Control-Host), weiter zum Gateway, in die Node-Sitzung und zum Broker. Der Broker schreibt die Datei auf dem Web-Node als Website-UID. Der Web-Node braucht keinen eingehenden Port über die bestehende Node-Sitzung hinaus.
- Zuerst die Web-Nodes aktualisieren. Jeder Web-Node, der Uploads annehmen soll, braucht ein Release mit Upload-Unterstützung (
updateauf einem kombinierten Host,install-nova-workspace-node.sh install … acceptauf einem separaten Node). Der aktualisierte Node bietet den Upload-Satz an; das Gateway gewährt aber nur den Lesesatz, solange die Node-Policyreadist. - Routen auf dem Control-Host aktivieren: Rekonfiguration mit Installationsprofil v27 (Runtime v26), dann
accept(Beispiel unten). - Uploads pro Node erlauben (Control-Host, root, siehe unten).
"native_workspace_upload": {
"enabled": true,
"max_file_bytes": 1073741824,
"spool_capacity_bytes": 4294967296
}| Option | Bedeutung |
|---|---|
max_file_bytes | größte Datei, 1 MiB – 16 GiB |
spool_capacity_bytes | Summe der angekündigten Größen aller bereitgestellten Uploads; mindestens max_file_bytes, höchstens 1 TiB |
- Voraussetzungen:
native_workspace.enabled=true, ein aktiviertes Gateway und ein akzeptierter Vorgänger, in dem der Workspace-Leser bereits aktiv war. Aktiviere also zuerst den Leser und akzeptiere, dann die Uploads in einer zweiten Rekonfiguration. - Der Installer legt den Spool
/var/lib/nova-controlpanel/workspace-uploadan (nova-controlpanel:nova-workspace-gateway, Modus 2750) und aktiviertnova-workspace-upload-spool-sweeper.timer(alle 10 Minuten). - Migration 125 ergänzt
next_workspace_uploadundnext_workspace_upload_capacity; sie ist rein additiv.
php $FABRIC node-capabilities <node_id> upload # auditiert: workspace.node-capabilities.set
php $FABRIC node-status <node_id> # upload_policy: true, dann upload_negotiated: trueEine Policy-Änderung schließt die Sitzung des Nodes; er verbindet sich innerhalb von Sekunden neu und handelt den neuen Satz aus. node-capabilities <node_id> read nimmt die Uploads wieder zurück. Panel und API bieten Uploads nur für Websites an, deren Node upload_negotiated: true meldet. Die Schaltfläche „Dateien hochladen“ erscheint nur, wenn GET …/workspace/uploads für den angemeldeten Benutzer available: true liefert.
Wer hochladen darf: genau die Principals, die die Website ändern dürfen (sites.update) – der Kunde für seine eigenen Websites, ein Reseller für die Websites seiner Kunden, ein Administrator für alle. Die Website-Bindung muss aktiv und write_enabled sein. Das Gateway prüft das vor jedem Node-Befehl erneut.
Prüfen
Control-Host:
install-nova-application-runtime.sh verify …prüft Gateway, Sweeper, Node-Stufe, Bibliotheks-Digests und Units.systemctl status nova-workspace-gateway nova-workspace-job-sweeper.timerphp $FABRIC node-status <node_id>
Web-Node:
install-nova-workspace-node.sh verify STAGE/application /(separater Node)systemctl status nova-workspace-broker nova-workspace-node nova-workspace-node-roots.path/var/lib/nova-controlpanel/workspace-node/authenticated.jsonnennt die laufende PID und die Zugangsdaten.
Regeln für skriptgesteuerte Prüfungen
Das Panel erledigt all das selbst; die Regeln brauchst du nur für eigene Prüfungen, etwa mit curl.
- Die Sitzung ist das Browser-Cookie
NOVA_SESSIDeiner nativen Anmeldung. - Jedes
POST/PUTbrauchtOrigin: <trusted origin>(genau dastrusted_originder Installation, zum Beispielhttps://panel.example:8443) undSec-Fetch-Site: same-origin; sonst 403WORKSPACE_UPLOAD_ORIGIN_DENIED(Uploads) oder 422 (Job-Abbruch). Content-Typewird exakt verglichen:application/json(ohne; charset=…) für JSON,application/octet-streamfür Upload-Stücke.- CSRF-Tokens kommen von
POST /api/next/v1/native-identity/csrf-tokensmit{"count":1,"scope":"<scope>"}(gleiche Regeln fürOrigin,Sec-Fetch-SiteundContent-Type). Ein Token hat 40 Hex-Zeichen und gilt 5 Minuten für genau eine Anfrage. Den Scopeworkspacegibt es nur, solangenative_workspace_upload.enabled=truegilt. Idempotency-Key: 8–200 Zeichen ausA–Z a–z 0–9 . _ : -. Ein Schlüssel ist an seinen Body gebunden; mit anderem Body wird er abgelehnt (JOB_IDEMPOTENCY_CONFLICT,WORKSPACE_UPLOAD_IDEMPOTENCY_CONFLICT).- JSON-Bodies sind geschlossene Objekte. Die Bodies für Upload-Anlage und Commit müssen genau die dokumentierten Schlüssel in der dokumentierten Reihenfolge enthalten, sonst 422
VALIDATION_REQUEST_INVALID. Lesezugriffe haben keinen Body, Upload-Routen keinen Query-String.
Funktionsprüfung (als Kundensitzung)
GET /api/next/v1/web/sites/<nws>/workspace/entries→ 202 mit einem Job.GET /api/next/v1/jobs/<job>/result→ die Einträge.- Download:
GET …/workspace/files/<name>/content?relative_path=<folder>→ 202 mit einem Job; nach Erfolg mit&job_id=<job>wiederholen (Rangewird unterstützt).<name>ist ein einzelner Dateiname, der Ordner gehört inrelative_path(""oder weggelassen für das Website-Root). Vorschau:…/files/<name>/preview?relative_path=<folder>&representation=text|image|pdf, dieselben zwei Schritte. POST /api/next/v1/jobs/<job>/cancelmitX-Nova-CSRF-Token(Scopejobs),Idempotency-Key,Content-Type: application/jsonund dem Body{"expected_revision":<Revision des Jobs als Ganzzahl>}→ 202. Voraussetzung:native_workspace.job_cancellation_enabled=trueundsites.update. Der Job endet mitcancelled, auch wenn sein Node offline ist.
Upload-Prüfung (als Kundensitzung)
Jedes POST trägt ein frisches X-Nova-CSRF-Token mit Scope workspace und einen neuen Idempotency-Key.
GET …/workspace/uploads→ 200 mitupload_availability.available: true(falsefür einen Benutzer ohnesites.update).POST …/workspace/uploadsmit{"name":"a.txt","parent_path":"","size_bytes":N}(genau diese drei Schlüssel in dieser Reihenfolge) → 201 mitupload.upload_id(upl_…),upload.upload_tokenundupload.chunk_bytes(1 MiB).PUT …/workspace/uploads/<upl>/chunks/<offset>mit höchstenschunk_bytesBytes,Content-Type: application/octet-stream,X-Nova-Upload-Token: <upload_token>undX-Nova-Chunk-SHA256: <hex dieses Stücks>→ 204 mitUpload-Offset. Das Pfadsegment ist der Byte-Offset (0, 1048576, …), keine Stücknummer; ein falscher Offset liefert 409WORKSPACE_UPLOAD_OFFSET_CONFLICTmit demUpload-Offset, an dem es weitergeht. Stücke brauchen kein CSRF-Token.POST …/workspace/uploads/<upl>/commitmit{"expected_revision":null,"sha256":"<hex der ganzen Datei>"}(beide Schlüssel, diese Reihenfolge) → 202 mit Upload und Job (Location: /api/next/v1/jobs/<job>).GET …/workspace/uploads/<upl>endet mitcommittedundrevision: "frv_…". Die Datei erscheint in…/workspace/entries, gehört der Website-UID und hat Modus 0644.- Derselbe Name noch einmal: Der Commit-Job scheitert mit
WORKSPACE_UPLOAD_CONFLICT,GET …/uploads/<upl>zeigtstate: "conflict"mitconflict.revision. Um genau diese Datei zu ersetzen, committest du erneut mit{"expected_revision":"<conflict.revision>","sha256":"<hex>"}und neuemIdempotency-Key.POST …/uploads/<upl>/cancel(Body leer oder{},Content-Type: application/json) behält die vorhandene Datei. - Der Job steht unter
/jobs; das Audit-Log enthältworkspace.upload.create,.commitund.cancel.
Deaktivieren
| Ziel | Vorgehen |
|---|---|
| Routen abschalten | Rekonfiguration mit native_workspace.enabled=false (und Abbruch aus). Jobs bleiben lesbar; der Sweeper beendet weiterhin offene Jobs. |
| Nur Uploads abschalten | php $FABRIC node-capabilities <node_id> read je Node (sofort) oder Rekonfiguration mit native_workspace_upload.enabled=false (Routen entfernt). Laufende Upload-Jobs scheitern oder laufen ab; der Spool-Sweeper löscht ihre bereitgestellten Dateien, der Node entfernt seine Stages nach 24 h. |
| Gateway stoppen | Rekonfiguration mit workspace_gateway.enabled=false. Der Sweeper-Timer bleibt aktiv, solange eine Gateway-Runtime installiert ist. |
| Einen Node zurückziehen | php $FABRIC node-revoke <node_id> [credential_id] – das Gateway lehnt das widerrufene Zertifikat sofort ab; danach systemctl disable --now nova-workspace-node auf dem Node. |
Hinweis: Eine Runtime mit aktivierten Uploads lässt sich nicht durch eine Runtime unter v26 ersetzen. Schalte die Uploads zuerst ab und akzeptiere.
Rotation und Wiederherstellung
- Gateway-Zertifikat erneuern:
php $FABRIC gateway-issue /root/nova-workspace-pki /root/nova-workspace-gateway-<date>. Setzeworkspace_gateway.certificate_source_fileundworkspace_gateway.private_key_source_fileauf die neuen Dateien, dannreconfigureundaccept. Nodes vertrauen weiterhin derselben CA. - Node-Zertifikat rotieren:
node-request, dannnode-issue … --rotate, dannnode-install. Die alten Zugangsdaten bleiben eine Stunde langretiring. Eine niedrigere Revision wird nie installiert. - Node-Schlüssel ersetzen:
node-revoke, dann/etc/nova-controlpanel/workspace-node/node.keyentfernen und mit--rotateneu registrieren. - Zurückrollen: Der Application-Installer und
install-nova-workspace-node.sh rollbackstellen Bibliothek, Units, Links, Quittung und Root-Key exakt wieder her. Registrierungsdateien (transport.json,node.crt,node.key,gateway-ca.pem, das Drop-in) sind Node-Zustand und werden von keinem Installer entfernt. Der Node-Root-Key wird einmal erzeugt und nie rotiert.
Fehlersuche
| Symptom | Ursache / Prüfung |
|---|---|
GET …/workspace/entries → 404 RESOURCE_WEBSITE_NOT_FOUND | Der Node hat workspace.filesystem-list nie ausgehandelt (node-status prüfen), die Website-Bindung ist nicht aktiv oder native_workspace.enabled=false. |
Jobs enden mit expired / JOB_DEADLINE_EXPIRED | Keine Node-Sitzung: systemctl status nova-workspace-node und journalctl -u nova-workspace-node prüfen. Der Sweeper beendet solche Jobs nach 15 s. |
Node-Log NOVA_WORKSPACE_NODE_UNAVAILABLE, Neustart alle 10 s | Gateway nicht erreichbar (Fleet-Firewall, Adresse im Drop-in), Zugangsdaten widerrufen oder abgelaufen, oder Transportdateien ungültig. node-install mit frischem Bundle erneut ausführen. |
node-issue → NOVA_WORKSPACE_NODE_CAPABILITY_POLICY_CONFLICT | Die Node-Zeile trägt eine andere Capability-Policy. Workspace-Nodes ohne Capability-CSV anlegen. |
node-issue → NOVA_WORKSPACE_GATEWAY_TRUST_MISMATCH | Die CA im PKI-Verzeichnis ist nicht die installierte node-ca.crt. |
Broker NOVA_WORKSPACE_BROKER_STARTUP_DENIED phase=native_library | Bibliothek oder Header fehlt oder weicht ab. verify des Installers ausführen. |
Broker phase=mapping | workspace-roots.json mit php …/nova-workspace-node-roots.php --check prüfen und systemctl start nova-workspace-node-roots.service ausführen. |
Installation abgelehnt: Workspace activation on a web host requires the platform native bundle | Das Release-Paket enthält kein natives Plattform-Bundle. |
PDF-Vorschau zeigt WORKSPACE_PREVIEW_PDF_ENGINE_UNAVAILABLE | Der Browser konnte /nova/assets/vendor/pdfjs-6.3.289/pdf.min.mjs oder den Worker nicht laden. Prüfe, ob der vhost .mjs als text/javascript ausliefert (AddType text/javascript .mjs im Panel-vhost; nosniff blockiert jeden anderen Typ) und ob die Antwort aus einem älteren Release im Cache liegt. Der Download ist nicht betroffen. |
PDF-Vorschau zeigt WORKSPACE_PREVIEW_PDF_TOO_LARGE | Die Datei ist größer als 8 MB. Lade sie stattdessen herunter. |
Bildvorschau → 415 WORKSPACE_PREVIEW_DOWNLOAD_ONLY bei jedem Bild | Dem PHP des Control-Hosts fehlt gd (php -m | grep gd). |
Upload-Anlage → 409 WORKSPACE_UPLOAD_UNAVAILABLE | Website-Bindung nicht aktiv oder nicht write_enabled, oder der Node hat workspace.upload v1 nicht ausgehandelt: node-status muss upload_policy und upload_negotiated mit true zeigen. Ein alter Node bietet nur den Lesesatz an. |
upload_policy: true, upload_negotiated: false | Der Node läuft mit einem alten Release, oder das Gateway wurde auf ein Release ohne Uploads zurückgerollt. Der Node bietet dann 10 Minuten lang nur den Lesesatz an und versucht es erneut. |
Anlage → 503 WORKSPACE_UPLOAD_CAPACITY_EXHAUSTED | Der Spool hat spool_capacity_bytes erreicht, oder es blieben weniger als 512 MiB frei. Warten, bis Uploads abgeschlossen oder abgelaufen sind, oder die Kapazität erhöhen. |
Anlage → 429 WORKSPACE_UPLOAD_LIMIT_REACHED | 4 aktive Uploads pro Benutzer oder 8 pro Website. |
Job failed WORKSPACE_UPLOAD_QUOTA_EXCEEDED | Die Festplattenquota der Website oder das Dateisystem des Web-Nodes hat keinen Platz für die Datei. |
Job failed WORKSPACE_UPLOAD_PERMISSION_DENIED | Der Website-Benutzer darf den Zielordner nicht beschreiben (Modus, Besitzer, schreibgeschützter Mount). |
Job failed WORKSPACE_UPLOAD_SPOOL_INVALID | Die bereitgestellte Datei auf dem Control-Host wurde entfernt oder ersetzt. Erneut hochladen. |
Jeder Upload auf einem Node scheitert mit WORKSPACE_UPLOAD_PERMISSION_DENIED | Die Broker-Unit ist möglicherweise veraltet (/var/www schreibgeschützt): nova-workspace-broker.service braucht ReadWritePaths=-/var/www -/srv. Mit systemctl cat nova-workspace-broker prüfen. |
| Spool wächst | systemctl status nova-workspace-upload-spool-sweeper.timer; journalctl -u nova-workspace-upload-spool-sweeper. |
Grenzen in Version 1.0
- Upload-Durchsatz. Das Gateway leitet 32 KiB pro Node-Befehl weiter, mit je einem Roundtrip. Rechne je nach Latenz mit einigen MB/s pro Node-Sitzung. Uploads zu einem Node teilen sich dessen Sitzung mit Lesezugriffen.
- Commit großer Dateien. Der Broker arbeitet single-threaded. Während er eine große Datei für den Commit hasht, warten andere Workspace-Befehle an diesen Node.
- Stage-Verzeichnis. Jedes Website-Root hat ein Verzeichnis
.nova-upload(0700, Website-UID). Der Node blendet es in Listen aus und verweigert Lesezugriffe darunter; über SFTP/FTP ist es sichtbar. Entferne es nicht, solange Uploads laufen. - Fortsetzen nach Neuladen. Ein neu geladenes Panel setzt einen unterbrochenen Upload nicht selbst fort. Über die API geht das (
GETauf den Upload, beireceived_bytesweitermachen); andernfalls läuft der Upload nach 6 Stunden Inaktivität ab. - Panel. Uploads startest du im Dateibrowser der Website (
#/websites/<nws>/files, Schaltfläche „Dateien hochladen“). Upload-Jobs erscheinen unter „Dateiaufträge“.