
TREK 插件管理完全指南安装、权限审查与更新治理的三道安全闸门【免费下载链接】TREKA self-hosted travel/trip planner with real-time collaboration, interactive maps, PWA support, SSO, budgets, packing lists, and more.项目地址: https://gitcode.com/GitHub_Trending/nomad22/TREK本文围绕 TREK 的 Admin → Plugins 面板讲解如何在自托管实例上安全完成插件安装、权限审查、出口白名单、更新校验与退役的完整流程。动手前先检查运行时总开关在面板里做任何事之前先确认插件运行时本身是开着的。TREK_PLUGINS_ENABLED是整套系统的总闸它的取值只要不是false、0、off、no大小写不敏感运行时就算开启——而默认状态就是开启判定逻辑在 kill-switch.ts 里每次调用时实时读取环境变量改了配置重启即生效。这里有个容易混淆的点运行时开启不等于有插件在跑。运行时开着只是允许面板可用、允许管理员逐个激活插件每一个已安装的插件都必须手动打开在此之前没有任何第三方代码被执行。运行时关闭时面板显示Plugins are disabled提示开启时头部则出现绿色Runtime on标识。关闭整套系统的部署写法environment: - TREK_PLUGINS_ENABLEDfalse关闭后已安装插件仍留在磁盘上停用、无害重新打开即可恢复。面板侧的管控同样严格所有端点挂在Controller(api/admin/plugins)下同时经过JwtAuthGuard与AdminGuard双守卫只有管理员能访问运行时关闭时install、upload、activate、update、rescan等操作统一返回 503。插件相关的环境变量速查变量默认值何时需要改TREK_PLUGINS_ENABLED开启需要让所有第三方代码彻底停摆时TREK_PLUGINS_DEV_LINK关闭值恰为1才生效要在开发机上链接本地构建目录并热重载时TREK_PLUGIN_ALLOW_PRIVATE_EGRESS关闭私网出口默认拒绝插件目标服务与 TREK 同机或同局域网时TREK_PLUGIN_REGISTRY_URLTREK 官方注册表想让 Discover 页浏览自己的 fork/镜像时 后三个变量都不该在生产环境随手打开各自的适用场景在第三、五、七节展开。一张图看懂插件的五段生命周期把插件在实例上的存活过程拆成五段后面每一节都是其中一段的放大发现Discover在注册表卡片流里浏览看类型、作者、徽章与下载量工具栏支持按 Widget / Page / Integration / Trip page 类型过滤与排序。安装Install服务端完成下载、校验、安全解压、manifest 复验与注册全程不执行任何插件代码。审查Review安装前的对话框把权限、出口主机、设置项摊开给你看激活时若权限有变化还会再问一次。激活Activate手动打开开关子进程启动依赖按序级联拉起。退役Retire删除插件时按清单清理代码、配置与数据出口白名单和定时任务无条件抹掉。记住这条线就不会在错误阶段做错误操作——比如想当然地以为装完就能用装完默认Off或者在依赖没就绪时硬开。让注册表插件跑起来之前先完成审查面板双视图与工具栏面板顶部用分段切换器在Installed当前实例已装列表带数量统计与Discover社区注册表卡片流之间切换。两个视图共用同一工具栏Search plugins…搜索框、Type类型筛选、Sort排序菜单、Upload plugin上传按钮、Rescan重扫描按钮Installed视图另多一个Status筛选Active / Off / Update available / Error。Rescan常被低估它同时做两件事——重新发现磁盘上本地已装插件discoverPlugins并强制拉取远程注册表绕过 30 分钟的服务器缓存CACHE_TTL 30 * 60 * 1000和 CDN。缓存的是聚合好的dist/index.json而非逐插件 API 调用注册表请求失败也只是软降级、不影响面板。效果是刚发布的插件立刻可见而不是最长等约 35 分钟。版本不兼容时如何回退安装点进一张卡片的Install前服务端会用assertHostCompatible/hostSatisfies拿插件声明的trek版本范围和当前宿主版本做比对见 install/host-compat.ts。两种降级路径存在仍兼容的旧版本 → 按钮变成Install {version}装那个版本没有任何版本兼容 → 按钮变成Incompatible并禁用。两种情况对话框都会用琥珀色提示条写明原因而不是把理由藏在 tooltip 里。装完默认 Off安装过程到底做了什么安装流程只做五件事下载、校验、安全解压、重新校验 manifest、注册为 inactive。没有任何一步执行插件代码所以刚装好的插件默认处于Off状态要管理员手动启用。预安装对话框的四个信息区点卡片会弹出审查对话框内容来自服务端在审查提交点实时拉取的 manifest 预览ManifestPreview见 registry/registry.service.ts不是作者自己写的介绍文字What it can access—— 请求的权限逐条翻译成平实语言如 Read the trips…不请求权限时显示Needs no special access.Connects to—— manifest 声明的全部可访问主机等宽字体 chip 展示Setup—— 需要填写的设置项标注Instance-wide或Per user必要时标注RequiredDetails—— 版本、体积、所需 TREK 版本范围、审查时间、总下载量底部附Source repository、Report an issue与插件Homepage链接。三枚徽章各自保证什么、不保证什么徽章它保证它不保证ReviewedTREK 维护者对该插件每一个版本做了恶意软件扫描不承诺质量、可用性也不是无害担保Signed安装时的字节已对照作者签名密钥校验过密钥按 TOFU 钉住——好比记下第一枚指纹、之后只认这枚代码在授权范围内具体想干什么Unsigned字节与注册表担保的内容一致checksum 已验证没有任何机制把字节绑定到作者身上目前注册表里大多数插件未签名所以Unsigned是琥珀色提示而非警报。面板底部还有一个可折叠的How plugins are contained面板完整说明隔离模型的边界与局限。核心结论两个徽章都不说明代码做了什么先读权限清单和出口主机再决定安装。划清权限与出口边界从清单到白名单权限清单怎么读每条权限的确切授予范围记录在 Plugin-Permissions从只读的db:read:trips每次调用都对操作者做 membership 校验到写入类的db:write:places叠加place_edit权限与写入审计再到宿主中介型能力——oauth:client宿主持有令牌插件只拿到短期 access token与notify:send收件人强制限定为操作者本人或其所属行程。你批准的权限列表是真实边界它界定了插件能触及什么但约束不了它在授权范围内的意图——被允许读行程且能连某主机的插件完全可能把数据发过去。如何为插件添加操作者出口主机operatorEgress有一类插件自托管 Gotify、ntfy 之类访问的主机名只有你知道manifest 无法预写这类 manifest 会声明operatorEgress审查对话框随之多出一个 hosts you addchip 与提示装完到该插件行的⋯ → Allowed hosts对话框逐个添加主机除此之外它到不了任何地方。几个硬性规则未声明operatorEgress的插件永远拿不到主机——安装时同意的范围仍是硬边界只有管理员能加主机普通用户即使提供凭据也无法扩大出口保存白名单后插件必须重启才生效出口守卫在子进程初始化时只安装一次且拒绝二次init见 plugin-runtime.service.ts 注释运行中进程无法热扩容删除某个主机同理立即失效并再次重启主机名校验与 manifest 声明出口的规则一致不允许裸*、不允许整 TLD 通配、不允许带协议前缀添加至少一个主机之前插件行显示琥珀色Add allowed hostchip——此时它一个主机都到不了不提示容易被误认为静默故障有主机后 chip 变蓝并显示数量。私网出口开关何时才该打开如果目标服务和 TREK 同机或同局域网localhost、192.168.x.x必须设置TREK_PLUGIN_ALLOW_PRIVATE_EGRESSon。⚠️ 注意该变量放宽的是所有已装插件的私网出口策略——只有当你信任全部插件时才开。启用被拒的三类原因与依赖级联启用操作可能被结构化拒绝错误码从最严重到最不严重依次预检只读预检任何一项不过都不会留下半激活状态错误码场景补救路径ADDON_DISABLED必需的 addon 未启用toast 提示 addon 名称到 Admin → Addons 开启后重试DEPENDENCY_MISSING插件依赖缺失或版本过旧对话框逐条列出依赖一键Download / Update后自动重试TREK_VERSION_INCOMPATIBLE/TREK_VERSION_UNKNOWN宿主版本不兼容 / 插件未声明支持范围升级 TREK或等插件更新trek范围声明级联语义有两个方向向上级联启用启用前服务端按依赖图计算enableOrder先拉起全部依赖再拉起目标被顺带打开的依赖会有 toast 告知向两级联停用addon 被关闭时依赖它的插件自动停用传递依赖一并处理deactivateForDisabledAddon反过来停用某插件也会停用所有依赖它的插件deactivateWithDependents——一个插件不可能在依赖缺失时继续运行确保插件更新与退役不越权新增权限时装而不启的同意流程有更新时插件行出现Update → v{version}按钮列表上方出现{count} updates available for your plugins.提示条与Update all批量按钮。服务端update()会对比新版本声明权限与已授予权限的差集newGrants无新增则透明重启到新代码有任何新增权限或出口主机则新代码装好但保持关闭并提示{name} v{version} is asking for rights you havent granted yet. The new version is installed but stays off until you approve it.对话框列出Newly requested permissions与New outbound connections管理员二选一Approve turn on或Keep off for now。批量更新时这些同意提示排队逐个出现一个都不会被跳过若被同意的新版本未签名对话框会额外说明没有任何机制把它和作者绑定。另一个隐性保护resolveUpdateTarget挑选的是当前 TREK 能运行的最新版本而非无脑取最新——避免新版本放弃对当前宿主支持时把正常工作的插件更新坏。如何判定密钥轮换式更新retrust作者签名密钥与安装时钉住的密钥不再匹配时更新被拒插件行显示Update blocked — {reason}与Review链接对话框并排展示钉住指纹与当前指纹。TREK 无法从自身区分合法轮换与接管——两者看起来一模一样所以必须先通过你已信任的渠道向作者核实新密钥。覆盖范围被服务端严格钉死signature-status.ts 与assertRetrustable只有SIGNATURE_KEY_CHANGED允许覆盖Trust the new key update按钮签名无效SIGNATURE_INVALID、缺失SIGNATURE_MISSING或半声明SIGNATURE_INCOMPLETE只给解释没有任何覆盖入口调用方必须回显对话框展示的完整公钥——防止对话框渲染后注册表条目又被换钥重信任与更新在同一次调用内原子完成要么新密钥通过校验、插件落到新版本并钉住新密钥要么什么都不变杜绝钉住未验证密钥的窗口卸载时的数据清理清单⋯ → Delete的确认文案是Uninstall plugin?—This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.执行时依次清理停止插件进程、移除代码目录删除plugins注册表行与设置字段deleteDatatrue时清除数据目录、错误日志、实体元数据、每用户配置含加密密钥、OAuth 令牌与状态、迁移台账、能力审计日志、待处理的 GDPR 擦除队列出口主机与定时任务无条件删除——否则后续复用同一 id 的插件会悄悄继承前人权限若选择保留数据待处理的用户数据擦除义务也一并保留同 id 重装后继续兑现注册表之外的两条路旁路上传与开发链接上传 .zip 旁路安装Sideload工具栏的Upload plugin按钮或直接拖.zip到面板上。归档先解压到 staging走与注册表安装相同的硬防护防 zip-slip/炸弹的安全解压、严格 manifest 校验、拒绝原生二进制唯一省掉的是 SHA-256/签名校验——因为没有注册表条目可对。上传上限 50 MB50 * 1024 * 1024 4096与 SDKpack限额一致。装好的插件保持inactive激活时仍需同意权限该行标记SideloadedUploaded manually — not from the registry, unsigned and unreviewed.用相同 id 覆盖上传时旧代码会先被强制停止并停用替换后的代码绝无可能未经重新激活仍在运行。链接本地构建目录Dev-Link仅当服务端TREK_PLUGINS_DEV_LINK1时入口才出现其他值一律视为关。填入本地构建目录后服务端对代码目录创建符号链接不复制、校验 manifest、拒绝原生二进制注册为 inactive再用fs.watch监听构建输出重建后防抖 400ms 自动重新 fork实现见 dev-link.ts 与 runtime 的link()。 对这两个来源诚实一点Sideloaded与Dev-Link徽章只是卡片上的标签记录代码来源——不附加额外检查、不同沙箱、无限制。旁路插件以它声明的权限原样运行未经恶意软件扫描、无签名。徽章存在的唯一意义是让你一眼看出除了你没有人为这份代码背书source 徽章因此会替换同一行上的 Signed/Unsigned 徽章因为它本身是更强的声明。谁动了你的数据隔离模型与用户侧审计隔离模型的核心事实由 runtime/ 与 supervisor/ 实现的隔离边界每个活动插件跑在独立 OS 子进程中以 Node 权限模型--permission启动文件系统读取限定在自身代码目录JWT_SECRET、数据库连接等 TREK 机密对插件进程物理不可达插件打不开trek.db、不能写文件、不能派生子进程、不能用 worker 线程、不能加载原生模块自有数据在独立 SQLite 文件中且只能通过 TREK 访问插件只经内部 RPC 通道与 TREK 通信TREK 只应答 manifest声明且你批准的能力——未授予的调用被拒绝而非忽略RPC 通道对插件代码本身封死即使跑在 fork 进程里process.send、process.on(message)等原始 IPC 原语也在其代码加载前被吊销——既不能伪造宿主消息也不能窃听在途请求页面/组件 UI 运行在密封的浏览器 frame中读不到会话 cookie也碰不到外围 TREK 页面插件崩溃、挂起或内存耗尽时死掉的只是它自己的进程TREK 继续运行并可重启或停用它用户侧活动日志审计不需要管理员权限每个用户都能在Settings → Plugins的活动日志中查看插件以自己名义执行的全部操作——读过的行程/费用、写入的地点、TREK 代发的每次出站调用。这是基于哈希链的防篡改插件审计面向用户的视图管理员则在Admin → Plugins看到按插件维度的视图。延伸阅读wiki/Plugins.md —— 插件系统全貌类型、隔离模型、依赖、活动日志wiki/Plugin-Permissions.md —— 每条权限的确切范围与http:outbound细节wiki/Plugin-Development.md —— SDK 与 manifest 编写wiki/Plugin-Publishing.md —— 注册表提交流程与trek-pluginCLIwiki/Security-Hardening.md —— 安全加固建议server/src/nest/plugins/ —— 服务端插件模块源码运行时、注册表、安装管线、签名状态【免费下载链接】TREKA self-hosted travel/trip planner with real-time collaboration, interactive maps, PWA support, SSO, budgets, packing lists, and more.项目地址: https://gitcode.com/GitHub_Trending/nomad22/TREK创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考