跳到內容
Syno Package Land
語言: 繁體中文

dsm-package.yaml 參考

native-go 或 binary 專案使用 dsm-package.yaml。以下範例可在使用 --with files,jobs,login --package MyApp 建立的 native-go 專案通過 check。

# 套件識別資訊與 SPK 版本:0.1.0-0001。
schema: 2
package: MyApp
version: "0.1.0"
build: 1
displayname: My App
description: A native DSM package with files, jobs, and login.
maintainer: Your Name
os_min_ver: "7.1-42661"
arches: [x86_64, aarch64]
# Go CGI 後端。binary 專案改用 kind: binary 與 files。
backend:
kind: go
dir: backend
main: ./cmd/app
# 先建置 Vue 前端,再複製靜態輸出。
ui:
dir: frontend/dist
build:
cwd: frontend
command: [npm, run, build]
# CLI 的 login 對應 identity 欄位。
capabilities:
files: session
jobs: {worker: sha256-v1}
identity: standalone
# 使用 synopkgland add root-ops 加入 root scripts 與能力程式碼。
# rootOps: true
# 使用 synopkgland add delegate 加入 delegate 程式碼。
# delegate:
# scope: install-selected
# operations: [files.moveFromStaging]
# destinations: [save]
# lifetime: until-revoked
# 產生的專案包含訊息目錄與詞彙表。
i18n:
messages: i18n/messages
glossary: i18n/glossary.json
info:
zh-TW:
displayname: 我的 App
description: 提供檔案、背景工作與登入功能的 DSM 套件。
# 安裝時選擇現有的共用資料夾。
install:
sharedFolder:
mode: select
key: shared
permission: rw
# 選填的發行者資訊。
metadata:
license: MIT
contact_email: you@example.com
homepage: https://example.com
# 選填的入口政策;需要 Go entry gate 與適合的 API routes。
# entry: app-privilege
# 使用 synopkgland add portal 啟用;需要 rootOps 或 delegate,並符合 portal 的最低 DSM 版本。
# portal: {alias: my-app}
# 選填的前景服務;請提供自己的 payload 目錄。
# 與 jobs 共用時,也需要 until-revoked delegate。
# daemon:
# exec: bin/service
# targets: {x86_64: daemon/x86_64, aarch64: daemon/aarch64}
# args: []
# env: {}
# timeouts: {start: 30, stop: 30, status: 5, uninstall: 60}
# uninstall_args: [cleanup]

以下預設值是解析器的預設值;模板提供的值另行標示。dsm-package.yaml 與 compose.yaml 不能共存(PROJECT_RUNTIME_EXCLUSIVE)。未知的頂層鍵會回報 STANDALONE_FIELD_UNKNOWN。處理方式請參閱錯誤碼。

