錯誤碼
錯誤碼是固定的字串。請依錯誤碼判斷,不要依訊息文字判斷。
| 出現位置 | 格式 |
|---|---|
| CLI 文字輸出 | stderr 上的 [CODE] message。結束碼為 1。 |
CLI --json | stdout 上的 {"ok":false,"code":"CODE","message":"…","hint":"…"}。部分失敗會多一個含報告的 data 欄位。 |
| App RPC(UI 呼叫後端) | {"success":false,"error":{"code":"…","message":"…"}},HTTP 狀態為 200。在瀏覽器中,ctx.call 會以 {code, message} 拒絕。請見 App API 參考。 |
check 在專案中發現問題時,錯誤訊息會包含檔案、行號與建議。code 是第一個錯誤的錯誤碼。
CLI 錯誤
Section titled “CLI 錯誤”下表列出 synopkgland 指令可能回報的所有錯誤碼。以 COMPOSE_、CONTRACT_、INSTALL_、HOMES_ 開頭的錯誤碼屬於容器(Compose)App。以 STANDALONE_ 開頭的錯誤碼屬於原生 App(dsm-package.yaml)。
| 錯誤碼 | 意思 | 處理方式 |
|---|---|---|
ADD_FILE_CONFLICT | add 發現既有檔案與該能力要寫入的檔案不同。 | 移動或合併列出的檔案後再執行 add。add 不會覆寫內容不同的檔案。 |
ADD_LAYOUT_UNSUPPORTED | 該能力需要標準的 backend 資料夾。 | 在 dsm-package.yaml 設定 backend.dir: backend,或手動合併該能力的檔案。 |
APP_SCRIPT_INVALID | dsm-scripts/<DSM 腳本名稱> 是 symlink、資料夾或特殊檔案。 | 改成專案 dsm-scripts/ 資料夾裡的一般檔案。 |
APP_SCRIPT_NOT_EXECUTABLE | dsm-scripts/<DSM 腳本名稱> 檔案沒有執行權限;DSM 會直接執行它。 | 對該檔案執行 chmod +x。 |
APP_SCRIPT_NO_SHEBANG | dsm-scripts/<DSM 腳本名稱> 檔案開頭不是 #!。 | 在檔案開頭加上直譯器行,例如 #!/bin/sh。 |
APP_SCRIPT_UNKNOWN | 專案 dsm-scripts/ 資料夾裡有檔案的名稱不是 SDK 會執行的 DSM 套件腳本名稱。 | 命名為 preinst、postinst、preuninst、postuninst、preupgrade、postupgrade 或 start-stop-status,或移出 dsm-scripts/。不支援 prereplace 與 postreplace。 |
BUILD_NOT_REPRODUCIBLE | build --verify-reproducible 再建置一次的 SPK 與第一次不同。 | 查看列出的 payload 與 metadata 檔案,移除每次建置都會變的內容(時間戳、隨機或絕對路徑、未鎖定的依賴)後重新建置。 |
BUILD_SPK_FAILED | deploy 打包 SPK 時失敗。 | 執行 synopkgland check、修正錯誤、檢查專案內的檔案權限後重試。 |
CAPABILITY_COMBINATION_INVALID | 這些能力無法一起使用,或無法與你的 UI 或 daemon 搭配。 | login 與 delegate 需要 --ui vue。除非 delegate.lifetime 是 until-revoked,否則 daemon 不能與 jobs 並用。 |
CAPABILITY_INVALID | 能力名稱或值不合法。 | 使用 files: session、jobs: true(或 {worker: sha256-v1})、identity: standalone、rootOps: true,或合法的 delegate 區塊。 |
CAPABILITY_UNSUPPORTED | 這種專案類型不支援能力。 | 能力需要原生 Go 專案(init -t native-go)。容器(Compose)與 binary 專案不支援。 |
CATALOG_INSTALL_FAILED | 透過 DSM 套件中心移除或安裝套件失敗。 | 閱讀訊息,到 NAS 的套件中心查看安裝記錄,或手動重試。 |
CLI_ARCH_INVALID | --arch 的值不合法。 | 使用 x86_64、aarch64 或 armv7。armv7 用於 native-go 與 binary,不用於 Container Manager App。 |
CLI_ARGUMENT_MISSING | 缺少必要的引數。 | 以 --help 執行該指令,查看它的引數。 |
CLI_COMMAND_UNKNOWN | 沒有這個指令。 | 執行 synopkgland --help 列出指令。 |
CLI_JOBS_INVALID | --jobs 的值不是正整數。 | 使用 --jobs 1(預設)或更大的整數。 |
CLI_OPTION_ARGUMENT_MISSING | 選項需要值,但沒有提供。 | 在選項後補上值。 |
CLI_OPTION_INVALID | 選項的值不合法,或該選項不適用於此指令。 | 以 --help 執行該指令。--param、--share、--run-as 請寫成 NAME=value。--project 不適用於 init。 |
CLI_OPTION_MISSING | 缺少必要的選項。 | 以 --help 執行該指令,查看必要的選項。 |
CLI_OPTION_UNKNOWN | 沒有這個選項。 | 以 --help 執行該指令,列出它的選項。 |
CLI_OUTPUT_ARCH_REQUIRED | 用 -o 輸出單一檔案時,必須指定恰好一個架構。 | -o 搭配單一 --arch,或改用 --out-dir。 |
COMMAND_FAILED | 指令失敗,且沒有更具體的錯誤碼。 | 閱讀訊息與 stderr,排除原因後重試。 |
COMPOSE_BIND_SOURCE_FORBIDDEN | 磁碟區掛載使用了不允許的主機路徑。 | 掛載 ${SYNOPKG_PKGVAR}、${SYNO_APP_SECRETS_DIR},或你以 shared_folder 安裝參數宣告的 ${SLOT}。 |
COMPOSE_BIND_SOURCE_UNDECLARED | 磁碟區掛載使用了未宣告的共用資料夾變數。 | 在 synology-app.yaml 的 install 下宣告該 shared_folder 參數。 |
COMPOSE_BIND_SUFFIX_INVALID | 共用資料夾變數後面的子路徑不合法,含有 .. 或控制字元。 | 使用單純的相對子路徑,例如 ${MEDIA_SHARE}/data:/data。 |
COMPOSE_BUILD_FORBIDDEN | compose.yaml 使用了 build:。NAS 只執行既有的映像。 | 移除 build:,改用映像,最好以 digest 固定(image@sha256:…)。再執行一次 check。 |
COMPOSE_CAP_ADD_FORBIDDEN | 服務使用了 cap_add,但未宣告 privilege.cap_add。 | 在 synology-app.yaml 設定 privilege.cap_add: true,或移除 cap_add。 |
COMPOSE_DEVICES_FORBIDDEN | 服務使用了 devices,但未宣告 privilege.devices。 | 在 synology-app.yaml 設定 privilege.devices: true,或移除 devices。 |
COMPOSE_DYNAMIC_ROUTE_UNSUPPORTED | compose.yaml 使用了不支援的變數形式,或 DSM 不會載入的 secret、config 來源。 | 只使用 ${NAME} 搭配字串或布林安裝答案。移除 secrets 與 configs。 |
COMPOSE_ENV_MISSING | synopkgland test 找不到為 Compose App 建立的資料夾(SYNOPKG_PKGVAR 與 secrets 資料夾)。 | 確認測試執行時能建立這些資料夾,然後再執行一次 test。 |
COMPOSE_GATEWAY_PORT_EXPOSED | DSM 登入閘道必須是唯一的入口,但 adminport 對應的發布連接埠監聽在所有網路介面上。 | 將連接埠綁定到 loopback,例如 "127.0.0.1:18333:18333",或設定 integration.web.access: public。 |
COMPOSE_HOST_BIND_FORBIDDEN | 磁碟區掛載寫死了主機路徑,例如 /volume1/… 或 ./。 | 宣告 shared_folder 安裝參數,並以 ${SLOT} 掛載。 |
COMPOSE_HOST_IPC_FORBIDDEN | 服務使用了 ipc: host,但未宣告 privilege.host_ipc。 | 設定 privilege.host_ipc: true,或移除 ipc: host。 |
COMPOSE_HOST_NETWORK_FORBIDDEN | 服務使用了 host 網路,但未宣告 privilege.host_network。 | 設定 privilege.host_network: true,或改用一般的 Compose 網路。 |
COMPOSE_HOST_PID_FORBIDDEN | 服務使用了 pid: host,但未宣告 privilege.host_pid。 | 設定 privilege.host_pid: true,或移除 pid: host。 |
COMPOSE_MISSING | check 找不到 compose.yaml,也找不到 dsm-package.yaml。 | 在專案根目錄執行指令,或建立其中一個檔案。 |
COMPOSE_NAMED_VOLUME_UNDECLARED | 服務使用了未在頂層 volumes 宣告的具名磁碟區。 | 將該磁碟區加到 compose.yaml 的頂層 volumes,或改掛載受控資料夾。 |
COMPOSE_NOT_HEALTHY | 執行 synopkgland test 時,某個服務沒有在時限內變成 healthy。 | 檢查 healthcheck 與 App 記錄。 |
COMPOSE_NOT_RUNNING | 執行 synopkgland test 時,某個服務沒有維持執行。 | 檢查容器的啟動指令與記錄,找出它結束的原因。 |
COMPOSE_NUMERIC_COMMAND_ARG_FORBIDDEN | command 或 entrypoint 清單中有純數字的項目。DSM 可能把它轉成數字,導致專案無法啟動。 | 把整個指令寫成單一字串,例如 command: ["sh", "-c", "httpd -f -p 8080 -h /srv"],或把旗標與值合併成 "-p8080"。 |
COMPOSE_POSIX_ALL_SHARES_SUFFIX_FORBIDDEN | posix_all_shares 的值被加上了子路徑。 | 使用完整的 ${ALL_SHARES} 來源,後面不要加任何內容。 |
COMPOSE_POSIX_ALL_SHARES_UNDECLARED | compose.yaml 使用了 all-shares 變數,但沒有安裝參數是 type: posix_all_shares。 | 宣告一個 type: posix_all_shares 的安裝參數。 |
COMPOSE_PRIVILEGED_FORBIDDEN | 服務使用了 privileged: true,但未宣告 privilege.privileged。 | 設定 privilege.privileged: true,或移除 privileged: true。 |
COMPOSE_ROUTE_UNSUPPORTED | 專案使用了 DSM 無法執行的 Compose 功能。 | 使用預先建置的映像與支援的安裝參數。移除不支援的權限、secrets 或 build。 |
COMPOSE_SERVICE_NOT_FOUND | depends_on 指名了 compose.yaml 沒有定義的服務。 | 修正 depends_on,指向已定義的服務。 |
COMPOSE_SOCKET_MOUNT_FORBIDDEN | 服務掛載了 Docker socket 或其他敏感的系統 socket。 | 移除 docker.sock 掛載。要存取檔案,請使用 shared_folder 或 App 自己的檔案 API。 |
COMPOSE_USER_CONFLICTS_DSM_USER | 服務設定了 user,而 App 又宣告了 dsm_user 安裝參數。 | 移除 compose.yaml 中的 user。dsm_user 參數會替你設定 ${NAME_UID}:${NAME_GID} 與 group_add。 |
COMPOSE_USER_NUMERIC_FORBIDDEN | 服務寫死了數字的 uid:gid。 | 宣告 dsm_user 安裝參數,並使用 ${NAME_UID}:${NAME_GID}。 |
COMPOSE_USER_ROOT_FORBIDDEN | 容器以 root(0:0)執行。 | 宣告 dsm_user 安裝參數,並使用 ${USER_UID}:${USER_GID}。 |
CONTAINER_ARCH_UNSUPPORTED | 容器 App 只支援 x86_64 與 aarch64。DSM 沒有 armv7 的 Container Manager。 | 使用 --arch x86_64 或 --arch aarch64,或改建原生 Go App。 |
CONTRACT_ACCESS_GROUPS_INVALID | integration.web.groups 缺少、格式不符,或沒有搭配 access: dsm-groups 使用。 | 使用 access: dsm-groups 並列出 DSM 群組名稱,或移除 groups。 |
CONTRACT_ACCESS_INVALID | integration.web.access 的值未知。 | 使用 dsm-users(預設)、dsm-admins、dsm-groups(搭配 groups)或 public。 |
CONTRACT_ACCESS_REQUIRES_WEB | 沒有網頁的 App 設定了 integration.web.access 或 groups。 | 移除它們,或加上對應已發布 Compose 連接埠的 adminport。 |
CONTRACT_ADMINPORT_INVALID | adminport 不是整數。 | 將 adminport 設為對應已發布 Compose 連接埠的整數。 |
CONTRACT_ADMINPORT_UNMAPPED | adminport 與 compose.yaml 中任何已發布的連接埠都不相符。 | 在 ports 下加上對應的連接埠映射,例如 "8080:80"。 |
CONTRACT_DSM_USER_DUPLICATE | App 宣告了不只一個 dsm_user 安裝參數。 | 只保留一個。 |
CONTRACT_HOMES_PATH_FORBIDDEN | homes 安裝參數寫了路徑或預設值。 | 只宣告 type: homes,並在 Compose 中引用該參數。套件會在安裝時解析路徑。 |
CONTRACT_HOMES_UNSUPPORTED | 不支援 homes 安裝參數類型。check 會回報警告,deploy 會拒絕。 | 若要讓管理員選一個資料夾,請使用 type: shared_folder。 |
CONTRACT_I18N_INVALID | synology-app.yaml 的 i18n 區塊不合法。 | 只使用 i18n.info,以 zh-TW、ja 等支援的語言為 key,displayname / description 為單行且不含 " 或 \。英文寫在頂層。 |
CONTRACT_ICON_INVALID | synology-app.yaml 的 icon 不是可用的套件圖示。 | icon 指向專案內至少 256×256 的正方形 PNG,或含 icon_256.png 的 icon_<size>.png 目錄。移除即使用 SDK 預設圖示。 |
CONTRACT_INVALID_STRING | synology-app.yaml 中的字串含有控制字元,或含有不允許的 ${…} 代換。 | 移除控制字元與 ${。安裝參數請在 install 下宣告。 |
CONTRACT_LAUNCH_INVALID | integration.web.launch 的值未知。 | 使用 dsm-window(預設)或 new-page。沒有網頁的 App 請省略。 |
CONTRACT_LAUNCH_REQUIRES_WEB | 沒有網頁的 App 設定了 integration.web.launch。 | 移除它,或加上對應已發布 Compose 連接埠的 adminport。 |
CONTRACT_MISSING_FIELD | synology-app.yaml 缺少必填欄位。 | 補上訊息指出的欄位,例如 package、version 或 displayname。 |
CONTRACT_PACKAGE_TOO_LONG | 套件名稱超過 32 個字元,這是 DSM 的上限。 | 將 package 縮短到 32 個字元以內。 |
CONTRACT_PORTAL_REQUIRES_EXECUTOR | Compose App 宣告了 integration.web.portal。Compose App 沒有 executor,而解除安裝後要讓 DSM 網頁伺服器停止提供登入入口網站別名,只有 root 做得到。 | 移除 integration.web.portal。需要別名時,由管理員在 DSM 設定反向代理。 |
CONTRACT_POSIX_ALL_SHARES_LISTING_UNSUPPORTED | posix_all_shares 需要 CLI 在安裝時讀取 NAS 的共用資料夾清單。套件中心與 Package Source 上架做不到這點。 | 以 synopkgland deploy --host <name> 安裝。不要把這個 App 上架到 Package Source。 |
CONTRACT_POSIX_ALL_SHARES_VALUE_FORBIDDEN | posix_all_shares 參數寫了 default 或路徑。 | 只宣告 type: posix_all_shares。 |
CONTRACT_SCHEMA_INVALID | synology-app.yaml 不符合 schema。 | 修正訊息指出的欄位。請見 Compose manifest 參考。 |
CONTRACT_SCHEMA_UNSUPPORTED | synology-app.yaml 的 schema 值不受支援。 | 設定 schema: 1。 |
CONTRACT_SECRET_UNSUPPORTED | 不支援 secret 安裝參數類型。check 會回報警告,deploy 會拒絕。 | 非敏感的值請使用 type: string。若是機密,讓 App 在啟動時自行取得,或放進 ${SYNO_APP_SECRETS_DIR} 內的檔案。 |
DEPLOY_ARCH_UNDETERMINED | deploy 無法判定 NAS 的架構。 | 傳入 --arch x86_64、aarch64 或 armv7。 |
DEPLOY_BUILD_OUTPUT_INVALID | 建置沒有為 deploy 產生恰好一個 SPK。 | 傳入單一 --arch,再執行一次 deploy。 |
DEPLOY_FAILED | deploy 失敗,且沒有更具體的錯誤碼。 | 檢查與 NAS 的網路連線,並執行 synopkgland logs --host <nas>。 |
DEPLOY_PARAM_TYPE_INVALID | --param 的值與宣告的類型不符。 | string 參數請傳非空字串。boolean 參數請只傳 true 或 false。 |
DEPLOY_PARAM_REQUIRED | install-selected delegate 首次安裝沒有指定範圍,其 preinst 會拒絕安裝。 | 加上 --param delegate_share=<共用資料夾> 或 --param delegate_home=true。 |
DEPLOY_PARAM_UNDECLARED | --param 指名了未宣告的安裝參數,或 native-go、binary 套件沒有這個安裝精靈值。 | Compose 只傳 synology-app.yaml 的 install 下宣告的 string 或 boolean 名稱。native-go 與 binary 只傳 install-selected delegate 的 delegate_share 或 delegate_home。 |
DEPLOY_PLAN_INVALID | 部署計畫與專案類型不符。 | 執行 check 後再部署。 |
DEPLOY_POSIX_ALL_SHARES_LOOKUP_FAILED | deploy 無法用管理員工作階段列出 NAS 上的共用資料夾。 | 確認管理員可以在 DSM 列出共用資料夾,或以 --param NAME=… 提供清單。 |
DEPLOY_VERSION_INVALID | 套件版本不合法、低於已安裝的版本(“Refusing downgrade”),或 version 相同但 build 沒有更高。 | 設定更高且合法的 version 或 build,再部署。 |
DEVELOPMENT_INSTANCE_UNSUPPORTED | 原生 Go App 不支援 --dev。 | 以不同的套件名稱執行 init,取得另一個開發用 App。 |
DSM_COMPOUND_FAILED | DSM 安裝請求的其中一個步驟失敗。 | 查看回應中的 api、method、errorCode,以及 NAS 上的套件中心記錄,然後重試。 |
DSM_DEPENDENCY_CONFLICT | DSM 拒絕請求,因為有執行中的套件依賴這個套件。 | 停止 DSM 列出的套件,然後重試升級。 |
DSM_TLS_UNTRUSTED | DSM 的憑證是自簽、已過期或名稱不符,這台電腦不信任它。 | 把 NAS 憑證或其 CA 匯出成 PEM,用 NODE_EXTRA_CA_CERTS=<該檔> 執行;或讓 DSM 使用與 host profile 名稱相符的受信任憑證。不要關閉憑證檢查。 |
DSM_REQUEST_FAILED | 對 DSM 的請求失敗。 | 檢查 DSM 工作階段、請求參數與套件中心記錄,然後重試。 |
DSM_USER_LOGICAL_NAME_REQUIRED | dsm_user 的值是數字。它必須是 DSM 使用者名稱。 | 傳入使用者名稱,例如 --run-as RUN_AS=alice。 |
DSM_USER_REQUIRED | App 有共用資料夾,但沒有 dsm_user 安裝參數。 | 加上恰好一個 install.<NAME>.type: dsm_user,並在 Compose 中使用 ${NAME_UID}:${NAME_GID}。 |
EXECUTOR_BUILD_FAILED | 建置執行管理員操作的輔助程式(供 rootOps 與 delegate 使用)失敗。 | 閱讀訊息中的編譯器輸出並修正。原生 App 需要 Go 1.21 或以上;建置固定使用 Go 1.26.9,取不到(離線)或產物記錄其他 Go 版本時會失敗。 |
EXECUTOR_DIGEST | 建置提供給管理員操作輔助程式的 digest 不是 64 字元的 SHA-256 十六進位字串。 | 以 synopkgland build 重新建置。不要自己帶 digest 呼叫組裝器。 |
EXECUTOR_DIGEST_MISMATCH | 由 backend/go.mod 的 SDK 版本建出的 executor 與 CLI 內建的 SHA-256 表不符,或表中沒有這個 SDK 版本。 | require 已發佈的 SDK 版本,並以 Go 1.26.9 建置。版本比 CLI 新時,更新 CLI。 |
EXECUTOR_DIGEST_UNVERIFIED | 警告:SYNOPKGLAND_SDK_DIR 指向本機 SDK,executor 沒有對照 SHA-256 表。 | 只用於開發。要發佈 SPK 前取消 SYNOPKGLAND_SDK_DIR 並重新建置。 |
SDK_REQUIRED | rootOps 或 delegate 需要 SDK,但 backend/go.mod 沒有 require github.com/synopackageland/syno-pkg-land-sdk。 | 在 backend/go.mod require 與 CLI 同一 minor 的 SDK,或改用 init 產生的 Go 後端。 |
SDK_TAG_REQUIRED | Rust App 的 Cargo.lock 沒有把唯一一個 syno-pkg-land-app 釘在 release tag(branch、rev、path、registry 與多個版本都會被拒絕)。 | 在 Cargo.toml 寫 syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "vX.Y.Z" },執行 cargo update -p syno-pkg-land-app 並提交 Cargo.lock。 |
SDK_VERSION_MISMATCH | frontend/package.json 的 @synopackageland/sdk 與 backend/go.mod 要求的 SDK 版本不同。 | 兩邊改成同一個版本。file: 相依時,比對的是該目錄 package.json 的 version。 |
SDK_UNSUPPORTED | 後端(backend/go.mod 或 backend/Cargo.lock)要求的 SDK 不在這個 CLI 的 minor 版本線上。 | 改用與 SDK 同一 minor 的 CLI,或把 SDK 改成訊息列出的版本。 |
SDK_DIR_NOT_READY | SYNOPKGLAND_SDK_DIR 指向的目錄沒有 go/go.mod,或 Vue 專案需要的 SDK ts 套件尚未建置(沒有 ts/dist)。 | 指向 syno-pkg-land-sdk 的 checkout。Vue 專案先在 $SYNOPKGLAND_SDK_DIR/ts 執行 npm ci && npm run build。 |
SDK_DOWNLOAD_FAILED | go mod download 取不到 backend/go.mod 要求的 SDK 版本。 | CLI 會透過 git 取得 private SDK。請讓 git 有 github.com 的憑證;可用 git ls-remote https://github.com/synopackageland/syno-pkg-land-sdk 驗證存取權限。接著確認版本存在。離線時先在同一台機器連線執行一次 go mod download。 |
STANDALONE_LOGIN_STYLE_IMAGE_INVALID | login_style 指定的圖片不存在、格式錯誤或尺寸錯誤。 | 在專案內使用至少 1920×1080、最多 2 MiB 的 JPEG wallpaper,320×200 的 JPEG wallpaper_thumbnail,以及 680×124 的 PNG title。 |
STANDALONE_LOGIN_STYLE_INVALID | dsm-package.yaml 的 login_style 格式錯誤,或沒有宣告 portal 就設定了它。 | 宣告 portal,login_style 只寫 color(#RRGGBB)、成對的 wallpaper 與 wallpaper_thumbnail,以及 title。省略 login_style 就使用 CLI 預設樣式。見Manifest 參考。 |
STANDALONE_PYTHON_SDK_MISSING | App 的 SDK 版本沒有 Python SDK(python/synopkgland_app)。 | 把 SYNOPKGLAND_SDK_DIR 指向含 python/synopkgland_app 的 syno-pkg-land-sdk checkout,或要求有附帶它的 SDK 版本。 |
STANDALONE_REQUEST_TIMEOUT_SHORT | 請求期限在 root.run 可能執行的 root 程式回應前就結束。executor 在 run.timeout_s 之後 10 秒回應,它的 client 再多等 10 秒。 | 把 backend.timeout_seconds 設為至少該程式的 run.timeout_s(預設 20)+ 20,或調低 run.timeout_s。 |
TEMPLATES_MISSING | 找不到 @synopackageland/templates。 | 重新安裝 @synopackageland/cli,或把 SYNOPKGLAND_TEMPLATES_DIR 指向 templates checkout。 |
EXECUTOR_PACKAGE | 套件名稱不適用於管理員操作輔助程式。 | 使用以英文字母開頭、含 2 到 64 個英文字母與數字的套件名稱。 |
EXECUTOR_PIN_REQUIRED | 套件使用了 rootOps 或 delegate,但建置沒有附上輔助程式。 | 以 synopkgland build 建置,讓輔助程式一併打包。 |
EXECUTOR_POLICY | delegate 的 operations 或 scope 不合法。 | 修正 capabilities.delegate。請見 Manifest 參考。 |
EXECUTOR_POLICY_REJECTED | App 的 SDK 版本的 executor 拒絕 CLI 產生的 policy,NAS 核准時也會拒絕。 | 原因會指出被拒的部分:root、stop 或 purge → root.programs、root.stop、uninstall.purge;scope、operation、destination、move 或 lifetime → capabilities.delegate;portal → portal;entry → entry。修正 dsm-package.yaml 的該部分。請見 Manifest 參考。 |
EXECUTOR_ROOT_PROGRAMS_UNSUPPORTED | dsm-package.yaml 的 root 設定需要支援 root 程式設定的 executor,App 的 SDK 版本沒有。 | 改用有 root 程式的 SDK,或移除 root 設定。 |
EXECUTOR_TASK_LENGTH | 管理員操作輔助程式的排程工作腳本比 DSM 允許的長度還長。 | 以 synopkgland build 重新建置。若仍發生,請縮短套件名稱。 |
EXECUTOR_TASK_PERCENT | 排程工作腳本含有 % 字元,DSM 不接受。 | 以 synopkgland build 重新建置。若仍發生,檢查套件名稱與 scope 是否含 %。 |
GATEWAY_ARCH_FAMILY_REQUIRED | DSM 登入閘道是原生程式,所以 SPK 需要目標架構。 | 加上 --arch x86_64 或 --arch aarch64。deploy 會從 NAS 讀取。只有不需要 DSM 登入的 App 才使用 integration.web.access: public。 |
GATEWAY_BUILD_FAILED | 建置 DSM 登入閘道失敗,或產出的不是目標架構的靜態程式。 | 閱讀 go build 輸出。閘道固定以 Go 1.26.9 建置;離線時請安裝 go1.26.9,或讓 GOPROXY 可以提供 golang.org/toolchain。 |
GATEWAY_GO_MISSING | 建置 DSM 登入閘道需要 Go,但找不到 go 指令。 | 從 https://go.dev/dl/ 安裝 Go 1.21 或以上(建置時會使用 Go 1.26.9),或設定 integration.web.access: public。 |
HOMES_NOT_ENABLED | NAS 沒有開啟 User Home 服務,或 DSM 沒有回傳 home 路徑。 | 在 DSM 開啟 User Home,然後重新部署。 |
HOST_REQUIRED | 沒有選擇 NAS。 | 傳入 --host <profile>。不連 NAS 做本機檢查,請用 deploy --dry-run。 |
IMAGE_PIN_REQUIRED | 映像沒有以 digest 固定。 | 執行 synopkgland images pin。 |
INIT_BINARY_BUILD_FAILED | 建置 binary 模板的範例程式失敗。 | 安裝 Go 後重新執行 init,或提供你自己的靜態 CGI 程式。 |
INIT_COMPOSE_INVALID | 以 --from 提供的 Compose 檔案不合法。 | 讓 --from 指向含有 services 的 YAML 檔案。 |
INIT_DISPLAY_NAME_INVALID | 顯示名稱不合法。 | 使用單行文字,不含 " 與 \。 |
INIT_OPTIONS_UNSUPPORTED | 選項不適用於這個模板。 | --from 只適用於 -t compose。--ui 只適用於 -t native-go。 |
INIT_PACKAGE_INVALID | 套件名稱不合法。 | 以英文字母開頭,使用 2 到 64 個英文字母與數字,例如 PhotoTagger。 |
INIT_SHARED_FOLDER_INVALID | 共用資料夾選項不合法。 | 使用 select 或 create。使用 create 時,還要傳入 --shared-folder-name。--shared-folder 只適用於 -t native-go。 |
INIT_TARGET_NOT_EMPTY | 目標資料夾中有 init 會覆寫的檔案。 | 使用空資料夾。要為既有專案加入能力,請使用 add。 |
INIT_TEMPLATE_REQUIRED | 沒有指定模板。 | 使用 -t native-go、binary 或 compose。 |
INIT_TEMPLATE_UNKNOWN | 模板名稱未知。 | 使用 -t native-go、binary 或 compose。 |
INIT_UI_INVALID | --ui 的值不合法。 | 使用 --ui vue 或 --ui plain。 |
INSTALL_PARAMETER_UNREFERENCED | 宣告了 install 參數,但 compose.yaml 從未使用。 | 在 compose.yaml 以 ${NAME} 使用它,或從 synology-app.yaml 移除。 |
INSTALL_STRING_INVALID | 安裝參數的預設值含有控制字元或 ${…} 代換。 | 從預設值中移除。 |
INSTALL_STRING_TOO_LONG | 安裝參數的預設值超過 256 個字元。 | 縮短預設值。 |
LOCAL_SPK_INSTALL_FAILED | DSM 無法安裝 deploy 上傳的 SPK。 | 到 NAS 的套件中心查看安裝錯誤。檢查套件版本與需求。 |
MIN_DSM_CONTAINER_FLOOR | 容器 App 的最低 DSM 版本太低。 | 容器 App 需要 DSM 7.2.1-69057 或以上。 |
MIN_DSM_INVALID | 最低 DSM 版本不合法,或對該能力來說太低。 | 指定 7.x 版本,或完整的 7.x-build 版本。rootOps 需要 DSM 7.1-42661 或以上。 |
NAS_CREDENTIALS_MISSING | 找不到 NAS 憑證。 | 設定 synoagentcli profile,或設定 DSM_URL 與 DSM_PASSWORD。 |
NATIVE_ARCH_UNDETERMINED | deploy 無法判定原生 App 的 NAS 架構。 | 傳入 --arch x86_64、aarch64 或 armv7。 |
NATIVE_LAYOUT_INVALID | 原生套件的 manifest、hook 或檔案不符合套件版面規則。 | 使用 schema: 2 搭配 backend.kind: native。檢查路徑、程式是否為靜態 ELF 檔案,以及 checksum。 |
NATIVE_TOOLKIT_TAR_UNSUPPORTED | native.toolkits 需要 GNU tar 或 bsdtar 作為 tar,但 PATH 上的 tar 兩者都不是。 | 讓 PATH 上第一個 tar 是 GNU tar 或 bsdtar(macOS 內建 bsdtar,多數 Linux 是 GNU tar),再重新 build。 |
NATIVE_LAYOUT_SCRIPT_NOT_EXECUTABLE | 原生套件版面 scripts/ 的生命週期腳本沒有執行權限。DSM 會直接執行它;inspect 對同一個檔案回報 SPK_SCRIPT_NOT_EXECUTABLE。 | 在版面 metadata 資料夾對該腳本執行 chmod +x,再重新 build。 |
NOTICE_MISSING | 缺少第三方授權聲明檔案。 | 重新安裝模板相依套件並重新建置 UI,讓授權聲明檔案產生。 |
NOTICE_UNSAFE | 授權聲明檔案是 symlink、特殊檔案,或過大。 | 移除 symlink、特殊檔案與過大的授權聲明檔案。 |
NOT_INSTALLED | 套件尚未安裝在 NAS 上。 | 先執行 synopkgland deploy --host <nas>。 |
PACKAGE_IDENTITY_TOO_LONG | 套件名稱太長。上限為 28 個字元,讓 4 個字元的 .dev 後綴仍能放進 DSM 的 32 字元上限。 | 將 package 縮短到 28 個字元以內。 |
PORT_ALREADY_IN_USE | deploy 發現某個已發布的 TCP 連接埠已被其他服務或容器使用。 | 更換 synology-app.yaml 或 compose.yaml 中發布的主機連接埠。升級或重新安裝時,同一套件自己的容器不受影響。 |
PROJECT_NOT_FOUND | 找不到專案 manifest。 | 在專案根目錄執行指令,或傳入 --project。 |
PROJECT_RUNTIME_EXCLUSIVE | 專案同時有 compose.yaml 與 dsm-package.yaml。 | 只保留一個:容器 App 用 compose.yaml,原生 App 用 dsm-package.yaml。 |
REPRODUCIBLE_INVALID | manifest 的 reproducible 格式不對,或列出的 input 不是專案內的檔案。 | 使用 reproducible: {inputs: [檔案...], clean: [路徑...]},路徑相對於專案;{arch} 只能用在 clean。 |
SHARE_LOGICAL_NAME_REQUIRED | 共用資料夾的值是 /volume1/… 這類路徑。 | 傳入控制台中顯示的共用資料夾名稱,例如 --share MEDIA_SHARE=photos。 |
SHARE_NOT_FOUND | NAS 上沒有這個共用資料夾。 | 在 DSM 控制台建立它,或修正拼字。 |
SHARE_RUN_AS_NO_ACCESS | 選定的執行使用者對選定的共用資料夾沒有權限。安裝會成功,但 App 執行時會得到 “Permission denied”。 | 在 DSM 中授予該使用者(或其群組)該共用資料夾的權限,或改選其他使用者或資料夾。這項檢查只在 deploy 執行,套件中心的安裝精靈不會執行。 |
SHARE_VALUE_REQUIRED | deploy 沒有已宣告的 shared_folder 參數的值。 | 傳入 --share <SLOT>=<name>。 |
SPK_INSPECTION_FAILED | inspect 找到至少一個錯誤:dsm.errors 中的 SPK 規則錯誤,或 synopkgland 建置的 SPK 在 findings 中的建置合約問題。 | 修正報告中每個錯誤後重新建置或打包。警告不會導致失敗。 |
STANDALONE_API_PERMISSIONS_CHANGED | 建置進行時,permissions.json 被修改。 | 讓檔案保持不變,再執行一次 check 與 build。 |
STANDALONE_API_PERMISSIONS_INVALID | permissions.json 不合法。 | 修正 backend/internal/api/permissions.json。請見 App API 參考。 |
STANDALONE_ARCHES_INVALID | arches 不是合法的清單。 | 至少列出 x86_64、aarch64、armv7 其中一個,不可重複。 |
STANDALONE_ARCH_NOT_DECLARED | 你要建置的架構不在 arches 中。 | 將它加入 dsm-package.yaml 的 arches,或改用已宣告的 --arch。 |
STANDALONE_BACKEND_INVALID | backend 區塊不合法。 | 恰好使用 go(dir,以及以 ./ 開頭的選用 main)或 binary(以架構為 key 的檔案)其中之一。 |
STANDALONE_BACKGROUND_ARTIFACT_REQUIRED | SPK 組裝器需要已建置的背景工作 worker,但沒有拿到。 | 以 synopkgland build 建置。不要直接呼叫組裝器。 |
STANDALONE_BACKGROUND_BUILD_FAILED | 建置背景工作 worker 失敗。 | 安裝 Go 1.25 或以上。確認 backend 內有 cmd/background-worker(init -t native-go --with jobs 會建立)。閱讀編譯器輸出。 |
STANDALONE_BACKGROUND_INVALID | capabilities.jobs 不合法。 | 寫成 jobs: true 或 jobs: { worker: sha256-v1 }。worker 一律以套件帳號執行。 |
STANDALONE_BINARY_ARCH_MISMATCH | 後端程式是為不同 CPU 建置的,與目標不符。 | 為該架構重新建置,或修正 backend.files 的對應。 |
STANDALONE_BINARY_ARCH_MISSING | arches 中的某個架構在 backend.files 沒有對應的程式。 | 加上該程式,或從 arches 移除該架構。 |
STANDALONE_BINARY_DYNAMIC | 後端程式是動態連結。各 DSM 機型的 libc 版本不同。 | 改為靜態連結。Go 請以 CGO_ENABLED=0 建置。 |
STANDALONE_BINARY_MISSING | 找不到後端程式。 | 確認 backend.files 指向的檔案存在。 |
STANDALONE_BINARY_NOT_ELF | 後端程式不是該架構所需的 little-endian Linux ELF 檔案(x86_64 與 aarch64 為 64 位元,armv7 為 32 位元)。 | 提供為該架構建置的 Linux 程式。 |
STANDALONE_BINARY_NOT_REGULAR | 後端程式不是一般檔案。 | 使用實際檔案,不可是 symlink、資料夾或特殊檔案。 |
STANDALONE_BINARY_TOO_LARGE | 後端程式超過 256 MiB。 | 縮小程式,例如使用 -ldflags "-s -w"。 |
STANDALONE_BRIDGE_APP_INVALID | App 目錄含有 symlink 或特殊檔案,或超過 256 MiB。 | App 目錄只保留一般檔案與目錄,大型資料移出。 |
STANDALONE_BRIDGE_APP_IN_UI | Python、Node.js 或 Rust App 的 backend.dir 與 ui.dir 重疊;DSM 會直接提供 ui/ 下的檔案。 | 把 App 放在 ui.dir 以外的目錄(例如 app/);兩者不可互相包含。 |
STANDALONE_BRIDGE_DESCRIBE_FAILED | 沒有 backend.methods 時,build 會啟動 App 讀取 hello,而 App 沒有回應 v1 hello。 | 在建置機器安裝 python3 或 node 並確認 App 能啟動,或在 dsm-package.yaml 列出 backend.methods。 |
STANDALONE_BRIDGE_MANIFEST_INVALID | CLI 產生的 bridge.json 不符合 spec/bridge/v1 的 manifest schema。 | 檢查 backend.entry、methods 與 node.package。仍失敗時請回報 CLI 錯誤。 |
STANDALONE_BRIDGE_METHODS_MISMATCH | App 的方法與 permissions.json 不一致,或使用了 SDK 的方法名稱;runtime 會拒絕啟動。 | permissions.json 只列 App 自己的方法;App 方法不可與 SDK 方法同名(nas.*、identity.*、portal.status 等)。 |
STANDALONE_BUILD_INVALID | build 不是 1 到 9999 的整數。 | 將 build 設為 1 到 9999 的整數。每發出一個 SPK 就遞增。 |
STANDALONE_DAEMON_ARTIFACT_REQUIRED | SPK 組裝器需要已建置的 daemon supervisor,但沒有拿到。 | 以 synopkgland build 建置。不要直接呼叫組裝器。 |
STANDALONE_DAEMON_BUILD_FAILED | 建置 daemon supervisor 失敗。 | 安裝 Go 1.21 或以上(建置固定使用 Go 1.26.9)並閱讀編譯器輸出。NAS 本身不需要 Go。 |
STANDALONE_DAEMON_INVALID | daemon 區塊不合法。 | 檢查 daemon.exec、各架構的 targets、args、env、uninstall_args 與以整數秒表示的逾時。移除 shell、user 與自訂 conf 檔案。 |
STANDALONE_DAEMON_PAYLOAD_INVALID | daemon 檔案不是專案內、有大小限制且不含連結的資料夾。 | 重新建置各架構的 bundle。移除 symlink、特殊檔案與 setid 位元。大小保持在 512 MiB 以下。 |
STANDALONE_ENTRY_INVALID | entry 不合法。 | 使用 admin-only 或 app-privilege。app-privilege 需要至少一個在 permissions.json 標為 authenticated 的 route。 |
STANDALONE_ENTRY_WIDENED | entry: admin-only 與 permissions.json 中開放給其他使用者的 route 衝突。 | 把這些 route 改為 administrators。要讓一般使用者進入,請改用 entry: app-privilege 或省略 entry。 |
STANDALONE_ENTRY_UNSUPPORTED | 後端無法強制執行 entry 模式。 | 使用 Go 後端:backend/go.mod require github.com/synopackageland/syno-pkg-land-sdk,且 backend.main 的 main.go(init 產生的是 cmd/app/main.go)以 dsm.NewEntryGate 包住 authenticator。 |
STANDALONE_FIELD_UNKNOWN | dsm-package.yaml 有不支援的欄位。 | 移除它。原生套件不接受自訂的生命週期腳本或 DSM conf 檔案。 |
STANDALONE_GO_BUILD_FAILED | go build 失敗。 | 在 backend 資料夾執行 go build ./... 並修正錯誤。 |
STANDALONE_GO_MISSING | 找不到 go 指令。 | 從 https://go.dev/dl/ 安裝 Go 1.25 或以上,或以 backend.files 打包既有的程式。 |
STANDALONE_I18N_CATALOG_INVALID | 訊息檔不是扁平的 key 對文字的 JSON 物件。 | 使用 { "greeting.save": "Save" } 這種格式。 |
STANDALONE_I18N_GLOSSARY_INVALID | 用語表格式錯誤,或某個用語指向不存在的訊息 key。 | 修正 glossary.json 的 terms(id、text、keys)。 |
STANDALONE_I18N_GLOSSARY_MISMATCH | 訊息沒有使用用語表要求的 DSM 用語。 | 使用該語言在用語表中的用語,讓 App 與 DSM 一致。 |
STANDALONE_I18N_INVALID | i18n 區塊不合法。 | i18n 只接受 messages、glossary 與 info。info 以 zh-TW、ja 等支援的語言為 key。英文寫在頂層。 |
STANDALONE_I18N_KEYS_MISMATCH | 某個語言檔的 key 與 en.json 不同。 | 讓每個語言檔恰好有 en.json 的所有 key。 |
STANDALONE_I18N_LOCALE_UNSUPPORTED | 訊息檔的語言不在支援的九種語言內。 | 使用 en、zh-TW、zh-CN、ja、ko、de、fr、es 或 it。其他 DSM 語言會顯示英文。 |
STANDALONE_I18N_MESSAGES_MISSING | i18n.messages 資料夾缺少 en.json。 | 加入 en.json。它是所有語言的後備文字與 key 清單。 |
STANDALONE_I18N_PLACEHOLDER_MISMATCH | 翻譯多了或少了 {placeholder}。 | 保留 en.json 文字中的每個 {name} 佔位符。 |
STANDALONE_ICON_INVALID | dsm-package.yaml 的 icon 不是可用的套件圖示。 | icon 指向專案內至少 256×256 的正方形 PNG,或含 icon_256.png 的 icon_<size>.png 目錄。移除即使用 SDK 預設圖示。 |
STANDALONE_MANIFEST_MISSING | 找不到 dsm-package.yaml。 | 在專案根目錄執行指令,或以 synopkgland init -t native-go 建立專案。 |
STANDALONE_MANIFEST_YAML | dsm-package.yaml 不是合法的 YAML 物件。 | 修正 YAML 語法。 |
STANDALONE_NODE_DEPENDENCY_MISSING | Node.js App 的 package.json 相依套件沒有安裝在它的 node_modules。 | 在 App 目錄執行 npm ci --omit=dev 後重新建置。@synopackageland/app 由 CLI 放入,不需安裝。 |
STANDALONE_NODE_SDK_NOT_BUILT | App 的 SDK 版本沒有建置好的 Node.js SDK(node/dist)。 | 先在 SYNOPKGLAND_SDK_DIR checkout 的 node/ 執行 npm ci && npm run build;正式發行的 SDK 已含 node/dist。 |
STANDALONE_OS_MIN_VER_INVALID | os_min_ver 格式不對,或對 rootOps 來說太低。 | 使用 <major>.<minor>-<build>,例如 7.2-64570。rootOps 需要 7.1-42661 或以上。 |
STANDALONE_PACKAGE_INVALID | package 名稱不合法。 | 以英文字母開頭,只使用英文字母與數字,2 到 64 個字元,例如 PhotoTagger。 |
STANDALONE_PATH_INVALID | 路徑欄位不是專案內的相對路徑。 | 使用相對於專案根目錄的路徑。 |
STANDALONE_PATH_OUTSIDE_PROJECT | 路徑指向專案資料夾之外。 | 把檔案放在專案內。symlink 解析後也必須在專案內。 |
STANDALONE_PORTAL_ENTRY_INVALID | os_min_ver 低於 DSM 7.2-64570 時由 executor 註冊入口,而套件名稱或 displayname 不符合它的規則。 | 套件名稱只能包含以 .、_ 或 - 分隔的英數字,最多 64 個字元;displayname 為 1–64 個字元且不含控制字元。 |
STANDALONE_PORTAL_INVALID | portal 格式不符,或別名不合法。 | 使用 portal: {} 或 portal: { alias: my-app }。別名為 1 到 64 個小寫英文字母、數字或 -,且不是 DSM 保留路徑。 |
STANDALONE_PORTAL_MIN_DSM | App 宣告了 portal,但 os_min_ver 低於 7.1-42661。 | 將 os_min_ver 提高到 7.1-42661 或以上,或移除 portal。 |
STANDALONE_PORTAL_REQUIRES_EXECUTOR | 沒有 executor(capabilities.rootOps 或 delegate)的 App 宣告了 portal。 | 解除安裝後要讓 DSM 網頁伺服器停止提供登入入口網站別名,只有 root 做得到,而無升權 App 任何階段都不使用 root。請加入 root-ops 或 delegate,或移除 portal,改由管理員在 DSM 設定反向代理。 |
STANDALONE_ROOT_OPS_MISSING | 設定了 capabilities.rootOps: true,但沒有任何 root 操作。 | 至少加入一個 root/<name>.sh,或移除 capabilities.rootOps。 |
STANDALONE_ROOT_OPS_UNUSED | 專案有 root/ 資料夾,但 capabilities.rootOps 沒有開啟。 | 設定 capabilities.rootOps: true,或刪除 root/。 |
STANDALONE_ROOT_OP_INVALID | root/ 內的檔案不是合法的 root 操作。 | 每個檔案都必須是 root/<小寫名稱>.sh、一般檔案、以 #!/bin/sh 開頭,且不超過 16 KiB。 |
STANDALONE_ROOT_PROGRAMS_INVALID | dsm-package.yaml 的 root 設定不合法,或 executor 不接受。 | root 只接受 programs(<name>: {kind, schema, run, job},對應 root/<name>.sh 或 root/<arch>/<name>)、stop(root/ 裡的程式)與 state: true,並需要 capabilities.rootOps: true。請見 Manifest 參考。 |
STANDALONE_RUNTIME_BUILD_FAILED | 從 App 的 SDK 版本編譯 bridge runtime(bridge/cmd/runtime)失敗,或不是以 go1.26.9 建置。 | 安裝 Go 1.21 以上並確保可取得 go1.26.9,且使用含 bridge runtime 的 SDK 版本。訊息中有編譯器輸出。 |
STANDALONE_RUST_BUILD_FAILED | Rust App 的 cargo zigbuild 交叉編譯失敗,或沒有產生 backend.entry 的 binary。 | 以 rustup 安裝 Rust 與 x86_64-unknown-linux-musl、aarch64-unknown-linux-musl、armv7-unknown-linux-gnueabihf 三個 target,並安裝 cargo-zigbuild 與 zig。backend.entry 設為 Cargo binary 名稱。訊息中有編譯器輸出。 |
STANDALONE_SCHEMA_INVALID | schema 值不是 2。 | 設定 schema: 2。使用 backend.kind 與 capabilities。 |
STANDALONE_SHARED_FOLDER_INVALID | install.sharedFolder 不合法。 | 寫成 install: { sharedFolder: { mode: select|create, key: <小寫英文字母、數字、底線>, permission: ro|rw } }。create 還需要 name。select 不可以有 name。 |
STANDALONE_TEXT_INVALID | 顯示文字欄位不合法。 | 使用單行、非空、且不含 " 與 \ 的文字。metadata 請檢查文字、email、URL 與螢幕截圖。 |
STANDALONE_TIMEOUT_UNSUPPORTED | backend.timeout_seconds 需要 Go main 讀取建置時傳入的 requestTimeout。 | 在 main.go 宣告 var requestTimeout = "" 並以 api.WithRequestDeadline(handler, api.Timeout(...)) 套用,或移除 timeout_seconds。 |
STANDALONE_UI_BUILD_FAILED | UI 建置指令失敗。 | 在 ui.build.cwd 安裝 UI 相依套件(有 package-lock.json 用 npm ci,否則用 npm install),執行建置指令並修正錯誤。 |
STANDALONE_UI_BUILD_INVALID | ui.build 不合法。 | ui.build.command 必須是字串清單,不經過 shell 執行,例如 [npm, run, build]。 |
STANDALONE_UI_ENTRY_MISSING | UI 資料夾沒有 app.js 或沒有 app.css。 | 讓 ui.dir(或 UI 建置輸出)同時包含這兩個檔案。 |
STANDALONE_UI_INVALID | ui 區塊不合法。 | 提供 ui.dir。 |
STANDALONE_UI_SPECIAL_FILE | UI 資料夾含有特殊檔案。 | 只保留一般檔案與資料夾。 |
STANDALONE_UI_SYMLINK | UI 資料夾含有 symlink。 | 以實際檔案取代。 |
STANDALONE_UI_TOO_LARGE | UI 檔案總大小超過 64 MiB。 | 縮小 UI 資產。 |
STANDALONE_UI_WINDOW_INVALID | ui.window 不是有效的 DSM 視窗大小。 | 使用整數:width 320–3840、height 240–2160,minWidth 與 minHeight(預設 700 與 420)不可大於它們。只寫要改的欄位。 |
STANDALONE_VERSION_INVALID | version 不是數字版本。 | 使用 1.2.0 這類格式。建置編號請填在 build。 |
UNINSTALL_EXEC_MISSING | uninstall.purge.exec 不是建置後套件內的一般可執行檔。 | 指向套件內的可執行檔,例如 ui/cgi/api.cgi、background/worker 或 daemon/payload/ 下的檔案。 |
UNINSTALL_EXEC_UNSAFE | uninstall.purge.exec 是試圖取得 root 的 shell script。 | hook 一律以套件帳號執行。需要 root 的清理放在 root/<name>.sh,並寫在 uninstall.purge.root。 |
UNINSTALL_INVALID | uninstall 區塊不符合固定的 exec、參數、環境變數與逾時契約。 | 檢查 uninstall.purge:exec 在套件內(不在 executor/ 或 root/)、args、env(不可用 SYNOPKGLAND_*)與 2–120 秒的 timeout,以及 state.items 的 key 不可重複。 |
UNINSTALL_ROOT_OP_MISSING | uninstall.purge.root 指向不存在的 root 操作。 | 加入 root/<name>.sh,或把 uninstall.purge.root 改成既有的 root 操作名稱。 |
UNINSTALL_ROOT_REQUIRES_ROOT_OPS | uninstall.purge.root 需要管理員核准的 root 操作。 | 宣告 capabilities.rootOps: true 並提供 root/<name>.sh,或移除 uninstall.purge.root。 |
UNINSTALL_STATE_REQUIRES_PURGE | uninstall.state 沒有可以刪除這些狀態的 App 解除安裝 hook。 | 加入 uninstall.purge,讓 App 在 SYNOPKGLAND_DELETE_STATE=1 時刪除列出的狀態,或移除 uninstall.state。 |
UNINSTALL_STATE_TEXT_MISSING | 解除安裝精靈缺少 uninstall.state 項目的文字。 | 在 en.json 訊息檔(與其他語言)加入 uninstall.state.<key>。 |
VALIDATION_FAILED | 專案未通過合約或安全檢查,所以 deploy 停止。 | 先執行 synopkgland check 並修正錯誤。 |
SPK 規則
Section titled “SPK 規則”synopkgland inspect <spk> 在 DSM 格式區段(--json 的 dsm)回報這些代碼。它們依 DSM 7 套件格式檢查任何 SPK,來源欄寫出每條規則出自 DSM 7 Developer Guide 的哪一頁。error 會讓 inspect 以 SPK_INSPECTION_FAILED 失敗。warning 是可能的錯誤,或指南沒有寫清楚的規則,不會導致失敗。--json 報告中每個問題都有 code、severity、message,適用時還有 path(package.tgz 內的檔案寫成 package.tgz:<path>)。
| 代碼 | 嚴重度 | 意思 | 來源 |
|---|---|---|---|
SPK_CONF_UNKNOWN | warning | conf/ 有 DSM 不讀取的檔案(已知:privilege、resource、PKG_DEPS、PKG_CONX、systemd/)。 | DSM 7 Developer Guide: conf、Systemd User Unit |
SPK_ELF_ARCH_MISMATCH | error | package.tgz 的 ELF 執行檔與 INFO arch 的 CPU 不符。 | DSM 7 Developer Guide: INFO Necessary Fields (arch)、Appendix A |
SPK_ENTRY_UNKNOWN | warning | SPK 最上層有指南沒有列出的檔案或目錄(檔名區分大小寫)。 | DSM 7 Developer Guide: Package Structure |
SPK_ENTRY_UNSAFE | error | SPK 內的路徑跳出封存根目錄(絕對路徑或 ..),或是連結。 | DSM 7 Developer Guide: Package Structure |
SPK_ICON_INVALID | error | PACKAGE_ICON.PNG 或 PACKAGE_ICON_256.PNG 不是 PNG。 | DSM 7 Developer Guide: Package Structure |
SPK_ICON_MISSING | error | 缺少 PACKAGE_ICON.PNG 或 PACKAGE_ICON_256.PNG。 | DSM 7 Developer Guide: Package Structure |
SPK_ICON_SIZE | warning | PACKAGE_ICON.PNG 不是 64×64,或 PACKAGE_ICON_256.PNG 不是 256×256。 | DSM 7 Developer Guide: Package Structure |
SPK_INFO_ADMINPORT_INVALID | error | INFO adminport 不是 0–65536 的整數。 | DSM 7 Developer Guide: INFO Optional Fields (adminport) |
SPK_INFO_ARCH_NOARCH_MIXED | warning | INFO arch 同時有 noarch 與其他值。 | DSM 7 Developer Guide: INFO Necessary Fields (arch) |
SPK_INFO_ARCH_UNKNOWN | warning | INFO arch 或 exclude_arch 含有 Appendix A 與已知 DSM 7 平台都沒有的值。 | DSM 7 Developer Guide: Appendix A Platform and Arch Value Mapping Table |
SPK_INFO_BOOLEAN_INVALID | error | INFO 的 yes/no 欄位(例如 startable、silent_install)不是 “yes” 或 “no”。 | DSM 7 Developer Guide: INFO Optional Fields |
SPK_INFO_CHECKSUM_MISMATCH | error | INFO checksum 不是 package.tgz 的 MD5。 | DSM 7 Developer Guide: INFO Optional Fields (checksum) |
SPK_INFO_DISPLAYNAME_MISSING | warning | INFO 沒有 displayname;Package Center 會改顯示 package 值。 | DSM 7 Developer Guide: INFO Optional Fields |
SPK_INFO_FIELD_DUPLICATE | warning | INFO 同一個欄位設定了兩次。 | DSM 7 Developer Guide: INFO |
SPK_INFO_FIELD_REQUIRED | error | INFO 缺少必填欄位(package、version、os_min_ver、description、arch、maintainer)。 | DSM 7 Developer Guide: INFO Necessary Fields |
SPK_INFO_FIELD_UNKNOWN | warning | INFO 欄位不在指南清單;DSM 不會使用它(拼錯的欄位名稱也會出現在這裡)。 | DSM 7 Developer Guide: INFO Necessary Fields, Optional Fields |
SPK_INFO_LANG_UNKNOWN | warning | displayname_ | DSM 7 Developer Guide: INFO Optional Fields (description_[language]) |
SPK_INFO_LINE_INVALID | warning | INFO 有一行不是 key=“value”(空行與 # 註解除外)。 | DSM 7 Developer Guide: INFO |
SPK_INFO_MISSING | error | 缺少 INFO。 | DSM 7 Developer Guide: Package Structure |
SPK_INFO_OS_MIN_VER_LOW | warning | INFO os_min_ver 低於 7.0-40000。 | DSM 7 Developer Guide: INFO Necessary Fields (os_min_ver) |
SPK_INFO_OS_VER_INVALID | error | INFO os_min_ver 或 os_max_ver 不是 | DSM 7 Developer Guide: INFO Necessary Fields (os_min_ver), Optional Fields (os_max_ver) |
SPK_INFO_PACKAGE_INVALID | error | INFO package 含有 : / > < | = 其中之一。 | DSM 7 Developer Guide: INFO Necessary Fields (package) |
SPK_INFO_VALUE_UNTERMINATED | error | INFO 欄位值的引號沒有結束。 | DSM 7 Developer Guide: INFO |
SPK_INFO_VERSION_INVALID | error | INFO version 不是以 .、-、_ 分隔的數字,或某段超過 2147483647。 | DSM 7 Developer Guide: INFO Necessary Fields (version) |
SPK_INFO_VERSION_NO_BUILD | warning | INFO version 沒有 - | DSM 7 Developer Guide: INFO Necessary Fields (version) |
SPK_LICENSE_TOO_LARGE | error | LICENSE 大於或等於 1 MB。 | DSM 7 Developer Guide: Package Structure |
SPK_NOARCH_ELF | error | INFO arch 是 noarch,但 package.tgz 有 ELF 執行檔。 | DSM 7 Developer Guide: INFO Necessary Fields (arch)、Pack Stage |
SPK_NOT_TAR | error | 檔案不是可讀的 tar 封存;SPK 是未壓縮的 tar。 | DSM 7 Developer Guide: Package Structure |
SPK_PAYLOAD_LINK_ABSOLUTE | warning | package.tgz 的 symlink 指向絕對路徑;目標由 NAS 決定,不在套件內。 | DSM 7 Developer Guide: Package Structure (package.tgz) |
SPK_PAYLOAD_LINK_ESCAPE | error | package.tgz 的 symlink 或 hard link 指到套件目錄之外。 | DSM 7 Developer Guide: Package Structure (package.tgz) |
SPK_PAYLOAD_MISSING | error | 缺少 package.tgz。 | DSM 7 Developer Guide: Package Structure |
SPK_PAYLOAD_PATH_UNSAFE | error | package.tgz 的路徑是絕對路徑或含 ..,會解開到套件目錄之外。 | DSM 7 Developer Guide: Package Structure (package.tgz) |
SPK_PAYLOAD_UNREADABLE | error | package.tgz 不是可讀的 tar 或 tar.gz 封存,或是空的。 | DSM 7 Developer Guide: Package Structure (package.tgz) |
SPK_PAYLOAD_XZ | warning | package.tgz 是 xz 壓縮(Synology toolkit 的格式);inspect 讀不了 xz,沒有檢查 payload 內容。 | DSM 7 Developer Guide: Pack Stage |
SPK_PRIVILEGE_INVALID | error | conf/privilege 不是 JSON 物件、沒有 defaults.run-as,或 run-as 不是 package/root。 | DSM 7 Developer Guide: Privilege Config |
SPK_PRIVILEGE_MISSING | error | 缺少 conf/privilege;DSM 7 起必須提供。 | DSM 7 Developer Guide: conf、Privilege Config |
SPK_PRIVILEGE_ROOT | warning | conf/privilege 要求以 root 執行(defaults、ctrl-script 或 executable)。 | DSM 7 Developer Guide: Privilege Config |
SPK_RESOURCE_INVALID | error | conf/resource 不是 JSON 物件。 | DSM 7 Developer Guide: Resource Config |
SPK_RESOURCE_UNKNOWN | warning | conf/resource 有指南沒有列出的 resource worker id。 | DSM 7 Developer Guide: Available Workers |
SPK_SCRIPT_HOOK_MISSING | warning | 缺少 preinst、postinst、preuninst、postuninst、preupgrade 或 postupgrade;指南列為必備,DSM 缺檔時的行為未驗證。 | DSM 7 Developer Guide: scripts |
SPK_SCRIPT_MISSING | error | 缺少 scripts/start-stop-status;DSM 用它啟動、停止與查詢套件狀態。 | DSM 7 Developer Guide: Package Structure、scripts |
SPK_SCRIPT_NOT_EXECUTABLE | error | scripts/ 的生命週期腳本沒有執行權限。 | DSM 7 Developer Guide: scripts |
SPK_SCRIPT_NO_INTERPRETER | warning | 生命週期腳本開頭沒有 #!(例如 #!/bin/sh),也不是 ELF。 | DSM 7 Developer Guide: scripts |
SPK_SIGNATURE_INVALID | warning | syno_signature.asc 不是 ASCII-armored PGP 簽章(指南的套件簽章只適用 DSM 6.x,可省略此檔)。 | DSM 7 Developer Guide: Sign Package (only for DSM6.X) |
SPK_UI_CONFIG_INVALID | error | dsmuidir 底下的 config 不是 JSON 物件。 | DSM 7 Developer Guide: Integrate DSM, Application Config |
SPK_UI_TEXTS_MISSING | error | config 的 title/desc 參照套件自己的字串(例如 synopkgland:app_title),但該 entry 沒有宣告 “texts”;DSM 會直接顯示 key。 | DSM 7.1.1/7.4 實測 |
SPK_UI_TEXTS_UNDECLARED | warning | config 的 title/desc 是 section:key 字串參照,但沒有宣告 “texts”;除非是 DSM 內建 section,否則 DSM 會直接顯示 key。 | DSM 7.1.1/7.4 實測 |
SPK_WIZARD_INVALID | warning | WIZARD_UIFILES 的精靈檔不是 JSON 陣列。 | DSM 7 Developer Guide: Package Structure (WIZARD_UIFILES) |
SPK_WIZARD_SCRIPT_NOT_EXECUTABLE | warning | WIZARD_UIFILES 的 .sh 精靈產生器沒有執行權限。 | DSM 7 Developer Guide: Package Structure (WIZARD_UIFILES) |
SPK_WIZARD_UNKNOWN | warning | WIZARD_UIFILES 的檔名不是 install/upgrade/uninstall_uifile[_ | DSM 7 Developer Guide: Package Structure (WIZARD_UIFILES) |
App 錯誤
Section titled “App 錯誤”產生的原生 App 會從後端把這些錯誤碼回傳給 UI。處理函式也可以回傳自己的錯誤碼,請見 App API 參考。
處理函式若回傳一般的 Go 錯誤,而不是 api.Error,UI 會收到 internal。這包括 root.run 的所有失敗,以及 executor.status 除了 executor 暫停以外的所有失敗;executor 暫停時會回傳 ready: false、state: "paused" 與下一步 next。
| 錯誤碼 | 回傳者 | 意思 | 處理方式 |
|---|---|---|---|
session_required | 所有非 public 的 route | 沒有有效的 DSM 工作階段,或 File Station 使用者與呼叫者不符。 | 重新登入 DSM。 |
credential_not_ready | 以呼叫者 DSM 工作階段執行的 route(root.*、files.*、delegate.*、File Station) | 請求帶有 DSM 工作階段 cookie,卻沒有可用的 SynoToken。共用視窗 wrapper 會在呼叫後端與 DSM WebAPI 前取得缺少的 token;此錯誤表示必要的 carrier 仍不可用。 | 以同一主機名稱重新登入 DSM,再開啟 App。自訂 transport 應先等待 DSM session helper,再送出請求。 |
dsm_session_required | 使用 identity: standalone 時的 nas.*、bg.browse、bg.jobs.submit | 呼叫需要 DSM 的 id cookie,但沒有。 | 從 DSM 視窗開啟 App 並登入 DSM。 |
session_revalidation_required | 使用 identity: standalone 時的其他 route | App 工作階段需要向 DSM 重新驗證,但沒有 DSM cookie。 | 從 DSM 視窗開啟 App。 |
admin_required | 需要管理員的 route | 呼叫者不在 DSM 管理員群組、entry: admin-only 拒絕了呼叫者,或 api.RequireAdmin 失敗。已註冊但 permissions.json 沒有列出的方法,對非管理員也會得到這個錯誤碼。 | 請使用管理員帳號開啟。admin-only App 不會列在應用程式權限中。若該方法應開放一般使用者,請在 permissions.json 把它列為 authenticated。 |
app_privilege_denied | 使用 entry: app-privilege 時的所有 route | DSM 應用程式權限不允許這個帳號或位址使用此 App。 | 請管理員到「控制台 > 應用程式權限」,依顯示名稱選擇此 App 並按「編輯」,允許你的帳號或群組使用。 |
auth_unavailable | 所有 route | DSM 驗證或權限查詢失敗。工作階段過多時也會回傳。 | 重試。若持續發生,檢查 DSM 是否正常。 |
unknown_method | 所有 route | 方法名稱沒有註冊。所有已登入的呼叫者都會得到這個錯誤碼,不論是否為管理員。 | 檢查方法名稱,以及是否已加入該能力。 |
cross_origin | JSON route | 請求來自其他來源。 | 只從 App 自己的頁面呼叫後端。 |
origin_required | JSON route | POST 請求沒有 Origin 也沒有 Referer,後端無法判斷是哪個頁面送出的。 | 用目前版本的瀏覽器重新開啟 App。 |
json_required | JSON route | 請求沒有 Content-Type: application/json。 | 送出 JSON。ctx.call 會自動處理。 |
method_not_allowed | JSON route | 請求不是 POST。 | 使用 POST。 |
request_too_large | JSON route | 內容超過 1 MiB,或巢狀太深。 | 減少送出的資料。 |
bad_request | 所有 route | 內容或 params 不合法。含有未知欄位的 params 會被拒絕。 | 送出 {"method": "…", "params": {…}},只含該方法接受的欄位。 |
bad_response | 所有 route | 請求逾時(20 秒)或被取消,或伺服器沒有回傳 JSON。 | 重試。 |
internal | 所有 route | 處理函式回傳的錯誤不是 api.Error。詳細資訊在 App 記錄中,不在回應裡。 | UI 需要看到的錯誤請回傳 api.Error。檢查 App 記錄。 |
network | DSM 視窗中的 ctx.call | NAS 沒有回應。 | 檢查連線後重試。 |
denied | nas.*、bg.browse | File Station 拒絕該操作,通常是使用者對該資料夾沒有權限。 | 在 DSM 授予使用者該資料夾的權限。 |
conflict | nas.*、bg.* | 目標已存在,或請求與工作目前的狀態衝突。 | 換一個名稱,或重新載入狀態。 |
invalid-request | nas.* | File Station 拒絕這些引數,例如路徑不合法。 | 檢查路徑。 |
unavailable | nas.*、bg.* | File Station 或背景儲存空間沒有回應或無法使用。 | 稍後重試。 |
canceled | nas.*、delegate.* | 呼叫被取消。 | 若不是你取消的,請重試。 |
not_found | nas.*、bg.jobs.* | 檔案、工作或排程不存在,或屬於其他使用者。 | 檢查路徑或 id。 |
commit-uncertain | nas.files.create_folder、nas.files.upload | 回應遺失,所以無法確定變更是否已完成。 | 列出資料夾確認,必要時重試。 |
upload_size_required | nas.files.upload | 上傳沒有 Content-Length,或超過 16 GiB。 | 送出不超過 16 GiB 的 Content-Length。 |
limit-exceeded | nas.*、bg.jobs.submit、files.read | 達到大小上限,例如工作輸入超過 512 KiB。 | 送出較小的檔案。 |
read_failed | bg.jobs.submit | 無法完整讀取檔案。 | 重試。 |
identity_unavailable | bg.* | 找不到呼叫者的 DSM 使用者 id。 | 重試。若持續發生,重新登入 DSM。 |
jobs_busy | bg.* | 工作儲存區被鎖定超過 5 秒。 | 稍後重試。 |
not_ready | bg.jobs.result | 工作還沒有結果。 | 等到工作變成 succeeded。 |
queue-full | bg.jobs.submit、bg.schedules.* | 背景佇列已滿。 | 等工作完成。 |
quota-exceeded | bg.jobs.submit | 背景儲存空間已滿。 | 等工作完成,或移除已完成的工作。 |
owner-queue-full | bg.jobs.submit | 呼叫者待處理的工作已達上限。 | 等呼叫者的工作完成。 |
owner-quota-exceeded | bg.jobs.submit | 呼叫者的背景儲存空間已達上限。 | 等呼叫者的工作完成。 |
schedule-full | bg.schedules.create | 套件的排程數已達上限。 | 刪除一個排程。 |
input-unavailable | bg.schedules.* | 工作輸入的私有副本已不存在。 | 重新匯入檔案。 |
https_required | identity.login、identity.session | 呼叫是透過純 HTTP 發出的。 | 以 HTTPS 開啟 App。 |
invalid_credentials | identity.login | 帳號名稱或密碼錯誤。 | 再試一次。 |
account_disabled | identity.login | DSM 帳號已停用。 | 使用其他帳號,或在 DSM 啟用該帳號。 |
otp_required | identity.login | 帳號需要雙重驗證碼。 | 登入時一併送出 otp。 |
login_not_permitted | identity.login | DSM 不允許這個帳號登入 App。 | 在 DSM 檢查該帳號。 |
rate_limited | identity.login | 嘗試次數過多。 | 等一分鐘後重試。 |
invalid-destination | delegate.* | 目的地不合法。 | 重新選擇目的地。 |
invalid-size | delegate.* | 檔案大小不合法。 | 傳入暫存檔案的實際大小。 |
unsupported | delegate.*、bg.* | 此設定不支援該呼叫。 | 檢查能力與生命週期模式。 |
needs-scope-confirmation | delegate.* | 管理員必須先確認資料夾範圍。 | 在 App 的管理員設定中核准範圍。 |
disabled | delegate.* | 管理員已關閉這項整合。 | 請管理員啟用。 |
operation-conflict | delegate.* | 相同的 job id 又以不同的輸入送出。 | 使用新的 job id。 |
operation-not-found | delegate.operations.* | executor 不認得這項操作。 | 檢查 id。 |
destination-exists | delegate.move_from_staging、delegate 檔案操作 | 目的地已有同名檔案且 conflict 為 fail;或 overwrite 遇到資料夾或符號連結;或 rename 已用到 name (99)。 | 使用其他名稱,或設定 conflict。 |
invalid-path | delegate.move_from_staging、delegate 檔案操作 | name 中的資料夾為空、. 或 ..、超過 255 位元組、含控制字元或 \ : * ? " < > | 之一,或是 #recycle、#snapshot、@eaDir;或整個名稱超過 1024 位元組;或 File Station 認定名稱或路徑不合法而拒絕。 | 修正名稱。 |
path-too-deep | delegate.move_from_staging | name 超過 16 層資料夾。 | 減少資料夾層數。 |
destination-not-directory | delegate.move_from_staging、files.createFolder | name 中的某個資料夾其實是檔案或符號連結,或位於另一個磁碟區;或在檔案底下呼叫 CreateFolder。 | 換一個資料夾名稱。 |
name-too-long | delegate.move_from_staging、delegate 檔案操作 | 磁碟區認為名稱過長而拒絕,例如加密共用資料夾超過 143 位元組。 | 改用較短的名稱。 |
NO_SPACE | delegate.move_from_staging、delegate 檔案操作 | 目的地的儲存空間已滿。 | 釋出空間。 |
not-found | delegate 檔案操作 | 授權的資料夾內沒有這個路徑,或 File Station 回報該項目不存在。 | 檢查路徑。 |
not-a-file | files.read | 路徑是資料夾或特殊檔案。 | 讀取一般檔案。 |
recursive-required | files.delete | 路徑是資料夾,且沒有設定 recursive。 | 設定 Recursive: true。 |
recycle-bin-disabled | files.delete | 共用資料夾沒有資源回收筒,且沒有設定 permanent。 | 開啟資源回收筒,或設定 Permanent: true。 |
task-not-found | files.taskStatus、files.taskCancel | 任務屬於其他工作,或 executor 已重新啟動。 | 用 files.info 確認結果。 |
too-many-tasks | files.copy、files.move、files.delete | executor 已在追蹤 64 個任務。 | 等待任務完成。 |
READ_FAILED | files.read | executor 無法把檔案複製到 staging。 | 重試。若持續發生,請檢查 NAS。 |
PERMISSION_DENIED | delegate.* | App 代為操作的使用者無法寫入目的地、delegate.select_destination 收到使用者無法寫入的資料夾,或 File Station 因權限不足拒絕某個項目。刪除後項目仍在時也會以此失敗。 | 在 DSM 修正權限,或選擇其他目的地。 |
STAGING_UNAVAILABLE、STAGING_CHANGED | delegate.move_from_staging | 暫存檔案不存在,或在你暫存後被修改。 | 重新暫存檔案。 |
ADMISSION_PENDING、ADMISSION_EXHAUSTED | delegate.move_from_staging | 移動正在等待 executor 接受,或重試次數已用完。 | 等待並檢查 delegate.operations.get。 |
download_failed | delegate 限時模式的下載 | 下載沒有完成。 | 重試。 |
jobs_unavailable | delegate.jobs.* | 工作儲存區無法使用。 | 稍後重試。 |
spool_unsafe、journal_corrupt | delegate.jobs.* | 工作儲存區未通過安全檢查。 | 重試無法排除。請檢查 App 資料資料夾。 |
not_cancelable、key_conflict、queue_full、quota | delegate.jobs.* | 工作在目前狀態下無法取消、key 已被使用、佇列已滿,或儲存空間已滿。 | 修改請求或等待。 |
EXECUTOR_UNAVAILABLE、EXECUTOR_TIMEOUT、EXECUTOR_TOO_LARGE、EXECUTOR_PROTOCOL | delegate.*、executor.* | App 無法連到管理員操作 executor、逾時、訊息過大,或無法理解回應。 | 以 synopkgland status 檢查能力狀態。管理員可能需要重新核准。 |
EXECUTOR_PAUSED | delegate.* | executor 已暫停,例如套件停止或升級期間。 | 啟動套件。升級後管理員可能需要重新核准。 |
APP_STOPPED、APP_STARTING | delegate.*、executor.* | 套件已停止,或剛啟動、executor 尚未開始接聽。沒有送出任何內容。 | 啟動套件,或稍候:SDK 的面板會顯示套件已停止或啟動中並自行重試,被拒的動作顯示「請啟動後再試一次」(lifecycleRefusal(error, locale))。DSM 視窗遇到 APP_STOPPED 立即回傳,APP_STARTING 與 EXECUTOR_STARTING 約重試 4 秒;executor.control 的啟動最多重試 30 秒。 |
AUTH_DENIED、INELIGIBLE、APP_DENIED、ADMIN_REQUIRED、DELEGATION_DENIED、SCOPE_DENIED、POLICY_DENIED、UNKNOWN_OP | delegate.* | executor 拒絕該操作:呼叫者或 App 不被允許、授權或資料夾範圍未涵蓋它,或該操作不在已核准的政策內。 | 檢查授權、範圍與 manifest。變更政策需要重新建置並重新取得管理員核准。 |
INVALID_REQUEST、REQUEST_TOO_LARGE | delegate.* | 送給 executor 的請求不合法,或超過 64 KiB。路徑或名稱不合法時,Go 用戶端會在呼叫 executor 之前就回傳 INVALID_REQUEST。 | 修正請求。 |
STORAGE_ERROR、INTERNAL、WRITE_FAILED、DSM_FAILED | delegate.* | executor 在讀取狀態、寫入檔案或呼叫 DSM 時失敗。 | 重試。若持續發生,檢查 NAS。 |
SCOPE_APPROVAL_STALE、IDENTITY_CHANGED | delegate.* | 範圍核准已過期,或授權所屬的 DSM 帳號已變更。 | 重新核准範圍,或重新選擇目的地。 |
ROOT_FAILED | root.run(顯示為 internal) | root 操作以非零狀態結束,或無法執行。 | 測試該腳本。輸出上限為 1 MiB,執行時間上限為 20 秒。 |
portal_alias_invalid | ctx.portal | DSM 拒絕該別名。 | 使用 1 到 64 個小寫英文字母、數字或 -。 |
portal_alias_reserved | ctx.portal | 該別名是 DSM 保留路徑。 | 選擇其他別名。 |
portal_alias_in_use | ctx.portal | 其他 App 已使用該別名。 | 選擇其他別名。 |
portal_unavailable | ctx.portal | 無法讀取或變更應用程式入口網站設定。 | 重試。若持續發生,請使用控制台。 |
forbidden | 容器 App 登入閘道 | 登入的使用者不被 App 的 integration.web.access 允許。 | 將使用者加入允許的群組,或變更 access。 |
token_required | 容器 App 登入閘道 | GET、HEAD、OPTIONS 以外的請求沒有 DSM token。 | 送出 X-SYNO-TOKEN 標頭。 |
cross_site_blocked | 容器 App 登入閘道 | 會變更狀態的請求或 WebSocket 交握來自其他網站。 | 只從 App 自己的頁面呼叫。 |
upgrade_unsupported | 容器 App 登入閘道 | 請求要求閘道不支援的協定升級。 | 使用一般 HTTP 或 WebSocket。 |
redirect | 容器 App 登入閘道 | 路徑需要結尾斜線。 | 跟隨重新導向(HTTP 308)。 |
bad_path | 容器 App 登入閘道 | 請求路徑不合法。 | 修正 URL。 |
body_too_large | 容器 App 登入閘道 | 請求內容超過 64 MiB。 | 減少送出的資料。 |
upstream_timeout | 容器 App 登入閘道 | 容器在 60 秒內沒有回應。 | 檢查容器。 |
upstream_unavailable | 容器 App 登入閘道 | 無法連到容器。 | 確認容器正在執行。 |
bad_gateway | 容器 App 登入閘道 | 閘道無法從容器取得有效的回應。 | 檢查容器記錄。 |
登入閘道回傳純文字錯誤:第一行是錯誤碼。它也會設定 X-Synopkgland-Error 標頭。DSM 會把某些錯誤狀態換成自己的頁面,所以閘道改送另一個狀態,並把原本的狀態放在 X-Synopkgland-Status:403 改為 401、404 改為 410、500 與 502 改為 520、503 改為 521、504 改為 524。
delegate 檔案操作會讀取 File Station 逐項回報的拒絕原因,所以 PERMISSION_DENIED、destination-exists、not-found、name-too-long、invalid-path、destination-not-directory 與 NO_SPACE 會指出真正的原因。它們不可重試。
失敗的工作會有 errorCode,而不是 RPC 錯誤。請從 bg.jobs.get 或 bg.jobs.list 讀取。
errorCode | 意思 | 處理方式 |
|---|---|---|
timeout | 工作執行超過 60 秒。 | 使用較小的輸入。 |
input-changed | worker 的結果與輸入的 digest 不符。 | 重新送出工作。 |
worker-error | worker 失敗。 | 重新送出工作。若重複發生,檢查輸入。 |
worker-stopped | 工作執行期間 worker 停止。工作狀態為 interrupted。 | 重新送出工作。 |
worker-changed | 你把工作排入佇列後,worker 版本改變了。工作狀態為 interrupted,排程會維持關閉,直到管理員啟用。 | 重新送出工作。管理員以 bg.schedules.enable 啟用排程。 |
admission-interrupted | 工作在被接受之前就中斷了。 | 重新送出工作。 |
Executor 協定錯誤碼
Section titled “Executor 協定錯誤碼”管理員操作 executor 以這些錯誤碼回應 App 後端。它們是 @synopackageland/sdk 與 Go module github.com/synopackageland/syno-pkg-land-sdk 中 executor 協定 v1 的錯誤碼;下表由其 errors.json 產生。kind 表示錯誤碼出現的位置:refusal 是被拒絕的請求,outcome 與 reason 記錄在操作上,client 由 App 內的用戶端產生,executor 不會送出。App 後端會把其中大多數依 App 錯誤 所列傳給 UI。
| 代碼 | 類型 | 可重試 | HTTP | 意義 |
|---|---|---|---|---|
AUTH_DENIED | refusal | 否 | 401 | auth 中的 DSM 工作階段缺少、無效或已過期。 |
INELIGIBLE | refusal | 否 | 403 | 此 DSM 帳號無法委派:系統帳號、已過期,或不是呼叫者本人。 |
APP_DENIED | refusal | 否 | 403 | DSM 應用程式權限不允許此帳號使用 App 或 File Station。 |
ADMIN_REQUIRED | refusal | 否 | 403 | 此操作需要 DSM 管理員。 |
DELEGATION_DENIED | refusal | 否 | 403 | 授權不存在、屬於其他使用者或套件,或已撤銷。 |
SCOPE_DENIED | refusal | 否 | 403 | 路徑超出授權或已核准的資料夾範圍。 |
POLICY_DENIED | refusal | 否 | 403 | 此操作不在已核准的政策內。 |
PEER_DENIED | refusal | 否 | 403 | socket 對端不是套件使用者或 root。 |
PERMISSION_DENIED | refusal | 否 | 403 | 受委派的使用者在 DSM 中無法存取該路徑。 |
UNKNOWN_OP | refusal | 否 | 400 | executor 不認得此操作。 |
INVALID_REQUEST | refusal | 否 | 400 | 請求或其 params 不合法。 |
REQUEST_TOO_LARGE | refusal | 否 | 413 | 請求行超過 64 KiB。 |
EXECUTOR_PAUSED | refusal | 是 | 503 | executor 已暫停,例如套件停止或升級期間。 |
EXECUTOR_STARTING | refusal | 是 | 503 | executor 正在執行安裝或升級後的 App start 步驟;結束前 status 回報 state starting。 |
STORAGE_ERROR | refusal | 是 | 500 | executor 無法讀寫其受保護的狀態。 |
INTERNAL | refusal | 是 | 500 | executor 發生非預期的失敗。 |
WRITE_FAILED | refusal | 是 | 500 | executor 無法寫入檔案。 |
READ_FAILED | refusal | 是 | 500 | executor 無法把檔案複製到 staging。 |
DSM_FAILED | refusal | 是 | 502 | executor 呼叫 DSM 失敗。 |
ROOT_FAILED | refusal | 否 | 500 | root 程式無法執行、被訊號終止,或其輸出無法保存。 |
ROOT_TIMEOUT | refusal | 是 | 504 | root 程式超過 policy 的時限,已被終止。 |
ROOT_BUSY | refusal | 是 | 429 | 此套件同時執行的 root 程式已達上限。 |
ROOT_STAGING_FULL | refusal | 是 | 507 | staging 資料夾中等待取走的 root 輸出已達配額。 |
ROOT_JOB_NOT_FOUND | refusal | 否 | 404 | 此套件沒有這個 job_id 的 root 工作。 |
PORTAL_FAILED | refusal | 是 | 502 | DSM 未接受應用程式入口的變更;status 的 portal 說明是否需要再移除一次。 |
NO_SPACE | refusal | 否 | 507 | 目的地的儲存空間已滿。 |
SCOPE_APPROVAL_STALE | refusal | 否 | 409 | 資料夾範圍的核准已過期。 |
IDENTITY_CHANGED | refusal | 否 | 409 | 授權所綁定的 DSM 帳號或資料夾已變更。 |
needs-scope-confirmation | refusal | 否 | 409 | 管理員必須先確認資料夾範圍。 |
disabled | refusal | 否 | 409 | 管理員已關閉這項整合。 |
invalid-destination | refusal | 否 | 400 | 目的地不在政策內。 |
invalid-size | refusal | 否 | 400 | 檔案大小缺少、為負數或過大。 |
operation-conflict | refusal | 否 | 409 | 相同的 job id 又以不同的輸入送出。 |
operation-not-found | refusal | 否 | 404 | 此授權與呼叫者沒有這項操作。 |
destination-exists | refusal | 否 | 409 | 目的地已有同名檔案,且 conflict 不允許取代。 |
invalid-path | refusal | 否 | 400 | 名稱或路徑為空、保留字、過長或含禁止字元。 |
path-too-deep | refusal | 否 | 400 | 名稱超過 16 層資料夾。 |
destination-not-directory | refusal | 否 | 409 | 名稱中的某個資料夾其實是檔案或符號連結,或位於另一個磁碟區。 |
name-too-long | refusal | 否 | 400 | 磁碟區認為名稱過長而拒絕。 |
not-found | refusal | 否 | 404 | 路徑不存在。 |
not-a-file | refusal | 否 | 400 | 路徑是資料夾或特殊檔案。 |
recursive-required | refusal | 否 | 400 | 路徑是資料夾,且未設定 recursive。 |
recycle-bin-disabled | refusal | 否 | 409 | 共用資料夾沒有資源回收筒,且未設定 permanent。 |
task-not-found | refusal | 否 | 404 | 任務屬於其他工作,或 executor 已重新啟動。 |
too-many-tasks | refusal | 是 | 429 | executor 已在追蹤 64 個任務。 |
queue-full | refusal | 是 | 429 | executor 的操作佇列已滿。 |
limit-exceeded | refusal | 否 | 413 | 檔案超過 max_bytes,或 root 輸出超過 policy 的 max_output。 |
OPERATION_CANCELED | outcome | 否 | 409 | 操作已取消;reason 說明原因。 |
CANCEL_REQUESTED | outcome | 否 | 202 | 已要求取消,複製尚未停止。 |
CLEANUP_PENDING | outcome | 是 | 500 | 操作已結束,但部分檔案尚未清除。 |
grant-revoked | reason | 否 | 409 | 授權已撤銷。 |
destination-replaced | reason | 否 | 409 | 較新的授權取代了此目的地。 |
integration-disabled | reason | 否 | 409 | 管理員停用了此整合。 |
validation-denied | reason | 否 | 403 | 授權未通過 DSM 的重新驗證。 |
scope-changed | reason | 否 | 409 | 已核准的資料夾範圍已變更。 |
storage-error | reason | 是 | 500 | 受保護的狀態無法寫入。 |
operation-canceled-by-user | reason | 否 | 409 | 擁有者取消了操作。 |
operation-deadline-exceeded | reason | 是 | 504 | 操作超過期限。 |
EXECUTOR_UNAVAILABLE | client | 是 | 503 | 用戶端無法連到 executor socket。 |
APP_STOPPED | client | 是 | 503 | 套件已停止:生命週期信箱要求 executor 停止。用戶端沒有送出任何內容。 |
APP_STARTING | client | 是 | 503 | 套件剛啟動,executor 尚未開始接聽。用戶端沒有送出任何內容。 |
EXECUTOR_TIMEOUT | client | 是 | 504 | executor 未及時回應。 |
EXECUTOR_TOO_LARGE | client | 否 | 413 | 請求或回應超過 64 KiB。 |
EXECUTOR_PROTOCOL | client | 否 | 502 | executor 的回應不是有效的 v1 回應。 |