Unofficial
本頁內容
  1. 01影片內容與所需條件
  2. 02首次設定
  3. 03模組、環境、Go、Python 與 QDK
  4. 04新專案
  5. 05配方
  6. 06建置與 make qpkg
  7. 07簽署
  8. 08測試部署與首次登入
  9. 09arm_64 套件
  10. 10相關指南

在 NAS 上從零開始打造 Transmission

下方的影片是一次真實的執行過程:Bucket & Code Server IDE 1.0.0-55 在一台尚未設定任何東西的 NAS 上運作。影片從首次啟動畫面開始,結束時 QTS 套件 Transmission 已簽署、已安裝並在瀏覽器中回應,同一個程式的 arm_64 套件也已下載。本指南依章節逐一說明影片:操作者做什麼、畫面顯示什麼,以及指令碼檢查什麼。

影片 · 6:26。 從零開始打造 Transmission,從首次設定到 arm_64 套件 Bucket & Code Server IDE 1.0.0-55 · x86_64 的 NAS
  1. 準備模組、環境、執行環境
  2. 專案從原始碼建置的套件
  3. 配方五個、閘道、服務
  4. 建置兩個應用程式、make qpkg
  5. 安裝簽署、測試部署、arm_64

圖片是執行過程中的畫面,取自面板與編輯器;只有總覽上的卡片取自 1.0.0-62 版。NAS 的位址與名稱在每個畫面中都已遮蔽,顯示為 nas.local 與 NAS。

01影片內容與所需條件

這次執行花了 25 分 7 秒,影片長 6:26。超過 10 秒的等待會剪掉中間部分,並以實際的等待時間標示剪接處;超過 10 秒沒有點擊的片段以四倍速播放,標示為 4×。

指令碼操作瀏覽器:它在面板中點擊,把完成專案的每個檔案輸入編輯器,並在繼續之前透過面板的 API 檢查每個步驟。面板、編輯器、建置與套件都是真的。完成的專案是 編輯器專案 中的範例 Transmission (BitTorrent client, own recipes),位於 應用程式 頁面的 範例 分頁;檢視程式碼 會顯示它的檔案。

  • 一台安裝了 Bucket & Code Server IDE 1.0.0-55 或更新版本、處理器為 x86_64 的 NAS。arm_64 套件是在該 NAS 上交叉建置的。
  • 面板中的管理員帳號。全新安裝時,首次啟動畫面會建立它。
  • NAS 可連上網際網路:它會下載建置環境的根檔案系統、工具鏈與配方的原始碼,並以 sha256 檢查每個下載。
  • 已簽署的套件需要 QNAP 核發給您的程式碼簽署憑證(第 07 節)。

02首次設定

影片 0:00 · 執行中 4 秒

全新安裝沒有任何帳號,因此面板只會開啟一個畫面:帳號 administrator 的 設定管理員密碼。輸入兩次至少 10 個字元的密碼,然後按 設定密碼並登入。此畫面在套件啟動後 60 分鐘內接受密碼,而且只接受來自區域網路的連線。

指令碼檢查面板已以 administrator 登入,且不再要求建立第一位管理員。

03模組、環境、Go、Python 與 QDK

影片 0:06 · 執行中 59 秒

總覽頁面以卡片顯示每個模組,全新安裝時只有核心在執行。用開關開啟 Git(Forgejo)與編輯器(瀏覽器中的 VS Code),直到兩張卡片都顯示 執行中。面板的每個帳號在 Forgejo 都有同名帳號,因此新專案精靈現在會提供 administrator 作為儲存庫的擁有者。

Bucket & Code Server IDE 1.0.0-62 在 x86_64 上的總覽:Git、「SVN 與 Bucket」和編輯器的卡片都在執行中

在工具鏈頁面,環境清單是空的,只提供 Ubuntu 24.04 builder 和一個按鈕 建立此環境。22 秒後,環境 ubuntu2404-builder 就建立好了。在下方的目錄中,安裝 會加入 Go 1.27 與 Python 3.13(執行環境分頁)以及 QNAP QDK 2.5.0(QNAP 分頁)。Go 建置專案的閘道,Python 執行寫出網頁介面 vendor 清單的工具,QDK 則打包 QTS 套件。