欄位型別必填預設值說明
schema整數是—必須為 2;STANDALONE_SCHEMA_INVALID。
package字串是—符合 ^[A-Za-z][A-Za-z0-9]{1,63}$;STANDALONE_PACKAGE_INVALID。
version字串是—以句點分隔的一至四段數字;STANDALONE_VERSION_INVALID。在 YAML 中請加上引號。
build整數是—範圍為 1–9999;補滿四位數後接在 version 後方;STANDALONE_BUILD_INVALID。
displayname字串是—非空的單行文字,不含雙引號或反斜線;STANDALONE_TEXT_INVALID。
description字串是—與 displayname 相同的文字規則;STANDALONE_TEXT_INVALID。
maintainer字串是—與 displayname 相同的文字規則;STANDALONE_TEXT_INVALID。
os_min_ver字串是模板:7.1-42661完整版本/組建編號,符合 ^\d+\.\d+(\.\d+)?-\d+$;STANDALONE_OS_MIN_VER_INVALID。功能的最低版本請參閱平台。
arches字串陣列是模板:[x86_64, aarch64]非空且不重複的 x86_64、aarch64、armv7 清單;STANDALONE_ARCHES_INVALID。
backend物件是—Go 原始碼或各架構的 CGI 執行檔;STANDALONE_BACKEND_INVALID。
ui物件是—靜態輸出目錄與選填的建置指令;STANDALONE_UI_INVALID。
icon路徑否SDK 預設圖示至少 256×256 的正方形 PNG,或放 icon_<size>.png(16、24、32、48、64、72、256;必須有 icon_256.png,缺少的尺寸由它縮放)的目錄。不接受 SVG。建置時產生 PACKAGE_ICON.PNG、PACKAGE_ICON_256.PNG 與 ui/images/app_<size>.png;每個套件中心圖示不可超過套件來源的 256 KiB 上限。check 與 inspect 會標示使用自訂或預設圖示;STANDALONE_ICON_INVALID。
capabilities物件否{}明確宣告能力;無效的名稱或值會回報 CAPABILITY_INVALID。
i18n物件否無訊息目錄、詞彙表與套件中心翻譯文字;STANDALONE_I18N_INVALID。
daemon物件否無固定的前景服務;STANDALONE_DAEMON_INVALID。
install物件否無僅接受 sharedFolder;STANDALONE_SHARED_FOLDER_INVALID。
entry字串否API 權限政策admin-only 或 app-privilege;STANDALONE_ENTRY_INVALID。
portal物件否停用{} 或 {alias: ...};STANDALONE_PORTAL_INVALID。需要 rootOps 或 delegate;STANDALONE_PORTAL_REQUIRES_EXECUTOR。
login_style物件否CLI 預設樣式登入入口的主色、桌布與標題圖;需要 portal。見下方 login_style;STANDALONE_LOGIN_STYLE_INVALID、STANDALONE_LOGIN_STYLE_IMAGE_INVALID。
root物件否無root/ 程式的設定:programs.<name>(kind、參數 schema、run 與 job 限制)、stop(套件停止與升級時 executor 執行的程式)與 state: true(只有 root 可讀、升級保留的 /volumeN/@synopkgland/<package>)。需要 capabilities.rootOps: true;STANDALONE_ROOT_PROGRAMS_INVALID。App 的 SDK executor 必須支援這些設定;EXECUTOR_ROOT_PROGRAMS_UNSUPPORTED。
uninstall物件否無purge(exec、args、env、timeout 2–120 秒、選用 root)在真正解除安裝時、executor purge 之前以套件帳號執行;state.items[].key 列出解除安裝精靈可刪除的狀態,每項需要 uninstall.state.<key> 文字。UNINSTALL_INVALID。
metadata物件否無發行者文字、連結與螢幕截圖;無效的 metadata 會回報 STANDALONE_TEXT_INVALID。
reproducible物件否無build --verify-reproducible 的設定:inputs 列出納入依賴指紋的檔案,clean 列出第二次建置前要刪除的路徑(可用 {arch})。參閱可重現建置;REPRODUCIBLE_INVALID。

以下欄位使用專案內的相對路徑。

規則驗證錯誤碼
路徑必須是非空字串。STANDALONE_PATH_INVALID
路徑必須解析至專案內,且不能是絕對路徑。STANDALONE_PATH_OUTSIDE_PROJECT

選擇一種後端格式。

欄位型別必填預設值規則與驗證錯誤碼
kind字串是—go 或 binary;STANDALONE_BACKEND_INVALID。未知的 backend 鍵也會回報此錯誤碼。
dir路徑Go 必填—原始碼目錄;適用路徑規則。Go API 政策檔 backend/internal/api/permissions.json 必須有效;STANDALONE_API_PERMISSIONS_INVALID。
main字串否;僅限 Go./cmd/app符合 ^\./[A-Za-z0-9_./-]*$ 且不含 ..;STANDALONE_BACKEND_INVALID。
files架構對應路徑的 mapbinary 必填—必須恰好對應已宣告的架構;缺少項目:STANDALONE_BINARY_ARCH_MISSING;多出項目:STANDALONE_BACKEND_INVALID;適用路徑規則。
Binary 檔案規則驗證錯誤碼
檔案必須存在。STANDALONE_BINARY_MISSING
必須是一般檔案,不能是符號連結或目錄。STANDALONE_BINARY_NOT_REGULAR
解析後的檔案必須位於專案內。STANDALONE_PATH_OUTSIDE_PROJECT
大小上限:256 MiB。STANDALONE_BINARY_TOO_LARGE
正確位元寬度的 little-endian Linux ELF。STANDALONE_BINARY_NOT_ELF
ELF machine 必須符合架構。STANDALONE_BINARY_ARCH_MISMATCH
靜態連結;不含動態 interpreter。STANDALONE_BINARY_DYNAMIC

