English Polski Français Italiano Nederlands Svenska 日本語 繁體中文 · Markdown

Bucket & Code Server IDE: Benutzerhandbuch

Bucket & Code Server IDE (QPKG bucketvs) bewahrt Quellcode und Dateien auf einem QNAP-NAS auf und baut dort Software. Das Paket bringt einen eigenen Webserver, eigene Werkzeuge und eigene Konten mit.

Dieses Handbuch beschreibt das Paket so, wie es auf dem NAS läuft.

Inhalt

Was auf dem NAS läuft

TeilWas er tutWo er lauscht
nginxdie einzige Tür im LAN: liefert das Panel aus und reicht jeden Pfad an sein Modul weiter9950 (HTTP), 9951 (HTTPS)
bvsdstartet und überwacht alle anderen Prozesse, verwaltet Konten und Einstellungen, führt Jobs und Cron-Jobs aus, beantwortet das Panelzwei Unix-Sockets in /usr/bin/bucketvs/var/run/
Git (Forgejo)Git-Hosting mit Weboberflächeein Unix-Socket in /usr/bin/bucketvs/var/run/forgejo/ und 9952 für Git über SSH
SVN und Bucket (httpd)Subversion-Repositorys und WebDAV-Ordner mit Historie127.0.0.1:9961, oder der nächste freie Port, wenn ein anderes Programm ihn belegt
Editor (code-server)VS Code im Browser, eine Instanz pro Kontoein Unix-Socket pro Konto in /usr/bin/bucketvs/var/run/ide/
CIder Forgejo-Actions-Runnerkein eigener Port; nginx lauscht für ihn auf 127.0.0.1:9960, solange das Modul eingeschaltet ist, oder auf dem nächsten freien Port, wenn ein anderes Programm 9960 belegt

Der Kern (nginx, bvsd, das Panel, Cron-Jobs, Toolchains) ist immer eingeschaltet. Git, CI, SVN und Bucket sowie der Editor sind Module, die ein Admin ein- und ausschaltet. Auf jeder Adresse des NAS antworten die Module unter ihren Pfaden: /git/, /svn/, /bucket/, /ide/. Das Panel liegt unter /, dieses Handbuch unter /guide/.

Solange das Paket läuft, liegen seine Programme in /usr/bin/bucketvs/bin. Alles, was das Paket aufbewahrt (Konten, Einstellungen, Repositorys, Umgebungen, Protokolle), liegt in einem Ordner auf einem Datenvolume: dem Datenordner.

Das Paket installieren

Das Paket braucht QTS 6.0 oder QuTS hero 6.0 oder neuer, auf einem NAS mit x86_64 oder ARM 64-Bit; für jede Architektur gibt es ein eigenes Paket (bucketvs_<Version>_x86_64.qpkg, bucketvs_<Version>_arm_64.qpkg). Es ist code-signiert: Installieren Sie es aus dem App Center (aus einem Repository, das es anbietet, oder mit Manuell installieren und der heruntergeladenen Datei). Das App Center prüft die Signatur; Apps ohne gültige Signatur müssen nicht erlaubt werden.

Die Installation legt den Dienstbenutzer bucketvs an (für Forgejo und httpd), den Link /usr/bin/bucketvs auf den Installationsordner, und startet bvsd. Die Systemprotokolle nennen den Datenordner.

Wo der Datenordner beginnt

Beim ersten Start ist der Datenordner BucketVS auf dem Volume, auf dem das Paket installiert ist, zum Beispiel /share/CACHEDEV1_DATA/BucketVS (QTS) oder /share/ZFS2_DATA/BucketVS (QuTS hero). Später lässt es sich im Panel auf ein anderes Volume verschieben (Den Datenordner verschieben).

Das Paket merkt sich seinen Datenordner in /etc/config/bucketvs-data-root; diese Datei überdauert das Paket. Das Entfernen des Pakets lässt den Datenordner und diese Datei stehen, sodass eine Installation nach dem Entfernen mit denselben Daten und denselben Konten startet. Ein Start hängt nie von einem Ordner ab, den es nicht gibt. Ist der Datenordner weg (gelöscht, auf einer ausgetauschten Festplatte oder auf einem Volume, das in diesem Moment offline ist), legt der Start BucketVS auf dem eigenen Volume des Pakets an, einen neuen Ordner, außer es liegt dort schon einer mit diesem Namen, und in einem neuen legt die erste Anmeldung das Passwort des Administrators fest. Das gilt nach einer Neuinstallation ebenso wie für ein installiertes Paket, auch beim Hochfahren. Die Systemprotokolle enthalten dazu eine Warnung, und .prev-Dateien behalten den alten Pfad: /etc/config/bucketvs-data-root.prev und bei einem installierten Paket auch etc/data-root.prev im Installationsordner. Lag der alte Ordner auf einem Volume, das in diesem Moment nur offline war, bringen Sie das Volume online, stoppen das Paket, kopieren diese Datei über etc/data-root im Installationsordner (zum Beispiel /share/CACHEDEV1_DATA/.qpkg/bucketvs/etc/data-root) und starten das Paket: Es läuft dann wieder mit den alten Daten.

Das Panel aus dem App Center öffnen

Öffnen beim Paket im App Center öffnet das Panel auf Port 9950 (HTTP) oder 9951 (HTTPS). Werden die Ports im Panel geändert (Ports), teilt das Paket dem App Center die neuen beim nächsten Start mit.

Autostart aus einer SSH-Sitzung

Solange der Schalter des Pakets im App Center eingeschaltet ist, startet das NAS das Paket beim Hochfahren. In einer SSH-Sitzung auf dem NAS setzen Sie als Admin denselben Schalter mit dem Dienstskript:

/etc/init.d/bucketvs.sh disable   # der nächste Start wird abgelehnt, auch beim Hochfahren
/etc/init.d/bucketvs.sh enable    # das Paket startet wieder beim Hochfahren

Jeder der beiden Befehle schreibt nur den Schalter (Enable in /etc/config/qpkg.conf), gibt aus, was er gesetzt hat, und schreibt dieselbe Zeile in die Systemprotokolle. Ein laufendes Paket läuft nach disable weiter, und enable startet nichts: das tun stop und start, und start lehnt ab, solange das Paket ausgeschaltet ist. status sagt, ob bvsd läuft.

Erste Anmeldung

Öffnen Sie das Panel unter https://<NAS-Adresse>:9951/ oder http://<NAS-Adresse>:9950/. Die HTTPS-Adresse verwendet anfangs ein selbstsigniertes Zertifikat, daher warnt der Browser, bis das Gerät ihm vertraut; der Abschnitt Das Zertifikat zeigt, wie Sie seinen Fingerabdruck vergleichen.

Eine neue Installation hat kein Konto. Solange der erste Administrator kein Passwort hat, öffnet das Panel einen einzigen Bildschirm, „Administratorpasswort setzen“, für das Konto administrator. Geben Sie ein Passwort zweimal ein: mindestens 10 Zeichen und höchstens 72 Byte. Das Speichern legt das Konto an und meldet Sie an.

Das Paket startet ohne Konto; Administratorpasswort setzen 60 Minuten, nur lokales Netz; administrator angemeldet; Paket im App Center neu starten: ein neues 60-Minuten-Fenster

Aus einer SSH-Sitzung auf dem NAS legt /usr/bin/bucketvs/bin/bvs user password administrator das Konto an, wenn es noch keines gibt, und gibt ein zufälliges Passwort aus; das Panel verlangt dann bei der ersten Anmeldung ein eigenes Passwort (Wenn ein Admin ausgesperrt ist).

Nach der ersten Anmeldung sagt die Übersicht, dass nur der Kern läuft. Die Kachel jedes Moduls sagt, was das Modul bietet, und hat eine Schaltfläche, die es einschaltet, etwa Git einschalten: Schalten Sie die Module ein, die Sie brauchen (Module).

Arbeiten im Panel

Das Panel funktioniert wie ein Code-Editor: Jede Seite öffnet sich in einem Tab, und eine Befehlspalette erreicht die Seiten und Aktionen über ihren Namen.

Konten

Das Panel hat eigene Konten. QTS-Konten melden sich dort nicht an.

Rollen

RolleWas sie darf
viewerliest das Panel; die Seiten Sicherungen, Speicher, Benutzer und Protokolle sind Admins vorbehalten. In Forgejo legt sie kein Repository an, forkt und importiert keines, legt keine Organisation an und pusht nie; sie liest die SVN-Repositorys und Buckets, für die sie Rechte hat, und schreibt in keines
memberliest, was ein viewer liest, und schreibt: pusht in die Git-Repositorys, für die sie Schreibzugriff erhält, schreibt in die SVN-Repositorys und Buckets, für die sie Lesen und Schreiben hat, und stellt dort ältere Versionen von Dateien wieder her. In Forgejo legt sie kein Repository an, forkt und importiert keines und legt keine Organisation an, und sie kann nicht in ein Repository pushen, das einem Konto unter developer gehört oder von einem solchen verwaltet wird, und, solange das CI-Modul eingeschaltet ist, auch nicht in eines, dessen Actions eingeschaltet sind. Sie bekommt keinen Editor, keine Cron-Jobs und keine Builds
developeröffnet zusätzlich den Editor, liest die bvs use-Zeilen installierter Toolchains, legt eigene Cron-Jobs an, ändert und startet sie, legt Apps an und baut sie, veröffentlicht Pakete im Repository (ein Admin listet sie), prüft Kernel-Module und legt Git-Repositorys an, deren Workflows auf dem NAS laufen, solange das CI-Modul eingeschaltet ist
adminalles: Konten, Einstellungen, Speicher, Netzwerk, Module, Toolchains, Umgebungen, jeder Cron-Job, Apps aktivieren, Kernel-Module laden, Pakete im Repository listen

Die Rolle developer ist root auf dem NAS: Ihre Cron-Befehle laufen als root, ebenso das Terminal ihres Editors und, solange das CI-Modul eingeschaltet ist, die Workflows der Repositorys, in die sie pushen darf. Geben Sie sie nur Personen, denen Sie auch das Admin-Passwort des NAS geben würden. Wer nur in Repositorys schreibt, braucht nur die Rolle member.

Unter Ihr Konto sieht jede Person ihre eigene Rolle und was sie erlaubt, mit einem Link zu diesem Abschnitt. Eine Seite über der Rolle einer Person sagt, welche Rolle sie erfordert, und was nur ein Admin ändert, ist dort, wo es steht, so gekennzeichnet. Netzwerk, Git und CI zeigen allen anderen ihre Einstellungen als Werte, mit „Nicht gesetzt“, wo einer leer ist.

Workflows laufen auf dem NAS als root, deshalb hält bvsd die Actions in jedem Git-Repository ausgeschaltet, das einem member oder viewer gehört oder in das ein solches Konto schreiben kann: Gibt man einem solchen Konto Schreibzugriff auf ein Repository, gehen dessen Actions innerhalb einer Minute aus, und die Git-Seite listet diese Repositorys für Admins. Um dort Actions zu nutzen, entziehen Sie zuerst diesen Schreibzugriff in Forgejo oder übertragen ein Repository, das einem solchen Konto gehört, auf das Konto eines developers.

Konten anlegen und ändern

Ein Admin verwaltet die Konten auf der Seite Benutzer.

Passwörter und Sitzungen

Falsche Passwörter

Hinter einem Proxy zählt die Adresse, die der Proxy meldet, aber nur, wenn der Proxy ein vertrauenswürdiger Proxy ist. Sonst zählt jeder Client als die eigene Adresse des Proxys, und fünf falsche Passwörter von irgendwem sperren alle für 15 Minuten aus.

Zwei-Faktor-Authentifizierung

Jedes Konto schaltet sie für sich selbst unter Ihr Konto ein: Scannen Sie den QR-Code mit einer Authenticator-App (oder tippen Sie den Schlüssel ein) und geben Sie dann den 6-stelligen Code ein, den die App zeigt. Danach fragt die Anmeldung nach dem Passwort nach einem Code.

API-Token

Skripte und CI verwenden API-Token statt eines Passworts. Unter Ihr Konto erzeugt „Neues Token“ eines:

Wenn ein Admin ausgesperrt ist

Der NAS-Admin kann jedes Konto aus einer SSH-Sitzung auf dem NAS zurücksetzen. Der Befehl bvs spricht mit bvsd über einen Socket, den nur root öffnen kann (/usr/bin/bucketvs/var/run/bvsd-cli.sock, Modus 600):

/usr/bin/bucketvs/bin/bvs user list
/usr/bin/bucketvs/bin/bvs user password administrator
/usr/bin/bucketvs/bin/bvs user totp-reset administrator
/usr/bin/bucketvs/bin/bvs user unlock administrator

Jede Anfrage auf diesem Socket handelt als der eingebaute Admin cli und wird in log/audit.log im Datenordner geschrieben. Für diese Befehle muss bvsd laufen.

Der Datenordner

Der Datenordner ist der Ordner, der alles enthält, was das Paket aufbewahrt. Sein Pfad ist die eine Zeile in /usr/bin/bucketvs/etc/data-root. Die Seite Speicher zeigt ihn, mit dem Volume, auf dem er liegt, und dem freien Platz dort.

