Skip to content

插件平台 ​

插件是一个独立的程序:有自己的进程或容器、自己的数据库和自己的界面。面板从不运行它的代码,从不在自己的页面中显示它的页面,也不保存它的任何数据。面板所做的是注册它,给它恰好你批准的访问权限,并持续关注它。本页说明这是如何做到的。安装插件见 安装插件 和 扩展页面;编写插件见 编写插件。

插件可以获得什么 ​

两样东西,仅此而已:

  • 一个 API 令牌,带有一组权限(scope),每个权限都附有插件给出的理由。插件通过与其他所有人相同的 API 读取和修改面板。
  • 一个 Webhook,接收它指定的事件。每个事件都需要能让插件读取该事件所涉及内容的权限;如果插件请求的权限中没有它,清单会被拒绝。

关于用户的基本信息(例如联系方式)存放在面板自己的字段中,插件用自己的令牌读写它们。插件需要保存的其他内容(例如商店的订单和付款)都保存在插件自己的数据库中。

清单 ​

每个插件都用一份清单描述自己:它的 id、名称和版本,它请求的权限及每个权限的理由,它需要的事件,设置、Webhook 和健康检查路径的位置,它的令牌的速率限制,以及安装方式。同一个文件既放在插件的公开仓库中,供插件目录和安装表单读取;也由运行中的插件提供,供注册时读取。完整格式见 插件清单。

签名与信任 ​

清单只凭签名获得信任:

类别签名者注册方式
官方Nexora 的密钥通过认领码
已验证开发者的密钥,由插件目录为其担保通过认领码;授权同意界面会写明开发者
未签名或非官方面板不信任的任何人手动注册,作为你自己的插件

签名覆盖每个字段,所以修改任何字段都会破坏签名。发布版本的校验和用同一个密钥签名,只有文件与校验和一致时,面板才会自己在服务器上安装插件。

通过认领码注册 ​

  1. 插件启动时带有一个一次性认领码,显示在它的日志或它自己的页面上。如果是面板安装的,认领码由面板生成,面板本来就知道。
  2. 面板读取清单:从插件的地址读取,检查签名,然后显示授权同意界面:每个权限及其理由、每个事件、速率限制,以及签名者。
  3. 你批准。 面板再次读取清单,确认它正是界面上显示的那份文档,然后创建恰好那个令牌和那个 Webhook,并连同认领码一起投递到插件的设置路径。
  4. 插件只在认领码正确时接受它们。 如果插件的应答不是成功(例如认领码错误),面板会删除刚刚创建的内容。失败的注册不会留下任何东西。

面板会向插件发送一个有效的令牌,所以只有当插件地址解析到的每个地址都位于本服务器、私有网络或容器网络上时,面板才通过普通的 http:// 与插件通信。其他任何情况下,插件都必须使用 https://。

权限归属于插件行 ​

注册完成后,令牌和 Webhook 由 服务 → 扩展 上该插件的那一行持有:

  • 它们出现在 API 令牌 和 Webhook 下,标有插件的名称,在那里无法编辑、轮换或删除。
  • 令牌绑定在面板所有者身上,而不是点击批准的那个人,所以那位管理员离开后它仍然有效;如果你转移所有权,它也会随之转移。
  • 移除 会先通知插件,再删除它的令牌和 Webhook。插件在自己数据库中保存的关于你的用户的内容会留在那里,所以再次注册时它还能找到这些内容。

健康检查 ​

清单指定了健康检查路径时,面板每分钟询问一次。应答 200 即为健康。

  • 连续两次询问失败 会把插件标记为不健康,附上最后一次错误,并发出一次 panel.addon_unhealthy。
  • 下一个 200 会让它恢复,并发出 panel.addon_recovered。

状态保存在数据库中,所以重启面板不会重复发出任何一个事件。没有健康检查路径的插件永远不会被询问。

暂停 ​

暂停 停止插件而不移除它:它的令牌立即失效,它的 Webhook 不再接收事件。暂停期间发出的事件不会为它保留。被暂停的插件不会被询问健康状态。恢复 会把两者重新打开。

更新从不自行扩大权限 ​

面板每小时,以及你点击 检查更新 时,都会重新读取已签名插件的清单。

  • 没有请求更多内容的版本(不超出插件现有的权限)会自动应用。
  • 请求更多权限、事件或更高速率限制的版本 会等待。插件保持现有的一切不变,它的那一行显示 更新 … 待批准,发出一次 panel.addon_update_waiting,审核界面只列出更新新增的内容及各自的理由,等你批准。
  • 请求插件从未有过的令牌或 Webhook 的版本 无法就地批准:它的凭据需要认领码,而插件已经用掉了认领码。请移除该插件并重新注册。

来自面板的证书 ​

提供 HTTPS 的插件可以从面板自己的证书库获取证书,而不必自己申请。面板负责签发和续期;插件每隔几分钟获取一次(注册前凭认领码,注册后凭令牌),并保留一份副本,因此即使面板宕机,它也能以 HTTPS 启动。这样它不需要自己的 80 或 443 端口,多个插件可以与面板共用一台服务器。

对于位于其他服务器上的插件,只提供面板所在服务器没有参与验证的证书:通过 DNS 验证签发的、自签名的或上传的。面板自己的 HTTPS 证书永远不会交给其他服务器上的插件,因为它的私钥会让那台服务器能够冒充面板。每次获取时都会再次检查这一点。参见 证书的签发与续期。

在面板自己的服务器上安装 ​

当面板直接运行在 Linux 服务器上(不在容器中)时,它可以把插件安装在自己旁边,无需 SSH:它先根据已签名的校验和检查发布版本,再以 root 身份运行插件的安装脚本,插件从面板获取证书。通过 SSH 安装到其他服务器时,同样的检查也适用;服务器的主机密钥在首次连接时被记住,SSH 密码或密钥从不保存。

文字与图片采用 CC BY 4.0 许可。