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

Bucket & Code Server IDE: przewodnik

Bucket & Code Server IDE (QPKG bucketvs) przechowuje kod źródłowy i pliki na NAS-ie QNAP i buduje na nim oprogramowanie. Ma własny serwer WWW, własne narzędzia i własne konta.

Przewodnik opisuje pakiet działający na NAS-ie.

Spis treści

Co działa na NAS-ie

CzęśćCo robiGdzie nasłuchuje
nginxjedyne wejście z sieci LAN: udostępnia panel i przekazuje każdą ścieżkę do jej modułu9950 (HTTP), 9951 (HTTPS)
bvsduruchamia i pilnuje wszystkich pozostałych procesów, przechowuje konta i ustawienia, wykonuje zadania i zadania cron, odpowiada panelowidwa gniazda uniksowe w /usr/bin/bucketvs/var/run/
Git (Forgejo)hosting repozytoriów Git z interfejsem WWWgniazdo uniksowe w /usr/bin/bucketvs/var/run/forgejo/ oraz 9952 dla Gita przez SSH
SVN i Bucket (httpd)repozytoria Subversion i foldery WebDAV z historią127.0.0.1:9961 albo następny wolny port, gdy ten zajmuje inny program
Edytor (code-server)VS Code w przeglądarce, jedna instancja na kontogniazdo uniksowe każdego konta w /usr/bin/bucketvs/var/run/ide/
CIrunner Forgejo Actionsbez własnego portu; gdy moduł jest włączony, nginx nasłuchuje dla niego na 127.0.0.1:9960 albo na następnym wolnym porcie, gdy 9960 zajmuje inny program

Rdzeń (nginx, bvsd, panel, zadania cron, toolchainy) działa zawsze. Git, CI, SVN i Bucket oraz Edytor to moduły, które admin włącza i wyłącza. Na każdym adresie NAS-a moduły odpowiadają pod swoimi ścieżkami: /git/, /svn/, /bucket/, /ide/. Panel jest pod /, a ten przewodnik pod /guide/.

Gdy pakiet działa, jego programy są w /usr/bin/bucketvs/bin. Wszystko, co pakiet przechowuje (konta, ustawienia, repozytoria, środowiska, logi), jest w jednym folderze na woluminie z danymi: w folderze danych.

Instalacja pakietu

Pakiet wymaga QTS 6.0 albo QuTS hero 6.0 lub nowszego, na NAS-ie x86_64 albo ARM 64-bit; dla każdej architektury jest osobny pakiet (bucketvs_<wersja>_x86_64.qpkg, bucketvs_<wersja>_arm_64.qpkg). Jest podpisany certyfikatem kodu: instaluje się go z App Center (z repozytorium, które go wymienia, albo przez Instalację ręczną pobranego pliku). App Center sprawdza podpis; nie trzeba zezwalać na aplikacje bez ważnego podpisu.

Instalacja zakłada użytkownika usługi bucketvs (dla Forgejo i httpd), dowiązanie /usr/bin/bucketvs do folderu instalacji i uruchamia bvsd. System Logs podaje folder danych.

Gdzie powstaje folder danych

Przy pierwszym uruchomieniu folder danych to BucketVS na woluminie, na którym zainstalowano pakiet, na przykład /share/CACHEDEV1_DATA/BucketVS (QTS) albo /share/ZFS2_DATA/BucketVS (QuTS hero). Później można go przenieść na inny wolumin z panelu (Przenoszenie folderu danych).

Pakiet pamięta swój folder danych w /etc/config/bucketvs-data-root, który przeżywa usunięcie pakietu. Usunięcie pakietu zostawia folder danych i ten plik, więc instalacja po usunięciu startuje na tych samych danych i kontach. Start nigdy nie zależy od folderu, którego nie ma. Gdy folderu danych już nie ma (usunięty, na wymienionym dysku albo na woluminie, który akurat jest offline), start tworzy BucketVS na woluminie pakietu, nowy folder, chyba że folder o tej nazwie już tam jest, a w nowym pierwsze logowanie ustawia hasło administratora. Dotyczy to instalacji po usunięciu i zainstalowanego pakietu, także przy starcie NAS-a. System Logs ma o tym ostrzeżenie, a pliki .prev zachowują starą ścieżkę: /etc/config/bucketvs-data-root.prev, a przy zainstalowanym pakiecie także etc/data-root.prev w folderze instalacji. Jeśli stary folder leżał na woluminie, który w tamtym momencie był tylko offline, włącz wolumin, zatrzymaj pakiet, skopiuj ten plik na etc/data-root w folderze instalacji (na przykład /share/CACHEDEV1_DATA/.qpkg/bucketvs/etc/data-root) i uruchom pakiet: znowu działa na starych danych.

Otwieranie panelu z App Center

Otwórz przy pakiecie w App Center otwiera panel na porcie 9950 (HTTP) albo 9951 (HTTPS). Gdy porty zmieni się w panelu (Porty), pakiet przekazuje App Center nowe przy następnym uruchomieniu.

Autostart z sesji SSH

Dopóki przełącznik pakietu w App Center jest włączony, NAS uruchamia pakiet przy starcie systemu. W sesji SSH na NAS-ie, jako admin, ten sam przełącznik ustawia skrypt usługi:

/etc/init.d/bucketvs.sh disable   # następny start zostanie odrzucony, także przy starcie systemu
/etc/init.d/bucketvs.sh enable    # pakiet znów startuje razem z systemem

Każde z tych poleceń zapisuje tylko przełącznik (Enable w /etc/config/qpkg.conf), wypisuje, co ustawiło, i dodaje ten sam wiersz do System Logs. Po disable działający pakiet działa dalej, a enable niczego nie uruchamia: do tego służą stop i start, przy czym start odmawia, dopóki pakiet jest wyłączony. status mówi, czy bvsd działa.

Pierwsze logowanie

Panel jest pod adresem https://<adres NAS-a>:9951/ albo http://<adres NAS-a>:9950/. Adres HTTPS ma na początku certyfikat z podpisem własnym, więc przeglądarka ostrzega, dopóki urządzenie mu nie zaufa; część Certyfikat opisuje, jak porównać jego odcisk.

Nowa instalacja nie ma żadnego konta. Dopóki pierwszy administrator nie ma hasła, panel otwiera się na jednym ekranie, „Ustaw hasło administratora”, dla konta administrator. Wpisz hasło dwa razy: co najmniej 10 znaków i najwyżej 72 bajty. Zapisanie hasła tworzy konto i loguje do panelu.

Pakiet startuje bez żadnego konta; Ustaw hasło administratora 60 minut, tylko sieć lokalna; administrator zalogowany; Ponowne uruchomienie pakietu w App Center: nowe 60 minut

Z sesji SSH na NAS-ie /usr/bin/bucketvs/bin/bvs user password administrator tworzy konto, gdy jeszcze go nie ma, i wypisuje losowe hasło; przy pierwszym logowaniu panel prosi wtedy o własne hasło (Gdy admin nie może się zalogować).

Po pierwszym zalogowaniu Przegląd mówi, że działa tylko rdzeń. Kafelek każdego modułu mówi, co moduł daje, i ma przycisk, który go włącza, np. Włącz Git: włącz te, których potrzebujesz (Moduły).

Praca w panelu

Panel działa jak edytor kodu: każda strona otwiera się w karcie, a paleta poleceń prowadzi do stron i działań po nazwie.

Konta

Panel ma własne konta. Konta QTS się do niego nie logują.

Role

RolaCo może
viewerprzegląda panel; strony Kopie zapasowe, Miejsce na dane, Konta i Logi są dla adminów. W Forgejo nie zakłada, nie forkuje ani nie importuje repozytoriów, nie zakłada organizacji i nigdy nie wypycha zmian; czyta repozytoria SVN i buckety, do których ma prawa, i do żadnego nie zapisuje
użytkownik (member)czyta to, co viewer, i zapisuje: wypycha zmiany do repozytoriów Git, w których dostał prawo zapisu, zapisuje w repozytoriach SVN i bucketach, w których ma odczyt i zapis, i przywraca tam starsze wersje plików. W Forgejo nie zakłada, nie forkuje ani nie importuje repozytoriów i nie zakłada organizacji, nie wypchnie zmian do repozytorium, którego właścicielem lub administratorem jest konto z rolą niższą niż developer, ani, gdy moduł CI jest włączony, do repozytorium z włączonymi Actions. Nie dostaje edytora, zadań cron ani budowania
developerdo tego otwiera edytor, czyta wiersze bvs use zainstalowanych toolchainów, tworzy, zmienia i uruchamia własne zadania cron, tworzy i buduje aplikacje, publikuje pakiety w repozytorium (wystawia je admin), sprawdza moduły jądra i zakłada repozytoria Git, których workflowy działają na NAS-ie, gdy moduł CI jest włączony
adminwszystko: konta, ustawienia, miejsce na dane, sieć, moduły, toolchainy, środowiska, każde zadanie cron, aktywacja aplikacji, ładowanie modułów jądra, wystawianie pakietów w repozytorium

Rola developer to root na NAS-ie: jej polecenia cron działają jako root, tak samo jej terminal edytora i, gdy moduł CI jest włączony, workflowy repozytoriów, do których może wysyłać zmiany. Dawaj ją tylko osobom, którym dałbyś hasło administratora NAS-a. Komuś, kto tylko zapisuje zmiany w repozytoriach, wystarczy rola użytkownika.

W sekcji Twoje konto każdy widzi swoją rolę i to, na co ona pozwala, z linkiem do tej sekcji. Strona powyżej czyjejś roli mówi, jakiej roli wymaga, a to, co zmienia tylko admin, jest tak opisane tam, gdzie się pojawia. Sieć, Git i CI pokazują pozostałym swoje ustawienia jako wartości, z „Nie ustawiono” tam, gdzie wartości brak.

Workflowy działają na NAS-ie jako root, więc bvsd trzyma Actions wyłączone w każdym repozytorium Git, którego właścicielem jest konto z rolą użytkownika lub viewer albo do którego takie konto może zapisywać: nadanie takiemu kontu prawa zapisu do repozytorium wyłącza jego Actions w ciągu minuty, a strona Git pokazuje adminom te repozytoria. Aby użyć tam Actions, najpierw odbierz to prawo zapisu w Forgejo albo przenieś repozytorium należące do takiego konta na konto developera.

Tworzenie i zmiana kont

Admin zarządza kontami na stronie Konta.

Hasła i sesje

Błędne hasła

Za proxy liczy się adres, który proxy podaje, ale tylko gdy to proxy jest na liście zaufanych proxy. W przeciwnym razie każdy klient liczy się jako adres samego proxy i pięć błędnych haseł od kogokolwiek blokuje wszystkich na 15 minut.

Uwierzytelnianie dwuskładnikowe

Każde konto włącza je samo na stronie Twoje konto: zeskanuj kod QR aplikacją uwierzytelniającą (albo wpisz klucz), a potem wpisz 6-cyfrowy kod, który pokazuje aplikacja. Od tej chwili logowanie po haśle prosi o kod.

Tokeny API

Skrypty i CI zamiast hasła używają tokenów API. Na stronie Twoje konto „Nowy token” tworzy token:

Gdy admin nie może się zalogować