bvsd startet nur mit einem Datenordner, der ein Ordner auf einem echten Volume ist. Der Start des Pakets prüft das vorher: Ein fehlender Ordner oder einer auf tmpfs oder ramfs ergibt einen neuen Datenordner auf dem Installationsvolume, wie unter Wo der Datenordner beginnt beschrieben. Ein Volume, das offline ist, hinterlässt seinen Einhängepunkt als leeren Ordner im RAM des NAS, und dort geschriebene Einstellungen wären nach dem nächsten Neustart weg. bvsd selbst lehnt einen solchen Ordner nur ab, wenn es von Hand gestartet wird, und der Grund geht dann in die QTS-Systemprotokolle.

Was bvsd jedem Prozess mitgibt

QTS hält /tmp in einer kleinen RAM-Disk und /root auf einer RAM-Disk, die ein Neustart leert. Deshalb bekommt jeder Prozess, den bvsd startet (Modulprogramme, Cron-Jobs, Installationen), seine temporären Dateien und seinen Home-Ordner im Datenordner:

VariableWert
HOME<Datenordner>/home/<Benutzer>
TMPDIR<Datenordner>/tmp
XDG_CACHE_HOME, XDG_CONFIG_HOME.cache und .config in diesem Home-Ordner
npm_config_cache.npm in diesem Home-Ordner
PATH~/.local/bin, ~/.npm-global/bin, dann bin, sbin und node/bin des Pakets, dann die Ordner des Systems
SSL_CERT_FILE, GIT_SSL_CAINFO, CURL_CA_BUNDLEdas CA-Bündel des Pakets, /usr/bin/bucketvs/etc/ssl/cacert.pem
TZdie Zeitzone des NAS, wie in QTS eingestellt
SHELL, EDITORbash und nano des Pakets
LANG, LESSCHARSETC.UTF-8 und utf-8, damit Dateinamen mit Umlauten und anderen Zeichen so erscheinen, wie sie sind

Den Datenordner verschieben

Die Seite Speicher verschiebt den ganzen Datenordner in einen anderen Ordner unter /share. Wählen Sie einen freigegebenen Ordner oder ein Volume; die Daten kommen in einen neuen Ordner namens BucketVS darin. Um einen Ordner selbst zu verwenden, öffnen Sie einen leeren Ordner namens BucketVS. Freigegebene Ordner werden in QTS angelegt (Systemsteuerung, Freigabeordner); innerhalb eines freigegebenen Ordners oder eines Volumes kann die Seite einen neuen Ordner anlegen. Die Auswahl öffnet sich dort, wo die Daten jetzt liegen, und sagt das; öffnen Sie von dort den freigegebenen Ordner oder das Volume, in das sie umziehen sollen.

Die Seite prüft das Ziel, bevor der Umzug beginnt, und listet jeden Grund, aus dem sie eines ablehnt:

Ziel erneut prüfen freier Platz: die Daten + 10 %; Module stoppen das Panel bleibt an; Kopieren mit rsync -aHAX --numeric-ids; Kopie prüfen Dateien, Bytes, Besitzer, Modi, Zeiten, sha256 von bis zu 1000 Dateien; Datenordner umschalten in /usr/bin/bucketvs/etc/data-root; bvsd startet neu im neuen Verzeichnis und startet die Module; Die alte Kopie bleibt, markiert mit MOVED-TO, bis Sie sie entfernen; Das alte Verzeichnis bleibt in Gebrauch, die Module starten wieder

Während der Umzug läuft:

Nach dem Umschalten stoppt bvsd und startet sich im neuen Verzeichnis neu, daher ist das Panel für ein paar Sekunden weg.

Schlägt der Umzug fehl, bleibt der alte Datenordner in Gebrauch und die Module starten wieder. Der Fehler des Jobs sagt, was schiefging und was aus der Kopie wurde:

Die alte Kopie und übrig gebliebene Kopien

Nach einem erfolgreichen Umzug bleibt der alte Datenordner, wo er war, mit einer Datei namens MOVED-TO darin. Nichts verwendet es. „Alte Kopie entfernen“ auf der Seite Speicher löscht es, und „Diese Kopie entfernen“ löscht eine übrig gebliebene Kopie eines fehlgeschlagenen Umzugs. Beide Löschungen bleiben auf einem Dateisystem und folgen nie einem Link. Ein Ordner, der ein Einhängepunkt oder der Ordner eines freigegebenen Ordners selbst ist, wird geleert und behalten.

Netzwerk

Die Seite Netzwerk enthält die Ports, den Modus für reines HTTP, die Hostnamen der Module, die vertrauenswürdigen Proxys, die öffentliche URL und das Zertifikat. Das Speichern startet neu, was die Änderung braucht, und listet es.

Ports

EinstellungStandardWas sie ist
HTTPS9951das Panel und die Module über TLS
HTTP9950das Panel und die Module über reines HTTP
Git über SSH9952Git über SSH
SSH-Port in Klon-URLs0der Port, den SSH-Klonadressen zeigen; 0 bedeutet den SSH-Port oben. Setzen Sie ihn, wenn ein Router einen anderen Port an das NAS weiterleitet.
SSH-Host in Klon-URLsleerder Name oder die Adresse, die SSH-Klonadressen zeigen. Leer bedeutet den Git-Hostnamen, sonst den Host der öffentlichen URL, sonst die LAN-Adresse des NAS; für einen über den Cloudflare Tunnel veröffentlichten Namen die LAN-Adresse und den Port für Git über SSH. Setzen Sie ihn auf einen Namen, der nur im DNS steht, oder auf die Adresse des Routers, wenn der Router den SSH-Port weiterleitet.

Ports liegen zwischen 1024 und 65535 und unterscheiden sich voneinander. Die Modulports auf 127.0.0.1 (9960 und 9961) werden abgelehnt, ebenso der Port, den httpd oder der Server des CI-Runners verwendet, wenn ein anderes Programm 9960 oder 9961 belegt hat (die Fehlermeldung nennt ihn). Bleibt nginx beim Speichern auf seinen alten Ports, weil es einen neuen nicht verwenden konnte, sagt eine Benachrichtigung warum. nginx lauscht auch auf IPv6, wenn das NAS es hat.

Reines HTTP

Die Anmeldeseite warnt, wenn sie über reines HTTP kam: Das Passwort geht dann lesbar durch das Netz.

Das Zertifikat

Beim ersten Start erzeugt bvsd ein selbstsigniertes Zertifikat (ECDSA P-256) für:

Es ist 825 Tage gültig, so lange, wie Apple-Geräte es höchstens annehmen, auch bei einem von Hand als vertrauenswürdig eingestuften Zertifikat. bvsd prüft es beim Start und einmal am Tag und erzeugt ein neues, wenn noch 30 Tage oder weniger übrig sind, wenn sich die Menge der Namen ändert oder wenn sein Schlüssel nicht passt. Ein neues sendet eine Benachrichtigung. Die Seite Netzwerk zeigt seine Namen, seine Gültigkeit und seinen SHA-256-Fingerabdruck: Vergleichen Sie den Fingerabdruck, bevor ein Gerät ihm vertraut.

„Eigenes Zertifikat hinzufügen“ nimmt eine Zertifikatskette und ihren privaten Schlüssel im PEM-Format:

Das Paar wird in etc/tls/ im Datenordner mit Modus 600 gespeichert. Läuft ein hochgeladenes Zertifikat ab oder besteht es diese Prüfungen nicht mehr, liefert nginx stattdessen das selbstsignierte aus, und eine Benachrichtigung sagt warum. Ein hochgeladenes Zertifikat mit 30 Tagen oder weniger sendet ebenfalls eine Benachrichtigung. „Neues selbstsigniertes Zertifikat“ erzeugt ein neues selbstsigniertes Paar und schaltet auf dieses zurück.

Clients, die über einen Proxy kommen, sehen das Zertifikat des Proxys, nicht dieses.

Zertifikat herunterladen auf der Seite Netzwerk speichert das Zertifikat, das das Panel ausliefert, ohne seinen Schlüssel als <name>.crt. Fügen Sie es den vertrauenswürdigen Zertifikaten eines Geräts hinzu, dann vertrauen die Browser dieses Geräts dem Panel; die Erweiterungsansichten des Editors brauchen das (Erweiterungen). Einem neuen selbstsignierten Zertifikat muss man erneut vertrauen.

Vertrauenswürdige Proxys

Eine Liste von IP-Adressen oder CIDR-Bereichen, etwa 192.168.1.5, die Adresse des Proxys vor dem NAS. Nur bei einer Anfrage, deren TCP-Verbindung von einer davon kommt, übernimmt nginx:

Eine Anfrage von jeder anderen Adresse gilt als direkt von ihrem Client kommend, und nginx ersetzt ihre X-Forwarded-*-Header durch eigene Werte. Ein Bereich macht jeden Host darin vertrauenswürdig: Jeder von ihnen kann dann Clientadresse und Schema setzen, tragen Sie also die eigene Adresse des Proxys ein. Ein Bereich aller Adressen (0.0.0.0/0, ::/0) wird abgelehnt.

Öffentliche URL

Nur die Adresse, etwa https://git.example.com, ohne Pfad. Die Abschnitte der Module sagen, welche Links mit ihr beginnen.

Hinter einem Reverse Proxy (Plesk)

Die übliche Einrichtung legt TLS auf einen Proxy mit einem öffentlichen Zertifikat und lässt ihn im LAN reines HTTP mit Port 9950 sprechen. Die Beispiele unten verwenden bvs.example.com als öffentlichen Namen, 192.168.1.20 für das NAS und 192.168.1.5 für den Plesk-Server; setzen Sie Ihre eigenen Werte ein.

Browser, git, WebDAV-Client; Plesk-nginx bvs.example.com öffentliches Zertifikat; nginx auf dem NAS 192.168.1.20; / Panel, /api/ bvsd; /git/, /svn/, /bucket/, /ide/; git über SSH

Auf dem NAS

  1. Tragen Sie auf der Seite Netzwerk die Adresse des Plesk-Servers (so, wie das NAS sie sieht) unter Vertrauenswürdige Proxys ein.
  2. Reines HTTP kann auf „Ausliefern“ bleiben. „Auf HTTPS umleiten“ funktioniert ebenfalls, sobald der Plesk-Server ein vertrauenswürdiger Proxy ist.

In Plesk

Tragen Sie diese Direktiven in die Apache- und nginx-Einstellungen der Domain ein, im Feld „Zusätzliche nginx-Anweisungen“ (in der englischen Oberfläche „Additional nginx directives“):

location ~ ^/ {
    proxy_pass http://192.168.1.20:9950;
    proxy_http_version 1.1;

    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # WebSocket: der Editor und sein Terminal
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;

    # große Pushes und Uploads: keine Größengrenze, gestreamt, eine Stunde Stille erlaubt
    client_max_body_size 0;
    proxy_request_buffering off;
    proxy_buffering off;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
}

location ~ ^/ ist eine Location mit regulärem Ausdruck. nginx zieht einen passenden regulären Ausdruck einem einfachen location / vor (Plesk schreibt ein eigenes), daher bedient dieser Block jeden Pfad der Site, und proxy_pass ohne Pfad reicht den Pfad der Anfrage unverändert weiter. Schalten Sie auf derselben Einstellungsseite „Statische Dateien direkt durch nginx bereitstellen“ aus: Ist es an, beantwortet Plesk Anfragen nach .js-, .css- und Bilddateien aus dem eigenen Ordner der Domain, und das Panel lädt nicht.

Schalten Sie in den Hosting-Einstellungen der Domain die dauerhafte, SEO-sichere 301-Weiterleitung von HTTP auf HTTPS ein (in der englischen Oberfläche „Permanent SEO-safe 301 redirect from HTTP to HTTPS“). Die zusätzlichen nginx-Anweisungen gelten auch für die Site der Domain auf reinem HTTP (Port 80); ohne die Weiterleitung antwortet die Site auch dort, und Passwörter gehen unverschlüsselt durch das Internet.

Warum jede Zeile zählt:

DirektiveWas ohne sie nicht funktioniert
Host $http_hostnginx auf dem NAS wählt den Serverblock nach Host, ein Modul-Hostname passt also nie. bvsd vergleicht den Origin der Seite mit Host, einschließlich Port, daher scheitert jede Änderung im Panel mit 403 csrf; $host würde einen anderen öffentlichen Port als 443 weglassen und genauso scheitern.
X-Forwarded-Forjeder Client zählt als der Plesk-Server: fünf falsche Passwörter einer Person sperren alle für 15 Minuten aus
X-Forwarded-Proto $schemedas Sitzungs-Cookie wird nicht als Secure markiert, und im Modus „Auf HTTPS umleiten“ wird jede Anfrage an Port 9951 des öffentlichen Namens geschickt
Upgrade, Connectiondie Seite des Editors öffnet sich, aber der Editor und sein Terminal verbinden sich nie
client_max_body_size 0, proxy_request_buffering off, die Timeoutsfür große Pushes und Uploads gelten die eigene Größengrenze und die Timeouts des Proxys

X-Forwarded-For und X-Forwarded-Proto zählen nur, wenn der Plesk-Server unter Vertrauenswürdige Proxys steht. Steht er dort nicht, ignoriert nginx auf dem NAS sie.

Git über SSH

