应用程序配置

每个应用程序(以前称为加载项,Add-on)都存放在一个文件夹中。文件结构如下所示:

addon_name/
  translations/
    en.yaml
  apparmor.txt
  build.yaml
  CHANGELOG.md
  config.yaml
  DOCS.md
  Dockerfile
  icon.png
  logo.png
  README.md
  run.sh
Note

翻译文件configbuild 均支持.json.yml.yaml 作为文件类型。

为了简单起见,所有示例都使用 .yaml

应用程序脚本

与每个 Docker 容器一样,您需要一个脚本在容器启动时运行。用户可能会运行许多应用程序,因此如果您正在做简单的事情,建议尝试坚持使用 Bash 脚本。

我们所有的图像也安装了 bashio。它包含一组常用的操作,可用于包含在应用程序中,以减少应用程序之间的代码重复,从而使开发和维护应用程序变得更加容易。

开发脚本时:

  • /data 是用于持久存储的卷。
  • /data/options.json 包含用户配置。您可以使用 Bashio 来解析此数据。
CONFIG_PATH=/data/options.json

TARGET="$(bashio::config 'target')"

所以如果你的options包含

{ "target": "beer" }

那么之后你的bash文件的环境中就会有一个包含beer的变量TARGET

应用程序 Dockerfile

所有应用程序(以前称为加载项,Add-on)都基于最新的 Alpine Linux 镜像。Home Assistant 会根据机器架构自动替换为正确的基础镜像。如果您需要使用不同时区,请添加 tzdata;我们的基础镜像已包含该软件包。

ARG BUILD_FROM
FROM $BUILD_FROM

# Install requirements for app
RUN \
  apk add --no-cache \
    example_alpine_package

# Copy data for app
COPY run.sh /
RUN chmod a+x /run.sh

CMD [ "/run.sh" ]

如果您不在设备上使用本地构建或我们的构建脚本,请确保 Dockerfile 还具有一组标签,其中包括:

LABEL \
  io.hass.version="VERSION" \
  io.hass.type="addon" \
  io.hass.arch="armhf|aarch64|i386|amd64"

可以将您自己的基础映像与build.yaml一起使用,或者如果您不需要自动多架构构建的支持,您也可以使用简单的dockerFROM。您还可以在 Dockerfile 后添加特定架构的后缀,以针对特定架构使用特定的 Dockerfile,即 Dockerfile.amd64

构建参数

我们默认支持以下构建参数:

ARG描述
@@保护0@@保存我们系统上的动态构建或建筑物的图像。
@@保护0@@应用程序版本(从config.yaml读取)。
@@保护0@@将当前的构建拱门保存在内部。

应用程序配置

应用程序(以前称为附加组件)的配置存储在config.yaml 中。

name: "Hello world"
version: "1.1.0"
slug: folder
description: >-
  "Long description"
arch:
  - amd64
url: "website with more information about the app (e.g., a forum thread for support)"
ports:
  123/tcp: 123
map:
  - type: share
    read_only: False
  - type: ssl
  - type: homeassistant_config
    read_only: False
    path: /custom/config/path
image: repo/{arch}-my-custom-addon
Note

避免在应用程序中使用 config.yaml 作为应用程序配置以外的任何内容的文件名。 Supervisor 在应用程序存储库中递归搜索 config.yaml

所需的配置选项

钥匙类型描述
@@保护0@@细绳应用程序的名称。
@@保护0@@细绳应用程序的版本。如果您使用带有 image 选项的 docker 映像,则这需要与将使用的映像的标签相匹配。
@@保护0@@细绳应用程序的 Slug。这在应用程序发布的 repository 范围内必须是唯一的并且 URI 友好。
@@保护0@@细绳应用程序的描述。
@@保护0@@列表支持的架构列表:armhfarmv7aarch64amd64i386

可选配置选项