Admin NAS-a może odzyskać każde konto z sesji SSH na NAS-ie. Polecenie bvs rozmawia z bvsd przez gniazdo, które otwiera tylko root (/usr/bin/bucketvs/var/run/bvsd-cli.sock, tryb 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

Każde żądanie na tym gnieździe działa jako wbudowany admin cli i trafia do log/audit.log w folderze danych. Te polecenia działają tylko wtedy, gdy działa bvsd.

Folder danych

Folder danych to folder, w którym jest wszystko, co pakiet przechowuje. Jego ścieżka to jedyny wiersz pliku /usr/bin/bucketvs/etc/data-root. Strona Miejsce na dane pokazuje go razem z woluminem, na którym jest, i wolnym miejscem na nim.

bvsd startuje tylko na folderze danych, który jest folderem na prawdziwym woluminie. Start pakietu sprawdza to wcześniej: folder, którego nie ma, albo folder na tmpfs lub ramfs daje nowy folder danych na woluminie instalacji, jak opisuje Gdzie powstaje folder danych. Wolumin, który jest offline, zostawia swój punkt montowania jako pusty folder w RAM-ie NAS-a, a zapisane tam ustawienia zniknęłyby przy następnym restarcie. Sam bvsd odrzuca taki folder tylko wtedy, gdy ktoś uruchomi go ręcznie, a przyczyna trafia wtedy do Dzienników systemu QTS.

Co bvsd daje każdemu procesowi

QTS trzyma /tmp na małym RAM-dysku, a /root na RAM-dysku, który restart czyści. Dlatego każdy proces, który uruchamia bvsd (programy modułów, zadania cron, instalacje), ma pliki tymczasowe i folder domowy w folderze danych:

ZmiennaWartość
HOME<folder danych>/home/<konto>
TMPDIR<folder danych>/tmp
XDG_CACHE_HOME, XDG_CONFIG_HOME.cache i .config w tym folderze domowym
npm_config_cache.npm w tym folderze domowym
PATH~/.local/bin, ~/.npm-global/bin, potem bin, sbin i node/bin pakietu, potem foldery systemu
SSL_CERT_FILE, GIT_SSL_CAINFO, CURL_CA_BUNDLEzestaw certyfikatów CA pakietu, /usr/bin/bucketvs/etc/ssl/cacert.pem
TZstrefa czasowa NAS-a, ustawiona w QTS
SHELL, EDITORbash i nano pakietu
LANG, LESSCHARSETC.UTF-8 i utf-8, więc nazwy plików z polskimi literami wyglądają tak, jak powinny

Przenoszenie folderu danych

Strona Miejsce na dane przenosi cały folder danych do innego folderu w /share. Wybierz folder udostępniony albo wolumin; dane trafią do nowego folderu BucketVS w środku. Żeby użyć samego wybranego folderu, otwórz pusty folder o nazwie BucketVS. Foldery udostępnione tworzy się w QTS (Panel sterowania, Foldery udostępnione); wewnątrz folderu udostępnionego albo woluminu strona może utworzyć nowy folder. Okno wyboru otwiera się tam, gdzie dane są teraz, i mówi to; stamtąd otwórz folder udostępniony albo wolumin, do którego mają trafić.

Przed startem przenoszenia strona sprawdza cel i wymienia każdy powód, dla którego go odrzuca:

Ponowne sprawdzenie celu wolne miejsce: dane + 10 %; Zatrzymanie modułów panel działa dalej; Kopiowanie rsync -aHAX --numeric-ids; Weryfikacja kopii pliki, bajty, właściciele, tryby, czasy, sha256 do 1000 plików; Przełączenie folderu danych w /usr/bin/bucketvs/etc/data-root; bvsd startuje od nowa na nowym folderze i uruchamia moduły; Stara kopia zostaje, oznaczona MOVED-TO, dopóki jej nie usuniesz; Stary folder zostaje w użyciu, moduły startują ponownie

W trakcie przenoszenia:

Po przełączeniu bvsd zatrzymuje się i uruchamia od nowa na nowym folderze, więc panel znika na kilka sekund.

Gdy przenoszenie się nie uda, stary folder danych zostaje w użyciu, a moduły startują ponownie. Błąd zadania mówi, co poszło źle i co stało się z kopią:

Stara kopia i kopie pozostałe

Po udanym przenoszeniu stary folder danych zostaje na miejscu, z plikiem MOVED-TO w środku. Nic go nie używa. „Usuń starą kopię” na stronie Miejsce na dane go usuwa, a „Usuń tę kopię” usuwa kopię pozostałą po nieudanym przenoszeniu. Oba usuwania nie wychodzą poza jeden system plików i nie podążają za dowiązaniami. Folder, który jest punktem montowania albo samym folderem udostępnionym, zostaje opróżniony i zachowany.

Sieć

Strona Sieć zawiera porty, tryb zwykłego HTTP, nazwy hostów modułów, zaufane proxy, publiczny URL i certyfikat. Zapisanie ustawień restartuje to, czego wymaga zmiana, i podaje, co zostało zrestartowane.

Porty

UstawienieDomyślnieCo to jest
HTTPS9951panel i moduły przez TLS
HTTP9950panel i moduły przez zwykłe HTTP
Git przez SSH9952Git przez SSH
Port SSH w adresach klonowania0port pokazywany w adresach klonowania SSH; 0 oznacza port SSH powyżej. Ustaw go, gdy router przekierowuje na NAS inny port.
Host SSH w adresach klonowaniapustenazwa albo adres pokazywany w adresach klonowania SSH. Puste oznacza nazwę hosta Gita, a bez niej host z publicznego URL-a, a bez niego adres NAS-a w LAN; dla nazwy opublikowanej przez Cloudflare Tunnel adres w LAN i port Git przez SSH. Wpisz nazwę bez proxy (w Cloudflare: „DNS only”) albo adres routera, gdy router przekierowuje port SSH.

Porty mieszczą się w zakresie od 1024 do 65535 i różnią się od siebie. Porty modułów na 127.0.0.1 (9960 i 9961) są odrzucane, podobnie jak port, którego używa httpd albo serwer runnera CI, gdy 9960 lub 9961 zajął inny program (komunikat go podaje). Gdy po zapisie nginx zostaje na starych portach, bo nie mógł użyć nowego, powiadomienie mówi dlaczego. Gdy NAS ma IPv6, nginx nasłuchuje też na nim.

Zwykłe HTTP

Strona logowania ostrzega, gdy została otwarta przez zwykłe HTTP: hasło idzie wtedy przez sieć otwartym tekstem.

Certyfikat

Przy pierwszym starcie bvsd tworzy certyfikat z podpisem własnym (ECDSA P-256) dla:

Jest ważny 825 dni, najdłużej, ile przyjmują urządzenia Apple, nawet dla certyfikatu zaufanego ręcznie. bvsd sprawdza go przy starcie i raz dziennie i tworzy nowy, gdy zostało 30 dni lub mniej, gdy zmienia się zestaw nazw albo gdy klucz nie pasuje. Nowy certyfikat wysyła powiadomienie. Strona Sieć pokazuje jego nazwy, ważność i odcisk SHA-256: porównaj odcisk, zanim urządzenie zaufa certyfikatowi.

„Dodaj własny certyfikat” przyjmuje łańcuch certyfikatów i klucz prywatny w formacie PEM:

Para jest zapisywana w etc/tls/ w folderze danych z trybem 600. Gdy dodany certyfikat wygaśnie albo przestanie przechodzić te sprawdzenia, nginx używa w zamian certyfikatu z podpisem własnym, a powiadomienie mówi dlaczego. Dodany certyfikat, któremu zostało 30 dni lub mniej, także wysyła powiadomienie. „Nowy certyfikat z podpisem własnym” tworzy nową parę z podpisem własnym i wraca do niej.

Klienci, którzy przychodzą przez proxy, widzą certyfikat proxy, nie ten.

Pobierz certyfikat na stronie Sieć zapisuje certyfikat, który podaje panel, bez klucza, jako <nazwa>.crt. Dodaj go do zaufanych certyfikatów urządzenia, a przeglądarki tego urządzenia zaufają panelowi; potrzebują tego widoki rozszerzeń w edytorze (Rozszerzenia). Nowemu certyfikatowi z podpisem własnym trzeba zaufać ponownie.

Zaufane proxy

Lista adresów IP albo zakresów CIDR, na przykład 192.168.1.5, adres proxy przed NAS-em. Tylko dla żądania, którego połączenie TCP przychodzi z jednego z nich, nginx bierze:

Żądanie z każdego innego adresu liczy się jako przychodzące wprost od klienta, a nginx zastępuje jego nagłówki X-Forwarded-* własnymi wartościami. Wpisanie zakresu sprawia, że zaufany jest każdy host w tym zakresie: każdy z nich może wtedy podać adres klienta i schemat, więc wpisz adres samego proxy. Zakres obejmujący wszystkie adresy (0.0.0.0/0, ::/0) jest odrzucany.

Publiczny URL

Sam adres, na przykład https://git.example.com, bez ścieżki. Części o modułach mówią, które odnośniki od niego się zaczynają.

Za odwrotnym proxy (Plesk)

Zwykle TLS kończy się na proxy z publicznym certyfikatem, a proxy łączy się z portem 9950 w sieci LAN przez zwykłe HTTP. Przykłady poniżej używają bvs.example.com jako nazwy publicznej, 192.168.1.20 jako adresu NAS-a i 192.168.1.5 jako adresu serwera Plesk; wstaw w ich miejsce własne.

Przeglądarka, git, klient WebDAV; nginx Pleska bvs.example.com publiczny certyfikat; nginx na NAS-ie 192.168.1.20; / panel, /api/ bvsd; /git/, /svn/, /bucket/, /ide/; git przez SSH

Na NAS-ie

  1. Na stronie Sieć dodaj adres serwera Plesk (taki, jaki widzi NAS) do listy Zaufane proxy.
  2. Zwykłe HTTP może zostać na „Obsługuj”. „Przekieruj na HTTPS” też działa, gdy serwer Plesk jest zaufanym proxy.

W Plesku

Wpisz te dyrektywy w ustawieniach Apache i nginx domeny, w polu „Dodatkowe dyrektywy nginx”:

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: edytor i jego terminal
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;

    # duże wypchnięcia i wysyłki: bez limitu rozmiaru, strumieniowo, dopuszczalna godzina ciszy
    client_max_body_size 0;
    proxy_request_buffering off;
    proxy_buffering off;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
}

location ~ ^/ to lokalizacja z wyrażeniem regularnym. nginx przedkłada pasujące wyrażenie regularne nad zwykłe location / (Plesk zapisuje własne), więc ten blok obsługuje każdą ścieżkę witryny, a proxy_pass bez ścieżki przekazuje ścieżkę żądania bez zmian. Na tej samej stronie ustawień wyłącz „Serwuj pliki statyczne bezpośrednio przez nginx”: gdy jest włączone, Plesk odpowiada na żądania plików .js, .css i obrazów z folderu domeny i panel się nie wczytuje.

W ustawieniach hostingu domeny włącz stałe przekierowanie 301 z HTTP na HTTPS (w angielskim interfejsie „Permanent SEO-safe 301 redirect from HTTP to HTTPS”). Dodatkowe dyrektywy nginx obowiązują też w witrynie domeny na zwykłym HTTP (port 80); bez przekierowania witryna odpowiada także tam, a hasła idą przez internet niezaszyfrowane.

Po co jest każdy wiersz:

DyrektywaCo się psuje bez niej
Host $http_hostnginx na NAS-ie wybiera blok serwera po Host, więc nazwa hosta modułu nigdy nie pasuje. bvsd porównuje Origin strony z Host razem z portem, więc każda zmiana w panelu kończy się 403 csrf; $host gubi publiczny port inny niż 443 i kończy się tak samo.
X-Forwarded-Forkażdy klient liczy się jako serwer Plesk: pięć błędnych haseł jednej osoby blokuje wszystkich na 15 minut
X-Forwarded-Proto $schemeciasteczko sesji nie dostaje flagi Secure, a w trybie „Przekieruj na HTTPS” każde żądanie idzie na port 9951 nazwy publicznej
Upgrade, Connectionstrona edytora się otwiera, ale edytor i jego terminal nigdy się nie łączą
client_max_body_size 0, proxy_request_buffering off, limity czasudo dużych wypchnięć i wysyłek stosuje się własny limit rozmiaru i limity czasu proxy

X-Forwarded-For i X-Forwarded-Proto liczą się tylko wtedy, gdy serwer Plesk jest na liście Zaufane proxy. W przeciwnym razie nginx na NAS-ie je pomija.

Git przez SSH

Proxy HTTP nie przenosi SSH. Git przez SSH łączy się bezpośrednio z portem 9952 NAS-a albo przez przekierowanie portu TCP na routerze. „Port SSH w adresach klonowania” na stronie Sieć ustawia port, który pokazują adresy klonowania, a „Host SSH w adresach klonowania” nazwę albo adres, gdy publiczna nazwa prowadzi tylko do proxy.

Sprawdzenie konfiguracji

Nazwy hostów modułów