Ein HTTP-Proxy transportiert kein SSH. Git über SSH geht direkt an Port 9952 des NAS oder über eine TCP-Portweiterleitung im Router. „SSH-Port in Klon-URLs“ auf der Seite Netzwerk setzt den Port, den die Klonadressen zeigen, und „SSH-Host in Klon-URLs“ den Namen oder die Adresse, wenn der öffentliche Name nur den Proxy erreicht.

Die Einrichtung prüfen

Hostnamen für die Module

Ein Modul kann einen eigenen Hostnamen haben (Seite Netzwerk, Hostnamen). nginx liefert dieses Modul dann allein an der Wurzel des Namens aus. Der Name muss auf das NAS zeigen oder auf den Proxy davor. Auf einem Proxy braucht jeder Hostname eine eigene Site mit denselben Direktiven wie oben.

ModulAn der Wurzel seines HostnamensAußerdem dort
GitForgejo/git/ auf jedem anderen Namen antwortet mit 302 auf den Git-Hostnamen, mit demselben Pfad, derselben Query und demselben Port
Editorcode-serverdie Anmeldeseite des Panels und /api/, damit sich ein Benutzer auf diesem Namen anmelden kann
SVN und BuckethttpdRepositorys bleiben unter /svn/<Name> und Buckets unter /bucket/<Name>

Ein ausgeschaltetes Modul antwortet mit 503 und einem Satz, der das sagt, auf seinen Pfaden und auf seinem Hostnamen.

Eine Anmeldung für alle Hostnamen

Das Sitzungs-Cookie gehört zu dem Namen, auf dem es gesetzt wurde, es sei denn, die Einstellung network.cookie_domain nennt eine übergeordnete Domain aller Modul-Hostnamen. Mit example.com erreicht eine Anmeldung auf bvs.example.com auch git.example.com und ide.example.com. bvsd lehnt ein öffentliches Suffix ab (com, com.pl, co.uk, myqnapcloud.com), eine Domain, die nicht allen Modul-Hostnamen übergeordnet ist, und jede Domain, solange kein Modul-Hostname gesetzt ist. Jede Site unter dieser Domain erhält das Cookie, setzen Sie also die engste gemeinsame übergeordnete Domain.

Die Seite Netzwerk zeigt diese Einstellung nicht. Der NAS-Admin setzt sie über den CLI-Socket mit dem curl des Pakets:

/usr/bin/bucketvs/bin/curl --unix-socket /usr/bin/bucketvs/var/run/bvsd-cli.sock \
  -X PUT -H 'Content-Type: application/json' \
  -d '{"network":{"cookie_domain":"example.com"}}' \
  http://bvsd/api/v1/settings

Ein leerer Wert ("") hält das Cookie wieder auf jedem Namen für sich.

Im Internet veröffentlichen (Cloudflare Tunnel)

Die Seite Veröffentlichen (Verwaltung, nur Admins) stellt das Paket unter Namen einer Domain ins Internet, deren DNS bei Cloudflare liegt. cloudflared, das das Paket mitbringt, baut vom NAS aus die Verbindung zu Cloudflare auf: Kein Router-Port wird geöffnet, und Cloudflare hält die Zertifikate für die Namen. Jede Anfrage geht durch das nginx des Pakets: Das Panel und seine API verlangen eine Anmeldung, ohne Konto öffnet sich nur, was Sie öffentlich gemacht haben (öffentliche Repositorys, ihre Webansicht, das Paket-Repository).

Es gibt zwei Typen von Namen, von jedem höchstens einen:

TypBeispielWas er ausliefert
Haupt-Hostnamecode.example.comdas Panel und seine API, Forgejo unter /git/, die Webansicht unter /svn-web/ und /bucket-web/, das Paket-Repository unter /repo/ (nur lesend) und das Handbuch. /svn/ und /bucket/ antworten dort mit 404, /ide/ ebenso, bis Sie den Editor veröffentlichen (unten)
Paket-Hostnameqpkg.example.comnur GET und HEAD von /repo/, für das App Center auf anderen NAS-Geräten; alles andere antwortet mit 404

Was das Token braucht

Erzeugen Sie unter dash.cloudflare.com (My Profile, API Tokens) ein API-Token mit diesen Berechtigungen, für die Zone der Namen:

Das Paket bewahrt das Token auf dem NAS in einer Datei auf, die nur root liest, und zeigt es nie wieder an.

Nutzt das Token Client IP Address Filtering, tragen Sie dort beide öffentlichen Adressen des NAS ein, IPv4 und IPv6: Das NAS ruft Cloudflare über IPv6 auf, wenn es eine IPv6-Adresse hat. Sonst lehnt die Seite Veröffentlichen mit token_ip_filter ab und nennt die Adresse, die Cloudflare gesehen hat.

Veröffentlichen

Geben Sie die Namen und das Token ein und dann Veröffentlichen. Das Paket prüft zuerst alles bei Cloudflare und ändert dort nichts, wenn eine Prüfung fehlschlägt; die Meldung sagt, was zu beheben ist:

Dann legt es den Tunnel an (mit dem Namen bucketvs-<NAS-Name>, außer Sie geben einen Namen an; ein Tunnel dieses Namens, den Cloudflare schon hat, wird übernommen), lässt jeden Namen mit einem proxied CNAME-Eintrag auf ihn zeigen, fügt die Cache-Regeln hinzu und startet cloudflared. Erneut veröffentlichen mit denselben Werten ändert nichts. Setzen Sie die öffentliche URL (Netzwerk) auf die https://-Adresse des Haupt-Hostnamens, damit die Links und HTTPS-Klonadressen von Forgejo ihn nennen; die Seite erinnert Sie daran, solange sie sich unterscheiden.

Git über SSH geht nicht durch den Tunnel: Cloudflare transportiert zu einem veröffentlichten Namen nur HTTP. Die SSH-Klonadresse ist daher die LAN-Adresse des NAS mit seinem Port für Git über SSH (9952), im Panel und im eigenen Klonfeld von Forgejo, und die Seite Git und die Übersicht sagen „Klonen über SSH funktioniert im lokalen Netz; aus dem Internet klonen Sie über HTTPS.“ Für SSH aus dem Internet leiten Sie den SSH-Port im Router weiter und setzen SSH-Host in Klon-URLs (Netzwerk) auf die öffentliche Adresse des Routers oder auf einen Namen, der nur im DNS steht und auf sie zeigt, mit SSH-Port in Klon-URLs, wenn der Router einen anderen Port nutzt.

Der Haupt-Hostname antwortet auf /ide/ mit 404, bis ein Admin auf der Seite Veröffentlichen den Schalter Den Editor unter dem Haupt-Hostnamen veröffentlichen einschaltet. Das Terminal des Editors ist eine root-Shell auf dem NAS, und wer sich dort aus dem Internet als Entwickler oder Admin anmeldet, bekommt sie; schalten Sie daher zuerst die Zwei-Faktor-Authentifizierung für diese Konten ein. Mit eingeschaltetem Schalter durchläuft der Editor dieselbe Anmeldung wie im LAN, sein Port-Proxy (/ide/proxy/<port>/) bleibt dort aus, und Cloudflare hält seine Seiten nie im Cache. Solange der Schalter an ist, zeigt die Übersicht Editor im Internet.

Solange das CI-Modul an ist, läuft ein Workflow, der in ein beliebiges Repository dieses Forgejo gepusht wird, über den eigenen Runner des NAS als root auf dem NAS, ob er aus dem Internet oder aus dem LAN gepusht wurde: dieselbe Macht wie das Terminal des Editors. Die Seite Veröffentlichen sagt das unter Was das Internet erreicht. Geben Sie Push-Zugriff nur Personen, denen Sie das Admin-Passwort des NAS geben würden.

Der Cache

Mit eingeschalteten Cache-Vorgaben behält Cloudflare Pakete (*.qpkg) ein Jahr, Symbole einen Tag, repo.xml 5 Minuten und die Dateien des Panels ein Jahr; nie behält es die API, die Seiten von Forgejo, die Anmeldeseiten oder die Webansicht. Eine Veröffentlichung in das Paket-Repository entfernt repo.xml (und ein geändertes Symbol oder die Dateien einer gelöschten Version) sofort aus dem Cache von Cloudflare. Das Paket fügt seine eigenen Regeln am Ende der Cache-Regeln der Zone an und ändert die anderen nie.

Anmeldung aus dem Internet

Das erste Passwort lässt sich nie über einen veröffentlichten Namen setzen: Die Ersteinrichtung nimmt nur einen lokalen Client an. Falsche Passwörter zählen pro Internet-Client, wie im LAN. Ein mit git an Forgejo gesendetes Passwort zählt ebenfalls; ein Forgejo-Zugriffstoken funktioniert wie immer. Cloudflare nimmt Anfragen bis 100 MB an, daher geht ein größerer Push oder Upload über die LAN-Adresse.

Stoppen und entfernen

Stoppen beendet cloudflared; die Namen zeigen dann die eigene Fehlerseite von Cloudflare, und bei Cloudflare ändert sich nichts. Bei Cloudflare entfernen löscht die DNS-Einträge, die Cache-Regeln und den Tunnel, die das Paket angelegt hat (ein übernommener Tunnel bleibt), und vergisst das Token. Solange Namen veröffentlicht sind, zeigt die Übersicht ein Etikett Internet mit dem Zustand des Tunnels.

Module

Die Übersicht zeigt jedes Modul mit seinen Prozessen, seinem Speicher und seiner CPU und schaltet es ein und aus (nur Admins). Ein ausgeschaltetes Modul sagt, was es bietet; ein Admin schaltet es mit seiner Schaltfläche (Git einschalten, Editor einschalten usw.) auf seiner Kachel, auf seiner eigenen Seite oder, beim Editor, im Tab Editor ein.

ZustandBedeutung
läuftjeder Prozess des Moduls läuft
startetein Prozess wurde vor weniger als einer Sekunde gestartet
beeinträchtigtein Prozess wartet auf seinen Neustart, die Dateien des Moduls konnten nicht geschrieben werden, oder seine Zustandsprüfung schlägt fehl
startet in einer Schleife neuein Prozess hat sich innerhalb von 10 Minuten 5-mal beendet; bvsd startet ihn alle 15 Minuten neu, und eine Benachrichtigung ging hinaus
gestopptdie Prozesse des Moduls laufen nicht (ein Datenumzug hat sie gestoppt, oder sie konnten nicht starten)
ausdas Modul ist ausgeschaltet

Ein Prozess, der sich beendet, wird nach 1 Sekunde wieder gestartet, dann nach 2, 4 und so weiter bis zu 60 Sekunden. Nach 10 Minuten Laufzeit beginnt die Wartezeit wieder bei 1 Sekunde. Ein Prozess, der in einer Schleife neu startet, startet sofort wieder, wenn sein Modul aus- und wieder eingeschaltet wird.

Git

Das Git-Modul betreibt Forgejo, eine Weboberfläche für Git-Repositorys mit Issues, Pull-Requests, Releases, Wikis, LFS, Spiegeln und Webhooks. Ein Admin schaltet es mit Git einschalten in der Übersicht oder auf der Git-Seite ein. Der Job bereitet die Ordner und die Datenbank von Forgejo in <Daten>/forgejo vor, legt jedes Panel-Konto in Forgejo an und startet es. Forgejo öffnet sich dann unter /git/ auf der Adresse des Panels oder unter / des Git-Hostnamens, wenn einer gesetzt ist (siehe Hostnamen für die Module).

Neues Repository auf der Git-Seite und, solange es keines gibt, auf der Git-Kachel der Übersicht öffnet das Formular von Forgejo für ein Repository. Das Panel bietet ihn und Ein Repository migrieren oder spiegeln ab der Rolle developer an: Forgejo lässt einen viewer oder ein member kein Repository anlegen.

Repositorys und Konten

Klonen über HTTPS und SSH

Auf der Seite Git zeigt Ein Repository klonen beide Befehle für einen Besitzer und ein Repository:

WegAdresseAnmeldung
HTTPS (oder HTTP)https://<NAS-Adresse>:9951/git/<Besitzer>/<repo>.gitBenutzername und Passwort des Panels oder ein Zugriffstoken
SSHssh://git@<NAS-Adresse>:9952/<Besitzer>/<repo>.gitein SSH-Schlüssel, hinzugefügt in Forgejo unter Einstellungen, SSH- / GPG-Schlüssel

Repositorys für Personen ohne Konto zeigen

Öffentliches Durchsuchen auf der Seite Git lässt jeden, der Forgejo erreicht, dessen öffentliche Repositorys ohne Konto lesen. In Forgejo ist jedes Repository öffentlich oder privat (seine Einstellungen, Sichtbarkeit). Mit eingeschaltetem Schalter kann ein Besucher ohne Konto:

Ein privates Repository bleibt verborgen: Seine Adresse antwortet mit „nicht gefunden“. Solange der Schalter an ist, listet Forgejo außerdem keine Konten (der Tab Benutzer unter Entdecken und die Benutzersuche sind aus, auch für angemeldete Benutzer), sodass ein Besucher die Kontonamen nicht sammeln kann. Pushen, Issues, Pull-Requests und Einstellungen brauchen weiterhin ein Konto. Mit ausgeschaltetem Schalter verlangt jede Seite vom Besucher zuerst eine Anmeldung.

Um ein Repository zu teilen, machen Sie es in Forgejo öffentlich, schalten Öffentliches Durchsuchen ein und senden die Adresse. Auf einem Git-Hostnamen lautet die Adresse https://<Git-Hostname>/<Besitzer>/<repo>.