钥匙类型默认描述
@@保护0@@列表默认支持所有机器类型。您可以将应用程序配置为仅在特定计算机上运行。您可以在机器类型之前使用!来否定它。
@@保护0@@网址应用程序的主页。您可以在此处解释该应用程序和选项。
@@保护0@@细绳@@保护0@@initialize 将在设置 Home Assistant 时启动该应用程序。 system 适用于数据库之类的东西,不依赖于其他东西。 services 将在 Home Assistant 之前启动,而 application 之后启动。最后once 适用于不作为守护进程运行的应用程序。
@@保护0@@细绳此应用程序的 Web 界面的 URL。与http://[HOST]:[PORT:2839]/dashboard一样,该端口需要内部端口,该端口将被替换为有效端口。还可以使用以下命令将协议部分绑定到配置选项:[PROTO:option_name]://[HOST]:[PORT:2839]/dashboard,并查找它是否是true,并且它将查找https
@@保护0@@细绳@@保护0@@auto 启动时启动由系统控制,manual 将应用程序配置为仅手动启动。如果插件不应该在启动时自动启动,请使用 manual_only 来防止用户更改它。
@@保护0@@词典从容器公开的网络端口。格式为"container-port/type": host-port。如果主机端口是null,则映射被禁用。
@@保护0@@词典网络端口描述映射。格式为"container-port/type": "description of this port"。或者使用Port description translations
@@保护0@@布尔值@@保护0@@如果true,则应用程序在主机网络上运行。
@@保护0@@布尔值@@保护0@@允许与其他人共享 IPC 命名空间。
@@保护0@@布尔值@@保护0@@将主机 D-Bus 服务映射到应用程序中。
@@保护0@@布尔值@@保护0@@允许容器在主机 PID 命名空间上运行。仅适用于不受保护的应用程序。 警告: 不适用于 S6 Overlay。如果需要将其设置为 true 并且您使用普通应用程序基础映像,则可以通过覆盖 /init 来禁用 S6。或者使用备用基础映像。
@@保护0@@布尔值@@保护0@@使用主机 UTS 命名空间。
@@保护0@@列表要映射到应用程序的设备列表。格式为:<path_on_host>。例如,/dev/ttyAMA0
@@保护0@@细绳固定应用程序所需的最低 Home Assistant Core 版本。值是版本字符串,如 2022.10.5
@@保护0@@斯特@@保护0@@基于角色的 Supervisor API 访问权限。可用值:defaulthomeassistantbackupmanageradmin
@@保护0@@布尔值@@保护0@@此应用程序可以访问 Supervisor 的 REST API。使用http://supervisor
@@保护0@@布尔值@@保护0@@此应用程序可以访问 Home Assistant REST API 代理。使用http://supervisor/core/api
@@保护0@@布尔值@@保护0@@允许应用程序对 Docker API 进行只读访问。仅适用于不受保护的应用程序。
@@保护0@@列表访问硬件/系统的权限。可用访问:BPFCHECKPOINT_RESTOREDAC_READ_SEARCHIPC_LOCKNET_ADMINNET_RAWPERFMONSYS_ADMINSYS_MODULESYS_NICESYS_PTRACESYS_RAWIOSYS_RESOURCESYS_TIME
@@保护0@@布尔值@@保护0@@提供对硬件的完全访问权限,就像 Docker 中的特权模式一样。仅适用于不受保护的应用程序。考虑使用其他应用程序选项来代替此选项,例如devices。如果启用此选项,请勿添加devicesuartusbgpio,因为不需要。
@@保护0@@布尔/字符串@@保护0@@启用或禁用 AppArmor 支持。如果启用,您还可以使用具有配置文件名称的自定义配置文件。
@@保护0@@列表要绑定挂载到容器中的 Home Assistant 目录类型列表。可能的值:homeassistant_configaddon_configssladdonsbackupsharemediaall_addon_configsdata。默认为只读,您可以通过添加属性read_only: false来更改它。默认情况下,所有路径都映射到插件容器内的/<type-name>,但也可以提供可选的path属性来配置路径(示例:path: /custom/config/path)。如果使用,路径不能为空,且与为插件定义的任何其他路径不同,并且不能是根路径。请注意,data 目录始终是映射且可写的,但path 属性可以使用相同的约定进行设置。
@@保护0@@词典用于运行应用程序的环境变量字典。
@@保护0@@布尔值@@保护0@@标记此应用程序以使用内部音频系统。我们将工作的 PulseAudio 设置映射到容器中。如果您的应用程序不支持 PulseAudio,您可能需要安装:Alpine Linux alsa-plugins-pulse 或 Debian/Ubuntu libasound2-plugins
@@保护0@@布尔值@@保护0@@标记此应用程序以使用内部视频系统。所有可用设备都将映射到应用程序中。
@@保护0@@布尔值@@保护0@@如果设置为 true/sys/class/gpio 将映射到应用程序以从内核访问 GPIO 接口。有些库还需要 /dev/memSYS_RAWIO 来对该设备进行读/写访问。在启用了 AppArmor 的系统上,您需要禁用 AppArmor 或为应用程序提供您自己的配置文件,这更有利于安全。
@@保护0@@布尔值@@保护0@@如果设置为 true,它将把原始 USB 访问 /dev/bus/usb 映射到具有即插即用支持的应用程序中。
@@保护0@@布尔值@@保护0@@默认false。自动将所有 UART/串行设备从主机映射到应用程序。
@@保护0@@布尔值@@保护0@@默认false。将其设置为 true 会将主机 udev 数据库只读安装到应用程序中。
@@保护0@@布尔值@@保护0@@如果设置为 true/device-tree 将映射到应用程序中。
@@保护0@@布尔值@@保护0@@将主机内核模块和配置映射到应用程序(只读)并授予您SYS_MODULE权限。
@@保护0@@布尔值@@保护0@@如果启用,您可以将 STDIN 与 Home Assistant API 结合使用。
@@保护0@@布尔值@@保护0@@如果 Docker 镜像没有 hass.io 标签,您可以启用旧模式以使用配置数据。
@@保护0@@词典应用程序的默认选项值。
@@保护0@@词典应用程序选项值的架构。它可以是 false 来禁用模式验证和选项。
@@保护0@@细绳用于 Docker Hub 和其他容器注册表。这应该仅设置为图像的名称(例如,ghcr.io/home-assistant/{arch}-addon-example)。如果使用此选项,请使用 version 选项设置活动 docker 标记。
@@保护0@@细绳与 Codenotary CAS 一起使用。这是用于通过 Codenotary 验证您的图像的电子邮件地址(例如,example@home-assistant.io)。这应该与 app's extended build options 中用作签名者的电子邮件地址匹配
@@保护0@@整数10默认 10(秒)。等待 Docker 守护进程完成或将被终止的超时时间。
@@保护0@@布尔值@@保护0@@如果将其设置为 true,则容器 /tmp 使用 tmpfs(一种内存文件系统)。
@@保护0@@列表此应用程序为 Home Assistant 提供的服务列表。
@@保护0@@列表将通过此应用程序提供或使用的服务列表。格式为service:function,功能为:provide(此应用程序可以提供此服务),want(此应用程序可以使用此服务)或need(此应用程序需要此服务才能正常工作)。
@@保护0@@布尔值@@保护0@@允许访问 Home Assistant 用户后端。
@@保护0@@布尔值@@保护0@@启用应用程序的入口功能。
@@保护0@@整数@@保护0@@对于在主机网络上运行的应用程序,您可以使用 0 并稍后通过 API 读取端口。
@@保护0@@细绳@@保护0@@修改URL入口点。
@@保护0@@布尔值@@保护0@@启用后,对应用程序的请求将被传输
@@保护0@@细绳@@保护0@@MDI icon 用于菜单面板集成。
@@保护0@@细绳默认为应用程序名称,但可以使用此选项进行修改。
@@保护0@@布尔值@@保护0@@使菜单项仅对管理员组中的用户可用。
@@保护0@@细绳@@保护0@@hotcold。如果cold,主管在进行备份之前关闭应用程序(使用cold 时将忽略pre/post 选项)。
@@保护0@@细绳在进行备份之前在应用程序上下文中执行的命令。
@@保护0@@细绳备份后在应用程序上下文中执行的命令。
@@保护0@@列表从备份中排除的文件/路径列表(支持 glob)。
@@保护0@@布尔值@@保护0@@将其设置为 true 以要求用户启用“高级”模式才能显示。
@@保护0@@细绳@@保护0@@使用以下属性标记应用程序:stableexperimentaldeprecated。除非用户启用高级模式,否则设置为 experimentaldeprecated 的应用程序不会显示在商店中。
@@保护0@@布尔值@@保护0@@将其设置为 false 以禁用 Docker 默认系统 init。如果映像有自己的初始化系统(如s6-overlay),请使用此选项。 注意:从 S6 V3 开始,需要将其设置为false,否则插件将无法启动,请参阅here 了解更多信息。
@@保护0@@细绳用于监控应用程序运行状况的 URL。与http://[HOST]:[PORT:2839]/dashboard一样,该端口需要内部端口,该端口将被替换为有效端口。还可以使用以下命令将协议部分绑定到配置选项:[PROTO:option_name]://[HOST]:[PORT:2839]/dashboard,并查找它是否是true,并且它将查找https。对于简单的 TCP 端口监控,您可以使用 tcp://[HOST]:[PORT:80]。它适用于主机或内部网络上的应用程序。
@@保护0@@布尔值@@保护0@@授予应用程序访问主机计划的权限,包括SYS_NICE以更改执行时间/优先级。
@@保护0@@布尔值@@保护0@@如果设置为true,主机的系统日志将以只读方式映射到应用程序中。大多数情况下,日志位于/var/log/journal 中,但在某些主机上,您会在/run/log/journal 中找到它。依赖此功能的应用程序应检查目录/var/log/journal是否已填充,如果没有,则回退到/run/log/journal
@@保护0@@列表插件的破坏版本列表。如果更新为破坏性版本或跨越破坏性版本,则始终需要手动更新,即使用户为插件启用了自动更新。
@@保护0@@词典应用程序容器的资源限制 (ulimit) 设置字典。每个限制可以是普通整数值,也可以是带有键 softhard 的字典,每个限制都采用普通整数进行细粒度控制。各个值不得大于主机的硬限制(可通过 ulimit -Ha 检查;例如,在 Home Assistant 操作系统中 nofile 限制的情况下为 524288)。