工具鏈:環境 ubuntu2404-builder,以及目錄中標示為已安裝的 QNAP QDK 2.5.0 (qbuild)

指令碼檢查 Git 與編輯器正在執行、ubuntu2404-builder 在環境清單中,以及 go-1.27-x86_64、python-3.13-x86_64 與 qdk-2.5.0-x86_64 已安裝。

04新專案

影片 0:52 · 執行中 24 秒

在 專案 頁面,新專案 先詢問範本。選擇 從原始碼建置的套件,並把專案命名為 Transmission;專案名稱就是套件名稱。在服務步驟選擇 網頁應用程式:一個背景服務,附有網頁連接埠與 App Center 的開啟按鈕。建置步驟不需要選擇環境:專案 Makefile 的 ENV 行讓兩個應用程式都使用 Ubuntu 24.04 builder。讓 建立後立即建置 保持關閉,因為起始配方仍指向一個佔位來源,第一次建置會失敗。建立專案 會建立含第一個提交的 Forgejo 儲存庫。

新專案,進度步驟:從原始碼建置的套件、Transmission;Forgejo 儲存庫與第一個提交完成;開啟專案、在編輯器中開啟與在 Forgejo 中開啟

在編輯器中開啟 會在編輯器中開啟專案。它的資料夾包含 recipes/transmission/(起始配方)、recipes.txt、兩個應用程式用的 Makefile、licenses.txt、qpkg/ 與 scripts/。指令碼檢查專案的管線列出應用程式 transmission 與 transmission-arm64,以及檔案總管顯示 recipes。

05配方

影片 1:18 · 執行中 12 分 12 秒

配方庫沒有 Transmission 及其網頁介面的配方,所以專案在 recipes/ 中帶有五個自己的配方,每個是含 recipe.json 與 build.sh 的資料夾:這兩個,以及 libnatpmp、miniupnpc 與 libdeflate;後三者配方庫也有,但在專案的應用程式中,由專案自己的副本取代配方庫的版本。curl、OpenSSL、zlib 與 libevent 來自配方庫。這兩個檔案由 您的第一個自訂配方 說明。

起始配方 · 14 秒

recipes/transmission/recipe.json 會填入 Transmission 4.1.3 的發行封存檔及其 sha256、它需要的配方(curl、OpenSSL、zlib、libevent、libnatpmp、miniupnpc 與 libdeflate)、靜態連結和一項檢查。build.sh 為常駐程式以及 transmission-remote、transmission-create、transmission-edit 與 transmission-show 執行 CMake,並關閉測試、翻譯與文件。

再四個配方 · 1 分 17 秒

在命令選擇區中,Bucket: New recipe 會詢問名稱,並從起始配方寫出兩個檔案。指令碼用這個方式建立 libnatpmp 20230423、miniupnpc 2.3.3、libdeflate 1.26 與 transmission-web 4.1.3,並在每個配方中填入來源、sha256 與建置步驟。Transmission 以靜態封存檔連結這三個函式庫。網頁介面是 HTML、CSS 與 JavaScript,從同一個發行封存檔的 web/ 建置。

編輯器:專案的 recipes 資料夾,含 libdeflate、libnatpmp、miniupnpc、transmission 與 transmission-web,以及開啟的 transmission-web 的 build.sh

vendor 清單 · 1 分 7 秒

網頁介面由 esbuild 與 Sass 建置,recipes/transmission-web/vendor.txt 鎖定它們使用的 npm 套件,每個套件一行,含 sha256、位址與目的地。編輯器的終端機從該發行版的 package-lock.json 寫出這個檔案,工具回報 30 files: 30 checked against the lockfile's sha512。完成的檔案有 41 行,其中 11 行是註解。

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 內含整個檔案的 sha256,建置在解壓每個套件之前會再檢查一次。npm 從不執行,也不會執行任何安裝指令碼。

配方清單、閘道、指令碼、授權與圖示 · 6 分 38 秒

recipes.txt 列出兩個應用程式要建置的項目:transmission、transmission-web 與 cacert,後者是 curl 用來檢查 HTTPS tracker 的 CA 憑證包。每個項目所需的其他配方由 App Builder 補上。

