Unofficial
Auf dieser Seite
  1. 01Was der Film zeigt, was Sie brauchen
  2. 02Ersteinrichtung
  3. 03Module, Build-Umgebung, Go, Python und QDK
  4. 04Neues Projekt
  5. 05Die Rezepte
  6. 06Bauen und make qpkg
  7. 07Die Signatur
  8. 08Testeinsatz und erste Anmeldung
  9. 09Das arm_64-Paket
  10. 10Weiterführende Anleitungen

Transmission auf Ihrem NAS von Grund auf bauen

Der Film unten zeigt einen echten Durchlauf von Bucket & Code Server IDE 1.0.0-55 auf einem NAS, auf dem noch nichts eingerichtet ist. Er beginnt auf der Seite der Ersteinrichtung. Am Ende ist das QTS-Paket Transmission signiert, installiert und antwortet im Browser, und ein arm_64-Build desselben Pakets ist heruntergeladen. Diese Anleitung geht den Film Kapitel für Kapitel durch: was die Person tut, was der Bildschirm zeigt und was das Skript prüft.

Walkthrough · 6:26. Transmission von Grund auf, von der Ersteinrichtung bis zum arm_64-Paket Bucket & Code Server IDE 1.0.0-55 · NAS mit x86_64
  1. EinrichtenModule, Umgebung, Laufzeiten
  2. ProjektPaket aus dem Quellcode
  3. Rezeptefünf, das Gate, der Dienst
  4. Bauenzwei Apps, make qpkg
  5. InstallierenSignatur, Testeinsatz, arm_64

Die Bilder sind Einzelbilder des Durchlaufs, aus dem Panel und dem Editor; nur die Kacheln der Übersicht stammen aus Version 1.0.0-62. Adresse und Name des NAS sind in jedem Bild maskiert und erscheinen als nas.local und NAS.

01Was der Film zeigt, was Sie brauchen

Der Durchlauf dauerte 25 min 7 s, der Film dauert 6:26. Er schneidet aus jeder Wartezeit von mehr als 10 Sekunden die Mitte heraus und zeigt am Schnitt, wie lange die Wartezeit wirklich war. Strecken von mehr als 10 Sekunden ohne Klick spielt er in vierfacher Geschwindigkeit ab, gekennzeichnet mit 4×.

Ein Skript steuert den Browser: Es klickt sich durch das Panel, tippt jede Datei des fertigen Projekts in den Editor und prüft jeden Schritt über die API des Panels, bevor es weitermacht. Das Panel, der Editor, der Build und die Pakete sind echt. Das fertige Projekt ist das Beispiel Transmission (BitTorrent-Client, eigene Rezepte) unter Editor-Projekte auf dem Reiter Beispiele der Seite Apps; Code ansehen zeigt seine Dateien.

  • Ein NAS mit Bucket & Code Server IDE 1.0.0-55 oder neuer und einem x86_64-Prozessor. Das arm_64-Paket entsteht auf diesem NAS als Cross-Build.
  • Ein Administratorkonto im Panel. Bei einer neuen Installation entsteht es auf der Seite der Ersteinrichtung.
  • Internetzugang für das NAS: Es lädt das Root-Dateisystem der Build-Umgebung, die Toolchains und die Quellen der Rezepte herunter und prüft jeden Download gegen seine sha256.
  • Für das signierte Paket ein Zertifikat zum Signieren von Code, das QNAP Ihnen ausgestellt hat (Abschnitt 07).

02Ersteinrichtung

Film 0:00 · im Durchlauf 4 s

Eine neue Installation hat kein Konto, daher zeigt das Panel nur eine Seite: Administratorpasswort setzen für das Konto administrator. Geben Sie ein Passwort mit mindestens 10 Zeichen zweimal ein und drücken Sie Passwort setzen und anmelden. Die Seite nimmt das Passwort nur in den ersten 60 Minuten nach dem Start des Pakets an, und nur aus dem lokalen Netzwerk.

Das Skript prüft, dass das Panel als administrator angemeldet ist und nicht mehr nach einem ersten Administrator fragt.

03Module, Build-Umgebung, Go, Python und QDK

Film 0:06 · im Durchlauf 59 s

