Skip to main content

核心配置文件 — config.ini

config.ini 是核心元数据文件,定义应用的身份信息、展示信息、运行属性和依赖关系。是平台校验和应用中心展示的关键依据。

重要: 文件扩展名为 .ini,但内容必须为 严格 JSON 格式。禁止添加注释、使用单引号、多余逗号或任何语法错误。

格式说明: 文件扩展名 .ini 是公司历史使用习惯(与传统配置系统保持文件命名一致),但解析器按 JSON 格式处理。开发者务必使用 JSON 语法编写,否则将导致自动校验失败。

标准模板

以下为 config.ini 标准模板,按应用子类型分为三个独立示例。开发者根据自身应用类型,选择对应的模板。三选一,不可混用。

必读:字段互斥关系

应用类型必设字段禁止字段
WebUI 内部打开(iframe)type: "iframe" + path: "/<id>/"open_path
WebUI 外部打开(新标签页)open_path: true + path: "http://${ip}:<端口>"type
无 UI 服务typeopen_pathpath

模板一:WebUI 内部打开(iframe 嵌入)

{
"id": "dev-myapp",
"icon": "/images/icons/dev-myapp.svg",
"publisher": "开发者名称",
"exec": true,
"type": "iframe",
"path": "/dev-myapp/",
"resize": true,
"maxmin": true,
"width": 1180,
"height": 680,
"help": "https://example.com/docs",
"version": "1.0.0",
"recommend": false,
"beta": false,
"low_version": "TOS7.0",
"category": ["Utilities"],
"depend": [],
"relation": [],
"platform": "x86_64",
"official": "https://example.com",
"application_type": "deb",
"system_id": "dev-myapp",
"package": "dev-myapp",
"user": "dev-myapp",
"all_user_display": true,
"allow_open_in_mobile": false
}

模板二:WebUI 外部打开(新标签页)

{
"id": "dev-myapp",
"icon": "/images/icons/dev-myapp.svg",
"publisher": "开发者名称",
"exec": true,
"open_path": true,
"path": "http://${ip}:8686",
"help": "https://example.com/docs",
"version": "1.0.0",
"recommend": false,
"beta": false,
"low_version": "TOS7.0",
"category": ["Utilities"],
"depend": [],
"relation": [],
"platform": "x86_64",
"official": "https://example.com",
"application_type": "deb",
"system_id": "dev-myapp",
"package": "dev-myapp",
"user": "dev-myapp",
"all_user_display": true,
"allow_open_in_mobile": false
}

模板三:无 UI 服务

{
"id": "dev-myapp",
"icon": "/images/icons/dev-myapp.svg",
"publisher": "开发者名称",
"exec": true,
"help": "https://example.com/docs",
"version": "1.0.0",
"recommend": false,
"beta": false,
"low_version": "TOS7.0",
"category": ["Utilities"],
"depend": [],
"relation": [],
"platform": "x86_64",
"official": "https://example.com",
"application_type": "deb",
"system_id": "dev-myapp",
"package": "dev-myapp",
"user": "dev-myapp",
"all_user_display": true,
"allow_open_in_mobile": false
}

字段参考