选项/架构

options 字典包含所有可用选项及其默认值。将默认值设为 null,或在 schema 字典中定义数据类型,即可把某个选项设为必填。这样,用户必须在应用程序(以前称为加载项,Add-on)启动前提供该选项。支持嵌套数组和字典,最大深度为 2。

要使选项真正可选(没有默认值),需要使用 schema 字典。将 ? 放在数据类型的末尾,并且不要options 字典中定义任何默认值。如果给出任何默认值,则该选项将成为必需值。

message: "custom things"
logins:
  - username: beer
    password: "123456"
  - username: cheep
    password: "654321"
random:
  - haha
  - hihi
link: "http://example.com/"
size: 15
count: 1.2
Note

如果您从已部署给用户的应用程序中删除配置选项,建议删除该选项以避免类似 Option '<options_key>' does not exist in the schema for <App Name> (<app slug>) 的警告。

要删除选项,可以使用 Supervisor 的加载项 API。使用 bashio 时,可以直接调用 bashio::addon.option '<options_key>'(不带额外参数即可删除该选项键)。要检查该选项是否仍已设置,请检查选项字典的内容,如下所示:

options=$(bashio::addon.options)
old_key='test'
if bashio::jq.exists "${options}" ".${old_key}"; then
    bashio::log.info "Removing ${old_key}"
    bashio::addon.option "${old_key}"