Die Seite Übersicht zeigt jedes Modul als Kachel, und eine neue Installation führt nur den Kern aus. Schalten Sie Git (Forgejo) und den Editor (VS Code im Browser) mit ihren Schaltern ein, bis beide Kacheln läuft zeigen. Jedes Panel-Konto hat ein gleichnamiges Konto in Forgejo, daher bietet der Assistent für neue Projekte nun administrator als Besitzer eines Repositorys an.

Die Übersicht von Bucket & Code Server IDE 1.0.0-62 auf x86_64: die Kacheln Git, SVN & Bucket und Editor laufen

Auf der Seite Toolchains ist die Liste der Umgebungen leer; angeboten wird der Ubuntu-24.04-Builder mit einer einzigen Schaltfläche: Diese Umgebung anlegen. Die Umgebung ubuntu2404-builder ist nach 22 Sekunden da. Im Katalog darunter fügt Installieren Go 1.27 und Python 3.13 (Reiter Laufzeitumgebungen) sowie QNAP QDK 2.5.0 (Reiter QNAP) hinzu. Go baut das Gate des Projekts, Python führt das Werkzeug aus, das die Vendor-Liste der Weboberfläche schreibt, und QDK packt die QTS-Pakete.

Toolchains: die Umgebung ubuntu2404-builder und im Katalog QNAP QDK 2.5.0 (qbuild) als installiert markiert

Das Skript prüft, dass Git und der Editor laufen, dass ubuntu2404-builder in der Liste der Umgebungen steht und dass go-1.27-x86_64, python-3.13-x86_64 und qdk-2.5.0-x86_64 installiert sind.

04Neues Projekt

Film 0:52 · im Durchlauf 24 s

Auf der Seite Projekte fragt Neues Projekt zuerst nach der Vorlage. Wählen Sie Paket aus dem Quellcode und nennen Sie das Projekt Transmission; der Name wird zum Namen des Pakets. Wählen Sie im Schritt Dienst Web-App: ein Hintergrunddienst mit Web-Port und der Schaltfläche Öffnen im App Center. Im Schritt Bauen wählen Sie keine Umgebung: Die Zeile ENV im Makefile des Projekts weist beiden Apps den Ubuntu-24.04-Builder zu. Lassen Sie Direkt nach dem Anlegen bauen aus, weil das Starter-Rezept noch eine Platzhalterquelle nennt und ein erster Build scheitern würde. Projekt anlegen erstellt das Forgejo-Repository mit seinem ersten Commit.

Neues Projekt, Schritt Fortschritt: Paket aus dem Quellcode, Transmission; Forgejo-Repository und erster Commit fertig; Projekt öffnen, Im Editor öffnen und In Forgejo öffnen

Im Editor öffnen öffnet das Projekt im Editor. Sein Ordner enthält recipes/transmission/ (das Starter-Rezept), recipes.txt, ein Makefile für zwei Apps, licenses.txt, qpkg/ und scripts/. Das Skript prüft, dass die Pipeline des Projekts die Apps transmission und transmission-arm64 aufführt und dass der Explorer recipes zeigt.

05Die Rezepte

Film 1:18 · im Durchlauf 12 min 12 s

Die Bibliothek hat kein Rezept für Transmission oder seine Weboberfläche. Deshalb bringt das Projekt in recipes/ fünf eigene Rezepte mit, jedes in einem Ordner mit recipe.json und build.sh: diese beiden sowie libnatpmp, miniupnpc und libdeflate, die es auch in der Bibliothek gibt. In den Apps des Projekts ersetzen die Kopien des Projekts die Rezepte der Bibliothek. curl, OpenSSL, zlib und libevent kommen aus der Bibliothek. Ihr erstes eigenes Rezept erklärt die beiden Dateien.

Das Starter-Rezept · 14 s

recipes/transmission/recipe.json bekommt das Release-Archiv von Transmission 4.1.3 mit seiner sha256, die Rezepte, die es braucht (curl, OpenSSL, zlib, libevent, libnatpmp, miniupnpc und libdeflate), das statische Linken und eine Prüfung. build.sh ruft CMake für den Daemon und für transmission-remote, transmission-create, transmission-edit und transmission-show auf, mit abgeschalteten Tests, Übersetzungen und Dokumentation.

Vier weitere Rezepte · 1 min 17 s