Moduł może mieć własną nazwę hosta (strona Sieć, Nazwy hostów). nginx udostępnia wtedy pod główną ścieżką tej nazwy tylko ten moduł. Nazwa musi wskazywać na NAS albo na proxy przed nim. Na proxy każda nazwa hosta potrzebuje własnej witryny z tymi samymi dyrektywami co wyżej.

ModułPod główną ścieżką swojej nazwyDodatkowo
GitForgejo/git/ na każdej innej nazwie odpowiada 302 na nazwę hosta Gita, z tą samą ścieżką, zapytaniem i portem
Edytorcode-serverstrona logowania panelu i /api/, żeby można było zalogować się pod tą nazwą
SVN i Buckethttpdrepozytoria zostają pod /svn/<nazwa>, a buckety pod /bucket/<nazwa>

Wyłączony moduł odpowiada 503 ze zdaniem, które to mówi, na swoich ścieżkach i pod swoją nazwą hosta.

Jedno logowanie dla wszystkich nazw

Ciasteczko sesji należy do nazwy, pod którą je ustawiono, chyba że ustawienie network.cookie_domain wskazuje domenę nadrzędną wszystkich nazw hostów modułów. Przy example.com logowanie pod bvs.example.com sięga też git.example.com i ide.example.com. bvsd odrzuca sufiks publiczny (com, com.pl, co.uk, myqnapcloud.com), domenę, która nie jest nadrzędna dla każdej nazwy hosta modułu, i każdą domenę, dopóki żaden moduł nie ma nazwy hosta. Ciasteczko dostaje każda witryna w tej domenie, więc ustaw najwęższą wspólną domenę nadrzędną.

Strona Sieć nie pokazuje tego ustawienia. Admin NAS-a ustawia je przez gniazdo CLI programem curl z pakietu:

/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

Pusta wartość ("") znów przypisuje ciasteczko do każdej nazwy osobno.

Publikacja w internecie (Cloudflare Tunnel)

Strona Publikowanie (Administracja, tylko dla administratorów) udostępnia pakiet w internecie pod nazwami z domeny, której DNS jest w Cloudflare. cloudflared, który jest w pakiecie, sam łączy się z NAS-a z Cloudflare: na routerze nie otwiera się żadnego portu, a certyfikaty dla tych nazw ma Cloudflare. Każde żądanie przechodzi przez nginx pakietu: panel i jego API wymagają zalogowania, a bez konta otwiera się tylko to, co upubliczniłeś (publiczne repozytoria, ich widok WWW, repozytorium pakietów).

Są dwa typy nazw, najwyżej po jednej:

TypPrzykładCo udostępnia
Główna nazwa hostacode.example.companel i jego API, Forgejo pod /git/, widok WWW pod /svn-web/ i /bucket-web/, repozytorium pakietów pod /repo/ (tylko odczyt) i przewodnik. /svn/ i /bucket/ odpowiadają tam 404, a /ide/ też, dopóki nie opublikujesz edytora (niżej)
Nazwa hosta pakietówqpkg.example.comtylko GET i HEAD dla /repo/, dla App Center na innych NAS-ach; na resztę odpowiada 404

Czego potrzebuje token

Utwórz token API w dash.cloudflare.com (My Profile, API Tokens) z tymi uprawnieniami, dla strefy tych nazw:

Pakiet trzyma token na NAS-ie w pliku, który czyta tylko root, i już go nie pokazuje.

Jeśli token ma Client IP Address Filtering, wpisz tam oba publiczne adresy NAS-a, IPv4 i IPv6: NAS łączy się z Cloudflare przez IPv6, gdy ma adres IPv6. Inaczej strona Publish odmawia z kodem token_ip_filter i podaje adres, który zobaczył Cloudflare.

Publikowanie

Wpisz nazwy i token, potem Opublikuj. Pakiet najpierw sprawdza wszystko w Cloudflare i niczego tam nie zmienia, gdy któreś sprawdzenie się nie powiedzie; komunikat mówi, co poprawić:

Potem tworzy tunel (o nazwie bucketvs-<nazwa NAS-a>, chyba że podasz inną; tunel o tej nazwie, którego ustawienia trzyma Cloudflare, zostaje przejęty), kieruje na niego każdą nazwę rekordem CNAME przez proxy, dodaje reguły pamięci podręcznej i uruchamia cloudflared. Opublikuj ponownie z tymi samymi wartościami niczego nie zmienia. Ustaw adres publiczny (Sieć) na adres https:// głównej nazwy hosta, żeby linki Forgejo i adresy klonowania HTTPS go podawały; strona przypomina o tym, dopóki się różnią.

Git przez SSH nie przechodzi przez tunel: do opublikowanej nazwy Cloudflare przenosi tylko HTTP. Dlatego adresem klonowania SSH jest adres NAS-a w LAN z portem Git przez SSH (9952), w panelu i w okienku klonowania samego Forgejo, a strona Git i Przegląd piszą: „Klonowanie przez SSH działa w sieci lokalnej; z internetu klonuj przez HTTPS.” Żeby SSH działał z internetu, przekieruj port SSH na routerze i ustaw Host SSH w adresach klonowania (Sieć) na publiczny adres routera albo na nazwę bez proxy (w Cloudflare: „DNS only”), która na niego wskazuje, a Port SSH w adresach klonowania, gdy router używa innego portu.

Główna nazwa hosta odpowiada na /ide/ kodem 404, dopóki admin nie włączy przełącznika Opublikuj edytor pod główną nazwą hosta na stronie Publikowanie. Terminal edytora to powłoka roota na NAS-ie i dostaje ją każdy, kto zaloguje się tam z internetu jako programista lub admin, więc najpierw włącz uwierzytelnianie dwuskładnikowe na tych kontach. Po włączeniu edytor przechodzi przez to samo logowanie co w sieci LAN, jego proxy portów (/ide/proxy/<port>/) pozostaje tam wyłączone, a Cloudflare nigdy nie trzyma jego stron w pamięci podręcznej. Dopóki przełącznik jest włączony, Przegląd pokazuje Edytor w internecie.

Gdy moduł CI jest włączony, workflow wypchnięty do dowolnego repozytorium tego Forgejo działa jako root na NAS-ie przez runner samego NAS-a, niezależnie od tego, czy wypchnięto go z internetu, czy z sieci lokalnej: to ta sama władza co terminal edytora. Strona Publikowanie mówi o tym pod Co widać z internetu. Dostęp do zapisu dawaj tylko osobom, którym dałbyś hasło admina NAS-a.

Pamięć podręczna

Przy włączonych Gotowych regułach pamięci podręcznej Cloudflare trzyma pakiety (*.qpkg) przez rok, ikony przez dzień, repo.xml przez 5 minut i pliki panelu przez rok; nigdy nie trzyma API, stron Forgejo, stron logowania ani widoku WWW. Publikacja w repozytorium pakietów od razu usuwa repo.xml (i zmienioną ikonę albo pliki usuniętej wersji) z pamięci podręcznej Cloudflare. Pakiet dodaje własne reguły na końcu reguł pamięci podręcznej strefy i nigdy nie zmienia pozostałych.

Logowanie z internetu

Pierwszego hasła nie da się ustawić przez opublikowaną nazwę: pierwsze uruchomienie przyjmuje tylko klienta z sieci lokalnej. Błędne hasła liczą się osobno dla każdego klienta z internetu, jak w sieci lokalnej. Liczy się też hasło wysłane przez git do Forgejo; token dostępu Forgejo działa jak zawsze. Cloudflare przyjmuje żądania do 100 MB, więc większy push albo wysyłka idzie przez adres w sieci lokalnej.

Zatrzymanie i usunięcie

Zatrzymaj kończy cloudflared; nazwy pokazują wtedy stronę błędu Cloudflare, a w Cloudflare nic się nie zmienia. Usuń z Cloudflare usuwa rekordy DNS, reguły pamięci podręcznej i tunel, które pakiet utworzył (przejęty tunel zostaje), i zapomina token. Dopóki nazwy są opublikowane, Przegląd pokazuje plakietkę Internet ze stanem tunelu.

Moduły

Przegląd pokazuje każdy moduł z jego procesami, pamięcią i CPU oraz włącza go i wyłącza (tylko admin). Wyłączony moduł mówi, co daje; admin włącza go jego przyciskiem (Włącz Git, Włącz Edytor itd.) na jego kafelku, na jego stronie, a Edytor także w karcie Edytor.

StanZnaczenie
działadziała każdy proces modułu
uruchamia sięproces wystartował niecałą sekundę temu
z problemamiproces czeka na restart, pliki modułu nie dały się zapisać albo nie przechodzi sprawdzenie jego stanu
restartuje się w pętliproces zakończył się 5 razy w ciągu 10 minut; bvsd uruchamia go ponownie co 15 minut, a jedno powiadomienie już wyszło
zatrzymanyprocesy modułu nie działają (zatrzymało je przenoszenie danych albo nie wystartowały)
wyłączonemoduł jest wyłączony

Proces, który się kończy, startuje ponownie po 1 sekundzie, potem po 2, 4 i tak dalej aż do 60 sekund. Po 10 minutach działania czekanie znów zaczyna się od 1 sekundy. Wyłączenie i ponowne włączenie modułu od razu uruchamia proces, który restartuje się w pętli.

Git

Moduł Git uruchamia Forgejo: interfejs WWW do repozytoriów git ze zgłoszeniami, pull requestami, wydaniami, wiki, LFS, kopiami lustrzanymi i webhookami. Admin włącza go przyciskiem Włącz Git w Przeglądzie albo na stronie Git. Zadanie przygotowuje foldery i bazę Forgejo w <data>/forgejo, zakłada w Forgejo każde konto panelu i uruchamia go. Forgejo otwiera się potem pod /git/ na adresie panelu albo pod / nazwy hosta Gita, gdy jest ustawiona (zob. Nazwy hostów modułów).

Nowe repozytorium na stronie Git, a dopóki nie ma żadnego, także na kafelku Git w Przeglądzie, otwiera formularz Forgejo do tworzenia repozytorium. Panel pokazuje ten przycisk i Migracja lub mirror repozytorium od roli developer w górę: konto z rolą viewer ani z rolą użytkownika nie może w Forgejo tworzyć repozytoriów.

Repozytoria i konta

Klonowanie przez HTTPS i SSH

Na stronie Git sekcja Sklonuj repozytorium podaje oba polecenia dla właściciela i repozytorium:

SposóbAdresLogowanie
HTTPS (lub HTTP)https://<adres NAS-a>:9951/git/<właściciel>/<repo>.gitnazwa i hasło z panelu albo token dostępu
SSHssh://git@<adres NAS-a>:9952/<właściciel>/<repo>.gitklucz SSH dodany w Forgejo (Ustawienia, Klucze SSH / GPG)

Pokazywanie repozytoriów osobom bez konta

Publiczne przeglądanie na stronie Git pozwala każdemu, kto dotrze do Forgejo, czytać jego publiczne repozytoria bez konta. W Forgejo każde repozytorium jest publiczne albo prywatne (jego Ustawienia, Widoczność). Przy włączonym przełączniku gość bez konta może:

Prywatne repozytorium pozostaje ukryte: jego adres odpowiada „nie znaleziono”. Przy włączonym przełączniku Forgejo nie pokazuje też listy kont (karta Użytkownicy w Eksploruj i wyszukiwanie użytkowników są wyłączone, także dla zalogowanych), więc gość nie zbierze nazw kont. Wypychanie, zgłoszenia, pull requesty i ustawienia nadal wymagają konta. Przy wyłączonym przełączniku każda strona najpierw prosi o zalogowanie.

Żeby udostępnić repozytorium, oznacz je w Forgejo jako publiczne, włącz Publiczne przeglądanie i wyślij adres. Na nazwie hosta Gita adres to https://<nazwa hosta Gita>/<właściciel>/<repo>.

Nowy projekt