gate/ 含有 trgate,一個不使用外部模組的 Go 程式。Transmission 的預設設定沒有密碼,只接受來自 NAS 本身的 RPC 呼叫;如果不設密碼就對網路開放,任何連得到連接埠 9091 的人都能使用它。因此套件要在您選好密碼後才啟動 transmission-daemon:trgate 以設定頁面佔住連接埠,把密碼以 Transmission 儲存的加鹽形式寫入,然後在同一個連接埠啟動常駐程式。套件不會產生密碼,所以沒有任何密碼被寫入檔案或 QTS 系統記錄。

scripts/make-qpkg.sh 是範本的打包程式,填入了三個位置:KEEP,套件從每個應用程式取用的路徑;own_programs,為每種架構建置 trgate;以及 own_licences,補上 licenses.txt 無法提供的授權文字。licenses.txt 列出套件所含每個配方的授權,LICENSE 則是專案自身程式碼的授權。指令碼會輸入這十個檔案。qpkg/icons/ 中的三個圖示,是在檔案總管中對該資料夾使用 Upload... 放進去的。

服務 · 40 秒

在專案檢視中,服務與套件 卡片包含寫出套件啟動與停止指令碼的區塊,以及 qpkg.cfg 的鍵值。從網頁應用程式預設開始,指令碼最後得到九個區塊:磁碟區上的資料資料夾 Transmission;群組 arr 中的帳號 transmission,它擁有該資料夾(模式 700);網頁連接埠 9091;作為該帳號常駐程式的 trgate,停止時間為 40 秒;等待連接埠 9091;一行記錄;以及狀態檢查 running 與 port_open。套件分頁設定顯示名稱 Transmission、版本 4.1.3、網頁路徑 /transmission/web/、網頁連接埠 9091,以及 QTS 在啟動與停止時等待的 60 秒。儲存 會顯示含各檔案 diff 的計畫,提交 則提交它。

服務與套件卡片,套件分頁:顯示名稱 Transmission、版本 4.1.3、網頁路徑 /transmission/web/、網頁連接埠 9091、啟動與停止時各 60 秒

檢查 · 30 秒

每次儲存都會檢查專案的配方,並在 問題 檢視中列出發現。指令碼等待 No problems have been detected in the workspace,之後專案的報告列出五個配方且沒有錯誤。make lint 在終端機中給出相同的結果。

提交與推送 · 1 分 42 秒

在原始檔控制中,指令碼暫存所有變更,以 Transmission from source 提交並推送。專案的遠端是透過 HTTPS 連線的 Forgejo 儲存庫,因此編輯器會詢問帳號的名稱與密碼,這組帳密 Forgejo 與面板共用。指令碼等到沒有未提交的內容、也沒有領先遠端的內容,再從 Forgejo 讀回三個圖示,逐位元組與專案的圖示比對。

06建置與 make qpkg

影片 5:13 · 執行中 10 分 1 秒

專案檢視中的 建置 會執行專案的 Makefile。它在 Ubuntu 24.04 builder 中依序建置兩個應用程式,兩者都是靜態的:為這台 NAS 的 x86_64 處理器建置 transmission,為 aarch64 建置 transmission-arm64,後者是交叉建置。每個應用程式依相依順序建置 13 個配方:來自配方庫的 cacert、OpenSSL、zlib、nghttp2、zstd、c-ares、curl 與 libevent,接著是來自專案的 libnatpmp、miniupnpc、libdeflate、transmission 與 transmission-web。這花了 8 分 1 秒。交叉建置的檢查只在已登錄 qemu-user 的地方執行;其他地方,建置會把它們記為未執行。指令碼檢查兩個應用程式最新的建置都已完成,且都指向專案 Transmission。

建置之後的專案檢視:建置完成,輸出面板中有兩行,分別表示 App Builder 已建置 transmission 與 transmission-arm64

套件由編輯器的終端機在專案資料夾中產生(2 分 0 秒)。Go 必須在路徑中,因為 make qpkg 會為每種架構建置 trgate:

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

make qpkg 用 QDK 打包每個應用程式最新成功的建置,並把 Transmission_4.1.3_x86_64.qpkg 與 Transmission_4.1.3_arm_64.qpkg 寫入 build/qpkg/build/,各約 30 MB。套件包含 Transmission 的五個程式、trgate、網頁介面、CA 憑證包、建置加到每個套件的 BusyBox,以及含 NOTICE 與各元件授權文字的 share/licenses/。