In der Befehlspalette fragt Bucket: New recipe nach einem Namen und schreibt beide Dateien aus dem Starter. Das Skript legt auf diese Weise libnatpmp 20230423, miniupnpc 2.3.3, libdeflate 1.26 und transmission-web 4.1.3 an und trägt bei jedem Quelle, sha256 und Build-Schritte ein. Transmission linkt die drei Bibliotheken als statische Archive. Die Weboberfläche besteht aus HTML, CSS und JavaScript und wird aus web/ desselben Release-Archivs gebaut.

Der Editor: der Ordner recipes des Projekts mit libdeflate, libnatpmp, miniupnpc, transmission und transmission-web, und die geöffnete build.sh von transmission-web

Die Vendor-Liste · 1 min 7 s

esbuild und Sass bauen die Weboberfläche, und recipes/transmission-web/vendor.txt legt ihre npm-Pakete genau fest, je eine Zeile mit sha256, Adresse und Ziel. Das Terminal des Editors schreibt die Datei aus der package-lock.json des Releases, und das Werkzeug meldet 30 files: 30 checked against the lockfile's sha512. Die fertige Datei hat 41 Zeilen, 11 davon sind Kommentare.

eval "$(bvs use python-3.13-x86_64)"
python3 /usr/bin/bucketvs/share/bucketvs/tools/npm-vendor.py package-lock.json CACHE-DIR \
  --dev --roots esbuild esbuild-sass-plugin fast-deep-equal \
  --platform linux-x64-glibc --platform linux-arm64-glibc --allow-install-scripts \
  > recipes/transmission-web/vendor.txt

build.sh enthält die sha256 der ganzen Datei, und der Build prüft jedes Paket noch einmal, bevor er es entpackt. npm läuft nie, und kein Installationsskript wird ausgeführt.

Rezeptliste, Gate, Skripte, Lizenzen und Icons · 6 min 38 s

recipes.txt nennt, was die beiden Apps bauen: transmission, transmission-web und cacert, das CA-Bundle, gegen das curl HTTPS-Tracker prüft. Der App Builder fügt hinzu, was jedes davon braucht.

gate/ enthält trgate, ein Go-Programm ohne externe Module. Die Standardeinstellungen von Transmission haben kein Passwort und nehmen RPC-Aufrufe nur vom NAS selbst an; würde man es ohne Passwort für das Netzwerk öffnen, bediente es jeden, der Port 9091 erreicht. Deshalb startet das Paket transmission-daemon erst, wenn Sie ein Passwort gewählt haben: trgate belegt den Port mit einer Einrichtungsseite, schreibt das Passwort in der gesalzenen Form, in der Transmission es speichert, und startet dann den Daemon auf demselben Port. Das Paket erzeugt kein Passwort, daher wird keines in eine Datei oder in die QTS-Systemprotokolle geschrieben.

scripts/make-qpkg.sh ist der Packer der Vorlage mit drei ausgefüllten Stellen: KEEP, die Pfade, die das Paket aus jeder App übernimmt; own_programs, das trgate für jede Architektur baut; und own_licences, das die Lizenztexte ergänzt, die licenses.txt nicht liefern kann. licenses.txt nennt die Lizenz jedes Rezepts, das das Paket enthält, und LICENSE ist die Lizenz des eigenen Codes des Projekts. Das Skript tippt diese zehn Dateien ein. Die drei Icons in qpkg/icons/ lädt das Skript im Explorer mit Upload... in diesen Ordner hoch.

Der Dienst · 40 s

In der Projektansicht enthält die Karte Dienst und Paket die Blöcke, die das Start- und Stoppskript des Pakets schreiben, und die Schlüssel von qpkg.cfg. Ausgehend von der Voreinstellung Web-App gelangt das Skript zu neun Blöcken: dem Datenordner Transmission auf dem Volume; dem Konto transmission in der Gruppe arr, dem dieser Ordner gehört (Modus 700); dem Web-Port 9091; trgate als Daemon des Kontos, mit 40 Sekunden zum Beenden; einem Warten auf Port 9091; einer Protokollzeile; und den Statusprüfungen running und port_open. Der Reiter Paket setzt den Anzeigenamen Transmission, die Version 4.1.3, den Pfad der Webseite /transmission/web/, den Web-Port 9091 und 60 Sekunden, die QTS beim Start und beim Stoppen wartet. Speichern zeigt den Plan mit dem Diff jeder Datei, und Committen committet ihn.