Neues Projekt

Neues Projekt ist eine Seite, die ein Projekt Schritt für Schritt vom Nichts zu einer gebauten und veröffentlichten ersten Version führt. Sie öffnet sich in einem eigenen Tab aus der Befehlspalette (Strg+Umschalt+P, Neues Projekt), oben in der Seitenleiste des Editors, im Kopf der Git-Seitenleiste, auf der Git-Seite und auf der Seite Projekte; ein Beispiel unter Editor-Projekte auf der Seite Beispiele hat Neues Projekt daraus. Sie braucht die Rolle Entwickler, die Module Git und Editor und Ihr Konto in Forgejo (die Git-Seite zeigt seinen Abgleich). Solange Git oder der Editor ausgeschaltet ist, sagt die Seite das über den Schritten, und ein Admin schaltet sie dort mit einer Schaltfläche ein.

  1. Vorlage. Die Vorlagen sind gruppiert: Programme (C, C++ mit CMake, Go, Rust, Node, Python, Java), Pakete für QTS (ein QPKG-Paket, eine App-Builder-App, ein Paket aus Quellen), Kernel (ein Kernelmodul, der USB-Seriell-Treiber ch341), Websites (eine statische Website: Seiten in src/, ein Makefile, das public/ baut, eine Linkprüfung als make test) und Beispiele. Jede Karte sagt, was ein Build erzeugt, und markiert, was diesem NAS noch fehlt (QDK, eine Build-Umgebung, ein ausgeschaltetes Modul), mit einem Link zur Seite, die es hinzufügt.
  2. Name und Sichtbarkeit. Der Name benennt das Repository und den Ordner projects/<Name>; die Seite prüft ihn beim Tippen. Dann der Besitzer (Ihr Konto oder eine Organisation, in der Forgejo Ihnen Repositorys erlaubt), privat oder öffentlich und auf Wunsch eine Beschreibung. Für eine App-Builder-App die Vorgabe, mit der sie beginnt, und das Ziel.
  3. Dienst, für ein QPKG-Paket und ein Paket aus Quellen: wie das Paket startet und stoppt, aus Blöcken gebaut. Wählen Sie eine Vorgabe (Kommandozeilenwerkzeug verlinkt das Programm nach /usr/bin; Hintergrunddienst fügt ein Konto, einen Datenordner auf dem Volume, das unter diesem Konto gestartete Programm, ein Warten auf seinen Port und einen Stopp mit Zeitlimit hinzu; Web-App fügt die Schaltfläche Öffnen in App Center hinzu; Leer hat nur die Verben) und ändern Sie dann ihre Blöcke. Die Karte jedes Blocks zeigt schon beim Tippen die Zeilen, die er ins Skript schreibt, und ein abgelehnter Wert ist unter seinem Feld markiert. Der Start schaltet Enable in App Center nie ein, und der Stopp berührt es nie. Die Projektansicht ändert die Blöcke später.
  4. Bauen. Die Umgebung, in der das Projekt gebaut wird, für das Projekt gespeichert (die Projektansicht ändert sie später), oder keine, dann wählt bvsd bei jedem Build eine. Der Schritt bietet zuerst die Umgebung an, die bvsd selbst wählt und in der bvs qbuild und CI bauen: den Ubuntu 24.04 builder, sonst den Debian 12 builder, sonst eine andere Debian- oder Ubuntu-Umgebung. Gibt das Makefile der Vorlage jeder App ihre Umgebung in einer ENV-Zeile, sagt der Schritt das und fragt nach keiner, und das Projekt speichert keine. Für ein Paket aus Quellen sagt der Schritt außerdem, dass Quelladresse und sha256 im Startrezept Platzhalter sind: Der erste Build schlägt fehl, bis das Rezept die echte Quelle Ihres Programms und die sha256 dieser Datei nennt. Die Seite zeigt den Workflow, den CI bei jedem Push ausführt. Direkt nach dem Anlegen bauen ist an, bis Sie es ausschalten; bei einem Paket aus Quellen ist es zunächst aus, und Sie können es einschalten. Ohne Debian- oder Ubuntu-Umgebung für das NAS sagt der Schritt das: Ein Admin legt dort mit Diese Umgebung anlegen die Builder-Umgebung an, und danach bietet der Schritt sie an; sonst schalten Sie Direkt nach dem Anlegen bauen aus und bauen das Projekt später.
  5. Veröffentlichen, für ein QPKG-Paket, eine App-Builder-App oder eine Website: Testeinsatz auf diesem NAS (Admin, nur signierte Pakete; für eine App Auf diesem NAS aktivieren), Im App Center-Repository dieses NAS veröffentlichen und Auf meinem Webserver veröffentlichen (Admin) mit einem der Webziele; Ziel hinzufügen speichert dort ein neues. Jedes ist optional. Die Wahl zur Veröffentlichung wird auch zum Schalter Im App Center-Repository veröffentlichen des Projekts (Projektansicht, Einstellungen): Solange er an ist, veröffentlicht die CI des Projekts dort bei jedem Lauf.
  6. Überprüfen listet alle Antworten und die Schritte, die laufen werden. Projekt anlegen schickt sie ab.
  7. Fortschritt verfolgt den Job jedes Schritts: das Repository und sein erster Commit, der erste Build, dann der Testeinsatz, die Veröffentlichung im App Center und im Web, einer nach dem anderen. Eine Zeile zeigt ihren Zustand und das Ende ihres Protokolls; ein Klick zeigt das Protokoll. Ein fehlgeschlagener Schritt sagt warum und bietet Erneut versuchen, die Schritte danach warten. Am Ende Projekt öffnen, Im Editor öffnen und In Forgejo öffnen. Ein Neuladen der Seite oder die Rückkehr zu ihrem Tab liest die Jobs erneut und schickt keinen Schritt zweimal. Wer die Seite verlässt, hält die Kette an; die Projektansicht hat dieselben Schritte.

Lehnt bvsd das Projekt ab (ein Name, den ein Ordner, eine App oder ein Repository belegt, ein Besitzer, in dem Sie nichts anlegen dürfen), kehrt die Seite zum Schritt mit dieser Antwort zurück, zeigt den Grund unter dem Feld und behält alle anderen Antworten. Ein ausgeschaltetes Modul (ein Admin schaltet es auf der Seite ein), ein fehlendes Forgejo-Konto und keine Debian- oder Ubuntu-Umgebung für eine App-Builder-App werden in Überprüfen erklärt.

Was der erste Job tut:

Der Workflow läuft bei jedem Push auf dem Runner des NAS, sobald das CI-Modul an ist, in der Umgebung, die der Workflow nennt. Der QPKG-Workflow veröffentlicht das Paket im Paket-Repository, das nur codesignierte Pakete annimmt. Scheitert der erste Commit oder sein Push, nachdem das Repository angelegt wurde, entfernt der Job den Ordner, löscht das Repository wieder und nennt den Grund. Solange der Schalter Im App Center-Repository veröffentlichen des Projekts aus ist, gibt bvs repo publish im Workflow einen Hinweis aus, statt zu veröffentlichen, und der Lauf geht weiter.

Die Projektansicht

Jeder Ordner von projects/ im Datenordner hat eine eigene Seite: ein Projekt aus dem Assistenten, die Kopie eines Beispiels aus den Editor-Projekten oder ein Repository, das Sie dort geklont haben. Sie öffnet sich aus dem Zweig Projekte der Seitenleiste des Editors, von der Seite Projekte, mit Projekt öffnen am Ende von Neues Projekt und aus der Befehlspalette (Projekt … öffnen oder Strg+P und sein Name). Sie braucht die Rolle Entwickler. Das Menü eines Projekts auf der Seite Projekte hat auch Bauen, Neu bauen, Veröffentlichen und die Veröffentlichung auf den Webzielen. Dasselbe Menü schaltet die Veröffentlichung durch CI im App Center ein oder aus.

Die Seite liest den Ordner und ändert von sich aus nichts darin. Der Typ des Projekts ergibt sich aus seinen Dateien: eine App-Builder-App mit dem Namen des Ordners, eine qpkg.cfg oben (ein QPKG-Paket), ein Makefile oben oder nichts davon, wenn der CI-Workflow des Projekts es baut. Hat eine App-Builder-App den Namen des Ordners, behält ein Projekt mit einer qpkg.cfg oben, oder mit Makefile und einer qpkg.cfg in qpkg/, seinen eigenen Build, und Testeinsatz und Veröffentlichen nehmen weiter sein QPKG.

Die Leiste oben enthält die Schritte. Ein Schritt, der nicht laufen kann, behält seine Schaltfläche, ausgegraut, und sagt daneben und unter der Leiste, warum. Ein Schritt, den das Projekt gar nicht nehmen kann, verschwindet aus der Leiste, und ein Satz darunter sagt, was das Projekt macht und wohin das Ergebnis des Builds geht: in den Ordner des Projekts bei einem Programm, auf die Seite Kernel bei einem Kernelmodul, auf die Seite jeder App bei einem Makefile, das nur App-Builder-Apps baut.

Ein Makefile-Projekt wählt neben Bauen ein Ziel (das Standardziel von make, sein erstes, außer Sie wählen ein anderes); ein CMake-Projekt baut, oder baut und führt seine Tests aus. Ein Kernelmodul-Projekt baut im Arbeitsbereich der Kernel-Werkstatt für den laufenden Kernel, und dieser Build ist Sache eines Admins. Ein laufender Schritt hat Abbrechen, und der Job endet meist sofort. Workflow ausführen startet den CI-Workflow des Projekts von Hand, wenn der Workflow einen workflow_dispatch-Auslöser hat; sonst ist die Schaltfläche aus und die Seite sagt warum. Der Workflow jeder Vorlage hat diesen Auslöser. Auf diesem NAS installiert listet die Pakete, die die Testeinsätze des Projekts installiert haben, mit Von diesem NAS entfernen für einen Admin. Projekt löschen, im Menü neben den Schaltflächen des Kopfs oder im Menü des Projekts auf der Seite Projekte, ist für einen Admin oder den Entwickler, dessen Forgejo-Konto das Repository hält. Sie tippen zuerst den Namen des Projekts; der Ordner geht, und das Forgejo-Repository, eine App-Builder-App des Namens und installierte Pakete bleiben. Die Seite verlinkt danach das Repository.

Einstellungen enthält, was bvsd für das Projekt außerhalb seines Ordners speichert. Für ein Makefile-, CMake- oder QPKG-Projekt zeigt es die Umgebung, in der Bauen und Neu bauen laufen, und ändert sie. Für ein Makefile, das nur App-Builder-Apps anlegt und baut, nennt es jede App mit der Umgebung, die ihre Zeile im Makefile angibt. Ein Projekt, das ein Paket macht oder dessen Workflow bvs repo publish ausführt, hat dort den Schalter Im App Center-Repository veröffentlichen: Ist er an, fügt bvs repo publish in der CI des Projekts dessen Pakete dem Repository hinzu; ist er aus, überspringt der CI-Lauf diesen Schritt mit einem Hinweis. Ein Projekt ohne gespeicherte Wahl (die Kopie eines Beispiels, ein Klon) hat ihn an. Git zeigt den Branch, wie weit er laut letztem Fetch vor oder hinter seinem Remote liegt (die Seite fetcht nie), den letzten Commit und die geänderten Pfade. Dateien listet einen Ordner auf einmal; wählen Sie eine Datei, um sie zu lesen, eine .qpkg wird heruntergeladen. Bearbeitet wird im Editor, und der Ordner .git bleibt außen vor.

Rezepte listet für ein Projekt mit eigenem Ordner recipes/ die Rezepte, die seine Apps nehmen: jedes mit seiner Version, der Version der Bibliothek, die es ersetzt, wenn es den Namen eines Bibliotheksrezepts trägt, und darunter dem, was die Rezeptprüfung gefunden hat, mit Datei und Zeile. Ein Rezept, das bvsd auslässt, hat eine Zeile mit dem Grund; sind mehr als drei auf dieselbe Weise ausgelassen, zählt eine Zeile den Rest. Was die Prüfung am Ordner recipes als Ganzem gefunden hat, hat eine eigene Zeile. Ein Klick öffnet den Ordner des Rezepts im Editor; das Menü kopiert auch den Befehl, der dieselbe Prüfung in einem Terminal des NAS ausführt: bvs recipe lint mit dem Ordner des Projekts. Die Karte erscheint auch, wenn recipes des Projekts ein Link, eine Datei, ein Ordner, den bvsd nicht lesen kann, oder ein Ordner nur mit Links ist, und sagt, warum kein Rezept daraus gelesen wird.

Dienst und Paket (ein QPKG-Paket oder ein Makefile-Projekt mit seinem Paket in qpkg/, etwa ein Paket aus Quellen) enthält das Start- und Stoppskript des Pakets als Blöcke, die Felder seiner qpkg.cfg (Paket) und die daraus geschriebenen Dateien (Skript). Speichern zeigt den Vergleich jeder Datei und committet sie dann ins Repository des Projekts; hat sich das Projekt inzwischen geändert, planen Sie neu. Von Hand bearbeiten schaltet die Blöcke aus, sodass Sie das Skript im Editor bearbeiten; Blöcke wieder anbinden zeigt, was ein erneutes Schreiben ersetzen würde. Bibliothek aktualisieren bringt die bvs-qpkg.sh dieses Bucket & Code Server IDE ins Paket, mit ihrem Vergleich. Ein Projekt aus der Zeit vor den Blöcken bietet Blöcke für dieses Skript verwenden.

