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

Bucket & Code Server IDE: gebruikershandleiding

Bucket & Code Server IDE (QPKG bucketvs) bewaart broncode en bestanden op een QNAP-NAS en bouwt daar software. Het pakket brengt een eigen webserver, eigen tools en eigen accounts mee.

Deze handleiding beschrijft het pakket zoals het op de NAS draait.

Inhoud

Wat er op de NAS draait

OnderdeelWat het doetWaar het luistert
nginxde enige deur op het LAN: serveert het paneel en geeft elk pad door aan zijn module9950 (HTTP), 9951 (HTTPS)
bvsdstart en bewaakt alle andere processen, houdt de accounts en instellingen bij, voert taken en cron-taken uit, beantwoordt het paneeltwee Unix-sockets in /usr/bin/bucketvs/var/run/
Git (Forgejo)Git-hosting met een webinterfaceeen Unix-socket in /usr/bin/bucketvs/var/run/forgejo/, en 9952 voor Git via SSH
SVN en Bucket (httpd)Subversion-repository’s en WebDAV-mappen met geschiedenis127.0.0.1:9961, of de volgende vrije poort als een ander programma hem bezet
Editor (code-server)VS Code in de browser, één instantie per accounteen Unix-socket per account in /usr/bin/bucketvs/var/run/ide/
CIde Forgejo Actions-runnergeen eigen poort; nginx luistert ervoor op 127.0.0.1:9960 zolang de module aan staat, of op de volgende vrije poort als een ander programma 9960 bezet

De kern (nginx, bvsd, het paneel, cron-taken, toolchains) staat altijd aan. Git, CI, SVN en Bucket, en de Editor zijn modules die een admin aan- en uitzet. Op elk adres van de NAS antwoorden de modules onder hun paden: /git/, /svn/, /bucket/, /ide/. Het paneel staat op /, en deze handleiding op /guide/.

Zolang het pakket draait, staan zijn programma’s in /usr/bin/bucketvs/bin. Alles wat het pakket bewaart (accounts, instellingen, repository’s, omgevingen, logboeken) staat in één map op een datavolume: de datamap.

Het pakket installeren

Het pakket vereist QTS 6.0 of QuTS hero 6.0 of nieuwer, op een NAS met x86_64 of ARM 64-bit; er is één pakket per architectuur (bucketvs_<versie>_x86_64.qpkg, bucketvs_<versie>_arm_64.qpkg). Het is ondertekend met een codesigneercertificaat: installeer het vanuit App Center (een repository die het aanbiedt, of Handmatig installeren met het gedownloade bestand). App Center controleert de handtekening; apps zonder geldige handtekening hoeven niet toegestaan te worden.

De installatie maakt de servicegebruiker bucketvs aan (voor Forgejo en httpd), de koppeling /usr/bin/bucketvs naar de installatiemap, en start bvsd. De systeemlogboeken noemen de datamap.

Waar de datamap begint

Bij de eerste start is de datamap BucketVS op het volume waarop het pakket is geïnstalleerd, bijvoorbeeld /share/CACHEDEV1_DATA/BucketVS (QTS) of /share/ZFS2_DATA/BucketVS (QuTS hero). Later kan hij vanuit het paneel naar een ander volume worden verplaatst (De datamap verplaatsen).

Het pakket onthoudt zijn datamap in /etc/config/bucketvs-data-root, een bestand dat het pakket overleeft. Het verwijderen van het pakket laat de datamap en dit bestand staan, zodat een installatie na een verwijdering start op dezelfde data en dezelfde accounts. Een start hangt nooit af van een map die er niet is. Is de datamap weg (verwijderd, op een vervangen schijf, of op een volume dat op dat moment offline is), dan maakt de start BucketVS op het volume van het pakket, een nieuwe map tenzij er al een map met die naam staat, en in een nieuwe map stelt de eerste aanmelding het wachtwoord van de beheerder in. Dat geldt na een herinstallatie en voor een geïnstalleerd pakket, ook bij het opstarten. De systeemlogboeken bevatten daarover een waarschuwing, en .prev-bestanden bewaren het oude pad: /etc/config/bucketvs-data-root.prev en bij een geïnstalleerd pakket ook etc/data-root.prev in de installatiemap. Stond de oude map op een volume dat op dat moment alleen offline was, breng het volume dan online, stop het pakket, kopieer dat bestand over etc/data-root in de installatiemap (bijvoorbeeld /share/CACHEDEV1_DATA/.qpkg/bucketvs/etc/data-root) en start het pakket: het draait dan weer op de oude data.

Het paneel openen vanuit App Center

Openen bij het pakket in App Center opent het paneel op poort 9950 (HTTP) of 9951 (HTTPS). Als de poorten in het paneel worden gewijzigd (Poorten), geeft het pakket de nieuwe bij zijn volgende start door aan App Center.

Automatisch starten vanuit een SSH-sessie

Zolang de schakelaar van het pakket in App Center aan staat, start de NAS het pakket bij het opstarten. In een SSH-sessie op de NAS zet je als admin dezelfde schakelaar met het servicescript:

/etc/init.d/bucketvs.sh disable   # de volgende start wordt geweigerd, ook bij het opstarten
/etc/init.d/bucketvs.sh enable    # het pakket start weer bij het opstarten

Beide opdrachten schrijven alleen de schakelaar (Enable in /etc/config/qpkg.conf), tonen wat ze hebben ingesteld en schrijven dezelfde regel in de systeemlogboeken. Een draaiend pakket blijft na disable draaien, en enable start niets: dat doen stop en start, en start weigert zolang het pakket uit staat. status zegt of bvsd draait.

Eerste aanmelding

Open het paneel op https://<NAS-adres>:9951/ of http://<NAS-adres>:9950/. Het HTTPS-adres gebruikt eerst een zelfondertekend certificaat, dus de browser waarschuwt totdat het apparaat het vertrouwt; de sectie Het certificaat laat zien hoe je de vingerafdruk vergelijkt.

Een nieuwe installatie heeft geen account. Zolang de eerste beheerder geen wachtwoord heeft, opent het paneel op één scherm, ‘Het beheerderswachtwoord instellen’, voor het account administrator. Typ een wachtwoord twee keer: minstens 10 tekens en hoogstens 72 bytes. Opslaan maakt het account aan en meldt je aan.

Het pakket start zonder account; Het beheerderswachtwoord instellen 60 minuten, alleen lokaal netwerk; administrator aangemeld; Het pakket in App Center herstarten: een nieuw venster van 60 minuten

Vanuit een SSH-sessie op de NAS maakt /usr/bin/bucketvs/bin/bvs user password administrator het account aan als er nog geen is en toont een willekeurig wachtwoord; het paneel vraagt dan bij de eerste aanmelding om een eigen wachtwoord (Als een admin buitengesloten is).

Na de eerste aanmelding zegt het Overzicht dat alleen de kern draait. De tegel van elke module zegt wat de module biedt en heeft een knop die haar aanzet, zoals Git aanzetten: zet de modules aan die je nodig hebt (Modules).

Werken in het paneel

Het paneel werkt als een code-editor: elke pagina opent in een tabblad, en een opdrachtenpalet bereikt de pagina’s en acties via hun naam.

Accounts

Het paneel heeft eigen accounts. QTS-accounts melden zich er niet bij aan.

Rollen

RolWat hij mag
viewerleest het paneel; de pagina’s Back-ups, Opslag, Gebruikers en Logboeken zijn voor admins. In Forgejo maakt hij geen repository aan, forkt of importeert hij er geen, maakt hij geen organisatie aan en pusht hij nooit; leest de SVN-repository’s en buckets waarop hij rechten heeft en schrijft in geen ervan
memberleest wat een viewer leest, en schrijft: pusht naar de Git-repository’s waarvoor hij schrijftoegang krijgt, schrijft in de SVN-repository’s en buckets waarop hij lezen en schrijven heeft, en zet daar oudere versies van bestanden terug. In Forgejo maakt hij geen repository aan, forkt of importeert hij er geen en maakt hij geen organisatie aan, en hij kan niet pushen naar een repository waarvan een account onder developer eigenaar of beheerder is, en, zolang de CI-module aan staat, ook niet naar een repository waarvan de Actions aan staan. Hij krijgt geen editor, cron-taken of builds
developeropent daarnaast de editor, leest de bvs use-regels van geïnstalleerde toolchains, maakt eigen cron-taken aan, wijzigt en start ze, maakt en bouwt apps, publiceert pakketten in de repository (een admin zet ze in de lijst), controleert kernelmodules, en maakt Git-repository’s aan waarvan de workflows op de NAS draaien zolang de CI-module aan staat
adminalles: accounts, instellingen, opslag, netwerk, modules, toolchains, omgevingen, elke cron-taak, apps activeren, kernelmodules laden, pakketten in de repository in de lijst zetten

De rol developer heeft root-rechten op de NAS: cron-opdrachten draaien als root, net als de terminal van de editor en, zolang de CI-module aan staat, de workflows van de repository’s waarin hij mag pushen. Geef deze rol alleen aan mensen aan wie je ook het admin-wachtwoord van de NAS zou geven. Wie alleen in repository’s schrijft, heeft genoeg aan de rol member.

Onder Jouw account ziet ieder zijn eigen rol en wat die toestaat, met een link naar deze sectie. Een pagina boven iemands rol zegt welke rol ze vereist, en wat alleen een beheerder wijzigt, staat daar ook zo vermeld. Netwerk, Git en CI tonen hun instellingen aan alle anderen als waarden, met „Niet ingesteld” waar er een leeg is.

Workflows draaien als root op de NAS, dus houdt bvsd de Actions uit in elke Git-repository waarvan een member of viewer eigenaar is of waarin zo’n account kan schrijven: zo’n account schrijftoegang tot een repository geven zet de Actions ervan binnen een minuut uit, en de Git-pagina toont die repository’s aan admins. Om daar Actions te gebruiken, haal je eerst die schrijftoegang in Forgejo weg, of draag je een repository waarvan zo’n account eigenaar is over aan het account van een developer.

Accounts aanmaken en wijzigen

Een admin beheert de accounts op de pagina Gebruikers.

Wachtwoorden en sessies

Verkeerde wachtwoorden

Achter een proxy telt het adres dat de proxy doorgeeft, maar alleen als de proxy een vertrouwde proxy is. Anders telt elke client als het eigen adres van de proxy, en vijf verkeerde wachtwoorden van wie dan ook sluiten iedereen 15 minuten buiten.

Tweefactorauthenticatie

Elk account zet deze voor zichzelf aan onder Jouw account: scan de QR-code met een authenticator-app (of typ de sleutel in) en voer dan de code van 6 cijfers in die de app toont. Daarna vraagt de aanmelding na het wachtwoord om een code.

API-tokens

Scripts en CI gebruiken API-tokens in plaats van een wachtwoord. Onder Jouw account maakt ‘Nieuw token’ er een:

Als een admin buitengesloten is