Die Karte Dienst und Paket, Reiter Paket: Anzeigename Transmission, Version 4.1.3, Pfad der Webseite /transmission/web/, Web-Port 9091, 60 Sekunden beim Start und beim Stoppen

Die Prüfung · 30 s

Bei jedem Speichern werden die Rezepte des Projekts geprüft, und die Befunde erscheinen in der Ansicht Probleme. Das Skript wartet auf No problems have been detected in the workspace, und der Bericht des Projekts nennt dann fünf Rezepte und keinen Fehler. make lint liefert dieselben Befunde im Terminal.

Commit und Push · 1 min 42 s

In der Quellcodeverwaltung stellt das Skript alle Änderungen bereit, committet sie als Transmission from source und pusht. Die Gegenstelle des Projekts ist sein Forgejo-Repository über HTTPS, daher fragt der Editor nach Name und Passwort des Kontos, die Forgejo mit dem Panel teilt. Das Skript wartet, bis nichts mehr uncommittet ist und nichts der Gegenstelle voraus ist, liest dann die drei Icons aus Forgejo zurück und vergleicht sie Byte für Byte mit denen des Projekts.

06Bauen und make qpkg

Film 5:13 · im Durchlauf 10 min 1 s

Bauen in der Projektansicht führt das Makefile des Projekts aus. Es baut die beiden Apps nacheinander im Ubuntu-24.04-Builder, beide statisch: transmission für den x86_64-Prozessor dieses NAS und transmission-arm64 für aarch64, als Cross-Build. Jede App baut 13 Rezepte in der Reihenfolge ihrer Abhängigkeiten: cacert, OpenSSL, zlib, nghttp2, zstd, c-ares, curl und libevent aus der Bibliothek, danach libnatpmp, miniupnpc, libdeflate, transmission und transmission-web aus dem Projekt. Das dauerte 8 min 1 s. Die Prüfungen des Cross-Builds laufen nur dort, wo qemu-user registriert ist; sonst vermerkt der Build sie als nicht ausgeführt. Das Skript prüft, dass die letzten Builds beider Apps fertig sind und das Projekt Transmission nennen.

Die Projektansicht nach dem Build: Build fertig, und das Ausgabefenster mit den Zeilen the App Builder built transmission und the App Builder built transmission-arm64

Die Pakete entstehen im Terminal des Editors, im Ordner des Projekts (2 min 0 s). Go muss im Pfad liegen, weil make qpkg trgate für jede Architektur baut:

eval "$(bvs use go-1.27-x86_64)"
make qpkg

make qpkg packt den neuesten erfolgreichen Build jeder App mit QDK und schreibt Transmission_4.1.3_x86_64.qpkg und Transmission_4.1.3_arm_64.qpkg nach build/qpkg/build/, je etwa 30 MB. Ein Paket enthält die fünf Programme von Transmission, trgate, die Weboberfläche, das CA-Bundle, die BusyBox, die der Build jedem Paket hinzufügt, und share/licenses/ mit einer NOTICE und den Lizenztexten jeder Komponente.

07Die Signatur

Nicht im Film · im Durchlauf 3 s

Dies ist der einzige Schritt außerhalb des Panels. Der Testeinsatz installiert nur signierte Pakete und überspringt die Signaturprüfung des App Centers nie. Das NAS des Durchlaufs enthält keine Dateien zum Signieren von Code, daher hat make qpkg beide Pakete unsigniert gebaut. Das Skript kopiert sie auf einen Computer mit einem Zertifikat zum Signieren von Code, das QNAP dem Autor dieser Anleitung ausgestellt hat, signiert sie dort mit qbuild von QDK, prüft die Signaturen und kopiert die Pakete zurück nach build/qpkg/build/. Das Zertifikat und sein privater Schlüssel gelangen nie auf das NAS. Die Liste Versionen kennzeichnet danach beide Pakete als signiert.

Versionen: Transmission_4.1.3_arm_64.qpkg und Transmission_4.1.3_x86_64.qpkg, beide als signiert gekennzeichnet

