完全指南:grain 导航、共享、备份与调试实操)
后端容器运行时安全云原生【免费下载链接】sandstormSandstorm is a self-hostable web productivity suite. Its implemented as a security-hardened web app package manager. | Actively sponsored by our friends at TestMu AI项目地址https://gitcode.com/gh_mirrors/sa/sandstorm点击查看免费下载导读Sandstorm 是一款可自托管的 Web 生产力套件本质上是一个安全加固的 Web 应用包管理器。当你通过 Sandstorm 打开任意一个应用app时Sandstorm 并不会让应用完全占据浏览器窗口而是在屏幕顶部注入一条由平台托管的顶部栏top bar为当前打开的 grain即应用运行实例/文档提供统一的导航与操作入口。本文以 docs/using/top-bar.md 为主线逐一讲解顶部栏各元素的功能、使用场景与注意事项并结合 shell/imports/sandstorm-ui-topbar/ 等仓库源码说明这些按钮背后的实现机制与调用链帮助你彻底掌握 Sandstorm 日常使用中最高频的交互界面。顶部栏是什么应用运行时由平台托管的导航层当应用在 Sandstorm 中运行时Sandstorm 会在屏幕顶部提供导航元素。这条顶部栏并非应用自身绘制的内容而是由 Sandstorm Shell即平台前端统一渲染的——从源码结构看其实现位于 shell/imports/sandstorm-ui-topbar/topbar.html模板定义与 shell/imports/sandstorm-ui-topbar/topbar.js行为逻辑中。这意味着无论你运行的是 EtherCalc、Meteor 示例应用还是其他任何应用顶部栏的交互方式都是一致的顶部栏可以感知当前打开的 grain 状态标题、大小、是否激活、是否有未读通知等并通过sandstormTopbarItem模板动态注册/注销按钮如 shell/imports/sandstorm-ui-topbar/topbar.html 所示顶部栏还会在移动端折叠为汉堡菜单menu-button并在桌面端支持通过 logo 折叠侧边栏shrinkNavbar逻辑见 topbar.js。想要快速体验顶部栏可以在你的 Sandstorm 实例中新建一个 grain例如 EtherCalc 演示应用即可看到。文档中给出的官方演示链接仅用于直观感受实际使用请以自己部署的实例为准。顶部栏元素逐一解析下面按文档顺序逐一说明顶部栏各元素的用途与背后的实现细节。这些按钮大多在 shell/imports/client/grain.html 的grain模板中通过{{#sandstormTopbarItem ...}}注册。Sandstorm 标志Logo返回 Shell 首页点击顶部栏左侧的 Sandstorm 标志可以回到 Sandstorm Shell 的主页即应用列表与文档列表视图。这里你可以浏览已安装的应用、查看已创建的 grains、继续未完成的工作或创建新 grain。从 topbar.html 可以看出Shell 导航区还提供了 Apps 与 Grains 两个显式入口链接分别对应应用商店/已安装应用列表与文档列表。当前 grain 名称点击重命名顶部栏会显示当前 grain 的名称例如 Untitled EtherCalc spreadsheet。点击该名称会弹出一个输入框让你为 grain 设置新标题。相关实现位于 shell/imports/client/grain-client.js 的promptNewTitle函数它通过window.prompt询问新标题然后调用grain.setTitle(title)完成持久化同时支持键盘 Enter/Space 触发grain-client.js。需要注意文档中的一个细节重命名只影响 Shell 侧对 grain 的记录应用本身并不知道你给它起的名字。也就是说名字是外壳层的元数据应用内部无法读取。大小Size估算 grain 的存储占用名称旁会显示如 10.2 kB 这样的字样这是该 grain 消耗的总存储空间。它的作用是帮助你判断哪些 grain 占用了较多资源从而决定是否需要清理。从 grain-client.js 的grainSizehelper 看它读取 grain 的size()并格式化为人类可读的大小字符串。不同应用的数据密度差异很大——有些应用非常轻量有些则可能占用可观空间。Share Access共享访问添加协作者点击该按钮会打开共享面板你可以通过邮件邀请用户emailInviteTab生成可分享链接shareableLinkTab并可指定该链接对应的角色/权限role查看谁有访问权限Who has access并能撤销某个共享链接或回收对某人的授权。相关 UI 模板集中在 shell/imports/client/grain.html事件与调用逻辑在 shell/imports/client/grain-client.js 与 shell/imports/client/grain-client.js。其中邮件邀请通过Meteor.call(inviteUsersToGrain, ...)完成可分享链接通过Meteor.call(newApiToken, ..., { webkey: { forSharing: true } }, ...)生成成功后构造shared/token形式的 URLWho has access 面板通过transitiveShares方法递归地列出所有被共享的账户与 graingrain-client.js。从权限模型看每次分享本质上都是签发一个API token能力令牌令牌携带角色分配roleAssignment信息撤销访问即是把对应 token 标记为revokedupdateApiToken。Move to trash移至回收站带确认的软删除点击后会出现确认对话框确认后 Sandstorm 会把该 grain 移入你的回收站。你有30 天时间撤销这一操作从回收站恢复超过 30 天后 grain 会被永久删除。前端确认与调用Template.grainDeleteButton在 grain-client.js 中通过window.confirm确认后调用Meteor.call(moveGrainsToTrash, [grainId])恢复入口当打开一个位于自己回收站中的 grain 时界面会显示restore-from-trash按钮调用moveGrainsOutOfTrash恢复grain-client.js30 天期限的实现在 shell/imports/server/grain-server.js 中定义了GRAIN_DELETION_MS 1000 * 60 * 60 * 24 * 30即 30 天Sandstorm 每天执行一次periodicCleanup将trashed时间早于该阈值的 grains 与对应 API tokens 彻底删除。Show Debug Log显示调试日志查看应用 stdout/stderr点击该按钮会在新窗口打开 grain 的调试日志页/grainlog/grainId内容来自应用进程的 stdout 与 stderr。对应前端事件在 grain-client.js服务端发布逻辑在 shell/imports/server/grain-server.js服务端通过Meteor.publish(grainLog, grainId)向客户端推送日志只有grain 的所有者可以查看调试日志源码中会校验grain.userId ! this.userId并拒绝其他人日志流通过supervisor.watchLog(8192, receiver)从 grain 的 supervisor 进程实时读取缓冲区为 8192 字节当连接断开时会追加 lost connection 提示。这是排查应用启动失败、运行异常等问题的最直接手段。Download Backup下载备份导出 /var 完整数据为 ZIP点击该按钮会把支撑该 grain 的全部数据打包成 ZIP 文件供你下载。文档强调备份内容是 grain 沙箱内/var目录的完整内容没有额外的包装目录wrapper directory即 ZIP 解压后顶层直接就是/var中的数据同时提示如果你升级过应用后再尝试恢复该备份可能会出现不兼容问题因为备份数据是旧版本应用写入的。前端实现makeAndDownloadBackup(grainId, suggestedFilename)位于 shell/imports/client/backups.ts先调用backupGrain方法生成备份 id再请求/downloadBackup/id并以.zip后缀保存弹窗交互Template.grainBackupPopupgrain.html会显示处理中/失败状态特殊情况下如 Collections 类应用会先展示警告提示备份集合不会包含其链接的其他 grainsgrain-client.js确认后才开始打包。Restart App重启应用停止并重启应用进程点击该按钮会停止并重新启动该 grain 的应用进程。文档特别说明正常情况下你永远不需要点击它只有应用出现问题时才用得上文档也坦言这个按钮理应属于某种开发者菜单。实现细节见 grain-client.js调用Meteor.call(shutdownGrain, grainId)停止应用成功后遍历页面中所有grain-frameiframe对匹配该 grain 的 frame 重新赋值frame.src以触发浏览器刷新 iframe 内容从而重新加载应用。由于 Sandstorm 会为每个打开的应用会话自动重新拉起进程重启后 grain 会以全新进程恢复运行。Get Webkey link获取 Webkey 链接为外部程序签发 API 令牌点击该按钮可以为当前 grain 创建一个API tokenWebkey供移动应用、命令行自动化或其他非浏览器交互方式访问该 grain。文档强调任何已登录用户都可以执行此操作不要求是所有者。入口按钮与弹窗模板grainApiTokenButton/grainApiTokenPopup定义于 grain.html生成流程在 grain-client.js 中填写标签petname、可选角色后调用Meteor.call(newApiToken, { accountId: Meteor.userId() }, grainId, petname, assignment, { webkey: { forSharing: false } }, ...)成功后会拼出形如protocol//apiHost#token的链接令牌管理弹窗内会列出该账号已有的令牌支持点击标签改名updateApiToken修改petname与撤销revoke在服务端令牌可设置forSharing共享用与expiresIfUnused未使用即过期等属性Webkey 的本质是能力即密钥capability-as-key持有链接即持有访问权因此要注意保管。按钮的可见性与条件渲染顶部栏并非对所有用户显示同样的按钮权限相关的按钮是按条件渲染的见 grain.html 的grain模板按钮显示条件依据源码 helperShare Access有访问权限hasAccessgrain-client.jsMove to trash已登录且为该 grain 的所有者或持有有效令牌displayTrashButtongrain-client.jsDebug Log / Backup / Clone / Restart / Settings仅所有者isOwnergrain-client.jsGet Webkey link有访问权限且已登录或该 grain 不属于旧共享模型displayWebkeyButtongrain-client.js顶部栏的扩展机制从使用到原理如果你还想更深入理解顶部栏shell/imports/sandstorm-ui-topbar/topbar.js 中的SandstormTopbar.addItem()topbar.js展示了它的通用扩展模型每个按钮本质是一个item包含唯一nameCSS 类名、显示template、可选的popupTemplate点击后弹出的面板、data数据上下文、priority排序权重越高越靠外、onDismiss弹窗关闭时的回调等属性onlyPopup模式如 Powerbox 请求/提供不显示图标只显示模态弹窗弹窗定位点击菜单项后弹窗会基于按钮在窗口中的水平位置自动选择从左侧或右侧展开topbar.js热更新保护只要有 grain 打开顶部栏会阻止页面因代码热更新hot code push被意外刷新sandstormTopbarBlockReload见 topbar.js避免中断正在进行的会话。此外应用还可以通过 postMessage API 主动请求顶部栏行为例如调用startSharing让 Shell 弹出共享面板grain-client.js或showConnectionGraph打开谁有访问权限对话框grain-client.js——这就是 docs/developing/http-apis.md 所描述的 HTTP API 在 UI 层的体现。延伸阅读顶部栏只是 Shell 的一部分完整的 Shell 客户端入口见 shell/imports/client/shell.html 与 shell/imports/client/shell-client.jsgrain 的生命周期创建、打开、回收站、删除相关服务端方法集中在 shell/imports/server/grain-server.js共享与令牌Webkey / API token的权限模型可参考 docs/developing/auth.md 与 docs/developing/powerbox.md应用如何利用 Shell 提供的各项能力包括请求顶部栏弹窗详见 docs/developing/http-apis.md。结语Sandstorm 顶部栏是连接用户与 grain 的控制台日常使用中你通过它重命名、共享、回收、备份、调试和重启应用从平台视角看它是权限模型所有者/协作者/令牌、进程管理supervisor与存储管理/var 打包三者的前端交汇点。掌握这些按钮的用途与边界条件是高效、安全地使用自托管 Sandstorm 的第一步。赞分享后端容器运行时安全云原生【免费下载链接】sandstormSandstorm is a self-hostable web productivity suite. Its implemented as a security-hardened web app package manager. | Actively sponsored by our friends at TestMu AI项目地址https://gitcode.com/gh_mirrors/sa/sandstorm点击查看免费下载相关推荐Material Components Web 顶部应用栏Top App Bar完整实战指南Material Components Web 顶部应用栏Top App Bar完整实战指南 导读 本文围绕 Material Components for前端UI组件设计系统Sandstorm 备份与恢复完整指南单 Grain 导出、整机快照与数据迁移实战Sandstorm 备份与恢复完整指南单 Grain 导出、整机快照与数据迁移实战 Sandstorm 是一个可自助托管的 Web 生产力套件本质上是经过安后端容器运行时安全云原生终极Primer CSS导航系统实践打造高效侧边栏与顶部导航的完整指南终极Primer CSS导航系统实践打造高效侧边栏与顶部导航的完整指南 Primer CSS是GitHub的设计系统提供了一套完整的CSS实现方案帮助开发前端设计系统UI组件上一篇企业级有道云笔记自动化备份解决方案Python脚本实现生产就绪的数据迁移下一篇PyWxDump 删库之后微信聊天记录备份与迁移的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考