fi

schema 看起来像options 但描述了我们应该如何验证用户输入。例如:

message: str
logins:
  - username: str
    password: str
random:
  - "match(^\\w*$)"
ssh:
  private_key: str
  public_key: str
link: url
size: "int(5,20)"
count: float
not_need: "str?"

我们支持:

  • str / str(min,) / str(,max) / str(min,max)
  • @@保护0@@
  • int / int(min,) / int(,max) / int(min,max)
  • float / float(min,) / float(,max) / float(min,max)
  • @@保护0@@
  • @@保护0@@
  • @@保护0@@
  • @@保护0@@
  • @@保护0@@
  • 列表(val1 | 值2 | ...)
  • device / device(filter):设备过滤器可以采用以下格式:subsystem=TYPE,即串行设备的subsystem=tty

应用程序扩展构建

应用程序的其他构建选项存储在build.yaml中。该文件将从我们的构建系统中读取。 仅当您不使用默认图像或需要其他东西时才需要这样做。

build_from:
  armhf: mycustom/base-image:latest
args:
  my_build_arg: xy
钥匙必需的描述
构建自以硬件架构为键、基础 Docker 镜像为值的字典。
参数允许额外的 Docker 构建参数作为字典。
标签允许附加 Docker 标签作为字典。
代码公证人使用 codenotary CAS 启用容器签名。
代码公证人.signer该图像的所有者签名者电子邮件地址。
codenotary.base_image验证基础容器镜像。如果您使用我们的官方图片,请使用notary@home-assistant.io