Nowy projekt to strona, która krok po kroku prowadzi projekt od zera do zbudowanej i opublikowanej pierwszej wersji. Otwiera się we własnej karcie z palety poleceń (Ctrl+Shift+P, Nowy projekt), z góry paska bocznego Edytora, z nagłówka paska bocznego Git, ze strony Git i ze strony Projekty; przykład z kategorii Projekty edytora na stronie Przykłady ma Nowy projekt z niego. Wymaga roli developer, modułów Git i Edytor oraz twojego konta w Forgejo (stronę Git pokazuje stan jego synchronizacji). Gdy Git lub Edytor jest wyłączony, strona mówi o tym nad krokami, a admin włącza je tam jednym przyciskiem.

  1. Szablon. Szablony są pogrupowane: Programy (C, C++ z CMake, Go, Rust, Node, Python, Java), Pakiety dla QTS (pakiet QPKG, aplikacja App Buildera, pakiet ze źródeł), Jądro (moduł jądra, sterownik USB-serial ch341), Strony WWW (statyczna strona: strony w src/, Makefile budujący public/, sprawdzanie linków jako make test) i Przykłady. Każda karta mówi, co powstaje z budowania, i zaznacza, czego temu NAS-owi jeszcze brakuje (QDK, środowiska budowania, wyłączonego modułu), z linkiem do strony, która to dodaje.
  2. Nazwa i widoczność. Nazwa jest nazwą repozytorium i folderu projects/<nazwa>; strona sprawdza ją w trakcie pisania. Dalej właściciel (twoje konto albo organizacja, w której Forgejo pozwala ci tworzyć repozytoria), prywatne lub publiczne, i opis, jeśli chcesz. Dla aplikacji App Buildera preset, od którego zaczyna, i cel.
  3. Usługa, dla pakietu QPKG i pakietu ze źródeł: jak pakiet się uruchamia i zatrzymuje, złożone z bloków. Wybierz preset (Narzędzie wiersza poleceń dowiązuje program w /usr/bin; Usługa w tle dodaje konto, folder danych na woluminie, program uruchamiany jako to konto, czekanie na jego port i zatrzymanie z limitem czasu; Aplikacja WWW dodaje przycisk Otwórz w App Center; Pusty ma tylko polecenia), potem zmień jego bloki. Karta każdego bloku pokazuje wiersze, które zapisuje w skrypcie, już w trakcie pisania, a odrzucona wartość jest zaznaczona pod swoim polem. Uruchomienie nigdy nie włącza Enable w App Center, a zatrzymanie nigdy go nie zmienia. Widok projektu zmienia bloki później.
  4. Budowanie. Środowisko, w którym projekt się buduje, zapamiętane dla projektu (widok Projektu zmienia je później), albo żadne, a wtedy bvsd wybiera je przy każdym budowaniu. Krok najpierw proponuje środowisko, które wybrałby sam bvsd i w którym budują bvs qbuild oraz CI: Ubuntu 24.04 builder, bez niego Debian 12 builder, a bez obu inne środowisko Debian lub Ubuntu. Gdy Makefile danego szablonu podaje środowisko każdej aplikacji w wierszu ENV, krok mówi o tym i o żadne nie pyta, a projekt żadnego nie zapamiętuje. Dla pakietu ze źródeł krok mówi też, że adres źródła i sha256 w przepisie startowym są zastępcze: pierwsze budowanie kończy się błędem, dopóki przepis nie poda prawdziwego źródła twojego programu i sha256 tego pliku. Strona pokazuje workflow, który CI uruchamia przy każdym pushu. Zbuduj zaraz po utworzeniu jest włączone, dopóki go nie wyłączysz; przy pakiecie ze źródeł jest na początku wyłączone i możesz je włączyć. Gdy na NAS-ie nie ma środowiska Debian ani Ubuntu, krok to mówi: admin tworzy tam środowisko do budowania przyciskiem Utwórz to środowisko, a krok je potem proponuje; w przeciwnym razie wyłącz Zbuduj zaraz po utworzeniu i zbuduj projekt później.
  5. Publikowanie, dla pakietu QPKG, aplikacji App Buildera albo strony WWW: Wdrożenie testowe na tym NAS-ie (admin, tylko pakiety podpisane; dla aplikacji Aktywuj na tym NAS-ie), Opublikuj w repozytorium App Center tego NAS-a i Opublikuj na moim serwerze WWW (admin) w jednym z celów WWW; Dodaj cel zapisuje tam nowy. Każde jest opcjonalne. Wybór publikacji staje się też przełącznikiem projektu Opublikuj w repozytorium App Center (widok projektu, Ustawienia): dopóki jest włączony, CI projektu publikuje tam przy każdym przebiegu.
  6. Podsumowanie wymienia wszystkie odpowiedzi i kroki, które zostaną uruchomione. Utwórz projekt je wysyła.
  7. Postęp śledzi zadanie każdego kroku: repozytorium i jego pierwszy commit, pierwsze budowanie, potem wdrożenie testowe, publikację w App Center i publikację w sieci, jeden po drugim. Wiersz pokazuje swój stan i koniec logu; kliknięcie pokazuje log. Nieudany krok mówi dlaczego i oferuje Ponów, a kolejne kroki czekają. Na końcu Otwórz projekt, Otwórz w edytorze i Otwórz w Forgejo. Przeładowanie strony lub powrót do jej karty odczytuje zadania ponownie i żaden krok nie jest wysyłany dwa razy. Opuszczenie strony zatrzymuje łańcuch; widok Projektu ma te same kroki.

Gdy bvsd odmawia utworzenia projektu (nazwa zajęta przez folder, aplikację lub repozytorium, właściciel, w którym nie możesz tworzyć), strona wraca do kroku z tą odpowiedzią, pokazuje powód pod jej polem i zachowuje wszystkie inne odpowiedzi. Wyłączony moduł (admin włącza go ze strony), brak konta w Forgejo i brak środowiska Debian lub Ubuntu dla aplikacji App Buildera są objaśnione w Przeglądzie.

Co robi pierwsze zadanie:

Workflow działa na runnerze NAS-a przy każdym pushu, gdy moduł CI jest włączony, w środowisku wskazanym w workflow. Workflow QPKG publikuje pakiet w repozytorium pakietów, które przyjmuje tylko pakiety podpisane kodem. Jeśli pierwszy commit lub jego push się nie uda po utworzeniu repozytorium, zadanie usuwa folder, ponownie usuwa repozytorium i podaje przyczynę. Gdy przełącznik projektu Opublikuj w repozytorium App Center jest wyłączony, bvs repo publish w workflow wypisuje komunikat zamiast publikować, a przebieg trwa dalej.

Widok projektu

Każdy folder projects/ w folderze danych ma własną stronę: projekt z kreatora, kopię przykładu z Projektów edytora albo repozytorium, które tam sklonowałeś. Otwiera się z gałęzi Projekty paska bocznego Edytora, ze strony Projekty, z Otwórz projekt na końcu Nowego projektu i z palety poleceń (Otwórz projekt … albo Ctrl+P i nazwa). Wymaga roli dewelopera. Menu projektu na stronie Projekty ma też Zbuduj, Zbuduj ponownie, Opublikuj i publikację w celach WWW. To samo menu włącza i wyłącza publikowanie przez CI w App Center.

Strona czyta folder i sama niczego w nim nie zmienia. Typ projektu ustala z jego plików: aplikacja App Buildera o nazwie folderu, qpkg.cfg na górze (pakiet QPKG), Makefile na górze albo nic z tego, gdy projekt buduje jego workflow CI. Gdy aplikacja App Buildera ma nazwę folderu, projekt z qpkg.cfg na górze albo z Makefile i qpkg.cfg w qpkg/ zachowuje własny sposób budowania, a Wdrożenie testowe i Publikowanie dalej biorą jego QPKG.

Pasek na górze zawiera kroki. Krok, który nie może się uruchomić, zachowuje swój przycisk, wyłączony, i mówi dlaczego obok niego i pod paskiem. Krok, którego projekt w ogóle nie może wykonać, znika z paska, a jedno zdanie pod nim mówi, co projekt tworzy i gdzie trafia wynik budowania: do folderu projektu dla programu, na stronę Jądra dla modułu jądra, na stronę każdej aplikacji dla Makefile, który buduje tylko aplikacje App Buildera.

Projekt z Makefile wybiera cel obok Zbuduj (domyślny cel make, czyli pierwszy, chyba że wybierzesz inny); projekt CMake buduje się albo buduje i uruchamia testy. Projekt modułu jądra buduje się w obszarze roboczym warsztatu jądra dla działającego jądra, a takie budowanie należy do admina. Działający krok ma Anuluj, a zadanie zwykle kończy się od razu. Uruchom workflow uruchamia ręcznie workflow CI projektu, gdy workflow ma wyzwalacz workflow_dispatch; w przeciwnym razie przycisk jest wyłączony, a strona mówi dlaczego. Workflow każdego szablonu ma ten wyzwalacz. Zainstalowane na tym NAS-ie wymienia pakiety zainstalowane przez wdrożenia testowe projektu, z Usuń z tego NAS-a dla admina. Usuń projekt, w menu obok przycisków nagłówka albo w menu projektu na stronie Projekty, jest dla admina lub dewelopera, którego konto Forgejo zawiera repozytorium. Najpierw wpisujesz nazwę projektu; folder znika, a repozytorium Forgejo, aplikacja App Buildera o tej nazwie i zainstalowane pakiety zostają. Strona podaje potem link do repozytorium.

Ustawienia zawierają to, co bvsd zapamiętuje dla projektu poza jego folderem. Dla projektu z Makefile, CMake albo QPKG pokazują środowisko, w którym działają Zbuduj i Zbuduj ponownie, i je zmieniają. Dla Makefile, który tylko tworzy i buduje aplikacje App Buildera, wymieniają każdą aplikację ze środowiskiem, które podaje jej wiersz w Makefile. Projekt, który tworzy pakiet albo którego workflow uruchamia bvs repo publish, ma tam przełącznik Opublikuj w repozytorium App Center: gdy jest włączony, bvs repo publish w CI projektu dodaje jego pakiety do repozytorium; gdy jest wyłączony, przebieg CI pomija ten krok z komunikatem. Projekt bez zapamiętanego wyboru (kopia przykładu, klon) ma go włączonego. Git pokazuje gałąź, ile jest przed lub za zdalnym repozytorium według ostatniego fetcha (strona nigdy nie robi fetcha), ostatni commit i zmienione ścieżki. Pliki wymienia jeden folder naraz; wybierz plik, aby go przeczytać, a .qpkg się pobiera. Edycja zostaje w edytorze, a folder .git jest pominięty.

Przepisy, dla projektu z własnym folderem recipes/, wymienia przepisy, które biorą jego aplikacje: każdy z wersją, z wersją z biblioteki, którą zastępuje, gdy ma nazwę przepisu z biblioteki, a pod spodem z tym, co znalazła kontrola przepisów, z plikiem i wierszem. Przepis, który bvsd pomija, ma wiersz z powodem; gdy w ten sam sposób pominięto więcej niż trzy, resztę liczy jeden wiersz. To, co kontrola znalazła w folderze recipes jako całości, ma własny wiersz. Kliknięcie otwiera folder przepisu w edytorze; menu kopiuje też polecenie, które uruchamia tę samą kontrolę w terminalu NAS-a: bvs recipe lint z folderem projektu. Karta pojawia się też, gdy recipes projektu jest dowiązaniem, plikiem, folderem, którego bvsd nie może odczytać, albo folderem z samymi dowiązaniami, i mówi, dlaczego żaden przepis nie jest z niego czytany.

Usługa i pakiet (pakiet QPKG albo projekt z Makefile i pakietem w qpkg/, na przykład pakiet ze źródeł) zawiera skrypt uruchamiania i zatrzymywania pakietu w postaci bloków, pola jego qpkg.cfg (Pakiet) i pliki z nich zapisane (Skrypt). Zapisz pokazuje różnice w każdym pliku, potem tworzy commit w repozytorium projektu; jeśli projekt w międzyczasie się zmienił, zaplanuj ponownie. Edytuj ręcznie wyłącza bloki, więc skrypt edytujesz w edytorze; Podłącz bloki ponownie pokazuje, co zastąpiłoby ponowne zapisanie. Zaktualizuj bibliotekę wnosi do pakietu bvs-qpkg.sh z tego Bucket & Code Server IDE, z różnicami. Projekt utworzony przed blokami oferuje Użyj bloków dla tego skryptu.