De NAS-admin kan elk account resetten vanuit een SSH-sessie op de NAS. Het commando bvs praat met bvsd via een socket die alleen root kan openen (/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

Elk verzoek op die socket handelt als de ingebouwde admin cli en wordt geschreven naar log/audit.log in de datamap. Voor deze commando’s moet bvsd draaien.

De datamap

De datamap is de map die alles bevat wat het pakket bewaart. Het pad is de ene regel in /usr/bin/bucketvs/etc/data-root. De pagina Opslag toont hem, met het volume waarop hij staat en de vrije ruimte daar.

bvsd start alleen op een datamap die een map op een echt volume is. De start van het pakket controleert dat eerst: een ontbrekende map, of een map op tmpfs of ramfs, geeft een nieuwe datamap op het installatievolume, zoals Waar de datamap begint beschrijft. Een volume dat offline is, laat zijn koppelpunt achter als een lege map in het RAM van de NAS, en instellingen die daar worden geschreven zouden na de volgende herstart weg zijn. bvsd zelf weigert zo'n map alleen als het met de hand wordt gestart, en de reden gaat dan naar de QTS-systeemlogboeken.

Wat bvsd elk proces meegeeft

QTS houdt /tmp in een kleine RAM-schijf en /root op een RAM-schijf die een herstart leegmaakt. Daarom krijgt elk proces dat bvsd start (moduleprogramma’s, cron-taken, installaties) zijn tijdelijke bestanden en zijn thuismap in de datamap:

VariabeleWaarde
HOME<datamap>/home/<gebruiker>
TMPDIR<datamap>/tmp
XDG_CACHE_HOME, XDG_CONFIG_HOME.cache en .config in die thuismap
npm_config_cache.npm in die thuismap
PATH~/.local/bin, ~/.npm-global/bin, dan bin, sbin en node/bin van het pakket, dan de mappen van het systeem
SSL_CERT_FILE, GIT_SSL_CAINFO, CURL_CA_BUNDLEde CA-bundel van het pakket, /usr/bin/bucketvs/etc/ssl/cacert.pem
TZde tijdzone van de NAS, zoals ingesteld in QTS
SHELL, EDITORbash en nano van het pakket
LANG, LESSCHARSETC.UTF-8 en utf-8, zodat bestandsnamen met letters als é en ë verschijnen zoals ze zijn

De datamap verplaatsen

De pagina Opslag verplaatst de hele datamap naar een andere map onder /share. Kies een gedeelde map of een volume; de data gaan naar een nieuwe map met de naam BucketVS daarin. Om een map zelf te gebruiken, open je een lege map met de naam BucketVS. Gedeelde mappen maak je aan in QTS (Configuratiescherm, Gedeelde mappen); binnen een gedeelde map of een volume kan de pagina een nieuwe map aanmaken. De kiezer opent waar de data nu staat en zegt dat; open van daaruit de gedeelde map of het volume waar ze naartoe moet.

De pagina controleert het doel voordat de verplaatsing begint en somt elke reden op waarom ze er een weigert:

Het doel opnieuw controleren vrije ruimte: de data + 10 %; De modules stoppen het paneel blijft aan; Kopiëren met rsync -aHAX --numeric-ids; De kopie controleren bestanden, bytes, eigenaars, modi, tijden, sha256 van maximaal 1000 bestanden; De hoofdmap omschakelen in /usr/bin/bucketvs/etc/data-root; bvsd start opnieuw op de nieuwe map en start de modules; De oude kopie blijft, gemarkeerd MOVED-TO, totdat je hem verwijdert; De oude map blijft in gebruik, de modules starten weer

Terwijl de verplaatsing loopt:

Na het omschakelen stopt bvsd en start het zichzelf opnieuw op de nieuwe map, dus het paneel is een paar seconden weg.

Als de verplaatsing mislukt, blijft de oude datamap in gebruik en starten de modules weer. De fout van de taak zegt wat er misging en wat er van de kopie is geworden:

De oude kopie en achtergebleven kopieën

Na een geslaagde verplaatsing blijft de oude datamap waar hij was, met een bestand met de naam MOVED-TO erin. Niets gebruikt hem. ‘De oude kopie verwijderen’ op de pagina Opslag verwijdert hem, en ‘Deze kopie verwijderen’ verwijdert een achtergebleven kopie van een mislukte verplaatsing. Beide verwijderingen blijven op één bestandssysteem en volgen nooit een koppeling. Een map die een koppelpunt is of de eigen map van een gedeelde map, wordt geleegd en behouden.

Netwerk

De pagina Netwerk bevat de poorten, de modus voor gewoon HTTP, de hostnamen van de modules, de vertrouwde proxy’s, de openbare URL en het certificaat. Opslaan herstart wat de wijziging nodig heeft en toont dat.

Poorten

InstellingStandaardWat het is
HTTPS9951het paneel en de modules via TLS
HTTP9950het paneel en de modules via gewoon HTTP
Git via SSH9952Git via SSH
SSH-poort in kloon-URL’s0de poort die SSH-kloonadressen tonen; 0 betekent de SSH-poort hierboven. Stel hem in als een router een andere poort naar de NAS doorstuurt.
SSH-host in kloon-URL’sleegde naam of het adres dat SSH-kloonadressen tonen. Leeg betekent de Git-hostnaam, anders de host van de openbare URL, anders het LAN-adres van de NAS; voor een naam die via de Cloudflare Tunnel is gepubliceerd, het LAN-adres en de poort voor Git via SSH. Stel hem in op een naam die alleen in DNS staat of op het adres van de router als de router de SSH-poort doorstuurt.

Poorten liggen tussen 1024 en 65535 en verschillen van elkaar. De moduleporten op 127.0.0.1 (9960 en 9961) worden geweigerd, net als de poort die httpd of de server van de CI-runner gebruikt als een ander programma 9960 of 9961 heeft ingenomen (de foutmelding noemt hem). Als opslaan nginx op zijn oude poorten laat omdat het een nieuwe niet kon gebruiken, zegt een melding waarom. nginx luistert ook op IPv6 als de NAS dat heeft.

Gewoon HTTP

De aanmeldpagina waarschuwt als ze via gewoon HTTP binnenkwam: het wachtwoord gaat dan leesbaar over het netwerk.

Het certificaat

Bij de eerste start maakt bvsd een zelfondertekend certificaat (ECDSA P-256) voor:

Het is 825 dagen geldig, het maximum dat Apple-apparaten aannemen, ook voor een certificaat dat met de hand is vertrouwd. bvsd controleert het bij de start en eenmaal per dag, en maakt een nieuw als er 30 dagen of minder over zijn, als de verzameling namen verandert, of als de sleutel niet past. Een nieuw certificaat stuurt een melding. De pagina Netwerk toont de namen, de geldigheid en de SHA-256-vingerafdruk: vergelijk de vingerafdruk voordat een apparaat het vertrouwt.

‘Een eigen certificaat toevoegen’ neemt een certificaatketen en de bijbehorende privésleutel in PEM-vorm:

Het paar wordt opgeslagen in etc/tls/ in de datamap met modus 600. Als een geüpload certificaat verloopt of deze controles niet meer doorstaat, serveert nginx in plaats daarvan het zelfondertekende en zegt een melding waarom. Een geüpload certificaat met 30 dagen of minder stuurt ook een melding. ‘Nieuw zelfondertekend certificaat’ maakt een nieuw zelfondertekend paar en schakelt daar weer op over.

Clients die via een proxy komen, zien het certificaat van de proxy, niet dit.

Het certificaat downloaden op de pagina Netwerk bewaart het certificaat dat het paneel serveert, zonder sleutel, als <naam>.crt. Voeg het toe aan de vertrouwde certificaten van een apparaat, dan vertrouwen de browsers van dat apparaat het paneel; de extensieweergaven van de editor hebben dat nodig (Extensies). Een nieuw zelfondertekend certificaat moet je opnieuw vertrouwen.

Vertrouwde proxy’s

Een lijst van IP-adressen of CIDR-bereiken, zoals 192.168.1.5, het adres van de proxy vóór de NAS. Alleen voor een verzoek waarvan de TCP-verbinding van een daarvan komt, neemt nginx over:

Een verzoek van elk ander adres telt als rechtstreeks afkomstig van zijn client, en nginx vervangt de X-Forwarded-*-headers door eigen waarden. Een bereik maakt elke host erin vertrouwd: elk daarvan kan dan het clientadres en het schema instellen, dus vul het eigen adres van de proxy in. Een bereik van alle adressen (0.0.0.0/0, ::/0) wordt geweigerd.

Openbare URL

Alleen het adres, zoals https://git.example.com, zonder pad. De secties van de modules zeggen welke koppelingen ermee beginnen.

Achter een reverse proxy (Plesk)

De gebruikelijke opzet legt TLS op een proxy met een openbaar certificaat en laat die gewoon HTTP naar poort 9950 op het LAN praten. De voorbeelden hieronder gebruiken bvs.example.com als openbare naam, 192.168.1.20 voor de NAS en 192.168.1.5 voor de Plesk-server; vul je eigen waarden in.

Browser, git, WebDAV-client; nginx van Plesk bvs.example.com openbaar certificaat; nginx op de NAS 192.168.1.20; / paneel, /api/ bvsd; /git/, /svn/, /bucket/, /ide/; git via SSH

Op de NAS

  1. Voeg op de pagina Netwerk het adres van de Plesk-server (zoals de NAS het ziet) toe aan de vertrouwde proxy’s.
  2. Gewoon HTTP kan op ‘Serveren’ blijven. ‘Doorsturen naar HTTPS’ werkt ook zodra de Plesk-server een vertrouwde proxy is.

In Plesk

Zet deze directieven in de Apache- en nginx-instellingen van het domein, in het veld ‘Extra nginx-directieven’ (in de Engelse interface ‘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: de editor en zijn terminal
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;

    # grote pushes en uploads: geen groottelimiet, gestreamd, een uur stilte toegestaan
    client_max_body_size 0;
    proxy_request_buffering off;
    proxy_buffering off;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
}

location ~ ^/ is een location met een reguliere expressie. nginx verkiest een passende reguliere expressie boven een gewone location / (Plesk schrijft er zelf een), dus dit blok bedient elk pad van de site, en proxy_pass zonder pad geeft het pad van het verzoek ongewijzigd door. Zet op dezelfde instellingenpagina ‘Statische bestanden rechtstreeks via nginx serveren’ uit: als dat aan staat, beantwoordt Plesk verzoeken om .js-, .css- en afbeeldingsbestanden uit de eigen map van het domein, en laadt het paneel niet.

Zet in de hostinginstellingen van het domein de permanente, SEO-veilige 301-omleiding van HTTP naar HTTPS aan (in de Engelse interface ‘Permanent SEO-safe 301 redirect from HTTP to HTTPS’). De extra nginx-directieven gelden ook voor de site van het domein op gewoon HTTP op poort 80; zonder de omleiding antwoordt de site ook daar, en gaan wachtwoorden onversleuteld over het internet.

Waarom elke regel telt:

DirectiefWat er zonder niet werkt
Host $http_hostnginx op de NAS kiest het serverblok op basis van Host, dus een module-hostnaam past nooit. bvsd vergelijkt de Origin van de pagina met Host, inclusief poort, dus elke wijziging in het paneel mislukt met 403 csrf; $host zou een andere openbare poort dan 443 weglaten en op dezelfde manier mislukken.
X-Forwarded-Forelke client telt als de Plesk-server: vijf verkeerde wachtwoorden van één persoon sluiten iedereen 15 minuten buiten
X-Forwarded-Proto $schemehet sessiecookie wordt niet als Secure gemarkeerd, en in de modus ‘Doorsturen naar HTTPS’ wordt elk verzoek naar poort 9951 van de openbare naam gestuurd
Upgrade, Connectionde pagina van de editor opent, maar de editor en zijn terminal maken nooit verbinding
client_max_body_size 0, proxy_request_buffering off, de time-outsvoor grote pushes en uploads gelden de eigen groottelimiet en time-outs van de proxy

X-Forwarded-For en X-Forwarded-Proto tellen alleen als de Plesk-server bij de vertrouwde proxy’s staat. Als dat niet zo is, negeert nginx op de NAS ze.

Git via SSH

Een HTTP-proxy vervoert geen SSH. Git via SSH gaat rechtstreeks naar poort 9952 van de NAS, of via een TCP-poortdoorsturing op de router. ‘SSH-poort in kloon-URL’s’ op de pagina Netwerk stelt de poort in die de kloonadressen tonen, en ‘SSH-host in kloon-URL’s’ de naam of het adres, als de openbare naam alleen de proxy bereikt.

De opzet controleren

Hostnamen voor de modules

Een module kan een eigen hostnaam hebben (pagina Netwerk, Hostnamen). nginx serveert die module dan alleen, in de root van de naam. De naam moet naar de NAS wijzen, of naar de proxy ervoor. Op een proxy heeft elke hostnaam een eigen site nodig, met dezelfde directieven als hierboven.

ModuleIn de root van zijn hostnaamDaar ook
GitForgejo/git/ op elke andere naam antwoordt met 302 naar de Git-hostnaam, met hetzelfde pad, dezelfde query en dezelfde poort
Editorcode-serverde aanmeldpagina van het paneel en /api/, zodat een gebruiker zich op die naam kan aanmelden
SVN en Buckethttpdrepository’s blijven op /svn/<naam> en buckets op /bucket/<naam>

Een module die uit staat, antwoordt met 503 en een zin die dat zegt, op zijn paden en op zijn hostnaam.

Eén aanmelding voor alle hostnamen

Het sessiecookie hoort bij de naam waarop het werd gezet, tenzij de instelling network.cookie_domain een bovenliggend domein van alle module-hostnamen noemt. Met example.com bereikt een aanmelding op bvs.example.com ook git.example.com en ide.example.com. bvsd weigert een openbaar achtervoegsel (com, com.pl, co.uk, myqnapcloud.com), een domein dat niet boven alle module-hostnamen ligt, en elk domein zolang er geen module-hostnaam is ingesteld. Elke site onder dat domein krijgt het cookie, dus stel het nauwste gemeenschappelijke bovenliggende domein in.

De pagina Netwerk toont deze instelling niet. De NAS-admin stelt haar in via de CLI-socket met de curl van het pakket:

/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

Een lege waarde ("") houdt het cookie weer op elke naam apart.

Publiceren op internet (Cloudflare Tunnel)

De pagina Publiceren (Beheer, alleen admins) zet het pakket op internet onder namen van een domein waarvan de DNS bij Cloudflare staat. cloudflared, dat het pakket meelevert, maakt vanaf de NAS verbinding met Cloudflare: er wordt geen routerpoort geopend, en Cloudflare beheert de certificaten van de namen. Elk verzoek gaat door de nginx van het pakket: het paneel en de API vragen om aanmelding, en zonder account opent alleen wat u openbaar hebt gemaakt (openbare repository’s, hun webweergave, de pakketrepository).

Er zijn twee typen namen, van elk type hoogstens één:

TypeVoorbeeldWat hij serveert
Hoofdhostnaamcode.example.comhet paneel en de API, Forgejo op /git/, de webweergave op /svn-web/ en /bucket-web/, de pakketrepository op /repo/ (alleen lezen) en de handleiding. /svn/ en /bucket/ antwoorden daar met 404, en /ide/ ook zolang u de editor niet publiceert (hieronder)
Hostnaam voor pakkettenqpkg.example.comalleen GET en HEAD van /repo/, voor App Center op andere NAS-apparaten; al het andere antwoordt met 404

Wat het token nodig heeft

Maak op dash.cloudflare.com (My Profile, API Tokens) een API-token met deze rechten, voor de zone van de namen:

Het pakket bewaart het token op de NAS in een bestand dat alleen root leest, en toont het nooit meer.

Als het token Client IP Address Filtering heeft, zet er dan beide openbare adressen van de NAS in, IPv4 en IPv6: de NAS maakt via IPv6 verbinding met Cloudflare zodra hij een IPv6-adres heeft. Anders weigert de pagina Publiceren met token_ip_filter en noemt het adres dat Cloudflare zag.

Publiceren

Typ de namen en het token, en dan Publiceren. Het pakket controleert eerst alles bij Cloudflare en verandert daar niets als een controle mislukt; de melding zegt wat je moet oplossen:

Daarna maakt het de tunnel (met de naam bucketvs-<NAS-naam> tenzij je een naam opgeeft; een tunnel met die naam die Cloudflare nog heeft, wordt overgenomen), laat elke naam er met een geproxied CNAME-record naar wijzen, voegt de cacheregels toe en start cloudflared. Opnieuw publiceren met dezelfde waarden verandert niets. Stel de openbare URL (Netwerk) in op het https://-adres van de hoofdhostnaam, zodat de koppelingen en HTTPS-kloonadressen van Forgejo die noemen; de pagina herinnert je eraan zolang ze verschillen.

Git via SSH gaat niet door de tunnel: Cloudflare vervoert naar een gepubliceerde naam alleen HTTP. Het SSH-kloonadres is daarom het LAN-adres van de NAS met zijn poort voor Git via SSH (9952), in het paneel en in het eigen kloonvak van Forgejo, en de pagina Git en het Overzicht zeggen ‘Klonen via SSH werkt op het lokale netwerk; vanaf internet kloon je via HTTPS.’ Voor SSH vanaf internet stuur je de SSH-poort door op de router en stel je SSH-host in kloon-URL’s (Netwerk) in op het openbare adres van de router of op een naam die alleen in DNS staat en ernaar wijst, met SSH-poort in kloon-URL’s als de router een andere poort gebruikt.

De hoofdhostnaam antwoordt op /ide/ met 404 tot een beheerder De editor publiceren op de hoofdhostnaam op de pagina Publiceren aanzet. De terminal van de editor is een root-shell op de NAS, en wie zich daar vanaf internet als developer of beheerder aanmeldt, krijgt hem; zet dus eerst tweefactorauthenticatie aan voor die accounts. Met de schakelaar aan gaat de editor door dezelfde aanmelding als op het LAN, blijft zijn poortproxy (/ide/proxy/<port>/) daar uit en houdt Cloudflare zijn pagina’s nooit in de cache. Zolang hij aan staat, toont het Overzicht Editor op internet.

Zolang de CI-module aan staat, draait een workflow die naar een willekeurige repository van deze Forgejo wordt gepusht als root op de NAS via de eigen runner van de NAS, of hij nu vanaf internet of vanaf het LAN is gepusht: dezelfde macht als de terminal van de editor. De pagina Publiceren zegt dat onder Wat internet bereikt. Geef pushtoegang alleen aan mensen aan wie u het beheerderswachtwoord van de NAS zou geven.

De cache

Met Cache-voorinstellingen aan bewaart Cloudflare pakketten (*.qpkg) een jaar, pictogrammen een dag, repo.xml 5 minuten en de bestanden van het paneel een jaar; de API, de pagina’s van Forgejo, de aanmeldpagina’s en de webweergave bewaart het nooit. Een publicatie in de pakketrepository haalt repo.xml (en een gewijzigd pictogram of de bestanden van een verwijderde versie) meteen uit de cache van Cloudflare. Het pakket voegt zijn eigen regels toe aan het einde van de cacheregels van de zone en wijzigt de andere nooit.

Aanmelden vanaf internet

Het eerste wachtwoord kan nooit via een gepubliceerde naam worden ingesteld: de eerste configuratie neemt alleen een lokale client aan. Verkeerde wachtwoorden tellen per internetclient, zoals op het LAN. Een wachtwoord dat met git naar Forgejo wordt gestuurd, telt ook; een Forgejo-toegangstoken werkt zoals altijd. Cloudflare neemt verzoeken tot 100 MB aan, dus een grotere push of upload gaat via het LAN-adres.

Stoppen en verwijderen

Stoppen beëindigt cloudflared; de namen tonen dan de eigen foutpagina van Cloudflare, en bij Cloudflare verandert niets. Van Cloudflare verwijderen verwijdert de DNS-records, de cacheregels en de tunnel die het pakket heeft gemaakt (een overgenomen tunnel blijft) en vergeet het token. Zolang er namen zijn gepubliceerd, toont het Overzicht een label Internet met de toestand van de tunnel.

Modules

Het Overzicht toont elke module met haar processen, geheugen en CPU, en zet haar aan en uit (alleen admins). Een module die uit staat zegt wat ze biedt; een admin zet haar aan met haar knop (Git aanzetten, Editor aanzetten enzovoort) op haar tegel, op haar eigen pagina of, voor de Editor, in het tabblad Editor.

StatusBetekenis
actiefelk proces van de module draait
starteen proces is minder dan een seconde geleden gestart
verminderdeen proces wacht op een herstart, de bestanden van de module konden niet worden geschreven, of de gezondheidscontrole mislukt
herstart steeds opnieuween proces is binnen 10 minuten 5 keer gestopt; bvsd start het elke 15 minuten opnieuw, en er ging één melding uit
gestoptde processen van de module draaien niet (een verplaatsing van de data heeft ze gestopt, of ze konden niet starten)
uitde module staat uit

Een proces dat stopt, wordt na 1 seconde opnieuw gestart, dan na 2, 4 enzovoort tot 60 seconden. Na 10 minuten draaien begint de wachttijd weer bij 1 seconde. Een proces dat steeds opnieuw herstart, start meteen weer als zijn module uit- en weer aangezet wordt.

Git

De Git-module draait Forgejo, een webinterface voor git-repository’s met issues, pull requests, releases, wiki’s, LFS, mirrors en webhooks. Een admin zet haar aan met Git aanzetten in het Overzicht of op de Git-pagina. De taak bereidt de mappen en de database van Forgejo voor in <data>/forgejo, voegt elk account van het paneel aan Forgejo toe, en start het. Forgejo opent dan op /git/ op het adres van het paneel, of op / van de Git-hostnaam als die is ingesteld (zie Hostnamen voor de modules).

Nieuwe repository op de Git-pagina, en zolang er nog geen is ook op de Git-tegel van het Overzicht, opent het formulier van Forgejo voor een repository. Het paneel biedt hem, en Een repository migreren of spiegelen, vanaf de rol developer aan: Forgejo laat een viewer of een member geen repository aanmaken.

Repository’s en accounts

Klonen via HTTPS en SSH

Op de pagina Git schrijft Een repository klonen beide commando’s voor een eigenaar en een repository:

ManierAdresAanmelding
HTTPS (of HTTP)https://<NAS-adres>:9951/git/<eigenaar>/<repo>.gitgebruikersnaam en wachtwoord van het paneel, of een toegangstoken
SSHssh://git@<NAS-adres>:9952/<eigenaar>/<repo>.giteen SSH-sleutel die in Forgejo is toegevoegd onder Instellingen, SSH- / GPG-sleutels

Repository’s tonen aan mensen zonder account

Openbaar bladeren op de pagina Git laat iedereen die Forgejo bereikt, de openbare repository’s zonder account lezen. In Forgejo is elke repository openbaar of privé (de Instellingen ervan, Zichtbaarheid). Met de schakelaar aan kan een bezoeker zonder account:

Een privérepository blijft verborgen: het adres antwoordt ‘niet gevonden’. Zolang de schakelaar aan staat, toont Forgejo ook geen accounts (het tabblad Gebruikers van Verkennen en het zoeken naar gebruikers staan uit, ook voor aangemelde gebruikers), zodat een bezoeker de accountnamen niet kan verzamelen. Pushen, issues, pull requests en instellingen vereisen nog steeds een account. Met de schakelaar uit vraagt elke pagina de bezoeker eerst om aan te melden.

Om een repository te delen, maak je hem openbaar in Forgejo, zet je Openbaar bladeren aan en stuur je het adres. Op een Git-hostnaam is het adres https://<Git-hostnaam>/<eigenaar>/<repo>.

Nieuw project

Nieuw project is een pagina die een project stap voor stap van niets naar een gebouwde en gepubliceerde eerste versie brengt. Ze opent in een eigen tabblad vanuit het opdrachtenpalet (Ctrl+Shift+P, Nieuw project), boven in de zijbalk van de Editor, in de kop van de Git-zijbalk, op de Git-pagina en op de pagina Projecten; een voorbeeld onder Editor-projecten op de pagina Voorbeelden heeft Nieuw project hieruit. Ze vraagt de rol developer, de modules Git en Editor en je account in Forgejo (de Git-pagina toont de synchronisatie). Zolang Git of de Editor uitstaat, zegt de pagina dat boven de stappen, en een beheerder zet ze daar met één knop aan.

  1. Sjabloon. De sjablonen zijn gegroepeerd: Programma’s (C, C++ met CMake, Go, Rust, Node, Python, Java), Pakketten voor QTS (een QPKG-pakket, een App Builder-app, een pakket uit broncode), Kernel (een kernelmodule, het USB-serieel-stuurprogramma ch341), Websites (een statische website: pagina’s in src/, een Makefile die public/ bouwt, een linkcontrole als make test) en Voorbeelden. Elke kaart zegt wat een build maakt en markeert wat deze NAS nog mist (QDK, een bouwomgeving, een module die uit staat), met een link naar de pagina die het toevoegt.
  2. Naam en zichtbaarheid. De naam is die van de repository en de map projects/<naam>; de pagina controleert hem terwijl je typt. Dan de eigenaar (je account, of een organisatie waarin Forgejo je repository’s laat maken), privé of openbaar, en een beschrijving als je wilt. Voor een App Builder-app de voorinstelling waarmee ze begint en het doel.
  3. Dienst, voor een QPKG-pakket en een pakket uit broncode: hoe het pakket start en stopt, opgebouwd uit blokken. Kies een voorinstelling (Opdrachtregelprogramma koppelt het programma in /usr/bin; Achtergronddienst voegt een account toe, een datamap op het volume, het programma gestart als dat account, wachten op zijn poort en een stop met een time-out; Webapp voegt de knop Openen van App Center toe; Leeg heeft alleen de werkwoorden) en wijzig dan de blokken. De kaart van elk blok toont al tijdens het typen de regels die het in het script schrijft, en een geweigerde waarde staat gemarkeerd onder zijn veld. Een start zet Enable van App Center nooit aan, en een stop raakt het nooit aan. De projectweergave wijzigt de blokken later.
  4. Bouwen. De omgeving waarin het project bouwt, voor het project bewaard (de projectweergave wijzigt die later), of geen, en dan kiest bvsd er bij elke build een. De stap biedt eerst de omgeving die bvsd zelf zou kiezen en waarin bvs qbuild en CI bouwen: de Ubuntu 24.04 builder, anders de Debian 12 builder, anders een andere Debian- of Ubuntu-omgeving. Geeft de Makefile van de sjabloon elke app haar omgeving op een ENV-regel, dan zegt de stap dat en vraagt hij er geen, en bewaart het project er geen. Voor een pakket uit broncode zegt de stap ook dat het bronadres en de sha256 van het startrecept tijdelijk zijn: de eerste build mislukt tot het recept de echte bron van je programma en de sha256 van dat bestand noemt. De pagina toont de workflow die CI bij elke push draait. Direct na het aanmaken bouwen staat aan tot je het uitzet; bij een pakket uit broncode staat het eerst uit, en je kunt het aanzetten. Zonder Debian- of Ubuntu-omgeving voor de NAS zegt de stap dat: een beheerder maakt daar de bouwomgeving aan met Deze omgeving aanmaken, en daarna biedt de stap die aan; zet anders Direct na het aanmaken bouwen uit en bouw het project later.
  5. Publiceren, voor een QPKG-pakket, een App Builder-app of een website: Testuitrol op deze NAS (admin, alleen ondertekende pakketten; voor een app Activeren op deze NAS), Publiceren in de App Center-repository van deze NAS en Publiceren op mijn webserver (admin) op een van de webdoelen; Een doel toevoegen bewaart er een nieuw. Elk is optioneel. De keuze om te publiceren wordt ook de schakelaar Publiceren in de App Center-repository van het project (projectweergave, Instellingen): zolang die aan staat, publiceert de CI van het project daar bij elke run.
  6. Controle toont elk antwoord en de stappen die zullen draaien. Project aanmaken verstuurt ze.
  7. Voortgang volgt de taak van elke stap: de repository en de eerste commit, de eerste build, dan de testuitrol, de publicatie in App Center en die op het web, de een na de ander. Een rij toont haar status en het einde van haar logboek; een klik toont het logboek. Een mislukte stap zegt waarom en biedt Opnieuw proberen, en de stappen erna wachten. Aan het eind Project openen, Openen in de editor en Openen in Forgejo. De pagina herladen of terugkeren naar haar tabblad leest de taken opnieuw en verstuurt geen stap twee keer. Wie de pagina verlaat, stopt de keten; de projectweergave heeft dezelfde stappen.

Als bvsd het project weigert (een naam die een map, een app of een repository al heeft, een eigenaar waarin je niets mag maken), gaat de pagina terug naar de stap met dat antwoord, toont de reden onder het veld en houdt alle andere antwoorden. Een module die uit staat (een admin zet haar aan vanaf de pagina), geen Forgejo-account en geen Debian- of Ubuntu-omgeving voor een App Builder-app worden uitgelegd in Controle.

Wat de eerste taak doet:

De workflow draait bij elke push op de runner van de NAS zodra de CI-module aan staat, in de omgeving die de workflow noemt. De QPKG-workflow publiceert het pakket in de pakketrepository, die alleen code-ondertekende pakketten aanneemt. Als de eerste commit of de push mislukt nadat de repository is gemaakt, verwijdert de taak de map, verwijdert de repository weer en zegt waarom. Zolang de schakelaar Publiceren in de App Center-repository van het project uit staat, toont bvs repo publish in de workflow een melding in plaats van te publiceren, en de run gaat door.

De projectweergave

Elke map van projects/ in de datamap heeft een eigen pagina: een project uit de wizard, de kopie van een voorbeeld uit Editor-projecten of een repository die je daar gekloond hebt. Ze opent vanuit de tak Projecten van de zijbalk van de Editor, vanaf de pagina Projecten, met Project openen aan het eind van Nieuw project en vanuit het opdrachtenpalet (Project … openen, of Ctrl+P en de naam). Ze vraagt de rol developer. Het menu van een project op de pagina Projecten heeft ook Bouwen, Opnieuw bouwen, Publiceren en de publicatie op de webdoelen. Hetzelfde menu zet publiceren door CI in App Center aan of uit.

De pagina leest de map en wijzigt er uit zichzelf niets in. Het type van het project volgt uit de bestanden: een App Builder-app met de naam van de map, een qpkg.cfg bovenaan (een QPKG-pakket), een Makefile bovenaan, of niets daarvan, wanneer de CI-workflow van het project het bouwt. Heeft een App Builder-app de naam van de map, dan houdt een project met een qpkg.cfg bovenaan, of met een Makefile en een qpkg.cfg in qpkg/, zijn eigen build, en nemen Testuitrol en Publiceren nog steeds zijn QPKG.

De strook bovenaan bevat de stappen. Een stap die niet kan draaien houdt haar knop, uitgeschakeld, en zegt ernaast en onder de strook waarom. Een stap die het project helemaal niet kan nemen, verdwijnt uit de strook, en één zin eronder zegt wat het project maakt en waar het resultaat van de build heen gaat: de map van het project bij een programma, de pagina Kernels bij een kernelmodule, de pagina van elke app bij een Makefile die alleen App Builder-apps bouwt.

Een Makefile-project kiest een doel naast Bouwen (het standaarddoel van make, het eerste, tenzij je een ander kiest); een CMake-project bouwt, of bouwt en draait zijn tests. Een kernelmoduleproject bouwt in de werkruimte van de kernelwerkplaats voor de draaiende kernel, en die build is aan een admin. Een lopende stap heeft Annuleren, en de taak stopt meestal meteen. De workflow uitvoeren draait de CI-workflow van het project met de hand als de workflow een workflow_dispatch-trigger heeft; anders staat de knop uit en zegt de pagina waarom. De workflow van elk sjabloon heeft die trigger. Geïnstalleerd op deze NAS toont de pakketten die de testuitrollen van het project hebben geïnstalleerd, met Verwijderen van deze NAS voor een admin. Project verwijderen, in het menu naast de knoppen van de kop of in het menu van het project op de pagina Projecten, is voor een admin of voor de developer wiens Forgejo-account de repository bevat. Je typt eerst de naam van het project; de map verdwijnt, en de Forgejo-repository, een App Builder-app met die naam en geïnstalleerde pakketten blijven. De pagina linkt daarna naar de repository.

Instellingen bevat wat bvsd buiten de map voor het project bewaart. Voor een Makefile-, CMake- of QPKG-project toont het de omgeving waarin Bouwen en Opnieuw bouwen draaien, en wijzigt die. Voor een Makefile die alleen App Builder-apps maakt en bouwt, noemt het elke app met de omgeving die haar regel in de Makefile noemt. Een project dat een pakket maakt, of waarvan de workflow bvs repo publish uitvoert, heeft daar de schakelaar Publiceren in de App Center-repository: staat die aan, dan voegt bvs repo publish in de CI van het project zijn pakketten toe aan de repository; staat die uit, dan slaat de CI-run die stap over met een melding. Een project zonder bewaarde keuze (de kopie van een voorbeeld, een kloon) heeft hem aan. Git toont de branch, hoever die voor of achter de remote ligt zoals de laatste fetch het liet (de pagina fetcht nooit), de laatste commit en de gewijzigde paden. Bestanden toont één map tegelijk; kies een bestand om het te lezen, een .qpkg wordt gedownload. Bewerken gebeurt in de editor, en de map .git blijft buiten beeld.

Recepten toont voor een project met een eigen map recipes/ de recepten die zijn apps nemen: elk met zijn versie, de versie uit de bibliotheek die het vervangt als het de naam van een bibliotheekrecept heeft, en daaronder wat de receptcontrole vond, met bestand en regel. Een recept dat bvsd weglaat, heeft een rij met de reden; zijn er meer dan drie op dezelfde manier weggelaten, dan telt één rij de rest. Wat de controle over de map recipes als geheel vond, heeft een eigen rij. Een klik opent de map van het recept in de editor; het menu kopieert ook de opdracht die dezelfde controle in een terminal van de NAS draait: bvs recipe lint met de map van het project. De kaart verschijnt ook als recipes van het project een link, een bestand, een map die bvsd niet kan lezen of een map met alleen links is, en zegt waarom er geen recept uit wordt gelezen.

Dienst en pakket (een QPKG-pakket, of een Makefile-project met zijn pakket in qpkg/, zoals een pakket uit broncode) bevat het start- en stopscript van het pakket als blokken, de velden van zijn qpkg.cfg (Pakket) en de bestanden die daaruit worden geschreven (Script). Opslaan toont de verschillen van elk bestand en commit ze dan in de repository van het project; is het project intussen gewijzigd, plan dan opnieuw. Met de hand bewerken zet de blokken uit, zodat je het script in de editor bewerkt; Blokken weer koppelen toont wat opnieuw schrijven zou vervangen. Bibliotheek bijwerken brengt de bvs-qpkg.sh van deze Bucket & Code Server IDE in het pakket, met de verschillen. Een project van vóór de blokken biedt Blokken gebruiken voor dit script.

Versies toont waarnaar het project kan overschakelen, en Naar deze versie overschakelen doet het:

VersieWat overschakelen doet
Een .qpkg in build/, of een export van de App Buildereen testuitrol van dat bestand (admin)
De build van de App Builderactiveert die (admin); de App Builder bewaart één build
Een versie in de pakketrepositorymaakt die de vermelde versie (admin)
Een git-tagcheckt de tag uit in de map

Een klik kiest een versie; haar menu doet ook een testuitrol, publiceert, publiceert op een webdoel of downloadt een .qpkg. Een tag wordt uitgecheckt als losse HEAD, en Terug naar main in de Git-kaart keert terug naar de branch. Overschakelen wordt geweigerd zolang de map niet-gecommitte wijzigingen heeft; de melding noemt ze, en je commit of stasht ze eerst in de editor. Vink twee versies aan en De twee vergelijken toont de bestanden die de ene heeft en de andere mist, en de gewijzigde bestanden. Twee tags, of twee pakketten, worden op inhoud vergeleken; een pakket met een commit alleen op grootte. Op de pagina Pakketten installeert een admin ook een versie uit de repository op deze NAS (Installeren op deze NAS), met de controles van de testuitrol.

Je eigen webserver (webdoelen)

Een webdoel is waar een admin een pakket of een website op de eigen webserver publiceert: een map van deze NAS (de Web-share van QTS, die de Web Server van QTS serveert, of een andere gedeelde map) of een rclone-remote (SFTP, FTP, WebDAV, S3, ingesteld in de rclone.conf van de back-ups), met het openbare adres dat het serveert. Ze staan op de pagina Publiceren, onder Webdoelen: Een doel toevoegen, Wijzigen, Verwijderen en Testen, dat er een klein bestand naartoe kopieert, het via het openbare adres ophaalt en weer verwijdert.

Een mapdoel is een eigen map in een share (/share/Web/mijnsite, nooit een hele share of een volume), buiten de datamap, omdat een websitepublicatie van het doel verwijdert wat de site niet meer bevat. Het adres begint met http:// of https:// en bevat geen gebruiker of wachtwoord.

Elke publicatie leest het bestand terug via het openbare adres: de .qpkg van een pakket met de .sha256, op sha256 vergeleken, of de index.html van een website, byte voor byte vergeleken. Als het adres niet serveert wat er is gekopieerd, mislukt de taak met web_check: en beide waarden.

CI-runners

De CI-module draait Forgejo Actions: een workflowbestand in .forgejo/workflows/ van een repository draait op een runner als er iets wordt gepusht. Ze heeft de Git-module nodig. Een admin zet haar aan onder Modules, CI, Inschakelen. De taak registreert de eigen runner van de NAS bij Forgejo, herstart Forgejo met Actions aan, en start de runner; ze eindigt als de runner Forgejo heeft bereikt.

De runner op de NAS

Externe runners

Een buildmachine elders (een server, een VM) kan ook taken van deze Forgejo oppakken. Op de pagina CI, onder Een externe runner registreren, geeft een admin haar een naam en krijgt de commando’s voor Linux x86_64 en aarch64. Die downloaden forgejo-runner 13.2.0 van code.forgejo.org, controleren de sha256, bewaren het token van de runner in runner-token (alleen leesbaar voor de eigenaar) en starten de runner met het label linux-amd64 (of linux-arm64). De runner verschijnt meteen in de lijst, offline totdat de commando’s draaien. Het token wordt alleen dan getoond. Zo’n runner voert zijn taken uit op zijn eigen machine, als de gebruiker die hem startte, en bereikt Forgejo op het openbare adres.

SVN en Bucket

De module SVN en Bucket serveert Subversion-repository’s op /svn/<naam> en buckets op /bucket/<naam>. Een bucket is een netwerkstation (WebDAV) waarin elk opgeslagen bestand een revisie wordt, zodat elke eerdere versie van een bestand gelezen of teruggezet kan worden. Een admin zet de module aan onder Modules; de pagina SVN & Bucket maakt dan beide typen aan, toont ze en verwijdert ze.

SVN-repository’s

svn checkout "https://<NAS-adres>:9951/svn/<naam>"
svn commit -m "…"

De pagina toont het checkout-commando met het adres van de repository. Achter een proxy volgt het adres de openbare URL, en met een SVN-hostnaam is het /svn/<naam> op die naam. De Geschiedenis van een repository toont de revisies; een bestand kan in elke revisie worden gelezen, met een andere worden vergeleken, en als nieuwe revisie worden teruggezet (Deze versie herstellen, voor accounts met lezen en schrijven).

Buckets

WebDAV-clients en hun grenzen

ClientHoe verbindenOpmerkingen
Finder van macOSGa, Verbind met server, https://<NAS-adres>:9951/bucket/<naam>de Finder vergrendelt een bestand terwijl hij het schrijft; de bucket beantwoordt WebDAV-vergrendelingen
rcloneeen webdav-remote met vendor = other en het adres van de bucketgeschikt voor kopieën via scripts
davfs2 (Linux)mount -t davfs https://<NAS-adres>:9951/bucket/<naam> /mnt/<map>de gebruikersnaam van het paneel en het wachtwoord of app-wachtwoord
Cyberduck, WinSCPeen WebDAV-verbinding (HTTPS) met poort 9951, pad /bucket/<naam>
curlcurl -T bestand -u <gebruiker> https://<NAS-adres>:9951/bucket/<naam>/bestandéén upload, één revisie (of twee, zie hierboven)
Windows VerkennerNetwerkverbinding makende WebClient van Windows stuurt een wachtwoord alleen via HTTPS met een certificaat dat Windows vertrouwt: zet de bucket achter een proxy met een echt certificaat (Achter een reverse proxy); het zelfondertekende certificaat is niet genoeg

Een repository of bucket tonen aan mensen zonder account

Een admin kan een SVN-repository of een bucket openbaar maken met de schakelaar in de rij op de pagina SVN & Bucket (Op het web). Iedereen die het adres heeft, kan hem dan zonder account in een browser lezen:

AdresWat het toont
https://<NAS-adres>:9951/svn-web/<naam>/een SVN-repository
https://<NAS-adres>:9951/bucket-web/<naam>/een bucket

De koppeling Bekijken op het web van de rij opent die pagina. Ze toont de bestanden en mappen in de nieuwste revisie of een oudere, toont een tekstbestand met regelnummers (tot 1 MiB) of een afbeelding, en biedt elk bestand als download aan. De Geschiedenis toont de revisies met hun auteurs, berichten en gewijzigde bestanden. De pagina van een revisie toont de diff van elk bestand dat ze wijzigde (tot 20 bestanden van hoogstens 1 MiB; de andere zijn koppelingen); elk bestand kan tussen twee revisies worden vergeleken.

Editor en AI-tools

De Editor-module draait VS Code in de browser (code-server) voor elk account met de rol developer of admin. Een admin zet haar aan onder Modules. Elk account krijgt een eigen instantie, die start als het account de editor opent en stopt na een tijd zonder verkeer.

De terminal van de editor is een root-shell op de NAS. Op QTS draaien de processen van het pakket als admin (uid 0), behalve Forgejo en httpd. Geef de rol developer alleen aan mensen aan wie je ook het admin-wachtwoord van de NAS zou geven.

De editor openen

De editor antwoordt alleen zijn eigen pagina's. Een WebSocket, een formulier of het verzoek van een script dat een andere pagina met de sessie van het account stuurt, vanaf een andere site of vanaf een andere poort van de NAS, krijgt 403 en start geen instantie; zo bereikt een andere pagina ook geen ontwikkelserver achter de weergave Ports.

Extensies

Claude Code, Gemini CLI en Codex CLI

Onder AI-opdrachtregeltools op de pagina Editor-instellingen installeert, bijwerkt en verwijdert elk account deze tools voor zichzelf:

ToolGeïnstalleerd metCommando
Claude Codehet installatieprogramma van Anthropic (claude.ai/install.sh), npm als dat misluktclaude
Gemini CLInpm install -g @google/gemini-cligemini
Codex CLInpm install -g @openai/codexcodex

Programmeren met een AI-assistent

Elk project dat Nieuw project maakt, bevat een skill voor AI-assistenten: .claude/skills/qnap-dev/ en een AGENTS.md die ernaar verwijst. De skill, in het Engels, bevat richtlijnen voor alles rond een QNAP-NAS: wat het in de shell is (een root op een RAM-schijf, BusyBox, geen systemd, geen pakketbeheerder, getcfg en setcfg), opslag en paden, hoe je met dit pakket bouwt, ondertekent en publiceert (bvs env run, bvs ldd, bvs qbuild, de App Builder, de kernelwerkplaats, de pakketrepository), poorten, back-ups en wat hij niet mag voorstellen, zoals apt op de NAS of niet-ondertekende apps toestaan in App Center. Hij zegt duidelijk dat ondertekenen met een hardwaretoken niet wordt ondersteund en niet is getest.

Toolchains en omgevingen

De pagina Toolchains downloadt wat nodig is om software op de NAS te bouwen:

TypeWat het isVoorbeelden
Root-bestandssysteemeen Linux-systeem om in een omgeving uit te pakkenDebian 12 en 13, Ubuntu 22.04 en 24.04, Alpine 3.22
Cross-toolchaineen compiler die voor een andere processor bouwtBootlin-toolchains voor aarch64, x86-64 en armv7, met glibc of musl
Runtimeeen taal of een buildtoolPython, Go, Node.js, Zig, Rust, CMake, Ninja, Java (JDK)
QNAPde eigen tools van QNAPQDK 2.5.0, voor bvs qbuild en Exporteren als QPKG
Kernelbroncodeeen Linux-kernelboom voor de kernelwerkplaatsLinux 6.6.129 van kernel.org; de GPL-kernelrelease van QNAP voor QTS 5.2.3

Items voor een andere processor zijn verborgen; ‘Items voor andere processors tonen’ toont ze, maar ze kunnen niet worden geïnstalleerd. De Bootlin-toolchains draaien op x86_64, dus een ARM-NAS heeft geen cross-toolchain.

De catalogus

Het pakket bevat een ingebouwde catalogus. De ondertekende externe catalogus op https://pub.qnaputilities.com/bucketvs/catalog.json kan items toevoegen zonder nieuw pakket. bvsd gebruikt hem alleen als de ed25519-handtekening past bij de sleutel die in het pakket is ingebouwd en hij niet ouder is dan de catalogus in gebruik. ‘De catalogus vernieuwen’ haalt hem meteen op, en de ingebouwde cron-taak ‘Vernieuwen van de toolchaincatalogus’ haalt hem elke dag om 04:15 op.

Installeren en verwijderen

Installeren is werk voor een admin, getoond met de voortgang op de pagina Taken:

  1. Het archief wordt gedownload naar toolchains/cache/ in de datamap. Een onderbroken download gaat verder als de installatie opnieuw wordt gestart.
  2. De sha256 wordt vergeleken met de catalogus. Bij een verschil wordt het bestand verwijderd.
  3. Een cross-toolchain of een runtime wordt uitgepakt naar toolchains/<kind>/<id> en het archief wordt verwijderd. Een root-bestandssysteem of kernelbroncode blijft een archief; elke omgeving of kernelwerkruimte pakt een eigen kopie uit. QNAP publiceert zijn GPL-kernelrelease in twee delen: beide worden gedownload, elk gecontroleerd met een eigen sha256, en samengevoegd.

Een vol volume laat de installatie mislukken met ‘no space left on’ en het koppelpunt van het volume.

‘Verwijderen’ verwijdert een geïnstalleerd item. Omgevingen die van een root-bestandssysteem zijn gemaakt, zijn kopieën en blijven.

Een toolchain of runtime gebruiken

bvs use <id> toont de export-regels (zoals PATH) die een geïnstalleerde cross-toolchain of runtime in een shell bruikbaar maken:

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

De pagina Toolchains toont dezelfde regels onder ‘bvs use’ voor elk geïnstalleerd item.

Omgevingen

Een omgeving is een Linux-systeem dat van een root-bestandssysteem is uitgepakt naar envs/<naam> in de datamap. Ze is wijzigbaar: apt install build-essential werkt in een Debian- of Ubuntu-omgeving, en wat je installeert blijft daar.

In een omgeving:

Hetzelfde vanuit een shell (de voorbeelden roepen bvs bij naam aan, zoals een cron-taak en een SSH-sessie op de NAS dat kunnen zolang het pakket draait):

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 en bvs env run starten in de map van waaruit je ze uitvoert. Een map onder projects/ van de datamap is dezelfde map onder /projects in de omgeving. Elke andere map (de checkout van een CI-taak, een map in een share) wordt gekoppeld op /work en het commando start daar. Vanuit / starten ze in /projects.

Een QPKG bouwen met bvs qbuild

bvs qbuild bouwt een QPKG uit de map waarin je het uitvoert (een map met qpkg.cfg, zoals de QPKG-sjabloon van Nieuw project die maakt). Het draait qbuild van QNAP in een Debian- of Ubuntu-omgeving. qbuild roept systeemprogramma’s aan via hun volledige paden, en in de omgeving leiden die paden naar de programma’s van de omgeving in plaats van die van de NAS. Het pakket komt in build/ van de map.

bvs tc install qdk-2.5.0-x86_64      # eenmalig; qdk-2.5.0-aarch64 op een ARM-NAS
cd /share/CACHEDEV1_DATA/BucketVS/projects/MyTool
bvs qbuild                           # --env <naam> kiest de omgeving

Het gebruikt de omgeving ubuntu2404-builder (het voorbeeld ‘Ubuntu 24.04 builder’), anders debian12-builder, anders een andere Debian- of Ubuntu-omgeving, en heeft daarin rsync nodig. Als er iets ontbreekt, stopt het en noemt het de opdracht die het toevoegt, bijvoorbeeld bvs env run ubuntu2404-builder -- apt-get install -y rsync. Argumenten na bvs qbuild gaan naar qbuild. Voordat qbuild draait, zegt bvs qbuild welk geval van code-ondertekening voor de map geldt.

Een omgeving heeft eigen bestanden en tools. Alles erin draait als root, ziet elk proces op de NAS en gebruikt het netwerk van de NAS.

Een QPKG code-ondertekenen

App Center controleert de codehandtekening van een pakket bij de installatie. Om te ondertekenen is een code-ondertekeningscertificaat nodig dat QNAP je heeft uitgegeven. bvs qbuild noemt op zijn eerste regel een van drie gevallen, bijvoorbeeld bvs: code signing, case 1 (a certificate as files): …:

GevalIn de map staatWat er gebeurt
1, een certificaat als bestandencertificate en private_key, optioneel ca_certs (de keten)qbuild ondertekent het pakket met openssl; de omgeving heeft openssl en bsdextrautils nodig
2, een certificaat op een hardwaretokencertificate_hsmniet ondersteund en niet getest: bvs qbuild stopt voordat er iets gebouwd wordt
3, geen certificaatgeen van die bestandenhet pakket wordt ongetekend gebouwd

App Builder

De App Builder compileert gekozen programma’s in één map, het prefix van de app (standaard /usr/app/my_app_prefix), in een omgeving.

Het tabblad Voorbeelden onder Apps bevat kant-en-klare apps, omgevingen, CI-workflows, cronjobs en Editor-projecten. Code bekijken op een kaart toont vóór gebruik wat het voorbeeld maakt, voor elke rol: de bestanden van een Editor-project, het workflowbestand, de opdracht van de cronjob, of bij een app de recepten in build-volgorde met build.sh en recipe.json van elk recept. De weergave is alleen-lezen en toont tekstbestanden; een omgeving heeft geen bestand, dus haar kaart heeft deze knop niet. Een voorbeeld gebruiken vraagt de rol developer, een omgeving de rol admin: de kaart van een omgeving biedt een developer geen Dit voorbeeld gebruiken.

Recepten

Elk programma wordt gebouwd vanuit een recept. Een recept noemt zijn bron met een sha256, de recepten waarvan het afhangt, de buildtools die de omgeving nodig heeft, en een controle die bewijst dat het resultaat werkt (zoals bin/bash --version). Er zijn recepten voor bibliotheken (zlib, openssl, ncurses, readline en andere), shells (bash, zsh, busybox), tools (coreutils, curl, git, jq, rsync, tmux, htop, nano en andere), servers (nginx, redis, openssh, dropbear) en een taal (lua).

Receptupdates

Nieuwe en bijgewerkte recepten komen ook als ondertekende catalogus van pub.qnaputilities.com, zodat ze de NAS bereiken vóór de volgende versie van Bucket & Code Server IDE. bvsd zoekt één keer per dag naar een nieuwere catalogus. Hij gebruikt er een alleen als de handtekening past bij de sleutel die in bvsd is ingebouwd, elk bestand overeenkomt met de lijst van de catalogus en de recepten nieuwer zijn dan die met het pakket kwamen; een catalogus die een controle niet doorstaat, wordt nooit gebruikt. Zolang een catalogus in gebruik is, markeert Nieuwe app de recepten die hij brengt als nieuw in de catalogus of bijgewerkt door de catalogus.

De kaart Receptenbibliotheek op de pagina Apps toont welke bibliotheek builds gebruiken (Pakketbibliotheek met de versie van het pakket, of Catalogus met de versie van de catalogus) en de laatste controle met het resultaat. Een admin heeft daar twee knoppen; de tweede verschijnt zolang een catalogus in gebruik is:

Na een wissel hergebruikt een nieuwe build elk recept waarvan de bestanden niet veranderd zijn. Voor elke build controleert bvsd de bestanden van de catalogus opnieuw. Is er een op de NAS veranderd, dan stopt de build voordat er iets draait, en builds gebruiken de vorige catalogus of de bibliotheek van het pakket.

Een app bouwen

Apps, Nieuwe app (rol developer) vraagt om een naam, het prefix (/usr/app/<naam> tenzij je een ander kiest), de omgeving waarin de app wordt gebouwd (een Debian- of Ubuntu-omgeving; de galerij Voorbeelden maakt de ‘Ubuntu 24.04 builder’, die de pagina als eerste kiest), het doel (de architectuur van deze NAS, of aarch64 of armv7 als cross-build), de NAS-modellen waarop hij draait, de linkwijze en de recepten. De recepten waarvan die afhangen, worden in bouwvolgorde toegevoegd.

Een app kan ook de recepten nemen van één project dat een eigen map recipes/ heeft. Kies dat project bij Recepten uit een project in de stap Pakketten. De recepten van het project staan bovenaan, onder de naam van het project en gemarkeerd met project, en daarna volgen die van de bibliotheek. Een recept van het project met de naam van een recept uit de bibliotheek vervangt dat recept in deze app en toont welke versie uit de bibliotheek het vervangt. Een recept dat het project weglaat, wordt met de reden genoemd. Een gekozen recept dat in de lijst van het project ontbreekt, wordt onder de keuzelijst genoemd en uit de app weggelaten; het komt terug zodra je een lijst kiest die het heeft. De pagina van de app noemt het project, en een developer opent vanuit die naam de projectweergave. Een viewer ziet de recepten van de laatste build van de app in de volgorde die het logboek noemt, elk met zijn toestand en logboek; voor de eerste build is er geen volgorde om te tonen.

Elke linkwijze is een kaart, met een afbeelding van waar de programma’s hun bibliotheken vinden, wat de wijze kost aan grootte, bij updates en in waar de app draait, en welke recepten haar ondersteunen. Voordat je recepten kiest, tellen de kaarten de hele receptenbibliotheek; als je terugkomt bij de eerste stap, tellen ze de recepten van je build. Voor een statische app kies je wat er gebeurt met recepten die niet statisch kunnen linken: ze als bundel bouwen, of ze weglaten.

Een Qt-build voert Qt’s eigen hulpmiddelen uit (moc, rcc, en lrelease van Linguist voor vertalingen). In een cross-build bouwen de Qt-recepten (qtbase, qttools) die hulpmiddelen daarom eerst voor deze NAS, in host/ onder het prefix, en daarna Qt voor het doel; de recepten die op Qt bouwen, voeren de hulpmiddelen van daar uit. Niets op het doel voert host/ uit. Het hoort bij de build van de app, dus het archief en Exporteren als QPKG bevatten het ook.

Je eigen recepten

Heeft de receptenbibliotheek geen recept voor een programma, dan kan een project een eigen recept meebrengen. De recepten staan in de map recipes/ van het project, in het formaat van de bibliotheek, en alleen de apps die het project noemen bouwen ze. Een pakket ontstaat zo in vijf stappen:

  1. Maak het project. In Nieuw project maakt de sjabloon Package from source (pakket uit broncode) een map met een startrecept dat de naam van het project draagt, een Makefile voor twee apps (een voor de processor van deze NAS, een voor aarch64, een cross-build op een x86_64-NAS) en het start- en stopscript van het pakket uit de stap Dienst.
  2. Schrijf het recept. New recipe in de editor voegt nog een recept toe vanuit hetzelfde startrecept (De editor openen). Zet het echte bronadres van het programma en de sha256 ervan in recipe.json (curl -fsSL <adres> | sha256sum in de terminal van de editor geeft de som) en de bouwstappen in build.sh. Een receptmap bevat recipe.json, build.sh en het vendorbestand dat recipe.json noemt, en verder niets; een patch gaat dus als here-document in build.sh.
  3. Controleer het. Elke keer dat je een bestand van een recept opslaat, worden de recepten van het project gecontroleerd en staan de bevindingen in de weergave Problems; make lint in de terminal en de kaart Recepten in de projectweergave geven dezelfde bevindingen. De controle leest recipe.json en ontleedt build.sh met bash -n. Het recept wordt nooit uitgevoerd.
  4. Bouw. Bouwen in de projectweergave maakt de twee apps als ze ontbreken en bouwt ze na elkaar. Een build leest de recepten van het project één keer, bij de start, dus een bestand dat later wordt opgeslagen wacht op de volgende build. Een recept van het project met de naam van een recept uit de bibliotheek vervangt dat recept alleen in de apps van dit project, en het logboek van de build zegt het.
  5. Verpak en installeer. make qpkg in de terminal van de editor zet de nieuwste geslaagde build van elke app in het pakket, met QDK uit Toolchains, en laat een app zonder zo’n build weg. Staan de bestanden voor de codeondertekening in qpkg/ naast qpkg.cfg, of in een map die QPKG_CERT_DIR noemt, dan is het pakket ondertekend (Een QPKG code-ondertekenen), en Testuitrol in de projectweergave (admin) installeert het op deze NAS.

Voor recepten van een project gelden een paar regels:

Op welke NAS-modellen een app draait

Een programma dat tegen glibc is gebouwd, start alleen op een NAS waarvan de glibc minstens zo nieuw is als de nieuwste versie die het programma vraagt. Het pakket rekent op glibc 2.39 of nieuwer op elke NAS waarop het draait (QTS 6.0, QuTS hero 6.0 en nieuwer): zijn glibc-ondergrens. 2.39 is de glibc van Ubuntu 24.04 en van QuTS hero 6.0.1, gelezen uit de eigen /lib/libc.so.6 van die firmware; QNAP publiceert geen glibc-versie, en zijn release notes noemen geen QTS 6.0. De test-NAS’en met QTS 6.1.0 en QuTS hero 6.1.0 hebben 2.43.

Draait op in de nieuwe app en in Wijzigen kiest een van twee:

Een cross-build (aarch64 of armv7) is altijd voor elke NAS. De nieuwe app waarschuwt wanneer de glibc van de gekozen omgeving boven wat de app toestaat ligt. Na elke build leest bvsd de glibc-versie die elk programma en elke bibliotheek vraagt, ook bij een cross-build. Een bestand boven de grens laat de build mislukken, en de oplossingen worden genoemd: een andere omgeving (Andere omgeving kiezen), de linkwijze static of Alleen voor deze NAS bouwen. De pagina van de app zegt welke glibc de nieuwste geslaagde build nodig heeft, en het tabblad Afhankelijkheden noemt elk bestand boven de grens.

Op de NAS voert bvs tree-deps <prefix> --tree <map> --glibc-max 2.39 dezelfde controle uit over elke appboom.

Een app op de NAS activeren

Activeren (admin) maakt het prefix een koppeling naar de nieuwste geslaagde build van de app, zodat de programma’s ervan op de NAS draaien vanuit /usr/app/<naam>/bin. Activeren vervangt nooit iets wat het zelf niet heeft gemaakt: een map, een bestand of een andere koppeling op het prefix wordt met de reden geweigerd. De systeemschijf van QTS wordt bij elke start opnieuw opgebouwd, daarom maakt het pakket de koppelingen bij elke start opnieuw. Deactiveren (admin) verwijdert de koppeling; de app verwijderen deactiveert haar eerst en verplaatst haar voor 7 dagen naar de prullenbak. Een developer kan een app alleen verwijderen zolang ze niet actief is. Een app die voor een andere architectuur is gebouwd, kan hier niet worden geactiveerd; download het archief voor een NAS van dat soort.

Een app exporteren

Exporteren als QPKG (admin) pakt de nieuwste geslaagde build in als een eigen QPKG, dat de app op een andere NAS installeert zonder dit pakket. Het weigert een app die alleen voor deze NAS is gebouwd, en stopt vóór het inpakken wanneer een programma van de build een glibc boven 2.39 nodig heeft (zie Op welke NAS-modellen een app draait). Daarvoor is QDK nodig: installeer ‘QNAP QDK 2.5.0’ op de pagina Toolchains, tabblad QNAP. Zolang QDK niet is geïnstalleerd, wordt de knop niet getoond en zegt de pagina van de app waar je het haalt. De export draait qbuild in de omgeving van de app, op dezelfde manier als bvs qbuild. Elke build installeert daar rsync; bij een app die het laatst met een oudere versie van het pakket is gebouwd, noemt de weigering de opdracht die het toevoegt. Het geëxporteerde pakket maakt bij de start de koppeling van zijn prefix en verwijdert die bij het stoppen. Het is niet code-ondertekend: het logboek van de taak noemt geval 3, net als een regel onder de knop. In een SSH-sessie zetten /etc/init.d/<naam>.sh disable en enable de schakelaar van het geëxporteerde pakket in App Center, en de koppeling van het prefix blijft zoals die is. Bij elke start voegt het geëxporteerde pakket ook een regel toe aan /etc/profile en /root/.profile, die bin en sbin van de app achter de eigen opdrachten van de NAS in het PATH van een SSH-aanmelding zet, voor admin en elk ander account dat mag aanmelden; bij verwijderen gaat de regel er weer uit.

Pakketrepository

Het pakket houdt een App Center-repository bij: QPKG-pakketten die erin worden gepubliceerd, kunnen vanuit App Center op andere NAS-apparaten worden geïnstalleerd, net als de apps van elke repository.

Kernelwerkplaats

De kernelwerkplaats bouwt kernelmodules voor de kernel die de NAS draait, controleert elk tegen die kernel, en laadt het. QNAP heeft de broncode van zijn huidige kernels niet gepubliceerd (de GPL-releases eindigen bij QTS 5.2.3), daarom leest de werkplaats wat de draaiende kernel over zichzelf toont en configureert een kernelboom die daarbij past.

Wat je nodig hebt

Het profiel

bvs kernel profile toont wat de draaiende kernel is: de release (6.6.129-qnap), de compiler waarmee QNAP hem bouwde, de vermagic van de eigen modules van QNAP, de grootte van struct module daarin en waar init en exit zitten, of modules ondertekend moeten zijn, en de instellingen die een kernelboom krijgt om erbij te passen.

De werkruimte

bvs kernel prepare maakt de werkruimte van de draaiende kernel in kernels/<release> van de datamap:

  1. Hij neemt de kernelbroncode die de catalogus voor deze versie heeft (bvs kernel sources): de eigen GPL-boom van QNAP als QNAP er een publiceerde, anders de boom van kernel.org, waarin de eigen wijzigingen van QNAP ontbreken. --source kiest een andere.
  2. Hij configureert de boom: met de configuratie van QNAP voor dit model als de boom van QNAP is, anders met de instellingen van het profiel. --option NAME=m voegt een instelling toe, bijvoorbeeld een stuurprogramma.
  3. Hij bereidt de boom voor op het bouwen van modules (--full bouwt in plaats daarvan de hele kernel, wat veel langer duurt en de controle de geëxporteerde symbolen van de kernel laat zien).
  4. Hij controleert dat de boom precies voor de release van de draaiende kernel bouwt.

Hij draait als taak op de pagina Taken. Een mislukte prepare houdt de boom van de vorige.

Een module bouwen

De modules die een build maakt, worden bewaard in kernels/<release>/modules/. Een module die QNAP voor deze kernel meelevert, wordt niet bewaard: de eigen kopie van QNAP blijft degene die laadt. bvs kernel make --build-only bewaart daar niets: de module blijft waar hij is gebouwd. De CI-workflows van de kernelsjablonen van Nieuw project bouwen zo.

De controle en het laden

bvs kernel check <module> vergelijkt een module met de draaiende kernel: de vermagic, de grootte van struct module en waar init en exit erin zitten (vergeleken met de eigen modules van QNAP), of een handtekening vereist is, de modules waarvan hij afhangt, en elk symbool dat hij nodig heeft. Elke bevinding zegt wat niet past en wat je moet doen. Afsluitstatus 3 betekent dat de module niet mag worden geladen.

bvs kernel load <module> voert de controle opnieuw uit en laadt de module, de modules waarvan hij afhangt eerst (die van QNAP van de NAS, of die van jou). Een module met een fout in de controle wordt nooit geladen. bvs kernel unload <module> verwijdert hem; een module die in gebruik is, blijft geladen. Elk laden en ontladen wordt geschreven naar log/kernel-modules.log.

De kernel van QNAP toont zijn datasymbolen niet, dus de controle kan symbolen zoals jiffies niet opzoeken; hij noemt ze als waarschuwingen. Als een daarvan ontbreekt, weigert de kernel de module bij het laden.

Modules in een app

Een app kan modules van de werkruimte noemen. De app activeren laadt ze voordat de koppeling wordt gemaakt, en elke start van het pakket laadt ze opnieuw zodra het paneel draait; de pagina Kernels toont een laadactie die nog bezig is. Deactiveren ontlaadt ze eerst; een module die in gebruik is, houdt de app actief.

Na een QTS-update naar een andere kernel moeten de modules opnieuw worden gebouwd in de werkruimte van de nieuwe kernel. Hetzelfde geldt na een herstel naar een andere datamap: kernels/ hoort niet bij een back-up.

In het paneel

De pagina Kernels toont het profiel van de draaiende kernel, de kernelbroncode uit de catalogus, de werkruimte en de modules ervan. Een admin bereidt daar de werkruimte voor (een bron, de omgeving, extra instellingen, de hele kernel of niet) en bouwt modules uit een projectmap of een map van de boom; beide draaien als taken. Controleren (developer) toont elke bevinding met de oplossing; Laden en Ontladen (admin) doen wat bvs kernel load en unload doen, en een geweigerde laadactie toont de controle die haar tegenhield. Een .ko-bestand ergens onder de datamap kan via zijn pad worden gecontroleerd.

Cron-taken en bewerkingen

De pagina Taken heeft twee lijsten: geplande taken (cron) en bewerkingen (de lange taken die bvsd uitvoert, zoals installaties en verplaatsingen).

Geplande taken

Een developer maakt en wijzigt zijn eigen taken; een admin wijzigt ze allemaal. Een taak heeft:

Elke taak houdt haar laatste 100 uitvoeringen met het einde van hun uitvoer (4 KB). Het volledige logboek van een uitvoering wordt 30 dagen bewaard.

Een taak draait als root namens haar eigenaar, met de thuismap van de eigenaar als HOME, en draait dus alleen zolang haar eigenaar een ingeschakelde developer of admin is. Zolang de eigenaar uitgeschakeld is of de rol member of viewer heeft, wordt elke tijd van de taak vastgelegd als een overgeslagen uitvoering die zegt waarom, bijvoorbeeld ‘its owner ola is disabled’, en Nu uitvoeren antwoordt met dezelfde reden. Er wordt geen melding gestuurd. Een uitvoering die loopt wanneer de eigenaar wordt uitgeschakeld of een rol onder developer krijgt, wordt gestopt. De taak draait weer zodra het account weer ingeschakeld is, of weer developer. Een account verwijderen verwijdert zijn taken. Ingebouwde taken draaien, wat er ook met een account gebeurt.

Als een opdracht eindigt, blijven processen die ze op de achtergrond startte doorlopen. Bij een time-out, het verwijderen van de taak of een stop van het pakket krijgt de hele procesgroep van de uitvoering SIGTERM, en na 5 seconden SIGKILL.

In de nachten waarin de klok verzet wordt, volgen de taken de regel van de cron van Debian. Een taak met * aan het begin van het minuut- of uurveld (ook */N), @hourly of @every volgt de verstreken tijd: in de herfst draait ze in beide doorgangen van het herhaalde uur, en in de lente komt het overgeslagen uur niet. Elke andere taak voert elk van haar tijden één keer uit: een tijd in het herhaalde uur draait één keer, en een tijd in het overgeslagen uur draait direct na de omschakeling.

Elk aangemeld account, ook een viewer, leest de opdrachten van de taken en de uitvoer van hun runs. Zet geen wachtwoorden of tokens in een opdracht: laat hem ze lezen uit een bestand onder <data>/etc dat alleen root leest (chmod 600).

Ingebouwde taken

TaakWanneerWat ze doet
Onderhouddagelijks om 03:30verwijdert uit tmp/ in de datamap wat al 10 dagen niet is gewijzigd; roteert log/audit.log boven 10 MB
De prullenbak legendagelijks om 03:45verwijdert wat meer dan 7 dagen geleden naar trash/ in de datamap is verplaatst (zoals de thuismap van een verwijderd account)
Vernieuwen van de toolchaincatalogusdagelijks om 04:15haalt de ondertekende toolchaincatalogus op
Logboeken van nginx roterenelk uur, in minuut 7hernoemt nginx-access.log of nginx-error.log naar .1 zodra het boven 20 MB komt (vijf oude bestanden bewaard) en vraagt nginx zijn logboeken opnieuw te openen

Een admin kan het schema, de time-out, het beleid en de melding van een ingebouwde taak wijzigen, en haar uitzetten. Haar naam en opdracht blijven.

Bewerkingen

Installaties, omgevingstaken, verplaatsingen van data en het aanzetten van een module draaien als bewerkingen. De lijst toont de laatste 50, de nieuwste eerst, met hun voortgang en logboek. Bewerkingen en hun logboeken worden 30 dagen bewaard. Een bewerking die liep toen het pakket stopte, verschijnt als interrupted. Een developer annuleert zijn eigen bewerkingen; een admin annuleert elke bewerking.

Back-ups

De pagina Back-ups (admin) stelt in wat er wordt geback-upt, wanneer, waar de kopieën heen gaan en hoeveel er worden bewaard. Nu een back-up maken start op elk moment een back-up. Op een nieuwe installatie staan geplande back-ups uit; zodra Geplande back-ups aan staat, draait er standaard dagelijks een back-up (de ingebouwde cron-taak backup). Hij bewaart de nieuwste uitvoering van elk van de laatste 7 dagen, 4 weken en 6 maanden, en altijd de nieuwste goede uitvoering. Er draait één back-up, controle, herstel of verwijdering tegelijk.

Twee uitvoeringen op één dag tellen als één dag: als de nieuwere klaar is, wordt de eerdere uitvoering van die dag verwijderd. Een Nu een back-up maken in de middag vervangt dus de geplande uitvoering van die ochtend; kopieer eerst een uitvoering naar elders als de toestand van die ochtend ertoe doet.

Wat een back-up bevat

Een uitvoering is een map <data>/backups/<id>/ met een manifest.json die elk bestand met zijn sha256 opsomt:

DeelWat
instellingenetc/: instellingen, accounts, TOTP-geheimen, de TLS-sleutel, de back-upsleutels
Gitde dump van Forgejo: repository’s, wiki’s, LFS-objecten, bijlagen en de database
SVN, bucketseen kopie van elke repository, incrementeel gemaakt: een revisie die al gekopieerd is, wordt niet opnieuw gekopieerd
VS Code-instellingende VS Code-instellingen van elk account, sneltoetsen, snippets en de lijst van zijn extensies (niet de bestanden van de extensies: de weergave Extensions installeert ze opnieuw)
omgevingende omgevingen uit Toolchains (standaard uit: ze kunnen opnieuw worden gemaakt)
projectenelke projectmap met zijn Git-geschiedenis en de bestanden die nog niet zijn gecommit, zonder node_modules
HOME-mappende HOME-map van elk account, zonder caches en de eigen installaties van de AI-tools (hun knop Installeren zet ze terug)
App Builderde instellingen van elke app en de geschiedenis van zijn builds; een build maakt de bestanden van de app opnieuw
pakketrepositoryde gepubliceerde pakketten, hun pictogrammen en de index die App Center leest

Deze vier delen zitten in elke back-up, wat er ook op de pagina is aangevinkt. Een map die sinds de vorige back-up niet is veranderd, wordt gekoppeld aan de kopie van die back-up en neemt geen ruimte in.

De uitvoering wordt pas zichtbaar als elk deel is geschreven en gecontroleerd; een fout of een vol volume verwijdert de onvoltooide map en laat de eerdere uitvoeringen zoals ze waren. Controleren leest een uitvoering volledig terug: de sha256 van elk archief, svnadmin verify van elke revisie, git fsck van elke repository en een integriteitscontrole van de database van Forgejo.

Doelen

Elke uitvoering wordt naar elk doel op de pagina gekopieerd:

Een kopie die de NAS verlaat (rsync, rclone) moet versleuteld zijn: zet Kopieën versleutelen die de NAS verlaten aan en De sleutel maken. De kopieën worden met age versleuteld voor de openbare helft ervan; de geheime helft wordt één keer getoond en bvsd bewaart haar niet. Zonder haar kan geen enkele NAS, deze ook niet, een versleutelde kopie herstellen: bewaar haar buiten deze NAS. Een nieuwe sleutel versleutelt de uitvoeringen vanaf dan; oudere kopieën hebben de oude geheime sleutel nodig.

Een doel dat mislukt, wordt genoemd in het resultaat van de uitvoering; de uitvoering zelf blijft goed.

rclone.conf bevat de inloggegevens van de remotes. Voordat een kopie of een Test het gebruikt, maakt bvsd het (en de back-upsleutel) alleen leesbaar voor root (modus 600) als dat nog niet zo is, en het logboek van de taak zegt dat.

Herstellen

Herstellen bij een uitvoering zet alles terug, één repository (een SVN-repository, een bucket of een Git-repository) of één projectmap:

Meldingen

bvsd schrijft elke melding naar de QTS-systeemlogboeken. Het kan ze ook naar chat- en maildiensten sturen via shoutrrr-URL’s (Telegram, Discord, Slack, e-mail, een generieke webhook en andere).

MeldingWanneerSchakelaar voor de URL’s
mislukte taakeen cron-uitvoering van een taak met een melding bij fout is mislukt of liep in een time-out; een bewerking is misluktnotify.on_job_failure
back-uphet resultaat van elke back-up, controle en herstel, ook de geslaagde; een geplande back-up die niet kon startennotify.on_backup
herstartluseen proces begon steeds opnieuw te herstartennotify.on_crashloop
certificaateen geüpload certificaat heeft 30 dagen of minder; nginx viel terug op het zelfondertekende certificaat; er is een nieuw zelfondertekend certificaat gemaaktnotify.on_cert_expiry
systeeminstellingen die bij de start zijn geweigerd, een onvoltooide verplaatsing van data gevonden, achtergebleven processen beëindigd, de configuratie kon niet worden geschrevenaltijd verzonden

De URL’s en de schakelaars staan onder Meldingen op de pagina Systeem; de schakelaars staan standaard aan. Een admin wijzigt ze daar. Andere accounts zien de schakelaars en van elke URL alleen het schema, omdat de rest van een URL het token bevat. De NAS-admin kan ze ook via de CLI-socket instellen:

/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

Logboeken en de supportbundel

Elk logboek is log/<name>.log in de datamap. De logboeken van bvsd en van elk proces dat het bewaakt, worden bij 20 MB geroteerd, en vijf oude bestanden worden bewaard. nginx-access.log en nginx-error.log hebben dezelfde grenzen, gecontroleerd bij elke start van bvsd en elk uur door de taak ‘Logboeken van nginx roteren’, dus een ervan kan 20 MB met hoogstens een uur verkeer overschrijden. De taak ‘Onderhoud’ roteert audit.log zodra het boven 10 MB komt en bewaart drie oude bestanden. De pagina Logboeken (admin) toont de laatste regels van elk logboek, filtert ze en volgt nieuwe regels terwijl ze binnenkomen:

LogboekWat het schrijft
bvsdbvsd zelf: starts, stops, toegepaste instellingen, problemen
nginxde eigen uitvoer van nginx
nginx-access, nginx-errorelk verzoek, en de fouten van nginx
auditelk verzoek op de CLI-socket
één per moduleproceshet programma van elke module

De pagina Systeem toont de versie, het platform, de tijdzone en elk proces dat bvsd bewaakt. ‘De supportbundel downloaden’ (admin) maakt één archief voor een foutmelding:

Het bevat nooit wachtwoorden, sessies, tokens of sleutels.

Updates

bvsd leest https://pub.qnaputilities.com/bucketvs/latest.json bij de start en elke 24 uur. Als het bestand een nieuwere versie noemt, noemt de pagina Systeem die, met de koppeling die de feed geeft. bvsd meldt de nieuwe versie alleen: het downloadt of installeert nooit een pakket. Een mislukte controle verandert niets in het paneel.

Een nieuwe versie installeren

Installeer het nieuwe pakket over het oude heen, vanuit App Center of met Handmatig installeren. De installatie stopt bvsd, vervangt de programmabestanden en start het weer; de datamap, de instellingen, de accounts en elke repository blijven, net als de sessies van het paneel. De instanties van de editor stoppen met bvsd, dus de open terminals van de editors eindigen; een instantie start weer als haar account de editor opent.

Vanaf een versie die de poorten 6050, 6051 en 6052 gebruikte. Eerdere builds luisterden op 6050 (HTTP), 6051 (HTTPS) en 6052 (Git via SSH). De eerste start van de nieuwe versie verplaatst elk daarvan naar 9950, 9951 en 9952 en zegt dat in een melding; een poort die je zelf hebt gekozen, blijft. Wijzig wat de oude poorten noemt: bladwijzers, een Plesk-proxy naar 6050, en git-remotes zoals ssh://git@<NAS>:6052/… (git remote set-url).

Verwijderen, opnieuw installeren en een beschadigd pakket

Je werk blijft als het pakket wordt verwijderd, opnieuw geïnstalleerd of beschadigd raakt. Alles wat je maakt, staat in de datamap: accounts en instellingen, Git- en SVN-repository’s, buckets, projectmappen, HOME-mappen, VS Code-instellingen en extensies, apps van de App Builder, omgevingen, de pakketrepository en de back-ups. De installatiemap (<volume>/.qpkg/bucketvs) bevat alleen de programma’s en één bestand dat de datamap noemt.

Een schijf die uitvalt, is iets anders: de datamap staat op de schijven van de NAS zelf. Bewaar back-ups op een andere machine (Back-ups); elke back-up bevat je projectmappen, HOME-mappen, de instellingen van de App Builder en de pakketrepository.

Het commando bvs

bvs is de opdrachtregel van het pakket, in /usr/bin/bucketvs/bin. Het staat in de PATH van elk proces dat bvsd start, cron-taken inbegrepen. Zolang het pakket draait, is /usr/bin/bvs een koppeling ernaar, zodat je het ook in een SSH-sessie op de NAS bij naam aanroept; stopt het pakket, dan verdwijnt de koppeling.

Elk commando dat via de CLI-socket met bvsd praat, heeft root nodig, omdat de socket alleen van root is: user, jobs en, terwijl bvsd draait, tc install, tc remove en env create, clone, export en delete. env shell, env run en qbuild hebben ook root nodig: ze starten bvs-chroot. Als een andere gebruiker stopt een commando dat de socket nodig heeft met ‘bvsd's CLI socket … is open to root only: run bvs as root’.

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>

Bestanden en mappen

PadWat
/usr/bin/bucketvsde programma’s van het pakket (een koppeling naar de installatiemap)
/usr/bin/bucketvs/etc/data-roothet pad van de datamap
/usr/bin/bucketvs/var/run/bvsd.sockde API-socket van het paneel (nginx gebruikt hem)
/usr/bin/bucketvs/var/run/bvsd-cli.sockde socket van het commando bvs, alleen root
<datamap>/etc/instellingen, accounts, sessies, tokens, de certificaten, de gegenereerde nginx.conf (geheimen met modus 600)
<datamap>/log/de logboeken
<datamap>/tmp/tijdelijke bestanden van elk proces
<datamap>/home/<gebruiker>/de thuismap van elk account
<datamap>/jobs/bewerkingen, cron-taken en hun uitvoeringen, met logboeken
<datamap>/toolchains/de downloadcache, geïnstalleerde toolchains en runtimes, exports
<datamap>/envs/omgevingen
<datamap>/projects/werkruimten, zichtbaar als /projects in omgevingen
<datamap>/trash/verwijderde items, 7 dagen bewaard

De modules voegen eigen mappen toe; hun secties noemen ze.