建置會產生套件要複製的靜態 UI 檔案。

欄位型別必填預設值規則與驗證錯誤碼
dir路徑是—建置時必須包含 app.js 與 app.css;STANDALONE_UI_ENTRY_MISSING;適用路徑規則。
build物件使用 identity 時無capabilities.identity 需要建置宣告;CAPABILITY_COMBINATION_INVALID。
build.cwd路徑使用 build 時—工作目錄;適用路徑規則。
build.command字串陣列使用 build 時—非空陣列,且每個字串非空;以參數方式執行,不經過 shell;STANDALONE_UI_BUILD_INVALID。

CLI 的 login 會寫入 identity;root-ops 會寫入 rootOps。

欄位型別必填預設值規則與驗證錯誤碼
files字串否停用僅接受 session;binary 會以 CAPABILITY_UNSUPPORTED 拒絕此能力。其他值:CAPABILITY_INVALID。
jobs布林值或物件否停用true 或 {worker: sha256-v1};binary 會以 CAPABILITY_UNSUPPORTED 拒絕。無效宣告:CAPABILITY_INVALID。
identity字串否停用僅接受 standalone;需要 UI 建置宣告(CAPABILITY_COMBINATION_INVALID);binary:CAPABILITY_UNSUPPORTED;其他值:CAPABILITY_INVALID。
rootOps布林值否停用僅接受 true;需要有效的 root/*.sh 檔案。其他值:CAPABILITY_INVALID。執行 root 操作需要管理員核准。
delegate物件否停用自動啟用 jobs;無效政策:CAPABILITY_INVALID;binary:CAPABILITY_UNSUPPORTED。需要管理員核准。

true 是以下 worker 宣告的簡寫。

欄位型別必填預設值規則與驗證錯誤碼
worker字串物件格式時jobs: true 時為 sha256-v1必須為 sha256-v1,物件不能有其他鍵;CAPABILITY_INVALID。

root/ 只能放固定的操作 script。

規則驗證錯誤碼
啟用時至少需要一個 script。STANDALONE_ROOT_OPS_MISSING
有 root/ 目錄時必須宣告 rootOps: true。STANDALONE_ROOT_OPS_UNUSED
每個檔名符合 ^[a-z][a-z0-9_]{0,31}\.sh$;僅限一般檔案,不接受符號連結。STANDALONE_ROOT_OP_INVALID
每個 script 最多 16 KiB,以 #!/bin/sh 加換行開頭;有效 UTF-8,不含 NUL。STANDALONE_ROOT_OP_INVALID
最低 DSM:7.1-42661。STANDALONE_OS_MIN_VER_INVALID

init --with delegate 與 add delegate 會寫入 {scope: install-selected, operations: [files.moveFromStaging], destinations: [save], lifetime: until-revoked}。這是 CLI 產生的宣告,不是解析器的預設值。

欄位型別必填預設值規則與驗證錯誤碼
scope字串是CLI:install-selectedhome、shared:<name> 或 install-selected。共用資料夾名稱不能含斜線、反斜線、控制字元、冒號、前後空白,也不能為 ./..。install-selected 需要 until-revoked;CAPABILITY_INVALID。
operations字串陣列是CLI:[files.moveFromStaging]非空且不重複。使用 until-revoked 時只能為 [files.moveFromStaging]。未使用 lifetime 與 destinations 時,可選 files.list、files.info、files.createFolder、files.checkPermission、files.write;CAPABILITY_INVALID。
destinations字串陣列使用 until-revoked 時CLI:[save]1–64 個不重複的鍵,符合 ^[a-z][a-z0-9_-]{0,63}$;CAPABILITY_INVALID。省略 lifetime 時也請省略此欄位。
lifetime字串使用 destinations 或 moveFromStaging 時CLI:until-revoked僅接受 until-revoked;使用其他列出的檔案操作時請省略;CAPABILITY_INVALID。

宣告一個固定的前景執行檔,以及各架構的 payload 目錄。

欄位型別必填預設值規則與驗證錯誤碼
exec字串是—相對於 payload 的路徑;最多 200 字元,不含 ./.. 區段;第一段使用英文字母、數字、_、-,後續區段也可使用 .;STANDALONE_DAEMON_INVALID。
targets架構對應路徑的 map是—每個已宣告架構恰好一個目錄;相對路徑、非空、位於專案內、不含 .. 區段或 NUL;STANDALONE_DAEMON_INVALID。
args字串陣列否[]最多 64 個字串,每個最多 4096 bytes,不含 NUL;僅允許 ${SYNOPKG_PKGDEST} 與 ${SYNOPKG_PKGVAR} 替換;STANDALONE_DAEMON_INVALID。
uninstall_args字串陣列否無與 args 相同的規則;提供時不能為空;解除安裝時停止服務後執行固定執行檔;STANDALONE_DAEMON_INVALID。
env字串對應字串的 map否{}最多 64 個項目;值適用參數字串規則;STANDALONE_DAEMON_INVALID。
env.<name>字串否—鍵符合 ^[A-Z][A-Z0-9_]{0,63}$。拒絕 PATH、HOME、TMPDIR、ENV、BASH_ENV、SHELLOPTS、BASHOPTS、GODEBUG、GOTRACEBACK、LD_*、DYLD_*、SYNOPKG_*;STANDALONE_DAEMON_INVALID。
timeouts物件否{start: 30, stop: 30, status: 5, uninstall: 60}僅接受下列四個鍵;STANDALONE_DAEMON_INVALID。
timeouts.start整數秒數否30start 等待 daemon 穩定運行的時間。範圍 2–120;STANDALONE_DAEMON_INVALID。
timeouts.stop整數秒數否30送出 SIGTERM 後,daemon 有 stop - 1 秒可結束,之後送 SIGKILL。範圍 2–120;STANDALONE_DAEMON_INVALID。
timeouts.status整數秒數否5範圍 1–10;STANDALONE_DAEMON_INVALID。
timeouts.uninstall整數秒數否60解除安裝時,停止服務後 uninstall_args 可執行的時間,逾時送 SIGTERM。與 stop 互相獨立。範圍 2–120;STANDALONE_DAEMON_INVALID。

逾時請依負載中的 NAS 實測決定,不要用閒置時的數字。開機時許多套件同時啟動,忙碌的儲存空間可能讓啟動超過 5 秒、撤銷超過 9 秒。請在 NAS 忙碌時(例如資料清理或大量複製期間)量測 start、stop 與 uninstall_args 指令的時間,再取最慢時間的約兩倍,並落在上述範圍內。調高數值只會讓 DSM 在程序卡住時等得更久;很快就緒或很快結束的 daemon 不會變慢。DSM 本身的套件 unit 允許 start 與 stop 各 3600 秒;preuninst 是否另有上限未知。

組合或 payload 規則驗證錯誤碼
Jobs 與 daemon 共存時,必須使用 delegate.lifetime: until-revoked。CAPABILITY_COMBINATION_INVALID
Payload 目錄僅含一般檔案與目錄,位於專案內,不含符號連結或 setuid/setgid 檔案,總大小最多 512 MiB。STANDALONE_DAEMON_PAYLOAD_INVALID
執行檔必須通過 binary 檔案規則。上述 binary 錯誤碼

選擇現有的共用資料夾或建立指定名稱的資料夾;兩種模式都不會在解除安裝時刪除共用資料夾。

欄位型別必填預設值規則與驗證錯誤碼
mode字串是—select 或 create;STANDALONE_SHARED_FOLDER_INVALID。
key字串是CLI init:shared符合 ^[a-z][a-z0-9_]{0,31}$;不能以 pkgwizard_、synopkg 或 change_ 開頭;STANDALONE_SHARED_FOLDER_INVALID。
name字串僅 create 時—符合 ^[A-Za-z0-9][A-Za-z0-9_-]{0,31}$;拒絕 homes、users、volume1、usbshare1 等 DSM 系統名稱。select 時禁止填寫;STANDALONE_SHARED_FOLDER_INVALID。
permission字串是CLI init:rwro 或 rw;select 模式需要管理員在安裝後授予套件帳號此權限。create 模式透過 DSM 授予;STANDALONE_SHARED_FOLDER_INVALID。

訊息目錄的 locale 與 DSM 語言代碼列於平台。

欄位型別必填預設值規則與驗證錯誤碼
messages路徑使用 glossary 時無存放 <locale>.json 的目錄;適用路徑規則。缺少英文訊息檔:STANDALONE_I18N_MESSAGES_MISSING;不支援的 locale:STANDALONE_I18N_LOCALE_UNSUPPORTED。
glossary路徑否無JSON 詞彙表;需要 messages(STANDALONE_I18N_INVALID);適用路徑規則;無效檔案:STANDALONE_I18N_GLOSSARY_INVALID。
infolocale 對應物件的 map否{}支援的 locale,不包含 en;英文使用頂層文字。未知鍵或 locale:STANDALONE_I18N_INVALID。
info.<locale>.displayname字串否頂層文字與 displayname 相同的單行文字規則;STANDALONE_TEXT_INVALID。
info.<locale>.description字串否頂層文字與 description 相同的單行文字規則;STANDALONE_TEXT_INVALID。

info 也決定 App 在 DSM 中的名稱。只要有一個翻譯,建置就會為英文與每個翻譯語言寫入 ui/texts/<DSM 語言>/strings,主選單項目與視窗標題改從這些檔案取字。沒有自己 displayname 或 description 的語言顯示英文。沒有 info 時,標題維持頂層的英文 displayname。

訊息目錄或詞彙表欄位型別必填預設值規則與驗證錯誤碼
訊息鍵字串每則訊息—扁平的 JSON 物件;以句點分隔的鍵符合 ^[A-Za-z][A-Za-z0-9_-]*(\.[A-Za-z0-9_-]+)*$,值為字串;STANDALONE_I18N_CATALOG_INVALID。
訊息鍵集合字串鍵是英文鍵必須與 en.json 的鍵完全相同;STANDALONE_I18N_KEYS_MISMATCH。
訊息預留位置{placeholder} 集合是英文預留位置每則翻譯訊息的預留位置必須相同;STANDALONE_I18N_PLACEHOLDER_MISMATCH。
terms物件陣列詞彙表必填—JSON 陣列;STANDALONE_I18N_GLOSSARY_INVALID。
terms[].id字串是—詞彙識別名稱;STANDALONE_I18N_GLOSSARY_INVALID。
terms[].textlocale 對應字串的 map是—支援的 locale 與非空文字;STANDALONE_I18N_GLOSSARY_INVALID。
terms[].keys字串陣列否[]已存在的英文訊息鍵;STANDALONE_I18N_GLOSSARY_INVALID。列出的每則翻譯必須包含對應 locale 的詞彙,不區分大小寫;STANDALONE_I18N_GLOSSARY_MISMATCH。

入口政策會補充你的 API 權限。

值或規則效果與驗證錯誤碼
admin-only僅管理員可進入。管理員是所有 route 的下限,包括能力加入的 route,其他使用者也看不到啟動圖示。permissions.json 中標為 authenticated 或 public 的 route 會回報 STANDALONE_ENTRY_WIDENED。
其他值STANDALONE_ENTRY_INVALID。
app-privilege檢查 DSM 應用程式權限;permissions.json 至少需要一個 authenticated route,否則回報 STANDALONE_ENTRY_INVALID。
省略使用 API 權限政策。
後端條件Go 後端必須在 main.go 接上 entry gate;缺少支援或使用 binary 後端會回報 STANDALONE_ENTRY_UNSUPPORTED。

空物件會啟用「應用程式入口網站 (Application Portal)」,並產生預設別名。

欄位型別必填預設值規則與驗證錯誤碼
alias字串否小寫套件 ID;保留名稱則使用 app- 加穩定雜湊值1–64 個小寫英文字母、數字與連字號;以英文字母或數字開頭及結尾。未知 portal 鍵或無效別名:STANDALONE_PORTAL_INVALID。
保留別名字串——拒絕 dsfile、indexdb、mobile、oauth、scripts、sharing、ssdp、synosdsjslib、synohdpack、webapi、webman、calendar、chatplus、contacts、drive、file、photo、sso、synologymeet;STANDALONE_PORTAL_INVALID。
最低 DSM版本/組建編號啟用時—7.1-42661;STANDALONE_PORTAL_MIN_DSM。
Executor能力啟用時—capabilities.rootOps 或 capabilities.delegate;STANDALONE_PORTAL_REQUIRES_EXECUTOR。

有 portal 的 App 會帶 DSM 的登入樣式:「控制台 › 登入入口 › 應用程式」顯示縮圖,別名登入頁有桌布、按鈕色與標題圖。省略 login_style 時使用 CLI 內建的中性樣式,標題圖用 App icon。check 與 inspect 會印出使用的樣式。

欄位類型必填預設規則與驗證錯誤
color字串否#2F6BD8#RRGGBB;STANDALONE_LOGIN_STYLE_INVALID。
wallpaper路徑否CLI 預設桌布專案內的 JPEG,至少 1920×1080、最多 2 MiB;必須與 wallpaper_thumbnail 一起設定。STANDALONE_LOGIN_STYLE_IMAGE_INVALID。
wallpaper_thumbnail路徑與 wallpaper 同時CLI 預設縮圖專案內 320×200 的 JPEG;STANDALONE_LOGIN_STYLE_IMAGE_INVALID。
title路徑否App icon專案內 680×124 的 PNG;STANDALONE_LOGIN_STYLE_IMAGE_INVALID。

沒有 portal 卻設定 login_style,或有其他鍵:STANDALONE_LOGIN_STYLE_INVALID。

所有 metadata 欄位都可省略;無效欄位或值會回報 STANDALONE_TEXT_INVALID。

欄位型別必填預設值規則與驗證錯誤碼
long_description字串或 locale map否無適用下方文字規則;STANDALONE_TEXT_INVALID。
changelog字串或 locale map否無適用下方文字規則;map 的英文項目提供 INFO 文字,沒有英文時使用第一個項目;STANDALONE_TEXT_INVALID。
contact_email字串否無網域含句點且不含空白的電子郵件地址;STANDALONE_TEXT_INVALID。
support_email字串否無相同的電子郵件規則;未提供 support_url 時產生 mailto: 支援連結;STANDALONE_TEXT_INVALID。
homepage字串否無適用下方 URL 規則;STANDALONE_TEXT_INVALID。
source_url字串否無適用下方 URL 規則;STANDALONE_TEXT_INVALID。
issues_url字串否無適用下方 URL 規則;STANDALONE_TEXT_INVALID。
license字串否無適用下方文字規則;STANDALONE_TEXT_INVALID。
maintainer_url字串否無適用下方 URL 規則;STANDALONE_TEXT_INVALID。
distributor字串否無適用下方文字規則;STANDALONE_TEXT_INVALID。
distributor_url字串否無適用下方 URL 規則;STANDALONE_TEXT_INVALID。
support_url字串否無HTTP(S) URL 或有效的 mailto: 地址;STANDALONE_TEXT_INVALID。
helpurl字串否無適用下方 URL 規則;STANDALONE_TEXT_INVALID。
screenshots字串陣列否無最多 12 個 HTTP(S) URL;STANDALONE_TEXT_INVALID。
Metadata 規則限制與驗證錯誤碼
文字值最多 16,000 字元;不能含控制字元,但允許 tab、換行與歸位字元;STANDALONE_TEXT_INVALID。
Locale map最多 32 個項目;鍵符合 ^[a-z]{2}(-[A-Za-z]{2})?$;值適用文字規則;STANDALONE_TEXT_INVALID。
URLHTTP(S)、最多 2048 字元、不含使用者名稱或密碼;STANDALONE_TEXT_INVALID。
整個物件JSON 表示法最多 32,000 字元;拒絕未知鍵;STANDALONE_TEXT_INVALID。