Wersje wymienia, na co można przełączyć projekt, a Przełącz na tę wersję to robi:

WersjaCo robi przełączenie
.qpkg w build/ albo eksport App Builderawdrożenie testowe tego pliku (admin)
Wersja zbudowana w App Builderzeaktywuje ją (admin); App Builder zachowuje jedną zbudowaną wersję
Wersja w repozytorium pakietówustawia ją jako wersję na liście (admin)
Tag gitwybiera tag w folderze

Kliknięcie wybiera wersję; jej menu także wdraża testowo, publikuje, publikuje w celu WWW albo pobiera .qpkg. Tag jest wybierany jako odłączony HEAD, a Wróć do main w karcie Git wraca do gałęzi. Przełączenie jest odrzucane, gdy folder ma niezatwierdzone zmiany; komunikat je wymienia, a ty najpierw zatwierdzasz je lub odkładasz w edytorze. Zaznacz dwie wersje, a Porównaj obie wymienia pliki, które ma jedna, a nie ma druga, oraz pliki zmienione. Dwa tagi albo dwa pakiety są porównywane po zawartości; pakiet z commitem tylko po rozmiarze. Na stronie Pakiety admin instaluje też wersję z repozytorium na tym NAS-ie (Zainstaluj na tym NAS-ie) z kontrolami wdrożenia testowego.

Własny serwer WWW (cele WWW)

Cel WWW to miejsce, w którym admin publikuje pakiet lub stronę WWW na własnym serwerze WWW: folder tego NAS-a (udział Web systemu QTS, który udostępnia Web Server QTS, albo inny folder udostępniony) lub zdalne miejsce rclone (SFTP, FTP, WebDAV, S3, skonfigurowane w rclone.conf kopii zapasowych), z adresem publicznym, który je udostępnia. Są na stronie Publikowanie, w sekcji Cele WWW: Dodaj cel, Zmień, Usuń i Sprawdź, który kopiuje tam mały plik, pobiera go z adresu publicznego i znowu go usuwa.

Cel w folderze to osobny folder w udziale (/share/Web/mojastrona, nigdy cały udział ani wolumin), poza folderem danych, bo publikacja strony usuwa z celu to, czego strona już nie zawiera. Adres zaczyna się od http:// lub https:// i nie zawiera użytkownika ani hasła.

Każda publikacja odczytuje plik z powrotem przez adres publiczny: .qpkg pakietu z jego .sha256, porównany po sha256, albo index.html strony, porównany bajt po bajcie. Gdy adres nie udostępnia tego, co skopiowano, zadanie kończy się błędem web_check: z obiema wartościami.

Runnery CI

Moduł CI uruchamia Forgejo Actions: plik workflow w katalogu .forgejo/workflows/ repozytorium uruchamia się na runnerze, gdy coś trafi do repozytorium przez push. Moduł potrzebuje modułu Git. Administrator włącza go w Moduły, CI, Włącz. Zadanie rejestruje w Forgejo własny runner NAS-a, uruchamia Forgejo ponownie z włączonym Actions i uruchamia runner; kończy się, gdy runner połączy się z Forgejo.

Runner na NAS-ie

Zewnętrzne runnery

Maszyna do budowania w innym miejscu (serwer, maszyna wirtualna) też może przyjmować zadania z tego Forgejo. Na stronie CI, w części Zarejestruj zewnętrzny runner, administrator nadaje mu nazwę i dostaje polecenia dla Linuksa x86_64 i aarch64. Pobierają one forgejo-runner 13.2.0 z code.forgejo.org, sprawdzają jego sumę sha256, zapisują token runnera w pliku runner-token (czytelnym tylko dla właściciela) i uruchamiają runner z etykietą linux-amd64 (albo linux-arm64). Runner od razu jest na liście, offline do czasu uruchomienia poleceń. Token pojawia się tylko wtedy. Taki runner wykonuje zadania na swojej maszynie, jako użytkownik, który go uruchomił, i łączy się z Forgejo pod jego publicznym adresem.

SVN i Bucket

Moduł SVN i Bucket udostępnia repozytoria Subversion pod /svn/<nazwa> i buckety pod /bucket/<nazwa>. Bucket to dysk sieciowy (WebDAV), w którym każdy zapisany plik staje się rewizją, więc każdą wcześniejszą wersję pliku można odczytać albo przywrócić. Administrator włącza moduł w Moduły; strona SVN i Bucket zakłada, pokazuje i usuwa oba typy.

Repozytoria SVN

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

Strona podaje polecenie checkout z adresem repozytorium. Za proxy adres idzie za publicznym URL-em, a z nazwą hosta SVN jest to /svn/<nazwa> na tej nazwie. Historia repozytorium pokazuje jego rewizje; plik można odczytać w dowolnej rewizji, porównać z inną i przywrócić jako nową rewizję (Przywróć tę wersję, dla kont z odczytem i zapisem).

Buckety

Klienty WebDAV i ich ograniczenia

KlientJak się połączyćUwagi
Finder w macOSIdź, Połącz z serwerem, https://<adres NAS-a>:9951/bucket/<nazwa>Finder blokuje plik na czas zapisu; bucket odpowiada na blokady WebDAV
rclonezdalny zasób webdav z vendor = other i adresem bucketudobre do kopiowania ze skryptów
davfs2 (Linux)mount -t davfs https://<adres NAS-a>:9951/bucket/<nazwa> /mnt/<katalog>nazwa użytkownika z panelu i hasło albo hasło aplikacji
Cyberduck, WinSCPpołączenie WebDAV (HTTPS) z portem 9951, ścieżka /bucket/<nazwa>
curlcurl -T plik -u <użytkownik> https://<adres NAS-a>:9951/bucket/<nazwa>/plikjedno wysłanie, jedna rewizja (albo dwie, zob. wyżej)
Eksplorator WindowsMapuj dysk sieciowyWebClient w Windows wysyła hasło tylko przez HTTPS z certyfikatem, któremu Windows ufa: bucket trzeba postawić za proxy z prawdziwym certyfikatem (Za odwrotnym proxy); certyfikat samopodpisany nie wystarczy

Pokazywanie repozytorium albo bucketu osobom bez konta

Administrator może udostępnić repozytorium SVN albo bucket przełącznikiem w jego wierszu na stronie SVN i Bucket (W sieci). Każdy, kto zna adres, może je wtedy czytać w przeglądarce bez konta:

AdresCo pokazuje
https://<adres NAS-a>:9951/svn-web/<nazwa>/repozytorium SVN
https://<adres NAS-a>:9951/bucket-web/<nazwa>/bucket

Link Zobacz w sieci w wierszu otwiera tę stronę. Pokazuje pliki i foldery w najnowszej albo starszej rewizji, plik tekstowy z numerami wierszy (do 1 MiB) albo obraz, a każdy plik da się pobrać. Historia pokazuje rewizje z autorami, opisami i zmienionymi plikami. Strona rewizji pokazuje różnice każdego zmienionego pliku (do 20 plików po najwyżej 1 MiB; pozostałe są linkami); dowolny plik można porównać między dwiema rewizjami.

Edytor i narzędzia AI

Moduł Edytor uruchamia VS Code w przeglądarce (code-server) dla każdego konta z rolą developer lub admin. Administrator włącza go w Moduły. Każde konto ma własną instancję: startuje, gdy konto otwiera edytor, i zatrzymuje się po czasie bez ruchu.

Terminal edytora to powłoka roota na NAS-ie. W QTS procesy pakietu działają jako admin (uid 0), poza Forgejo i httpd. Rolę developer należy dawać tylko osobom, którym dałoby się hasło administratora NAS-a.

Otwieranie edytora

Edytor odpowiada tylko własnym stronom. WebSocket, formularz albo żądanie skryptu, które wysyła inna strona z sesją konta, z innej witryny albo z innego portu NAS-a, dostaje 403 i nie uruchamia żadnej instancji, więc inna strona nie dosięgnie też serwera deweloperskiego za widokiem Ports.

Rozszerzenia

Claude Code, Gemini CLI i Codex CLI

W sekcji Narzędzia AI wiersza poleceń na stronie Ustawienia edytora każde konto instaluje, aktualizuje i usuwa te narzędzia dla siebie:

NarzędzieInstalacjaPolecenie
Claude Codeinstalator Anthropic (claude.ai/install.sh), npm, gdy ten zawiedzieclaude
Gemini CLInpm install -g @google/gemini-cligemini
Codex CLInpm install -g @openai/codexcodex

Programowanie z asystentem AI

Każdy projekt utworzony przez Nowy projekt zawiera skill dla asystentów AI: .claude/skills/qnap-dev/ i plik AGENTS.md, który na niego wskazuje. Skill, po angielsku, zawiera wytyczne do wszystkiego, co dotyczy NAS-a QNAP: czym jest on w powłoce (główny system plików w RAM-dysku, BusyBox, brak systemd i menedżera pakietów, getcfg i setcfg), pamięć masowa i ścieżki, jak budować, podpisywać i publikować tym pakietem (bvs env run, bvs ldd, bvs qbuild, App Builder, warsztat jądra, repozytorium pakietów), porty, kopie zapasowe oraz czego nie wolno proponować, na przykład apt na NAS-ie albo dopuszczania aplikacji bez podpisu w App Center. Mówi wprost, że podpisywanie kluczem sprzętowym nie jest obsługiwane ani testowane.

Toolchainy i środowiska

Strona Toolchainy pobiera to, co jest potrzebne do budowania oprogramowania na NAS-ie:

TypCo to jestPrzykłady
System plików rootsystem Linux do rozpakowania w środowiskuDebian 12 i 13, Ubuntu 22.04 i 24.04, Alpine 3.22
Cross-toolchainkompilator, który buduje dla innego procesoratoolchainy Bootlin dla aarch64, x86-64 i armv7, z glibc albo musl
Środowisko uruchomieniowejęzyk lub narzędzie do budowaniaPython, Go, Node.js, Zig, Rust, CMake, Ninja, Java (JDK)
QNAPwłasne narzędzia QNAPQDK 2.5.0, dla bvs qbuild i eksportu jako QPKG
Źródło jądradrzewo jądra Linux dla warsztatu jądraLinux 6.6.129 z kernel.org; wydanie GPL jądra QNAP dla QTS 5.2.3

Pozycje dla innego procesora są ukryte; „Pokaż pozycje dla innych procesorów” je wyświetla, ale nie da się ich zainstalować. Toolchainy Bootlin działają na x86_64, więc NAS z procesorem ARM nie ma cross-toolchaina.

Katalog

Pakiet ma wbudowany katalog. Podpisany zdalny katalog pod https://pub.qnaputilities.com/bucketvs/catalog.json może dodawać pozycje bez nowego pakietu. bvsd używa go tylko wtedy, gdy jego podpis ed25519 pasuje do klucza wbudowanego w pakiet i gdy nie jest starszy niż katalog w użyciu. „Odśwież katalog” pobiera go od razu, a wbudowane zadanie cron „Odświeżanie katalogu toolchainów” pobiera go codziennie o 04:15.

Instalowanie i usuwanie

Instalowanie należy do admina; jego postęp widać na stronie Zadania:

  1. Archiwum jest pobierane do toolchains/cache/ w folderze danych. Przerwane pobieranie wznawia się przy ponownym uruchomieniu instalacji.
  2. Jego sha256 jest porównywane z katalogiem. Niezgodność usuwa plik.
  3. Cross-toolchain albo środowisko uruchomieniowe jest rozpakowywane do toolchains/<typ>/<id>, a archiwum usuwane. System plików root i źródło jądra zostają jako archiwum; każde środowisko i każdy obszar roboczy jądra rozpakowuje własną kopię. QNAP publikuje swoje wydanie GPL jądra w dwóch częściach: obie są pobierane, każda sprawdzana własnym sha256, a potem łączone.

Pełny wolumin przerywa instalację błędem „no space left on” z punktem montowania woluminu.

„Usuń” usuwa zainstalowaną pozycję. Środowiska utworzone z systemu plików root są kopiami i zostają.

Używanie toolchaina lub środowiska uruchomieniowego

bvs use <id> wypisuje wiersze export (na przykład PATH), które włączają w powłoce zainstalowany cross-toolchain albo środowisko uruchomieniowe:

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