Versionen listet, wozu das Projekt wechseln kann, und Zu dieser Version wechseln tut es:

VersionWas der Wechsel tut
Eine .qpkg in build/ oder ein App-Builder-Exportein Testeinsatz dieser Datei (Admin)
Der Build des App Buildersaktiviert ihn (Admin); der App Builder behält einen Build
Eine Version im Paket-Repositorymacht sie zur gelisteten Version (Admin)
Ein Git-Tagcheckt den Tag im Ordner aus

Ein Klick wählt eine Version; ihr Menü setzt auch testweise ein, veröffentlicht, veröffentlicht auf einem Webziel oder lädt eine .qpkg herunter. Ein Tag wird als losgelöster HEAD ausgecheckt, und Zurück zu main in der Git-Karte kehrt zum Branch zurück. Der Wechsel wird abgelehnt, solange der Ordner nicht committete Änderungen hat; die Meldung nennt sie, und Sie committen oder stashen sie zuerst im Editor. Haken Sie zwei Versionen an, dann listet Die zwei vergleichen die Dateien, die die eine hat und der anderen fehlen, und die geänderten Dateien. Zwei Tags oder zwei Pakete werden nach Inhalt verglichen, ein Paket mit einem Commit nur nach Größe. Auf der Seite Pakete installiert ein Admin auch eine Repository-Version auf diesem NAS (Auf diesem NAS installieren), mit den Prüfungen des Testeinsatzes.

Eigener Webserver (Webziele)

Ein Webziel ist der Ort, an dem ein Admin ein Paket oder eine Website auf seinem eigenen Webserver veröffentlicht: ein Ordner dieses NAS (die Web-Freigabe von QTS, die der Web Server von QTS ausliefert, oder ein anderer freigegebener Ordner) oder ein rclone-Remote (SFTP, FTP, WebDAV, S3, eingerichtet in der rclone.conf der Sicherungen), mit der öffentlichen Adresse, die es ausliefert. Sie stehen auf der Seite Veröffentlichen unter Webziele: Ziel hinzufügen, Ändern, Entfernen und Testen, das eine kleine Datei dorthin kopiert, sie über die öffentliche Adresse holt und wieder löscht.

Ein Ordnerziel ist ein eigener Ordner in einer Freigabe (/share/Web/meineseite, nie eine ganze Freigabe oder ein Volume), außerhalb des Datenordners, weil eine Website-Veröffentlichung auf dem Ziel entfernt, was die Website nicht mehr enthält. Die Adresse beginnt mit http:// oder https:// und enthält keinen Benutzer und kein Passwort.

Jede Veröffentlichung liest die Datei über die öffentliche Adresse zurück: die .qpkg eines Pakets mit ihrer .sha256, nach sha256 verglichen, oder die index.html einer Website, Byte für Byte verglichen. Liefert die Adresse nicht, was kopiert wurde, schlägt der Job mit web_check: und beiden Werten fehl.

CI-Runner

Das CI-Modul betreibt Forgejo Actions: Eine Workflow-Datei in .forgejo/workflows/ eines Repositorys läuft auf einem Runner, wenn etwas gepusht wird. Es braucht das Git-Modul. Ein Admin schaltet es unter Module, CI, Einschalten ein. Der Job registriert den eigenen Runner des NAS bei Forgejo, startet Forgejo mit eingeschalteten Actions neu und startet den Runner; er endet, wenn der Runner Forgejo erreicht hat.

Der Runner auf dem NAS

Externe Runner

Ein Build-Rechner anderswo (ein Server, eine VM) kann ebenfalls Jobs von diesem Forgejo übernehmen. Auf der Seite CI, unter Einen externen Runner registrieren, gibt ein Admin ihm einen Namen und bekommt die Befehle für Linux x86_64 und aarch64. Sie laden forgejo-runner 13.2.0 von code.forgejo.org herunter, prüfen seine sha256, legen das Token des Runners in runner-token ab (nur für seinen Besitzer lesbar) und starten den Runner mit dem Label linux-amd64 (oder linux-arm64). Der Runner erscheint sofort in der Liste, offline, bis die Befehle laufen. Das Token wird nur in diesem Moment angezeigt. Ein solcher Runner führt seine Jobs auf seinem eigenen Rechner aus, als der Benutzer, der ihn gestartet hat, und erreicht Forgejo über dessen öffentliche Adresse.

SVN und Bucket

Das Modul SVN und Bucket liefert Subversion-Repositorys unter /svn/<Name> und Buckets unter /bucket/<Name> aus. Ein Bucket ist ein Netzlaufwerk (WebDAV), in dem jede gespeicherte Datei zu einer Revision wird, sodass jede frühere Version einer Datei gelesen oder zurückgeholt werden kann. Ein Admin schaltet das Modul unter Module ein; die Seite SVN & Bucket legt dann beide Typen an, listet und löscht sie.

SVN-Repositorys

svn checkout "https://<NAS-Adresse>:9951/svn/<Name>"
svn commit -m "…"

Die Seite zeigt den Checkout-Befehl mit der Adresse des Repositorys. Hinter einem Proxy folgt die Adresse der öffentlichen URL, und mit einem SVN-Hostnamen ist sie /svn/<Name> auf diesem Namen. Die Historie eines Repositorys listet seine Revisionen; eine Datei kann in jeder Revision gelesen, mit einer anderen verglichen und als neue Revision zurückgeholt werden (Diese Version wiederherstellen, für Konten mit Lesen und Schreiben).

Buckets

WebDAV-Clients und ihre Grenzen

ClientWie verbindenHinweise
macOS FinderGehe zu, Mit Server verbinden, https://<NAS-Adresse>:9951/bucket/<Name>der Finder sperrt eine Datei, während er sie schreibt; der Bucket beantwortet WebDAV-Sperren
rcloneein webdav-Remote mit vendor = other und der Adresse des Bucketsgeeignet für Kopien per Skript
davfs2 (Linux)mount -t davfs https://<NAS-Adresse>:9951/bucket/<Name> /mnt/<Ordner>Benutzername des Panels und das Passwort oder App-Passwort
Cyberduck, WinSCPeine WebDAV-Verbindung (HTTPS) zu Port 9951, Pfad /bucket/<Name>
curlcurl -T datei -u <Benutzer> https://<NAS-Adresse>:9951/bucket/<Name>/dateiein Upload, eine Revision (oder zwei, siehe oben)
Windows ExplorerNetzlaufwerk verbindender WebClient von Windows sendet ein Passwort nur über HTTPS mit einem Zertifikat, dem Windows vertraut: Stellen Sie den Bucket hinter einen Proxy mit einem echten Zertifikat (Hinter einem Reverse Proxy); das selbstsignierte Zertifikat reicht nicht

Ein Repository oder einen Bucket für Personen ohne Konto zeigen

Ein Admin kann ein SVN-Repository oder einen Bucket mit dem Schalter in seiner Zeile auf der Seite SVN & Bucket öffentlich machen (Im Web). Jeder, der die Adresse hat, kann es dann ohne Konto im Browser lesen:

AdresseWas sie zeigt
https://<NAS-Adresse>:9951/svn-web/<Name>/ein SVN-Repository
https://<NAS-Adresse>:9951/bucket-web/<Name>/einen Bucket

Der Link Im Web ansehen der Zeile öffnet diese Seite. Sie listet die Dateien und Ordner in der neuesten oder einer älteren Revision, zeigt eine Textdatei mit Zeilennummern (bis 1 MiB) oder ein Bild und bietet jede Datei zum Herunterladen an. Die Historie listet die Revisionen mit ihren Autoren, Nachrichten und geänderten Dateien. Die Seite einer Revision zeigt den Diff jeder Datei, die sie geändert hat (bis zu 20 Dateien mit höchstens 1 MiB; die übrigen sind Links); jede Datei lässt sich zwischen zwei Revisionen vergleichen.

Editor und KI-Werkzeuge

Das Editor-Modul betreibt VS Code im Browser (code-server) für jedes Konto mit der Rolle developer oder admin. Ein Admin schaltet es unter Module ein. Jedes Konto bekommt eine eigene Instanz, die startet, wenn das Konto den Editor öffnet, und nach einer Zeit ohne Datenverkehr stoppt.

Das Terminal des Editors ist eine root-Shell auf dem NAS. Unter QTS laufen die Prozesse des Pakets als admin (uid 0), außer Forgejo und httpd. Geben Sie die Rolle developer nur Personen, denen Sie auch das Admin-Passwort des NAS geben würden.

Den Editor öffnen

Der Editor antwortet nur seinen eigenen Seiten. Ein WebSocket, ein Formular oder die Anfrage eines Skripts, die eine andere Seite mit der Sitzung des Kontos sendet, von einer anderen Website oder von einem anderen Port des NAS, bekommt 403 und startet keine Instanz; so erreicht eine andere Seite auch keinen Entwicklungsserver hinter der Ansicht Ports.

Erweiterungen

Claude Code, Gemini CLI und Codex CLI

Unter KI-Kommandozeilenwerkzeuge auf der Seite Editor-Einstellungen installiert, aktualisiert und entfernt jedes Konto diese Werkzeuge für sich selbst:

WerkzeugInstalliert mitBefehl
Claude Codedem Installer von Anthropic (claude.ai/install.sh), npm, wenn das fehlschlägtclaude
Gemini CLInpm install -g @google/gemini-cligemini
Codex CLInpm install -g @openai/codexcodex

Programmieren mit einem KI-Assistenten

Jedes Projekt, das Neues Projekt anlegt, enthält einen Skill für KI-Assistenten: .claude/skills/qnap-dev/ und eine AGENTS.md, die darauf verweist. Der Skill, auf Englisch, enthält Richtlinien für alles rund um ein QNAP-NAS: was es in der Shell ist (ein Root-Dateisystem auf einer RAM-Disk, BusyBox, kein systemd, kein Paketmanager, getcfg und setcfg), Speicher und Pfade, wie man mit diesem Paket baut, signiert und veröffentlicht (bvs env run, bvs ldd, bvs qbuild, der App Builder, die Kernel-Werkstatt, das Paket-Repository), Ports, Backups und was er nicht vorschlagen darf, etwa apt auf dem NAS oder unsignierte Apps im App Center zu erlauben. Er sagt klar, dass das Signieren mit einem Hardware-Token nicht unterstützt und nicht getestet ist.

Toolchains und Umgebungen

Die Seite Toolchains lädt herunter, was zum Bauen von Software auf dem NAS nötig ist:

TypWas es istBeispiele
Root-Dateisystemein Linux-System zum Entpacken in eine UmgebungDebian 12 und 13, Ubuntu 22.04 und 24.04, Alpine 3.22
Cross-Toolchainein Compiler, der für einen anderen Prozessor bautBootlin-Toolchains für aarch64, x86-64 und armv7, mit glibc oder musl
Laufzeitumgebungeine Sprache oder ein Build-WerkzeugPython, Go, Node.js, Zig, Rust, CMake, Ninja, Java (JDK)
QNAPdie eigenen Werkzeuge von QNAPQDK 2.5.0, für bvs qbuild und Als QPKG exportieren
Kernel-Quellenein Linux-Kernelbaum für die Kernel-WerkstattLinux 6.6.129 von kernel.org; die GPL-Kernelveröffentlichung von QNAP für QTS 5.2.3

Einträge für einen anderen Prozessor sind ausgeblendet; „Einträge für andere Prozessoren anzeigen“ listet sie, aber sie lassen sich nicht installieren. Die Bootlin-Toolchains laufen auf x86_64, daher hat ein ARM-NAS keine Cross-Toolchain.

Der Katalog

Das Paket bringt einen eingebauten Katalog mit. Der signierte Remote-Katalog unter https://pub.qnaputilities.com/bucketvs/catalog.json kann Einträge ohne neues Paket hinzufügen. bvsd verwendet ihn nur, wenn seine ed25519-Signatur zum im Paket eingebauten Schlüssel passt und er nicht älter ist als der verwendete Katalog. „Katalog aktualisieren“ holt ihn sofort, und der eingebaute Cron-Job „Aktualisierung des Toolchain-Katalogs“ holt ihn jeden Tag um 04:15.

Installieren und entfernen

Installieren ist Sache eines Admins und wird mit Fortschritt auf der Seite Jobs gezeigt:

  1. Das Archiv wird nach toolchains/cache/ im Datenordner heruntergeladen. Ein unterbrochener Download wird fortgesetzt, wenn die Installation erneut gestartet wird.
  2. Seine sha256 wird mit dem Katalog verglichen. Bei einer Abweichung wird die Datei gelöscht.
  3. Eine Cross-Toolchain oder eine Laufzeitumgebung wird nach toolchains/<kind>/<id> entpackt und ihr Archiv gelöscht. Ein Root-Dateisystem oder Kernel-Quellen bleiben als Archiv; jede Umgebung und jeder Kernel-Arbeitsbereich entpackt eine eigene Kopie. QNAP veröffentlicht seine GPL-Kernelveröffentlichung in zwei Teilen: Beide werden heruntergeladen, jeder mit seiner eigenen sha256 geprüft, und zusammengefügt.