07簽署

不在影片中 · 執行中 3 秒

這是面板之外的唯一步驟。測試部署只安裝已簽署的套件,絕不略過 App Center 的簽章檢查,而這次執行的 NAS 沒有程式碼簽署檔案,因此 make qpkg 建置出來的兩個套件都未簽署。指令碼把它們複製到另一台電腦,那台電腦上有 QNAP 核發給本指南作者的程式碼簽署憑證;在那裡用 QDK 的 qbuild 簽署、檢查簽章,再把套件複製回 build/qpkg/build/。憑證與其私密金鑰從不會進入 NAS。之後版本清單會把兩個套件都標示為已簽署。

版本:Transmission_4.1.3_arm_64.qpkg 與 Transmission_4.1.3_x86_64.qpkg,兩者都標示為已簽署

您要用自己的憑證簽署。把 certificate 與 private_key,以及憑證鏈用的 ca_certs,放在 qpkg/qpkg.cfg 旁邊,或放在 QPKG_CERT_DIR 指定的資料夾,make qpkg 就會自行簽署套件;範本的 .gitignore 讓這些檔案不進入 git。沒有它們,套件就是未簽署的,測試部署會拒絕。NAS 如何處理未簽署的套件,由它的擁有者在 App Center 決定;本指南不建議安裝未簽署的套件。

08測試部署與首次登入

影片 5:53 · 執行中 32 秒

在專案頁面,測試部署(僅限管理員)以 qpkg_cli 把 x86_64 套件安裝到這台 NAS,方式和 App Center 安裝檔案相同,工作會等到 App Center 確認。套件會一直保持安裝,直到您用 從此 NAS 移除 或在 App Center 中移除。這項工作花了 18 秒。

測試部署之後的專案檢視:4.1.3 已安裝在這台 NAS 上,Transmission 4.1.3 已安裝,輸出面板中有 qpkg_cli 的各行

開啟 http://<NAS>:9091/,或在 App Center 按開啟。閘道的頁面 Choose the web interface password 會詢問使用者名稱(不更改則為 admin)並要求輸入兩次密碼,至少 8 個字元。按 Start Transmission。頁面顯示 Transmission 正在啟動,接著 transmission-daemon 接手連接埠,瀏覽器會要求輸入您選的使用者名稱與密碼。頁面在套件啟動後 60 分鐘內接受它們,來源須是 NAS 自己網路中的電腦,並使用 NAS 的 IP 位址或它自己的名稱。

登入後,瀏覽器顯示沒有任何傳輸的 Transmission 網頁介面。指令碼檢查頁面標題是 Transmission Web Interface,且 RPC 回報版本 4.1.3 (838877323f)。

09arm_64 套件

影片 6:20 · 執行中 23 秒

在版本清單的 arm_64 列上按右鍵會開啟其選單,下載 會儲存 Transmission_4.1.3_arm_64.qpkg(30,290,058 位元組)。指令碼把檔案大小與清單中的大小比對。

x86_64 的 NAS 無法執行該套件,因此指令碼在模擬下檢查它。scripts/qemu-test.sh 在已登錄 qemu-user 的 Linux 電腦上解開下載的檔案並在那裡執行。全部 22 項檢查在 19 秒內通過:

  • 程式是靜態的 AArch64 可執行檔,BusyBox 與 transmission-daemon 都能執行;
  • 閘道提供設定頁面,密碼設定之前 transmission-daemon 不執行,缺少頁面標頭的 POST 會被拒絕(403);
  • 設定之後 RPC 有回應,session-get 回報版本 4.1.3,錯誤的密碼被拒絕(401),網頁介面有回應,輸出與 settings.json 都不含密碼;
  • transmission-daemon 透過 HTTPS 取得 Debian 的 netinst .torrent,這需要套件的 CA 憑證包,之後再移除這個 torrent;
  • 對閘道送出 TERM 會結束 transmission-daemon,閘道以 0 結束。

這次執行中,沒有任何 ARM NAS 執行過該套件。

10相關指南