Strona Toolchainy pokazuje te same wiersze w „bvs use” przy każdej zainstalowanej pozycji.

Środowiska

Środowisko to system Linux rozpakowany z systemu plików root do envs/<nazwa> w folderze danych. Można je zmieniać: w środowisku z Debianem albo Ubuntu działa apt install build-essential, a to, co zainstalujesz, zostaje w nim.

W środowisku:

To samo z powłoki (przykłady wywołują bvs po nazwie, jak mogą to zrobić zadanie cron i sesja SSH na NAS-ie, gdy pakiet działa):

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 i bvs env run zaczynają w folderze, z którego je uruchomiono. Folder w projects/ katalogu danych to ten sam folder w /projects wewnątrz środowiska. Każdy inny folder (kopia repozytorium w zadaniu CI, folder w udziale) jest montowany w /work i polecenie zaczyna tam. Uruchomione z / zaczynają w /projects.

Budowanie QPKG przez bvs qbuild

bvs qbuild buduje pakiet QPKG z folderu, w którym je uruchomiono (folderu z qpkg.cfg, takiego jak ten, który tworzy szablon QPKG w Nowym projekcie). Uruchamia qbuild QNAP-a wewnątrz środowiska Debian lub Ubuntu. qbuild wywołuje programy systemowe pełnymi ścieżkami, a w środowisku te ścieżki prowadzą do programów środowiska zamiast do własnych programów NAS-a. Pakiet trafia do build/ w tym folderze.

bvs tc install qdk-2.5.0-x86_64      # raz; na NAS-ie ARM qdk-2.5.0-aarch64
cd /share/CACHEDEV1_DATA/BucketVS/projects/MyTool
bvs qbuild                           # --env <nazwa> wybiera środowisko

Używa środowiska ubuntu2404-builder (przykład „Ubuntu 24.04 builder”), a bez niego debian12-builder, a bez niego innego środowiska Debian lub Ubuntu, i potrzebuje w nim rsync. Gdy czegoś brakuje, zatrzymuje się i podaje polecenie, które to dodaje, na przykład bvs env run ubuntu2404-builder -- apt-get install -y rsync. Argumenty po bvs qbuild trafiają do qbuild. Zanim qbuild ruszy, bvs qbuild mówi, który przypadek podpisywania kodu dotyczy folderu.

Środowisko ma własne pliki i narzędzia. Wszystko w nim działa jako root, widzi każdy proces na NAS-ie i korzysta z sieci NAS-a.

Podpisywanie kodu QPKG

App Center sprawdza podpis kodu pakietu przy instalacji. Do podpisania potrzebny jest certyfikat podpisywania kodu wydany przez QNAP. bvs qbuild w pierwszym wierszu podaje jeden z trzech przypadków, na przykład bvs: code signing, case 1 (a certificate as files): …:

PrzypadekW folderze leżyCo się dzieje
1, certyfikat w plikachcertificate i private_key, opcjonalnie ca_certs (łańcuch)qbuild podpisuje pakiet przez openssl; środowisko potrzebuje openssl i bsdextrautils
2, certyfikat na kluczu sprzętowymcertificate_hsmnieobsługiwany i nietestowany: bvs qbuild zatrzymuje się, zanim cokolwiek zbuduje
3, bez certyfikatużadnego z tych plikówpakiet powstaje bez podpisu

App Builder

App Builder kompiluje wybrane programy do jednego folderu, prefiksu aplikacji (domyślnie /usr/app/my_app_prefix), w środowisku.

Zakładka Przykłady w Aplikacjach ma gotowe aplikacje, środowiska, workflow CI, zadania cron i Projekty edytora. Zobacz kod na karcie przykładu pokazuje, co przykład tworzy, zanim go użyjesz, dla każdej roli: pliki projektu edytora, plik workflow, polecenie zadania cron, a dla aplikacji jej receptury w kolejności budowania z plikami build.sh i recipe.json każdej z nich. Podgląd jest tylko do odczytu i pokazuje pliki tekstowe; środowisko nie ma plików, więc jego karta nie ma tego przycisku. Użycie przykładu wymaga roli developer, a środowiska roli admin: karta środowiska nie ma dla developera przycisku Użyj tego przykładu.

Receptury

Każdy program powstaje z receptury. Receptura podaje swoje źródło z sha256, receptury, od których zależy, narzędzia do budowania potrzebne w środowisku i sprawdzenie, które dowodzi, że wynik działa (na przykład bin/bash --version). Są receptury bibliotek (zlib, openssl, ncurses, readline i inne), powłok (bash, zsh, busybox), narzędzi (coreutils, curl, git, jq, rsync, tmux, htop, nano i inne), serwerów (nginx, redis, openssh, dropbear) i języka (lua).

Aktualizacje przepisów

Nowe i zaktualizowane przepisy przychodzą też jako podpisany katalog z pub.qnaputilities.com, więc trafiają na NAS przed następnym wydaniem Bucket & Code Server IDE. bvsd raz dziennie sprawdza, czy jest nowszy katalog. Używa go tylko wtedy, gdy podpis pasuje do klucza wbudowanego w bvsd, każdy plik zgadza się z listą katalogu, a jego przepisy są nowsze niż te dostarczone z pakietem; katalog, który nie przejdzie sprawdzenia, nigdy nie jest używany. Gdy katalog jest w użyciu, Nowa aplikacja oznacza przepisy, które przyniósł, jako nowy w katalogu albo zaktualizowany przez katalog.

Karta Biblioteka przepisów na stronie Aplikacje pokazuje, której biblioteki używa budowanie (Biblioteka z pakietu z wersją pakietu albo Katalog z wersją katalogu), oraz ostatnie sprawdzenie i jego wynik. Administrator ma tam dwa przyciski; drugi pojawia się, gdy katalog jest w użyciu:

Po przełączeniu przebudowa używa ponownie każdego przepisu, którego pliki się nie zmieniły. Przed każdym budowaniem bvsd jeszcze raz sprawdza pliki katalogu. Jeśli któryś zmienił się na NAS-ie, budowanie zatrzymuje się, zanim cokolwiek się uruchomi, a dalej używany jest poprzedni katalog albo biblioteka z pakietu.

Budowanie aplikacji

Aplikacje, Nowa aplikacja (rola developer) pyta o nazwę, prefiks (/usr/app/<nazwa>, chyba że wybierzesz inny), środowisko, w którym aplikacja się buduje (środowisko Debian albo Ubuntu; galeria Przykładów zakłada „Ubuntu 24.04 builder”, które strona wybiera jako pierwsze), cel (architektura tego NAS-a albo aarch64 lub armv7 jako kompilacja skrośna), na jakich modelach NAS aplikacja działa, tryb linkowania i przepisy. Przepisy, od których zależą, dochodzą w kolejności budowania.

Aplikacja może też brać przepisy jednego projektu, który ma własny folder recipes/. Wybierz ten projekt w polu Przepisy z projektu na kroku Pakiety. Jego przepisy są na liście pierwsze, pod nazwą projektu i z oznaczeniem projekt, a za nimi są przepisy z biblioteki. Przepis projektu o nazwie przepisu z biblioteki zastępuje go w tej aplikacji i pokazuje, którą wersję z biblioteki zastępuje. Przepis, który projekt pomija, jest wymieniony z powodem. Wybrany przepis, którego nie ma na liście projektu, jest wymieniony pod polem wyboru i pominięty w aplikacji; wraca, gdy wybierzesz listę, która go ma. Strona aplikacji podaje nazwę projektu, a programista otwiera z niej widok projektu. Viewer widzi przepisy ostatniego budowania aplikacji w kolejności z jego logu, każdy ze stanem i logiem; przed pierwszym budowaniem nie ma kolejności do pokazania.

Każdy tryb linkowania ma swoją kartę: rysunek tego, gdzie programy znajdują biblioteki, koszt trybu (rozmiar, aktualizacje, gdzie aplikacja działa) i przepisy, które ten tryb obsługują. Zanim wybierzesz przepisy, karty liczą całą bibliotekę przepisów; gdy wrócisz do pierwszego kroku, liczą przepisy twojego budowania. Dla aplikacji statycznej wybierasz, co się dzieje z przepisami, których nie da się zlinkować statycznie: budować je jako pakiet albo je pominąć.

Budowanie Qt uruchamia własne narzędzia Qt (moc, rcc i, do tłumaczeń, lrelease z Linguista). Dlatego w kompilacji skrośnej przepisy Qt (qtbase, qttools) najpierw budują te narzędzia dla tego NAS-a, do host/ pod prefiksem, a potem Qt dla celu; przepisy budowane na Qt uruchamiają narzędzia stamtąd. Nic na celu nie uruchamia host/. Należy on do zbudowanej aplikacji, więc archiwum i Eksportuj jako QPKG też go zawierają.

Własne przepisy

Gdy w bibliotece przepisów nie ma przepisu na program, projekt może mieć własny. Przepisy trafiają do folderu recipes/ projektu, w formacie biblioteki, i budują je tylko aplikacje, które wskazują ten projekt. Pakiet powstaje tak w pięciu krokach:

  1. Utwórz projekt. W Nowym projekcie szablon Package from source (pakiet ze źródeł) tworzy folder z przepisem startowym nazwanym jak projekt, Makefile dla dwóch aplikacji (jednej dla procesora tego NAS-a, drugiej dla aarch64, kompilowanej skrośnie na NAS-ie x86_64) i skrypt startu i zatrzymania pakietu z kroku Usługa.
  2. Napisz przepis. New recipe w edytorze dodaje kolejny przepis z tego samego przepisu startowego (Otwieranie edytora). Wpisz do recipe.json prawdziwy adres źródła programu i jego sha256 (curl -fsSL <adres> | sha256sum w terminalu edytora wypisuje sumę), a kroki budowania do build.sh. Folder przepisu zawiera recipe.json, build.sh i plik vendor wskazany w recipe.json, nic więcej, więc łatka trafia do build.sh jako here-document.
  3. Sprawdź go. Każdy zapis pliku przepisu sprawdza przepisy projektu i pokazuje wyniki w widoku Problems; make lint w terminalu i karta Przepisy w widoku projektu dają te same wyniki. Kontrola czyta recipe.json i parsuje build.sh przez bash -n. Nigdy nie uruchamia przepisu.
  4. Zbuduj. Zbuduj w widoku projektu tworzy obie aplikacje, gdy ich brakuje, i buduje je jedną po drugiej. Budowanie czyta przepisy projektu raz, na starcie, więc plik zapisany później czeka na następne budowanie. Przepis projektu o nazwie przepisu z biblioteki zastępuje go tylko w aplikacjach tego projektu, a log budowania o tym mówi.
  5. Spakuj i zainstaluj. make qpkg w terminalu edytora pakuje najnowsze udane budowanie każdej aplikacji w pakiet przez QDK z Toolchainów i pomija aplikację, która go nie ma. Gdy pliki podpisu kodu leżą w qpkg/ obok qpkg.cfg albo w folderze wskazanym przez QPKG_CERT_DIR, pakiet jest podpisany (Podpisywanie kodu QPKG), a Wdrożenie testowe w widoku projektu (admin) instaluje go na tym NAS-ie.

Kilka zasad dotyczy przepisów projektu:

Na jakich modelach NAS działa aplikacja

Program zbudowany z glibc uruchamia się tylko na NAS-ie, którego glibc jest co najmniej tak nowa jak najnowsza wersja, o którą program prosi. Pakiet zakłada glibc 2.39 lub nowszą na każdym NAS-ie, na którym działa (QTS 6.0, QuTS hero 6.0 i nowsze): to jego próg glibc. 2.39 to glibc Ubuntu 24.04 i QuTS hero 6.0.1, odczytana z własnego /lib/libc.so.6 tego firmware'u; QNAP nie podaje wersji glibc, a jego informacje o wydaniach nie wymieniają QTS 6.0. Testowe NAS-y z QTS 6.1.0 i QuTS hero 6.1.0 mają 2.43.

Działa na w nowej aplikacji i w Zmień wybiera jedno z dwóch:

Kompilacja skrośna (aarch64 albo armv7) jest zawsze dla każdego NAS-a. Nowa aplikacja ostrzega, gdy glibc wybranego środowiska jest nowsza, niż aplikacja pozwala. Po każdym budowaniu bvsd odczytuje wersję glibc, o którą prosi każdy program i biblioteka, także w kompilacji skrośnej. Plik ponad limitem kończy budowanie błędem, a poprawki są podane: inne środowisko (Wybierz inne środowisko), tryb linkowania static albo Buduj tylko dla tego NAS. Strona aplikacji mówi, jakiej glibc wymaga jej najnowsza udana wersja, a karta Zależności wymienia każdy plik ponad limitem.

Na NAS-ie bvs tree-deps <prefiks> --tree <folder> --glibc-max 2.39 robi to samo sprawdzenie dowolnego drzewa aplikacji.

Aktywacja aplikacji na NAS-ie

Aktywuj (admin) robi z prefiksu dowiązanie do najnowszej udanej wersji aplikacji, więc jej programy działają na NAS-ie z /usr/app/<nazwa>/bin. Aktywacja nigdy nie podmienia czegoś, czego sama nie utworzyła: folder, plik albo inne dowiązanie pod prefiksem jest odrzucane z podaniem powodu. Dysk systemowy QTS powstaje od nowa przy każdym starcie, więc pakiet odtwarza dowiązania przy każdym uruchomieniu. Dezaktywuj (admin) usuwa dowiązanie; usunięcie aplikacji najpierw ją dezaktywuje i przenosi do kosza na 7 dni. Developer może usunąć aplikację tylko wtedy, gdy nie jest aktywna. Aplikacji zbudowanej dla innej architektury nie da się tu aktywować; jej archiwum można pobrać na NAS tego rodzaju.

Eksport aplikacji

Eksportuj jako QPKG (admin) pakuje najnowszą udaną wersję jako osobny pakiet QPKG, który instaluje aplikację na innym NAS-ie bez tego pakietu. Odmawia dla aplikacji zbudowanej tylko dla tego NAS-a i zatrzymuje się przed pakowaniem, gdy program ze zbudowanej wersji wymaga glibc nowszej niż 2.39 (zobacz Na jakich modelach NAS działa aplikacja). Potrzebuje QDK: zainstaluj „QNAP QDK 2.5.0” na stronie Toolchainy, karta QNAP. Dopóki QDK nie jest zainstalowane, przycisku nie ma, a strona aplikacji mówi, skąd je wziąć. Eksport uruchamia qbuild w środowisku aplikacji, tak samo jak bvs qbuild. Każde budowanie instaluje tam rsync; dla aplikacji zbudowanej ostatnio starszą wersją pakietu odmowa podaje polecenie, które go dodaje. Wyeksportowany pakiet tworzy dowiązanie prefiksu przy starcie i usuwa je przy zatrzymaniu. Nie jest podpisany certyfikatem kodu: log zadania podaje przypadek 3, tak samo jak wiersz pod przyciskiem. W sesji SSH /etc/init.d/<nazwa>.sh disable i enable ustawiają przełącznik wyeksportowanego pakietu w App Center i zostawiają dowiązanie prefiksu bez zmian. Przy każdym starcie wyeksportowany pakiet dopisuje też wiersz do /etc/profile i /root/.profile, który dodaje bin i sbin aplikacji do PATH logowania przez SSH, za własnymi poleceniami NAS-a, dla admina i każdego innego konta, które może się logować; usunięcie pakietu zabiera ten wiersz.

Repozytorium pakietów

Pakiet prowadzi repozytorium App Center: opublikowane w nim pakiety QPKG można instalować na innych NAS-ach z App Center, jak aplikacje z każdego repozytorium.

Warsztat jądra

Warsztat jądra buduje moduły jądra dla jądra, na którym działa NAS, sprawdza każdy z nich względem tego jądra i je ładuje. QNAP nie opublikował źródeł swoich obecnych jąder (jego wydania GPL kończą się na QTS 5.2.3), więc warsztat odczytuje to, co działające jądro pokazuje o sobie, i konfiguruje drzewo jądra tak, żeby do niego pasowało.

Co jest potrzebne

Profil

bvs kernel profile pokazuje, czym jest działające jądro: jego wydanie (6.6.129-qnap), kompilator, którym QNAP je zbudował, vermagic własnych modułów QNAP, rozmiar struct module w nich i miejsce funkcji init i exit, czy moduły muszą być podpisane, oraz ustawienia, które dostaje drzewo jądra, żeby do niego pasowało.

Obszar roboczy

bvs kernel prepare tworzy obszar roboczy działającego jądra w kernels/<wydanie> folderu danych:

  1. Bierze źródło jądra, które katalog ma dla tej wersji (bvs kernel sources): własne drzewo GPL QNAP, gdy QNAP je opublikował, a w przeciwnym razie drzewo z kernel.org, w którym brakuje zmian QNAP. --source wybiera inne.
  2. Konfiguruje drzewo: konfiguracją QNAP dla tego modelu, gdy drzewo jest od QNAP, a w przeciwnym razie ustawieniami z profilu. --option NAZWA=m dodaje ustawienie, na przykład sterownik.
  3. Przygotowuje drzewo do budowania modułów (--full buduje zamiast tego całe jądro, co trwa dużo dłużej i pozwala sprawdzeniu zobaczyć symbole eksportowane przez jądro).
  4. Sprawdza, czy drzewo buduje dokładnie dla wydania działającego jądra.

Działa jako zadanie na stronie Zadania. Nieudane przygotowanie zostawia drzewo z poprzedniego.

Budowanie modułu

Moduły z budowania są zapisywane w kernels/<wydanie>/modules/. Modułu, który QNAP dostarcza dla tego jądra, nie ma tam: ładuje się własna kopia QNAP. bvs kernel make --build-only niczego tam nie zapisuje: moduł zostaje tam, gdzie powstał. Tak budują workflow CI szablonów jądra z Nowego projektu.

Sprawdzenie i ładowanie

bvs kernel check <moduł> porównuje moduł z działającym jądrem: vermagic, rozmiar struct module i miejsce funkcji init i exit w nim (względem własnych modułów QNAP), czy wymagany jest podpis, moduły, od których zależy, i każdy symbol, którego potrzebuje. Każde ustalenie mówi, co się nie zgadza i co zrobić. Kod wyjścia 3 oznacza, że modułu nie wolno ładować.

bvs kernel load <moduł> wykonuje sprawdzenie jeszcze raz i ładuje moduł, a najpierw moduły, od których zależy (własne QNAP z NAS-a albo Twoje). Moduł z błędem w sprawdzeniu nigdy nie jest ładowany. bvs kernel unload <moduł> go usuwa; moduł w użyciu zostaje załadowany. Każde załadowanie i usunięcie jest zapisywane w log/kernel-modules.log.

Jądro QNAP nie wymienia swoich symboli danych, więc sprawdzenie nie może wyszukać symboli takich jak jiffies; podaje je jako ostrzeżenia. Jeśli któregoś brakuje, jądro odrzuca moduł przy ładowaniu.

Moduły w aplikacji

Aplikacja może wskazać moduły z obszaru roboczego. Aktywacja aplikacji ładuje je, zanim powstanie jej link, a każdy start pakietu ładuje je ponownie, gdy panel już działa; strona Jądra pokazuje ładowanie, które jeszcze trwa. Dezaktywacja najpierw je usuwa; moduł w użyciu zostawia aplikację aktywną.

Po aktualizacji QTS do innego jądra moduły trzeba zbudować ponownie w obszarze roboczym nowego jądra. Tak samo po przywróceniu do innego folderu danych: kernels/ nie wchodzi do kopii zapasowej.

W panelu

Strona Jądra pokazuje profil działającego jądra, źródła jądra z katalogu, obszar roboczy i jego moduły. Administrator przygotowuje tam obszar roboczy (źródło, środowisko, dodatkowe ustawienia, całe jądro albo nie) i buduje moduły z folderu projektu albo z katalogu drzewa; oba działania są zadaniami. Sprawdź (developer) pokazuje każde ustalenie z naprawą; Załaduj i Wyładuj (admin) robią to samo co bvs kernel load i unload, a odrzucone ładowanie pokazuje sprawdzenie, które je zatrzymało. Plik .ko w dowolnym miejscu folderu danych można sprawdzić po ścieżce.

Zadania cron i operacje

Strona Zadania ma dwie listy: zaplanowane zadania (cron) i operacje (długie zadania, które wykonuje bvsd, na przykład instalacje i przenoszenie danych).

Zaplanowane zadania

Developer tworzy i zmienia własne zadania; admin zmienia wszystkie. Zadanie ma:

Każde zadanie przechowuje ostatnie 100 uruchomień z końcówką ich wyjścia (4 KB). Pełny log uruchomienia jest przechowywany 30 dni.

Zadanie działa jako root w imieniu swojego właściciela, z jego folderem domowym jako HOME, więc działa tylko wtedy, gdy właściciel jest włączonym developerem albo adminem. Gdy właściciel jest wyłączony albo ma rolę użytkownika lub viewer, każdy termin zadania jest zapisywany jako pominięte uruchomienie z powodem, np. „its owner ola is disabled”, a Uruchom teraz odpowiada tym samym powodem. Powiadomienie nie jest wysyłane. Uruchomienie, które trwa, gdy właściciel zostaje wyłączony albo dostaje rolę niższą niż developer, jest zatrzymywane. Zadanie znowu działa, gdy konto zostanie włączone albo znowu będzie developerem. Usunięcie konta usuwa jego zadania. Zadania wbudowane działają bez względu na to, co dzieje się z kontami.

Gdy polecenie się kończy, procesy uruchomione przez nie w tle działają dalej. Po przekroczeniu limitu czasu, usunięciu zadania albo zatrzymaniu pakietu cała grupa procesów uruchomienia dostaje SIGTERM, a po 5 sekundach SIGKILL.

W noce zmiany czasu zadania działają według reguły crona z Debiana. Zadanie z * na początku pola minut lub godzin (także */N), @hourly albo @every liczy upływ czasu: jesienią działa w obu przejściach powtórzonej godziny, a wiosną pominięta godzina nie nadchodzi. Każde inne zadanie wykonuje każdy swój termin raz: termin w powtórzonej godzinie wykonuje się raz, a termin w pominiętej godzinie zaraz po zmianie.

Każde zalogowane konto, także viewer, widzi polecenia zadań i wyjście ich uruchomień. Nie wpisuj haseł ani tokenów w polecenie: niech polecenie czyta je z pliku w <data>/etc, który czyta tylko root (chmod 600).

Zadania wbudowane

ZadanieKiedyCo robi
Konserwacjacodziennie o 03:30usuwa z tmp/ w folderze danych to, czego nic nie zmieniło przez 10 dni; rotuje log/audit.log po przekroczeniu 10 MB
Opróżnianie koszacodziennie o 03:45usuwa z trash/ w folderze danych to, co zostało tam przeniesione ponad 7 dni temu (na przykład folder domowy usuniętego konta)
Odświeżanie katalogu toolchainówcodziennie o 04:15pobiera podpisany katalog toolchainów
Rotacja logów nginxco godzinę, w 7. minuciezmienia nazwę nginx-access.log albo nginx-error.log na .1, gdy przekroczy 20 MB (pięć starszych plików zostaje), i każe nginxowi ponownie otworzyć logi

Admin może zmienić harmonogram, limit czasu, zachowanie przy trwającym uruchomieniu i powiadomienie zadania wbudowanego, a także je wyłączyć. Jego nazwa i polecenie się nie zmieniają.

Operacje

Instalacje, zadania środowisk, przenoszenie danych i włączanie modułów są wykonywane jako operacje. Lista pokazuje ostatnie 50, od najnowszej, z postępem i logiem. Operacje i ich logi są przechowywane 30 dni. Operacja, która trwała, gdy pakiet się zatrzymał, ma stan „przerwane”. Developer anuluje własne operacje; admin anuluje każdą.

Kopie zapasowe