Ein volles Volume lässt die Installation mit „no space left on“ und dem Einhängepunkt des Volumes scheitern.

„Entfernen“ löscht einen installierten Eintrag. Umgebungen, die aus einem Root-Dateisystem entstanden sind, sind Kopien und bleiben.

Eine Toolchain oder Laufzeitumgebung verwenden

bvs use <id> gibt die export-Zeilen aus (etwa PATH), die eine installierte Cross-Toolchain oder Laufzeitumgebung in einer Shell nutzbar machen:

eval "$(bvs use bootlin-aarch64-glibc-stable)"

Die Seite Toolchains zeigt dieselben Zeilen unter „bvs use“ für jeden installierten Eintrag.

Umgebungen

Eine Umgebung ist ein Linux-System, das aus einem Root-Dateisystem nach envs/<Name> im Datenordner entpackt wurde. Sie ist veränderbar: apt install build-essential funktioniert in einer Debian- oder Ubuntu-Umgebung, und was Sie installieren, bleibt dort.

In einer Umgebung:

Dasselbe aus einer Shell (die Beispiele rufen bvs beim Namen auf, wie ein Cron-Job und eine SSH-Sitzung auf dem NAS es können, solange das Paket läuft):

bvs env list
bvs env create deb12 --from debian-12-x86_64
bvs env shell deb12
bvs env run deb12 -- make -C /projects/hello

bvs env shell und bvs env run starten in dem Ordner, aus dem Sie sie aufrufen. Ein Ordner unter projects/ des Datenordners ist derselbe Ordner unter /projects in der Umgebung. Jeder andere Ordner (der Checkout eines CI-Jobs, ein Ordner in einer Freigabe) wird unter /work eingehängt, und der Befehl startet dort. Von / aus starten sie in /projects.

Ein QPKG mit bvs qbuild bauen

bvs qbuild baut ein QPKG aus dem Ordner, in dem Sie es aufrufen (ein Ordner mit qpkg.cfg, wie ihn die QPKG-Vorlage von Neues Projekt anlegt). Es führt qbuild von QNAP in einer Debian- oder Ubuntu-Umgebung aus. qbuild ruft Systemprogramme über ihre vollständigen Pfade auf, und in der Umgebung führen diese Pfade zu den Programmen der Umgebung statt zu denen des NAS. Das Paket landet in build/ des Ordners.

bvs tc install qdk-2.5.0-x86_64      # einmalig; qdk-2.5.0-aarch64 auf einem ARM-NAS
cd /share/CACHEDEV1_DATA/BucketVS/projects/MyTool
bvs qbuild                           # --env <Name> wählt die Umgebung

Es verwendet die Umgebung ubuntu2404-builder (das Beispiel „Ubuntu 24.04 builder“), sonst debian12-builder, sonst eine andere Debian- oder Ubuntu-Umgebung, und braucht darin rsync. Fehlt etwas, bricht es ab und nennt den Befehl, der es hinzufügt, zum Beispiel bvs env run ubuntu2404-builder -- apt-get install -y rsync. Argumente nach bvs qbuild gehen an qbuild. Bevor qbuild läuft, sagt bvs qbuild, welcher Fall der Codesignatur für den Ordner gilt.

Eine Umgebung hat eigene Dateien und Werkzeuge. Alles darin läuft als root, sieht jeden Prozess auf dem NAS und verwendet das Netz des NAS.

Ein QPKG code-signieren

App Center prüft die Codesignatur eines Pakets bei der Installation. Zum Signieren braucht es ein Codesignaturzertifikat, das QNAP Ihnen ausgestellt hat. bvs qbuild nennt in seiner ersten Zeile einen von drei Fällen, zum Beispiel bvs: code signing, case 1 (a certificate as files): …:

FallIm Ordner liegtWas passiert
1, ein Zertifikat als Dateiencertificate und private_key, optional ca_certs (die Kette)qbuild signiert das Paket mit openssl; die Umgebung braucht openssl und bsdextrautils
2, ein Zertifikat auf einem Hardware-Tokencertificate_hsmnicht unterstützt und nicht getestet: bvs qbuild hält an, bevor etwas gebaut wird
3, kein Zertifikatkeine dieser Dateiendas Paket wird unsigniert gebaut

App Builder

Der App Builder kompiliert ausgewählte Programme in einen Ordner, das Präfix der App (standardmäßig /usr/app/my_app_prefix), innerhalb einer Umgebung.

Der Reiter Beispiele unter Apps enthält fertige Apps, Umgebungen, CI-Workflows, Cron-Jobs und Editor-Projekte. Code ansehen auf einer Karte zeigt vor der Verwendung, was das Beispiel anlegt, für jede Rolle: die Dateien eines Editor-Projekts, die Workflow-Datei, den Befehl des Cron-Jobs oder bei einer App ihre Rezepte in Build-Reihenfolge mit build.sh und recipe.json jedes Rezepts. Die Ansicht ist schreibgeschützt und zeigt Textdateien; eine Umgebung hat keine Datei, daher hat ihre Karte diese Schaltfläche nicht. Ein Beispiel verwenden braucht die Rolle developer, eine Umgebung die Rolle admin: Die Karte einer Umgebung zeigt einem developer kein Dieses Beispiel verwenden.

Rezepte

Jedes Programm wird aus einem Rezept gebaut. Ein Rezept nennt seine Quelle mit einer sha256, die Rezepte, von denen es abhängt, die Build-Werkzeuge, die die Umgebung braucht, und eine Prüfung, die zeigt, dass das Ergebnis funktioniert (etwa bin/bash --version). Es gibt Rezepte für Bibliotheken (zlib, openssl, ncurses, readline und andere), Shells (bash, zsh, busybox), Werkzeuge (coreutils, curl, git, jq, rsync, tmux, htop, nano und andere), Server (nginx, redis, openssh, dropbear) und eine Sprache (lua).

Rezept-Updates

Neue und aktualisierte Rezepte kommen auch als signierter Katalog von pub.qnaputilities.com und erreichen das NAS so vor der nächsten Version von Bucket & Code Server IDE. bvsd sucht einmal am Tag nach einem neueren Katalog. Er verwendet ihn nur, wenn die Signatur zum in bvsd eingebauten Schlüssel passt, jede Datei zur Liste des Katalogs passt und seine Rezepte neuer sind als die mit dem Paket gelieferten; ein Katalog, der eine Prüfung nicht besteht, wird nie verwendet. Solange ein Katalog in Gebrauch ist, markiert Neue App die Rezepte, die er bringt, als neu im Katalog oder vom Katalog aktualisiert.

Die Karte Rezeptbibliothek auf der Seite Apps zeigt, welche Bibliothek Builds verwenden (Paketbibliothek mit der Version des Pakets oder Katalog mit der Version des Katalogs), und die letzte Prüfung mit ihrem Ergebnis. Ein Admin hat dort zwei Schaltflächen; die zweite erscheint, solange ein Katalog in Gebrauch ist:

Nach einem Wechsel verwendet ein neuer Build jedes Rezept wieder, dessen Dateien sich nicht geändert haben. Vor jedem Build prüft bvsd die Dateien des Katalogs erneut. Hat sich eine auf dem NAS geändert, hält der Build an, bevor etwas läuft, und Builds verwenden den vorherigen Katalog oder die Bibliothek des Pakets.

Eine App bauen

Apps, Neue App (Rolle developer) fragt nach einem Namen, dem Präfix (/usr/app/<Name>, außer Sie wählen ein anderes), der Umgebung, in der die App gebaut wird (eine Debian- oder Ubuntu-Umgebung; die Beispielgalerie legt den „Ubuntu 24.04 builder“ an, den die Seite zuerst wählt), dem Ziel (die Architektur dieses NAS, oder aarch64 oder armv7 als Cross-Build), den NAS-Modellen, auf denen sie läuft, der Linkart und den Rezepten. Die Rezepte, von denen sie abhängen, werden in Build-Reihenfolge hinzugefügt.

Eine App kann außerdem die Rezepte eines Projekts nehmen, das einen eigenen Ordner recipes/ hat. Wählen Sie das Projekt im Schritt Pakete unter Rezepte aus einem Projekt. Seine Rezepte stehen zuerst in der Liste, unter dem Namen des Projekts und mit Projekt markiert, danach folgen die der Bibliothek. Ein Rezept des Projekts mit dem Namen eines Rezepts der Bibliothek ersetzt dieses in der App und zeigt, welche Version der Bibliothek es ersetzt. Ein Rezept, das das Projekt auslässt, wird mit dem Grund genannt. Ein gewähltes Rezept, das in der Liste des Projekts fehlt, wird unter der Auswahl genannt und in der App ausgelassen; es kommt zurück, sobald Sie eine Liste wählen, die es hat. Die Seite der App nennt das Projekt, und ein Entwickler öffnet von diesem Namen aus die Projektansicht. Ein viewer sieht die Rezepte des letzten Builds der App in der Reihenfolge, die sein Protokoll nennt, jedes mit Zustand und Protokoll; vor dem ersten Build gibt es keine Reihenfolge zu zeigen.

Jede Linkart ist eine Karte, mit einem Bild davon, wo die Programme ihre Bibliotheken finden, was die Art an Größe, bei Updates und beim Ort, an dem die App läuft, kostet, und welche Rezepte sie unterstützen. Bevor Sie Rezepte wählen, zählen die Karten die ganze Rezeptbibliothek; wenn Sie zum ersten Schritt zurückkehren, zählen sie die Rezepte Ihres Builds. Für eine statische App wählen Sie, was mit Rezepten geschieht, die nicht statisch linken können: sie als Bundle bauen oder weglassen.

Ein Qt-Build führt Qts eigene Werkzeuge aus (moc, rcc und für Übersetzungen lrelease von Linguist). In einem Cross-Build bauen die Qt-Rezepte (qtbase, qttools) diese Werkzeuge deshalb zuerst für dieses NAS, nach host/ unter dem Präfix, und danach Qt für das Ziel; die Rezepte, die auf Qt aufbauen, führen die Werkzeuge von dort aus. Auf dem Ziel führt nichts host/ aus. Es gehört zum Build der App, daher enthalten auch das Archiv und Als QPKG exportieren es.

Eigene Rezepte

Hat die Rezeptbibliothek für ein Programm kein Rezept, kann ein Projekt ein eigenes mitbringen. Die Rezepte liegen im Ordner recipes/ des Projekts, im Format der Bibliothek, und nur die Apps, die das Projekt nennen, bauen sie. Ein Paket entsteht so in fünf Schritten:

  1. Das Projekt anlegen. In Neues Projekt legt die Vorlage Package from source (Paket aus Quellen) einen Ordner an, mit einem Startrezept, das wie das Projekt heißt, einem Makefile für zwei Apps (eine für den Prozessor dieses NAS, eine für aarch64, auf einem x86_64-NAS ein Cross-Build) und dem Start- und Stoppskript des Pakets aus dem Schritt Dienst.
  2. Das Rezept schreiben. New recipe im Editor fügt ein weiteres Rezept aus demselben Startrezept hinzu (Den Editor öffnen). Tragen Sie die echte Quelladresse des Programms und ihre sha256 in recipe.json ein (curl -fsSL <Adresse> | sha256sum im Terminal des Editors gibt die Summe aus) und die Bauschritte in build.sh. Ein Rezeptordner enthält recipe.json, build.sh und die Vendor-Datei, die recipe.json nennt, sonst nichts; ein Patch kommt deshalb als Here-Document in build.sh.
  3. Prüfen. Jedes Speichern einer Datei eines Rezepts prüft die Rezepte des Projekts und listet die Befunde in der Ansicht Problems; make lint im Terminal und die Karte Rezepte der Projektansicht liefern dieselben Befunde. Die Prüfung liest recipe.json und prüft die Syntax von build.sh mit bash -n. Sie führt das Rezept nie aus.
  4. Bauen. Bauen in der Projektansicht legt die beiden Apps an, wenn sie fehlen, und baut sie nacheinander. Ein Build liest die Rezepte des Projekts einmal, beim Start, sodass eine später gespeicherte Datei auf den nächsten Build wartet. Ein Rezept des Projekts mit dem Namen eines Rezepts der Bibliothek ersetzt dieses nur in den Apps dieses Projekts, und das Protokoll des Builds sagt es.
  5. Packen und installieren. make qpkg im Terminal des Editors packt den neuesten erfolgreichen Build jeder App mit QDK aus den Toolchains in das Paket und lässt eine App ohne einen solchen Build aus. Liegen die Dateien für die Code-Signatur in qpkg/ neben qpkg.cfg oder in einem Ordner, den QPKG_CERT_DIR nennt, ist das Paket signiert (Ein QPKG code-signieren), und Testeinsatz in der Projektansicht (admin) installiert es auf diesem NAS.

Für Rezepte eines Projekts gelten ein paar Regeln:

Auf welchen NAS-Modellen eine App läuft

Ein gegen glibc gebautes Programm startet nur auf einem NAS, dessen glibc mindestens so neu ist wie die neueste Version, die das Programm verlangt. Das Paket rechnet auf jedem NAS, auf dem es läuft (QTS 6.0, QuTS hero 6.0 und neuer), mit glibc 2.39 oder neuer: seine glibc-Untergrenze. 2.39 ist die glibc von Ubuntu 24.04 und von QuTS hero 6.0.1, gelesen aus dem eigenen /lib/libc.so.6 dieser Firmware; QNAP nennt keine glibc-Version, und seine Versionshinweise führen kein QTS 6.0. Die Test-NAS mit QTS 6.1.0 und QuTS hero 6.1.0 haben 2.43.