字段类型必填说明详细描述
idstring✅ 是应用唯一标识符平台全局唯一,不可与已上架应用重复。字符集:小写字母(a-z)、数字(0-9)和连字符(-)。必须以字母开头。最大长度:50 字符。推荐格式:开发者账号标识-应用业务名称 或 域名倒装-业务应用名。示例:dev-admin-monitor、com-douyin-service。禁止纯通用系统关键词:docker、bin、var、api、usr、root、admin、system、service等。创建后不可修改。
iconstring✅ 是图标路径仓库中的相对路径。必须遵循 /images/icons/<id>.svg 格式。图标文件必须存在于该路径。
publisherstring✅ 是发布者名称在应用中心展示的开发者或组织名称。示例:"Kevin""LinuxServer.io"
pathstring条件必填应用访问地址path 字段按场景互斥:iframe 用 /<app_id>/;外部打开用 http://${ip}:<端口>;无 UI 留空。 必须使用 ${ip} 占位符(如 http://${ip}:8686)。系统自动替换 ${ip} 为 TNAS 局域网 IP。禁止写死固定 IP 或域名。 非 80/443 端口:http://${ip}:<端口>。WebUI 内部打开(iframe):/<app_id>/。无 UI 应用:设为 "" 或省略该字段。exec=true 时必填。
execbool✅ 是是否有可执行服务应用是否支持启停操作。true:应用中心显示启动/停止按钮;false:仅展示,无生命周期控制。
open_pathbool条件必填是否在新标签页打开控制应用打开方式:true = 浏览器新标签页;false 或省略 = TOS 桌面内嵌 iframe。外部打开应用必须设为 truetype 互斥,不可同时设置。
typestring条件必填应用打开类型WebUI 内部打开(iframe 嵌入)时设为 "iframe"⚠️ 与 open_path 互斥,不可同时设置。 外部打开或无 UI 应用不设置此字段。
resizebool窗口是否可拉伸open_path=false 时生效。控制应用弹窗是否可调整大小。默认 false
maxminbool窗口是否可最大化/最小化open_path=false 时生效。控制应用弹窗是否支持最大化/最小化。默认 false
widthint默认窗口宽度open_path=false 时生效。应用打开页面的宽度,默认值 1180。
heightint默认窗口高度open_path=false 时生效。应用打开页面的高度,默认值 680。
helpstring帮助文档网址指向帮助文档、Wiki 或社区教程的链接。无则留空。
versionstring✅ 是应用版本号遵循语义化版本号。每次提交必须唯一且递增。示例:"1.0.0""2.3.1"
recommendbool✅ 是是否推荐应用recommend — 推荐标识,由平台运营人员在审核通过后根据应用质量统一设置。开发者提交时必须固定设置为 false,该字段由平台管理,开发者不得自行修改为 true
betabool✅ 是是否测试版true = 测试版,仅对测试用户展示;false = 正式版,全量用户展示。
low_versionstring✅ 是支持的最低TOS版本应用可正常运行的最低 TOS 版本。必须为 TOS7.0 及以上。格式:"TOS7.0""TOS7.1"
category[]string✅ 是应用分类最多3个分类,从官方分类列表中选择(见附录A)。第一个分类为主要分类 — 决定应用的默认展示分区。按从最具体到最通用的顺序排列。超量分类将导致驳回。
depend[]string✅ 是依赖应用列表安装前必须先安装的应用 ID。必须为应用中心已有的应用 ID。依赖按列表顺序安装。示例:["DockerEngine"]。无依赖:[]循环依赖将被驳回。
relation[]string关联应用列表应用详情页"关联应用"模块展示的应用 ID。无强制依赖,仅展示关联。无关联:[]
platformstring✅ 是目标架构"x86_64""aarch64"。多架构需分别提交。
officialstring官方网站应用官方网站链接。无则留空。
application_typestring✅ 是应用包类型Deb 单包模式应用填 "deb";双包模式/压缩包模式应用填 "deb-TarGz";Docker 应用填 "docker"
system_idstring条件必填Systemd 服务名Deb 应用必填。 必须与 systemd 服务文件名一致。Docker 应用留空。
packagestring条件必填Deb 包名Deb 应用必填。 必须与 DEBIAN/control 中的 Package 字段一致。Docker 应用留空。
compose_projectstring条件必填Docker Compose 项目名Docker 应用必填。 指定 docker-compose 项目创建时的名称,必须符合 Docker Compose 项目命名规范(仅小写字母、数字、连字符和下划线)。Deb 应用留空。示例:"myapp-docker"
⚠️ 注意: 虽然 Docker Compose 允许下划线,但建议 compose_projectid 保持字符集一致以降低混淆。id 仅支持小写字母、数字和连字符(不含下划线),如果两者使用相同字符串,compose_project 中也请勿使用下划线。
userstring✅ 是运行用户应用运行的系统用户。指定后自动创建专属用户(如 "jellyfin")。Deb 应用需与 systemd 服务 User 字段匹配。严禁使用 root 用户。
all_user_displaybool✅ 是是否对所有用户展示true = 所有 TNAS 用户可见;false = 仅管理员可见。当为 false 时,应用仅在管理员的应用程序中心视图中出现。非管理员用户无法看到或与该应用交互。应用仍在系统范围内安装并为所有用户运行;此设置仅控制可见性。
allow_open_in_mobilebool是否支持手机端打开true = 该应用支持手机端打开;false = 该应用不支持手机端打开。默认 false
share_folders[]string安装时创建共享文件夹配置在安装时为应用创建共享文件夹,文件夹权限采用 ACL 管理。使用此字段必须保证 user 字段不为空。 示例:["data", "config"]

关键规则

JSON 格式校验:

提交前校验 config.ini:

# 使用 python3
python3 -c "import json; json.load(open('config.ini'))" && echo "JSON 格式有效"

# 使用 jq
jq empty config.ini

常见导致驳回的 JSON 错误:

{
"id": "myapp", // ❌ 对象最后一个字段末尾多余逗号
"version": '1.0.0', // ❌ 单引号(必须用双引号)
// ❌ JSON 不允许注释
"beta": false,
}

正确写法:

{
"id": "myapp",
"version": "1.0.0",
"beta": false
}

❌ 全角引号"version": "1.0.0"✅ 半角引号"version": "1.0.0"

  1. IP 占位符path 字段必须使用 ${ip}(如 http://${ip}:8686)。禁止写死固定 IP 或域名。
  2. JSON 语法:必须是有效 JSON。禁止注释(///* */)、单引号或末尾多余逗号。
  3. ID 唯一性id 必须全局唯一。重复 ID 将被驳回。
  4. 版本递增:每次新提交的版本号必须大于前一版本。禁止重复或降级。
  5. 分类限制:每个应用最多3个分类。
  6. TOS 版本low_version 必须为 TOS 7.0 及以上。
  7. 字段一致性version 在 config.ini、DEBIAN/control 和 app.lang 之间必须一致。system_id 必须与 systemd 服务文件名匹配。package 必须与 DEBIAN/control 的 Package 字段匹配。

path 字段取值速查表:

应用类型打开方式path 填写值示例
Deb WebUI 内部打开iframe 嵌入/<app_id>/"/tmrtimer/"
Deb WebUI 外部打开新标签页/<app_id>/"/weather/"
Docker 应用新标签页http://${ip}:<端口>"http://${ip}:8080"
无 UI 服务无前端省略或 ""
注意

iframe 模式(内部打开)和外部打开的 path 格式相同(均为 /<app_id>/),区别在于 open_path 字段:内部打开 open_path=false(默认),外部打开 open_path=true。Docker 应用的 path 使用 http://${ip}:<端口> 格式。

保留字段: 以下字段名保留供未来平台使用。请勿在自定义 config.ini 中使用:host_networkcontainer_runtimesandboxauto_updateupstream_urllicensemin_memorymin_cpumin_disk。使用保留字段可能导致未来兼容性问题和驳回。