Strona Kopie zapasowe (admin) ustawia, co jest kopiowane, kiedy, dokąd trafiają kopie i ile ich zostaje. Zrób kopię teraz robi kopię w każdej chwili. Na nowej instalacji kopie według harmonogramu są wyłączone; po włączeniu Kopie według harmonogramu kopia powstaje domyślnie codziennie (wbudowane zadanie cron backup). Zostaje najnowsza kopia z każdego z ostatnich 7 dni, 4 tygodni i 6 miesięcy, a zawsze najnowsza udana. Naraz trwa jedna kopia, weryfikacja, przywracanie albo usuwanie.

Dwie kopie z jednego dnia liczą się jako jeden dzień: gdy nowsza się skończy, wcześniejsza z tego dnia jest usuwana. Zrób kopię teraz po południu zastępuje więc poranną kopię z harmonogramu; jeśli stan z rana jest ważny, najpierw trzeba skopiować tę kopię w inne miejsce.

Co zawiera kopia

Kopia to folder <data>/backups/<id>/ z plikiem manifest.json, który wymienia każdy plik z jego sha256:

CzęśćCo
ustawieniaetc/: ustawienia, konta, sekrety TOTP, klucz TLS, klucze kopii zapasowych
Gitzrzut Forgejo: repozytoria, wiki, obiekty LFS, załączniki i jego baza
SVN, bucketykopia każdego repozytorium, przyrostowa: rewizja już skopiowana nie jest kopiowana ponownie
ustawienia VS Codeustawienia VS Code każdego konta, skróty klawiszowe, fragmenty kodu (snippets) i lista jego rozszerzeń (bez plików rozszerzeń: widok Extensions instaluje je ponownie)
środowiskaśrodowiska ze strony Toolchainy (domyślnie wyłączone: da się je utworzyć ponownie)
projektykażdy folder projektu z historią Gita i plikami jeszcze niezatwierdzonymi, bez node_modules
foldery HOMEfolder HOME każdego konta, bez pamięci podręcznych i instalacji samych narzędzi AI (przycisk Zainstaluj je przywraca)
App Builderustawienia każdej aplikacji i historia jej budowań; budowanie tworzy pliki aplikacji ponownie
repozytorium pakietówopublikowane pakiety, ich ikony i indeks, który czyta App Center

Te cztery części są w każdej kopii, niezależnie od tego, co zaznaczono na stronie. Folder, który nie zmienił się od poprzedniej kopii, jest dowiązany do jej egzemplarza i nie zajmuje miejsca.

Kopia staje się widoczna dopiero, gdy każda część jest zapisana i sprawdzona; błąd albo pełny wolumin usuwa niedokończony folder i zostawia wcześniejsze kopie bez zmian. Sprawdź czyta kopię w całości: sha256 każdego archiwum, svnadmin verify każdej rewizji, git fsck każdego repozytorium i sprawdzenie spójności bazy Forgejo.

Miejsca docelowe

Każda kopia trafia do każdego miejsca docelowego ze strony:

Kopia, która opuszcza NAS (rsync, rclone), musi być szyfrowana: włącz Szyfruj kopie, które opuszczają NAS i Utwórz klucz. Kopie są szyfrowane programem age do publicznej połowy klucza; tajna połowa jest pokazana raz, bvsd jej nie przechowuje. Bez niej żaden NAS, także ten, nie przywróci zaszyfrowanej kopii: trzeba ją przechować poza tym NAS-em. Nowy klucz szyfruje kopie od tej chwili; starsze kopie wymagają starego klucza tajnego.

Miejsce docelowe, które zawiedzie, jest wymienione w wyniku kopii; sama kopia pozostaje udana.

rclone.conf zawiera dane logowania do zasobów zdalnych. Zanim użyje go kopia albo Test, bvsd ustawia go (i klucz kopii) tak, by czytał go tylko root (tryb 600), jeśli tak nie jest, a log zadania o tym mówi.

Przywracanie

Przywróć przy kopii przywraca wszystko, jedno repozytorium (repozytorium SVN, bucket albo repozytorium Git) albo jeden folder projektu:

Powiadomienia

bvsd zapisuje każde powiadomienie w Dziennikach systemu QTS. Może też wysyłać je do komunikatorów i poczty przez adresy URL shoutrrr (Telegram, Discord, Slack, e-mail, zwykły webhook i inne).

PowiadomienieKiedyPrzełącznik dla adresów URL
błąd zadaniauruchomienie zadania cron z powiadomieniem po błędzie nie udało się albo przekroczyło limit czasu; operacja się nie udałanotify.on_job_failure
kopia zapasowawynik każdej kopii zapasowej, weryfikacji i przywracania, także udanych; zaplanowana kopia, która nie mogła wystartowaćnotify.on_backup
pętla restartówproces wszedł w pętlę restartównotify.on_crashloop
certyfikatdodanemu certyfikatowi zostało 30 dni lub mniej; nginx wrócił do certyfikatu z podpisem własnym; powstał nowy certyfikat z podpisem własnymnotify.on_cert_expiry
systemustawienia odrzucone przy starcie, znalezione niedokończone przenoszenie danych, zakończone pozostawione procesy, konfiguracja, której nie dało się zapisaćwysyłane zawsze

Adresy i przełączniki są w sekcji Powiadomienia na stronie System; przełączniki są domyślnie włączone. Admin zmienia je tam. Pozostałe konta widzą przełączniki i tylko schemat każdego adresu, bo reszta adresu zawiera jego token. Admin NAS-a może je też ustawić przez gniazdo CLI:

/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=<id czatu>"]}}' \
  http://bvsd/api/v1/settings

Logi i paczka diagnostyczna

Każdy log to log/<nazwa>.log w folderze danych. Logi bvsd i każdego procesu, którego pilnuje, są rotowane po 20 MB, a pięć starszych plików zostaje. nginx-access.log i nginx-error.log mają te same limity, sprawdzane przy każdym starcie bvsd i co godzinę przez zadanie „Rotacja logów nginx”, więc każdy z nich może urosnąć ponad 20 MB o ruch z co najwyżej godziny. Zadanie „Konserwacja” rotuje audit.log, gdy przekroczy 10 MB, i zostawia trzy starsze pliki. Strona Logi (admin) pokazuje ostatnie wiersze każdego logu, filtruje je i pokazuje nowe wiersze na żywo:

LogKto go zapisuje
bvsdsam bvsd: starty, zatrzymania, zastosowane ustawienia, problemy
nginxwłasne wyjście nginx
nginx-access, nginx-errorkażde żądanie i błędy nginx
auditkażde żądanie na gnieździe CLI
po jednym na proces modułuprogram każdego modułu

Strona System pokazuje wersję, platformę, strefę czasową i każdy proces, którego pilnuje bvsd. „Pobierz paczkę diagnostyczną” (admin) tworzy jedno archiwum do zgłoszenia błędu:

Nigdy nie zawiera haseł, sesji, tokenów ani kluczy.

Aktualizacje

bvsd czyta https://pub.qnaputilities.com/bucketvs/latest.json przy starcie i co 24 godziny. Gdy plik podaje nowszą wersję, strona System ją pokazuje razem z odnośnikiem z tego pliku. bvsd tylko informuje o nowej wersji: nigdy nie pobiera ani nie instaluje pakietu. Nieudane sprawdzenie niczego w panelu nie zmienia.

Instalowanie nowej wersji

Nowy pakiet instaluje się na starym, z App Center albo przez Instalację ręczną. Instalacja zatrzymuje bvsd, podmienia pliki programu i uruchamia go ponownie; folder danych, ustawienia, konta i wszystkie repozytoria zostają, tak samo sesje panelu. Instancje edytora zatrzymują się razem z bvsd, więc otwarte terminale edytora się kończą; instancja startuje znowu, gdy konto otworzy edytor.

Z wersji, która używała portów 6050, 6051 i 6052. Wcześniejsze wersje nasłuchiwały na 6050 (HTTP), 6051 (HTTPS) i 6052 (Git przez SSH). Pierwszy start nowej wersji przenosi każdy z nich na 9950, 9951 i 9952 i mówi o tym w powiadomieniu; port wybrany samodzielnie zostaje. Zmień to, co wskazuje stare porty: zakładki, proxy w Plesku na 6050 i zdalne repozytoria git, na przykład ssh://git@<NAS>:6052/… (git remote set-url).

Usuwanie, ponowna instalacja i uszkodzony pakiet

Twoja praca zostaje, gdy pakiet zostanie usunięty, zainstalowany ponownie albo się uszkodzi. Wszystko, co tworzysz, leży w folderze danych: konta i ustawienia, repozytoria Git i SVN, buckety, foldery projektów, foldery HOME, ustawienia i rozszerzenia VS Code, aplikacje App Buildera, środowiska, repozytorium pakietów i kopie zapasowe. Folder instalacji (<wolumin>/.qpkg/bucketvs) zawiera tylko programy i jeden plik, który wskazuje folder danych.

Awaria dysku to inna sprawa: folder danych leży na dyskach samego NAS-a. Trzymaj kopie zapasowe na innej maszynie (Kopie zapasowe); każda kopia zawiera Twoje foldery projektów, foldery HOME, ustawienia App Buildera i repozytorium pakietów.

Polecenie bvs

bvs to wiersz poleceń pakietu, w /usr/bin/bucketvs/bin. Jest na PATH każdego procesu, który uruchamia bvsd, także zadań cron. Gdy pakiet działa, /usr/bin/bvs jest dowiązaniem do niego, więc w sesji SSH na NAS-ie też można go wywołać po nazwie; zatrzymanie pakietu usuwa to dowiązanie.

Każde polecenie, które łączy się z bvsd przez gniazdo CLI, wymaga uprawnień root, bo gniazdo jest tylko dla roota: user, jobs, a gdy bvsd działa, także tc install, tc remove oraz env create, clone, export i delete. Uprawnień root wymagają też env shell, env run i qbuild, bo uruchamiają bvs-chroot. Uruchomione przez innego użytkownika polecenie, które potrzebuje gniazda, kończy się komunikatem „bvsd's CLI socket … is open to root only: run bvs as root”.

bvs env list
bvs env create <nazwa> --from <id-systemu-plików-root> [--package <nazwa>]...
bvs env shell <nazwa>
bvs env run <nazwa> -- <polecenie> [<argument>...]
bvs env clone <nazwa> <nowa-nazwa>
bvs env export <nazwa>
bvs env delete <nazwa>
bvs tc list
bvs tc install <id>
bvs tc remove <id>
bvs use <id>
bvs jobs
bvs user list
bvs user password <nazwa>
bvs user totp-reset <nazwa>
bvs guide [--path] [en|pl|de|fr|it|nl|sv|ja|zh-TW]
bvs qbuild [--env <nazwa>] [<argument-qbuild>...]
bvs kernel profile [--json]
bvs kernel sources
bvs kernel prepare [--source <id>] [--env <nazwa>] [--option NAZWA=WARTOŚĆ]... [--full]
bvs kernel make [--project <folder> | --dir <katalog-drzewa>] [--build-only] [<cel>...]
bvs kernel check <plik.ko | moduł>
bvs kernel load <moduł>
bvs kernel unload <moduł>

Pliki i foldery

ŚcieżkaCo to jest
/usr/bin/bucketvsprogramy pakietu (dowiązanie do jego folderu instalacji)
/usr/bin/bucketvs/etc/data-rootścieżka folderu danych
/usr/bin/bucketvs/var/run/bvsd.sockgniazdo API panelu (używa go nginx)
/usr/bin/bucketvs/var/run/bvsd-cli.sockgniazdo polecenia bvs, tylko dla roota
<folder danych>/etc/ustawienia, konta, sesje, tokeny, certyfikaty, wygenerowany nginx.conf (poufne pliki z trybem 600)
<folder danych>/log/logi
<folder danych>/tmp/pliki tymczasowe każdego procesu
<folder danych>/home/<konto>/folder domowy każdego konta
<folder danych>/jobs/operacje, zadania cron i ich uruchomienia, z logami
<folder danych>/toolchains/pamięć podręczna pobrań, zainstalowane toolchainy i środowiska uruchomieniowe, eksporty
<folder danych>/envs/środowiska
<folder danych>/projects/obszary robocze, widoczne w środowiskach jako /projects
<folder danych>/trash/usunięte elementy, przechowywane 7 dni

Moduły dodają własne foldery; wymieniają je ich części.