Läuft auf in der neuen App und in Ändern wählt eines von zweien:

Ein Cross-Build (aarch64 oder armv7) ist immer für jedes NAS. Die neue App warnt, wenn die glibc der gewählten Umgebung über dem liegt, was die App erlaubt. Nach jedem Build liest bvsd die glibc-Version, die jedes Programm und jede Bibliothek verlangt, auch bei einem Cross-Build. Eine Datei über der Grenze lässt den Build scheitern, und die Lösungen werden genannt: eine andere Umgebung (Andere Umgebung wählen), die Linkart static oder Nur für dieses NAS bauen. Die Seite der App sagt, welche glibc ihr neuester erfolgreicher Build braucht, und der Tab Abhängigkeiten nennt jede Datei über der Grenze.

Auf dem NAS führt bvs tree-deps <Präfix> --tree <Ordner> --glibc-max 2.39 dieselbe Prüfung über einen beliebigen App-Baum aus.

Eine App auf dem NAS aktivieren

Aktivieren (admin) macht das Präfix zu einem Link auf den neuesten erfolgreichen Build der App, sodass ihre Programme auf dem NAS aus /usr/app/<Name>/bin laufen. Die Aktivierung ersetzt nie etwas, das sie nicht selbst angelegt hat: Ein Ordner, eine Datei oder ein anderer Link am Präfix wird mit dem Grund abgelehnt. Die QTS-Systemplatte wird bei jedem Start neu aufgebaut, daher legt das Paket die Links bei jedem Start neu an. Deaktivieren (admin) entfernt den Link; das Löschen der App deaktiviert sie zuerst und verschiebt sie für 7 Tage in den Papierkorb. Ein developer kann eine App nur löschen, solange sie nicht aktiv ist. Eine für eine andere Architektur gebaute App lässt sich hier nicht aktivieren; laden Sie ihr Archiv für ein NAS dieser Art herunter.

Eine App exportieren

Als QPKG exportieren (admin) packt den neuesten erfolgreichen Build als eigenes QPKG, das die App auf einem anderen NAS ohne dieses Paket installiert. Es lehnt eine App ab, die nur für dieses NAS gebaut ist, und hält vor dem Packen an, wenn ein Programm des Builds eine glibc über 2.39 braucht (siehe Auf welchen NAS-Modellen eine App läuft). Dafür ist QDK nötig: Installieren Sie „QNAP QDK 2.5.0“ auf der Seite Toolchains, Tab QNAP. Solange QDK nicht installiert ist, wird die Schaltfläche nicht angezeigt, und die Seite der App sagt, woher man es bekommt. Der Export führt qbuild in der Umgebung der App aus, genauso wie bvs qbuild. Jeder Build installiert dort rsync; bei einer App, die zuletzt mit einer älteren Version des Pakets gebaut wurde, nennt die Ablehnung den Befehl, der es hinzufügt. Das exportierte Paket legt beim Start den Link seines Präfixes an und entfernt ihn beim Stopp. Es ist nicht code-signiert: das Protokoll des Auftrags nennt Fall 3, ebenso eine Zeile unter der Schaltfläche. In einer SSH-Sitzung setzen /etc/init.d/<Name>.sh disable und enable den Schalter des exportierten Pakets im App Center und lassen den Link des Präfixes, wie er ist. Bei jedem Start fügt das exportierte Paket außerdem eine Zeile in /etc/profile und /root/.profile ein, die bin und sbin der App an den PATH einer SSH-Anmeldung anhängt, hinter die eigenen Befehle des NAS, für admin und jedes andere Konto, das sich anmelden darf; beim Entfernen nimmt es die Zeile wieder heraus.

Paket-Repository

Das Paket führt ein App-Center-Repository: Darin veröffentlichte QPKG-Pakete lassen sich auf anderen NAS-Geräten aus dem App Center installieren, wie die Apps jedes Repositorys.

Kernel-Werkstatt

Die Kernel-Werkstatt baut Kernel-Module für den Kernel, den das NAS ausführt, prüft jedes gegen diesen Kernel und lädt es. QNAP hat die Quellen seiner aktuellen Kernel nicht veröffentlicht (seine GPL-Veröffentlichungen enden bei QTS 5.2.3), daher liest die Werkstatt, was der laufende Kernel über sich zeigt, und konfiguriert einen Kernelbaum passend dazu.

Was Sie brauchen

Das Profil

bvs kernel profile zeigt, was der laufende Kernel ist: sein Release (6.6.129-qnap), der Compiler, mit dem QNAP ihn gebaut hat, das vermagic der eigenen Module von QNAP, die Größe von struct module in ihnen und wo init und exit liegen, ob Module signiert sein müssen, und die Einstellungen, die ein Kernelbaum bekommt, damit er passt.

Der Arbeitsbereich

bvs kernel prepare legt den Arbeitsbereich des laufenden Kernels in kernels/<release> des Datenordners an:

  1. Er nimmt die Kernel-Quellen, die der Katalog für diese Version hat (bvs kernel sources): den eigenen GPL-Baum von QNAP, wenn QNAP einen veröffentlicht hat, sonst den Baum von kernel.org, dem die eigenen Änderungen von QNAP fehlen. --source wählt einen anderen.
  2. Er konfiguriert den Baum: mit der Konfiguration von QNAP für dieses Modell, wenn der Baum von QNAP ist, sonst mit den Einstellungen des Profils. --option NAME=m fügt eine Einstellung hinzu, zum Beispiel einen Treiber.
  3. Er bereitet den Baum für Modul-Builds vor (--full baut stattdessen den ganzen Kernel, was viel länger dauert und die Prüfung die exportierten Symbole des Kernels sehen lässt).
  4. Er prüft, dass der Baum genau für das Release des laufenden Kernels baut.

Er läuft als Job auf der Seite Jobs. Ein fehlgeschlagenes prepare behält den Baum des vorherigen.

Ein Modul bauen

Die Module, die ein Build erzeugt, werden in kernels/<release>/modules/ aufbewahrt. Ein Modul, das QNAP für diesen Kernel mitliefert, wird nicht aufbewahrt: Die eigene Kopie von QNAP bleibt die, die geladen wird. bvs kernel make --build-only bewahrt dort nichts auf: Das Modul bleibt, wo es gebaut wurde. Die CI-Workflows der Kernel-Vorlagen von Neues Projekt bauen so.

Die Prüfung und das Laden

bvs kernel check <module> vergleicht ein Modul mit dem laufenden Kernel: das vermagic, die Größe von struct module und wo init und exit darin liegen (gegenüber den eigenen Modulen von QNAP), ob eine Signatur verlangt wird, die Module, von denen es abhängt, und jedes Symbol, das es braucht. Jeder Befund sagt, was nicht passt und was zu tun ist. Exit-Status 3 bedeutet, dass das Modul nicht geladen werden darf.

bvs kernel load <module> führt die Prüfung erneut aus und lädt das Modul, die Module, von denen es abhängt, zuerst (die eigenen von QNAP vom NAS oder Ihre). Ein Modul mit einem Fehler in der Prüfung wird nie geladen. bvs kernel unload <module> entfernt es; ein Modul in Gebrauch bleibt geladen. Jedes Laden und Entladen wird in log/kernel-modules.log geschrieben.

Der Kernel von QNAP listet seine Datensymbole nicht, daher kann die Prüfung Symbole wie jiffies nicht nachschlagen; sie nennt sie als Warnungen. Fehlt eines davon, lehnt der Kernel das Modul beim Laden ab.

Module in einer App

Eine App kann Module des Arbeitsbereichs nennen. Das Aktivieren der App lädt sie, bevor ihr Link angelegt wird, und jeder Start des Pakets lädt sie erneut, sobald das Panel läuft; die Seite Kernel zeigt ein Laden, das noch läuft. Das Deaktivieren entlädt sie zuerst; ein Modul in Gebrauch hält die App aktiv.

Nach einem QTS-Update auf einen anderen Kernel müssen die Module im Arbeitsbereich des neuen Kernels neu gebaut werden. Dasselbe gilt nach einer Wiederherstellung in einen anderen Datenordner: kernels/ ist nicht Teil einer Sicherung.

Im Panel

Die Seite Kernel zeigt das Profil des laufenden Kernels, die Kernel-Quellen des Katalogs, den Arbeitsbereich und seine Module. Ein Admin bereitet dort den Arbeitsbereich vor (eine Quelle, die Umgebung, zusätzliche Einstellungen, der ganze Kernel oder nicht) und baut Module aus einem Projektordner oder einem Verzeichnis des Baums; beides läuft als Job. Prüfen (developer) zeigt jeden Befund mit seiner Lösung; Laden und Entladen (admin) tun, was bvs kernel load und unload tun, und ein abgelehntes Laden zeigt die Prüfung, die es gestoppt hat. Eine .ko-Datei irgendwo unter dem Datenordner lässt sich über ihren Pfad prüfen.

Cron-Jobs und Vorgänge

Die Seite Jobs hat zwei Listen: geplante Jobs (Cron) und Vorgänge (die langen Jobs, die bvsd ausführt, etwa Installationen und Umzüge).

Geplante Jobs

Ein developer legt seine eigenen Jobs an und ändert sie; ein Admin ändert alle. Ein Job hat:

Jeder Job behält seine letzten 100 Läufe mit dem Ende ihrer Ausgabe (4 KB). Das vollständige Protokoll eines Laufs wird 30 Tage aufbewahrt.

Ein Job läuft als root im Auftrag seines Besitzers, mit dessen Home-Ordner als HOME, und läuft deshalb nur, solange sein Besitzer ein aktiver developer oder admin ist. Solange der Besitzer deaktiviert ist oder die Rolle member oder viewer hat, wird jede Zeit des Jobs als übersprungener Lauf aufgezeichnet, der den Grund nennt, etwa „its owner ola is disabled“, und Jetzt ausführen antwortet mit demselben Grund. Es wird keine Benachrichtigung gesendet. Ein Lauf, der andauert, wenn der Besitzer deaktiviert wird oder eine Rolle unter developer bekommt, wird gestoppt. Der Job läuft wieder, sobald das Konto aktiviert oder wieder developer ist. Das Löschen eines Kontos löscht seine Jobs. Eingebaute Jobs laufen, was auch immer mit einem Konto geschieht.

Wenn ein Befehl endet, laufen Prozesse, die er im Hintergrund gestartet hat, weiter. Bei einem Timeout, dem Löschen des Jobs oder einem Stopp des Pakets bekommt die ganze Prozessgruppe des Laufs SIGTERM, dann nach 5 Sekunden SIGKILL.

In den Nächten der Zeitumstellung folgen die Jobs der Regel von Debian-cron. Ein Job mit * am Anfang seines Minuten- oder Stundenfelds (auch */N), @hourly oder @every folgt der verstrichenen Zeit: Im Herbst läuft er in beiden Durchgängen der wiederholten Stunde, und im Frühjahr kommt die übersprungene Stunde nicht. Jeder andere Job führt jede seiner Zeiten einmal aus: Eine Zeit in der wiederholten Stunde läuft einmal, und eine Zeit in der übersprungenen Stunde läuft direkt nach der Umstellung.

Jedes angemeldete Konto, auch ein viewer, liest die Befehle der Aufgaben und die Ausgabe ihrer Läufe. Schreiben Sie Passwörter und Tokens nicht in einen Befehl: Lassen Sie ihn sie aus einer Datei unter <data>/etc lesen, die nur root liest (chmod 600).

Eingebaute Jobs

JobWannWas er tut
Wartungtäglich 03:30entfernt aus tmp/ im Datenordner, was sich seit 10 Tagen nicht geändert hat; rotiert log/audit.log über 10 MB
Papierkorb leerentäglich 03:45entfernt, was vor mehr als 7 Tagen nach trash/ im Datenordner verschoben wurde (etwa den Home-Ordner eines gelöschten Kontos)
Aktualisierung des Toolchain-Katalogstäglich 04:15holt den signierten Toolchain-Katalog
nginx-Protokolle rotierenstündlich, in Minute 7benennt nginx-access.log oder nginx-error.log in .1 um, sobald sie über 20 MB groß ist (fünf alte Dateien bleiben), und weist nginx an, seine Protokolle neu zu öffnen

Ein Admin kann Zeitplan, Zeitlimit, Richtlinie und Benachrichtigung eines eingebauten Jobs ändern und ihn ausschalten. Sein Name und sein Befehl bleiben.

Vorgänge

Installationen, Umgebungs-Jobs, Datenumzüge und das Einschalten eines Moduls laufen als Vorgänge. Die Liste zeigt die letzten 50, die neuesten zuerst, mit Fortschritt und Protokoll. Vorgänge und ihre Protokolle werden 30 Tage aufbewahrt. Ein Vorgang, der lief, als das Paket stoppte, erscheint als interrupted. Ein developer bricht seine eigenen Vorgänge ab; ein Admin bricht jeden ab.

Sicherungen