我们提供了一组基础镜像,应该可以满足很多需求。如果您不想使用基于 Alpine 的版本或需要特定的图像标签,请随时使用 build_from 选项为您的构建固定此要求。

应用程序翻译

应用程序(以前称为加载项,Add-on)可以为 UI 中使用的配置选项提供翻译文件。

翻译文件的示例路径:addon/translations/{language_code}.yaml

对于{language_code},请使用有效的语言代码,例如en,对于full list have a look hereen.yaml 将是有效的文件名。

该文件支持 2 个主键configurationnetwork

配置翻译

configuration:
  ssl:
    name: Enable SSL
    description: Enable usage of SSL on the webserver inside the app
  ssh:
    name: SSH Options
    description: Configure SSH authentication options
    fields:
      public_key:
        name: Public Key
        description: Client Public Key
      private_key:
        name: Private Key
        description: Client Private Key

在本例中,configuration (ssl) 下的密钥需要与 schema 配置中的密钥(在 config.yaml 中)相匹配。

端口描述翻译

network:
  80/TCP: The webserver port (Not used for Ingress)

在本例中,network (80/TCP) 下的密钥需要与 ports 配置中的密钥(在 config.yaml 中)相匹配。

应用程序高级选项

有时,应用程序开发人员可能希望允许用户配置以提供自己的文件,然后将这些文件作为其配置的一部分直接提供给内部服务。一些例子包括:

  1. 内部服务需要一个已配置项目的列表,并且每个项目的架构都很复杂,但该服务没有提供用于执行此操作的 UI,更容易将用户指向其文档并请求该架构中的文件。
  2. 内部服务需要二进制文件或外部配置的某些文件作为其配置的一部分。
  3. 内部服务支持配置更改时的实时重新加载,并且您希望通过询问用户在其架构中提供要实时重新加载的文件来支持其部分或全部配置。

在这种情况下,您应在加载项的配置文件中把 addon_config 添加到 map。然后告知用户将该文件放入 /addon_configs/{REPO}_<your addon's slug> 文件夹中。如果应用程序安装自本地,{REPO} 将是 local;如果应用程序来自 GitHub 仓库,{REPO} 则是根据仓库 URL 生成的哈希标识符(例如:https://github.com/xy/my_hassio_addons)。 该文件夹会在运行时挂载到加载项的 Docker 容器内的 /config。您应在加载项的 schema 中提供一个选项,用来收集相对于该文件夹的文件路径,或者依赖固定文件名并在文档中说明。

addon_config 的另一个用例,是让加载项提供基于文件的输出,或允许用户访问内部文件进行调试。一些例子包括:

  1. 内部服务日志记录到一个文件,并且您希望允许用户访问该日志文件
  2. 内部服务使用数据库,并且您希望允许用户访问该数据库进行调试
  3. 内部服务生成旨在在其自己的配置中使用的文件,并且您也希望允许用户访问它们

在这种情况下,您应将 addon_config:rw 添加到 map,以便加载项可以读写该文件夹。然后,在加载项运行时把这些文件写入 /config,让用户能够查看并访问它们。