Sie signieren mit einem eigenen Zertifikat. Legen Sie certificate und private_key sowie ca_certs für die Kette neben qpkg/qpkg.cfg oder in den Ordner, den QPKG_CERT_DIR nennt; dann signiert make qpkg die Pakete selbst, und die .gitignore der Vorlage hält die Dateien aus Git heraus. Ohne sie sind die Pakete unsigniert, und der Testeinsatz lehnt sie ab. Was ein NAS mit einem unsignierten Paket tut, entscheidet sein Besitzer im App Center; diese Anleitung empfiehlt nicht, unsignierte Pakete zu installieren.

08Testeinsatz und erste Anmeldung

Film 5:53 · im Durchlauf 32 s

Auf der Seite des Projekts installiert Testeinsatz (für Administratoren) das x86_64-Paket mit qpkg_cli auf diesem NAS, so wie das App Center eine Datei installiert, und der Job wartet, bis das App Center bestätigt. Das Paket bleibt installiert, bis Sie es mit Von diesem NAS entfernen oder im App Center entfernen. Der Job dauerte 18 s.

Die Projektansicht nach dem Testeinsatz: 4.1.3 auf diesem NAS installiert, Transmission 4.1.3 installiert, und die qpkg_cli-Zeilen im Ausgabefenster

Öffnen Sie http://<NAS>:9091/ oder drücken Sie im App Center auf Öffnen. Die Seite des Gates, Choose the web interface password, fragt nach einem Benutzernamen (admin, wenn Sie ihn nicht ändern) und zweimal nach dem Passwort, mindestens 8 Zeichen. Drücken Sie Start Transmission. Die Seite meldet, dass Transmission startet, dann übernimmt transmission-daemon den Port, und der Browser fragt nach dem gewählten Benutzernamen und Passwort. Die Seite nimmt Benutzername und Passwort in den ersten 60 Minuten nach dem Start des Pakets an, von einem Computer im Netzwerk des NAS, aufgerufen über die IP-Adresse des NAS oder seinen eigenen Namen.

Nach der Anmeldung zeigt der Browser die Weboberfläche von Transmission ohne Übertragungen. Das Skript prüft, dass der Titel der Seite Transmission Web Interface lautet und dass der RPC die Version 4.1.3 (838877323f) meldet.

09Das arm_64-Paket

Film 6:20 · im Durchlauf 23 s

Ein Rechtsklick auf die Zeile arm_64 der Liste Versionen öffnet ihr Menü, und Herunterladen speichert Transmission_4.1.3_arm_64.qpkg (30.290.058 Bytes). Das Skript vergleicht die Größe der Datei mit der aus der Liste.

Ein NAS mit x86_64 kann dieses Paket nicht ausführen, daher prüft das Skript es unter Emulation. scripts/qemu-test.sh entpackt den Download auf einem Linux-Computer, auf dem qemu-user registriert ist, und führt es dort aus. Alle 22 Prüfungen bestehen in 19 s:

  • die Programme sind statische AArch64-Programme, und BusyBox und transmission-daemon laufen;
  • das Gate liefert die Einrichtungsseite aus, transmission-daemon läuft nicht, bevor das Passwort gesetzt ist, und ein POST ohne den Header der Seite wird abgelehnt (403);
  • nach der Einrichtung antwortet der RPC, session-get meldet die Version 4.1.3, ein falsches Passwort wird abgelehnt (401), die Weboberfläche antwortet, und weder die Ausgabe noch settings.json enthält das Passwort;
  • transmission-daemon holt die netinst-.torrent-Datei von Debian über HTTPS, wofür das CA-Bundle des Pakets nötig ist, und der Torrent wird wieder entfernt;
  • ein TERM an das Gate beendet transmission-daemon, und das Gate endet mit 0.

In diesem Durchlauf hat kein ARM-NAS das Paket ausgeführt.

10Weiterführende Anleitungen

  • Ihr erstes eigenes Rezept führt mit einem kleinen Programm, cmatrix, durch das Starter-Rezept, die Prüfung und make qpkg.
  • Eine eigene App aus Ihren Rezepten baut eine App-Builder-App, die neben den Rezepten der Bibliothek die Rezepte eines Projekts verwendet.
  • Transmission im App Center ist das veröffentlichte Beispiel. Sein x86_64-Paket stammt aus einem früheren Durchlauf desselben Skripts auf 1.0.0-55; seine SHA-256 steht auf dieser Seite.
  • Das Benutzerhandbuch von Bucket & Code Server IDE beschreibt Neues Projekt, die Projektansicht, Toolchains, den App Builder und das Code-Signing eines Pakets.