Die Seite Sicherungen (admin) legt fest, was gesichert wird, wann, wohin die Kopien gehen und wie viele bleiben. Jetzt sichern startet jederzeit eine Sicherung. Auf einer neuen Installation sind geplante Sicherungen aus; sobald Geplante Sicherungen eingeschaltet ist, läuft standardmäßig täglich eine Sicherung (der eingebaute Cron-Job backup). Sie behält den neuesten Lauf jedes der letzten 7 Tage, 4 Wochen und 6 Monate und immer den neuesten guten Lauf. Es läuft immer nur eine Sicherung, Prüfung, Wiederherstellung oder Löschung auf einmal.

Zwei Läufe an einem Tag zählen als ein Tag: Wenn der neuere fertig ist, wird der frühere Lauf dieses Tages entfernt. Ein Jetzt sichern am Nachmittag ersetzt daher den geplanten Lauf vom Morgen; kopieren Sie einen Lauf vorher woandershin, wenn der Stand dieses Morgens zählt.

Was eine Sicherung enthält

Ein Lauf ist ein Ordner <Daten>/backups/<id>/ mit einer manifest.json, die jede Datei mit ihrer sha256 listet:

TeilWas
Einstellungenetc/: Einstellungen, Konten, TOTP-Geheimnisse, der TLS-Schlüssel, die Sicherungsschlüssel
Gitder Dump von Forgejo: Repositorys, Wikis, LFS-Objekte, Anhänge und seine Datenbank
SVN, Bucketseine Kopie jedes Repositorys, inkrementell erstellt: Eine schon kopierte Revision wird nicht erneut kopiert
VS-Code-Einstellungendie VS-Code-Einstellungen jedes Kontos, die Tastenbelegungen, die Snippets und die Liste seiner Erweiterungen (nicht die Dateien der Erweiterungen: Die Ansicht Extensions installiert sie neu)
Umgebungendie Umgebungen aus Toolchains (standardmäßig aus: Sie lassen sich neu anlegen)
Projektejeder Projektordner mit seiner Git-Historie und den noch nicht committeten Dateien, ohne node_modules
HOME-Ordnerder HOME-Ordner jedes Kontos, ohne Caches und die eigenen Installationen der KI-Werkzeuge (ihr Installieren-Knopf holt sie zurück)
App Builderdie Einstellungen jeder App und der Verlauf ihrer Builds; ein Build erzeugt die Dateien der App neu
Paket-Repositorydie veröffentlichten Pakete, ihre Symbole und der Index, den App Center liest

Diese vier Teile sind in jeder Sicherung, unabhängig davon, was auf der Seite angekreuzt ist. Ein Ordner, der sich seit der vorigen Sicherung nicht geändert hat, wird mit deren Kopie verknüpft und belegt keinen Platz.

Der Lauf wird erst sichtbar, wenn jeder Teil geschrieben und geprüft ist; ein Fehler oder ein volles Volume entfernt den unfertigen Ordner und lässt die früheren Läufe, wie sie waren. Prüfen liest einen Lauf vollständig zurück: die sha256 jedes Archivs, svnadmin verify jeder Revision, git fsck jedes Repositorys und eine Integritätsprüfung der Datenbank von Forgejo.

Ziele

Jeder Lauf wird auf jedes Ziel der Seite kopiert:

Eine Kopie, die das NAS verlässt (rsync, rclone), muss verschlüsselt sein: Schalten Sie Kopien verschlüsseln, die das NAS verlassen ein und Schlüssel erzeugen. Die Kopien werden mit age für seine öffentliche Hälfte verschlüsselt; die geheime Hälfte wird einmal angezeigt, und bvsd behält sie nicht. Ohne sie kann kein NAS, dieses eingeschlossen, eine verschlüsselte Kopie wiederherstellen: Bewahren Sie sie abseits dieses NAS auf. Ein neuer Schlüssel verschlüsselt die Läufe ab dann; ältere Kopien brauchen den alten geheimen Schlüssel.

Ein Ziel, das scheitert, wird im Ergebnis des Laufs genannt; der Lauf selbst bleibt gut.

rclone.conf enthält die Zugangsdaten der Remotes. Bevor eine Kopie oder ein Test sie benutzt, macht bvsd sie (und den Sicherungsschlüssel) nur für root lesbar (Modus 600), wenn sie es nicht ist, und das Protokoll der Aufgabe sagt das.

Wiederherstellen

Wiederherstellen bei einem Lauf holt entweder alles zurück, ein Repository (ein SVN-Repository, einen Bucket oder ein Git-Repository) oder einen Projektordner:

Benachrichtigungen

bvsd schreibt jede Benachrichtigung in die QTS-Systemprotokolle. Es kann sie außerdem über shoutrrr-URLs an Chat- und Maildienste senden (Telegram, Discord, Slack, E-Mail, ein generischer Webhook und andere).

BenachrichtigungWannSchalter für die URLs
Job-Fehlschlagein Cron-Lauf eines Jobs mit Benachrichtigung bei Fehlschlag schlug fehl oder überschritt sein Zeitlimit; ein Vorgang schlug fehlnotify.on_job_failure
Sicherungdas Ergebnis jeder Sicherung, Prüfung und Wiederherstellung, auch der erfolgreichen; eine geplante Sicherung, die nicht starten konntenotify.on_backup
Neustartschleifeein Prozess begann, in einer Schleife neu zu startennotify.on_crashloop
Zertifikatein hochgeladenes Zertifikat hat 30 Tage oder weniger; nginx ist auf das selbstsignierte Zertifikat zurückgefallen; ein neues selbstsigniertes Zertifikat wurde erzeugtnotify.on_cert_expiry
Systembeim Start abgelehnte Einstellungen, ein unvollendeter Datenumzug gefunden, übrig gebliebene Prozesse beendet, die Konfiguration konnte nicht geschrieben werdenwird immer gesendet

Die URLs und die Schalter stehen unter Benachrichtigungen auf der Seite System; die Schalter sind standardmäßig an. Ein Admin ändert sie dort. Andere Konten sehen die Schalter und von jeder URL nur das Schema, weil der Rest einer URL ihr Token enthält. Der NAS-Admin kann sie auch über den CLI-Socket setzen:

/usr/bin/bucketvs/bin/curl --unix-socket /usr/bin/bucketvs/var/run/bvsd-cli.sock \
  -X PUT -H 'Content-Type: application/json' \
  -d '{"notify":{"shoutrrr_urls":["telegram://<token>@telegram?chats=<chat id>"]}}' \
  http://bvsd/api/v1/settings

Protokolle und das Support-Paket

Jedes Protokoll ist log/<name>.log im Datenordner. Die Protokolle von bvsd und von jedem Prozess, den es überwacht, werden bei 20 MB rotiert, und fünf alte Dateien bleiben. nginx-access.log und nginx-error.log haben dieselben Grenzen, geprüft bei jedem Start von bvsd und jede Stunde durch den Job „nginx-Protokolle rotieren“, daher kann eines davon 20 MB um bis zu eine Stunde Datenverkehr überschreiten. Der Job „Wartung“ rotiert audit.log, sobald es über 10 MB groß ist, und behält drei alte Dateien. Die Seite Protokolle (admin) zeigt die letzten Zeilen jedes Protokolls, filtert sie und folgt neuen Zeilen, während sie kommen:

ProtokollWer es schreibt
bvsdbvsd selbst: Starts, Stopps, angewendete Einstellungen, Probleme
nginxdie eigene Ausgabe von nginx
nginx-access, nginx-errorjede Anfrage und die Fehler von nginx
auditjede Anfrage auf dem CLI-Socket
eines pro Modulprozessdas Programm jedes Moduls

Die Seite System zeigt die Version, die Plattform, die Zeitzone und jeden Prozess, den bvsd überwacht. „Support-Paket herunterladen“ (admin) erzeugt ein Archiv für einen Fehlerbericht:

Es enthält nie Passwörter, Sitzungen, Token oder Schlüssel.

Updates

bvsd liest https://pub.qnaputilities.com/bucketvs/latest.json beim Start und alle 24 Stunden. Nennt die Datei eine neuere Version, nennt die Seite System sie, mit dem Link aus dem Feed. bvsd meldet die neue Version nur: Es lädt nie ein Paket herunter und installiert keines. Eine fehlgeschlagene Prüfung ändert nichts im Panel.

Eine neue Version installieren

Installieren Sie das neue Paket über das alte, aus dem App Center oder mit Manuell installieren. Die Installation stoppt bvsd, ersetzt die Programmdateien und startet es wieder; der Datenordner, die Einstellungen, die Konten und jedes Repository bleiben, ebenso die Sitzungen des Panels. Die Editor-Instanzen stoppen mit bvsd, daher enden die offenen Terminals der Editoren; eine Instanz startet wieder, wenn ihr Konto den Editor öffnet.

Von einer Version, die die Ports 6050, 6051 und 6052 verwendete. Frühere Builds lauschten auf 6050 (HTTP), 6051 (HTTPS) und 6052 (Git über SSH). Der erste Start der neuen Version legt diese auf 9950, 9951 und 9952 um und sagt das in einer Benachrichtigung; ein Port, den Sie selbst gewählt haben, bleibt. Ändern Sie, was die alten Ports nennt: Lesezeichen, einen Plesk-Proxy auf 6050 und Git-Remotes wie ssh://git@<NAS>:6052/… (git remote set-url).

Entfernen, neu installieren und ein beschädigtes Paket

Ihre Arbeit bleibt, wenn das Paket entfernt, neu installiert oder beschädigt wird. Alles, was Sie anlegen, liegt im Datenordner: Konten und Einstellungen, Git- und SVN-Repositorys, Buckets, Projektordner, HOME-Ordner, VS-Code-Einstellungen und -Erweiterungen, App-Builder-Apps, Umgebungen, das Paket-Repository und die Sicherungen. Der Installationsordner (<Volume>/.qpkg/bucketvs) enthält nur die Programme und eine Datei, die den Datenordner nennt.

Ein ausfallender Datenträger ist etwas anderes: Der Datenordner liegt auf den Datenträgern des NAS selbst. Bewahren Sie Sicherungen auf einem anderen Rechner auf (Sicherungen); jede Sicherung enthält Ihre Projektordner, HOME-Ordner, die Einstellungen des App Builders und das Paket-Repository.

Der Befehl bvs

bvs ist die Kommandozeile des Pakets, in /usr/bin/bucketvs/bin. Er liegt im PATH jedes Prozesses, den bvsd startet, Cron-Jobs eingeschlossen. Solange das Paket läuft, verweist /usr/bin/bvs auf ihn, daher rufen Sie ihn auch in einer SSH-Sitzung auf dem NAS beim Namen auf; wenn das Paket stoppt, entfernt es den Link.

Jeder Befehl, der über den CLI-Socket mit bvsd spricht, braucht root, weil der Socket nur root gehört: user, jobs und, während bvsd läuft, tc install, tc remove sowie env create, clone, export und delete. env shell, env run und qbuild brauchen ebenfalls root: Sie starten bvs-chroot. Als anderer Benutzer bricht ein Befehl, der den Socket braucht, mit „bvsd's CLI socket … is open to root only: run bvs as root“ ab.

bvs env list
bvs env create <name> --from <rootfs-id> [--package <name>]...
bvs env shell <name>
bvs env run <name> -- <command> [<arg>...]
bvs env clone <name> <new-name>
bvs env export <name>
bvs env delete <name>
bvs tc list
bvs tc install <id>
bvs tc remove <id>
bvs use <id>
bvs jobs
bvs user list
bvs user password <name>
bvs user totp-reset <name>
bvs guide [--path] [en|pl|de|fr|it|nl|sv|ja|zh-TW]
bvs qbuild [--env <name>] [<qbuild argument>...]
bvs kernel profile [--json]
bvs kernel sources
bvs kernel prepare [--source <id>] [--env <name>] [--option NAME=VALUE]... [--full]
bvs kernel make [--project <folder> | --dir <tree directory>] [--build-only] [<target>...]
bvs kernel check <file.ko | module>
bvs kernel load <module>
bvs kernel unload <module>

Dateien und Ordner

PfadWas
/usr/bin/bucketvsdie Programme des Pakets (ein Link auf seinen Installationsordner)
/usr/bin/bucketvs/etc/data-rootder Pfad des Datenordners
/usr/bin/bucketvs/var/run/bvsd.sockder API-Socket des Panels (nginx verwendet ihn)
/usr/bin/bucketvs/var/run/bvsd-cli.sockder Socket des Befehls bvs, nur root
<Datenordner>/etc/Einstellungen, Konten, Sitzungen, Token, die Zertifikate, die gerenderte nginx.conf (Geheimnisse mit Modus 600)
<Datenordner>/log/die Protokolle
<Datenordner>/tmp/temporäre Dateien jedes Prozesses
<Datenordner>/home/<Benutzer>/der Home-Ordner jedes Kontos
<Datenordner>/jobs/Vorgänge, Cron-Jobs und ihre Läufe, mit Protokollen
<Datenordner>/toolchains/der Download-Cache, installierte Toolchains und Laufzeitumgebungen, Exporte
<Datenordner>/envs/Umgebungen
<Datenordner>/projects/Arbeitsbereiche, als /projects in Umgebungen sichtbar
<Datenordner>/trash/gelöschte Elemente, 7 Tage aufbewahrt

Die Module fügen eigene Ordner hinzu; ihre Abschnitte nennen sie.