Project NOMAD Supply Depot:离线应用目录的容器化应用管理、逐 App 凭据与数据目录实战解析
Supply Depot(供应仓库)是 Project NOMAD 中安装"内置工具之外"应用的目录:每个应用都是一个运行在你自己 NOMAD 上的独立 Docker 容器,完全离线可用,安装完成后在应用卡片上出现 Open 按钮。本文基于仓库中的官方文档 admin/docs/supply-depot-apps.md 展开,并结合 服务种子文件、容器管理服务 和 自定义应用安全护栏 的源码,讲清每个应用首次打开时要用什么账号、文件存在哪里、哪些功能离线时失效,以及如何把第三方容器安全地纳入 NOMAD 统一管理。读完本文,你可以独立完成 Supply Depot 中 Stirling PDF、File Browser、Calibre-Web、Vaultwarden、Jellyfin 等 11 个应用的首次配置与离线运维。
Supply Depot 的工作模型:每个应用一个容器
Supply Depot 页面由 supply_depot_controller.ts 渲染,它通过 SystemService 拉取全部服务(installedOnly: false),把目录内每个应用以卡片形式展示。从 docker_service.ts 的源码可以看到关键实现事实:
- 容器即应用:NOMAD 通过挂载的 Docker socket(DooD 模式)为每个服务创建同名的 Docker 容器,并在容器上打
io.project-nomad.managed: true标签,用于后续 Logs/Stats 只作用于自己管理的容器; - 安装是异步流:
createContainerPreflight先做前置检查(已安装、安装中、数据库与内存双重防并发),再在_createContainer中依次执行依赖检查、镜像拉取(pullImage对拉取失败显式 reject,避免"失败却继续创建容器")、安装前动作(部分应用需要 NOMAD 预先准备证书、空书库等)、容器创建与启动,全过程通过 server-sent events 把进度广播给前端; - 失败自愈:安装失败会触发清理;更新时若新容器启动失败,NOMAD 自动回滚到之前可用的版本。
文档明确划定边界:这一页只讲"在 NOMAD 上跑起来"所需的登录方式、默认凭据、文件落点和前置条件,不教如何使用各应用本身——每个应用都是独立的开源项目,以各自的官方文档为准。
管理你的应用:Manage 菜单与版本、Open 链接、自动更新
每个已安装应用的卡片上都有 Manage 菜单:
- Docs — 直达该应用的 NOMAD 入门说明,即本文各 App 小节。只有在该应用已有文档小节时此菜单项才会出现:supply_depot_docs.ts 中维护了一张服务名 → 文档锚点映射表,且要求每个锚点必须与 Markdown 中
## 应用名 {% #anchor %}的标题 id 完全一致,"链接永不指向不存在的章节"; - Edit — 修改应用的端口映射、卷绑定、环境变量、内存/CPU 限制。对精选目录应用同样可用;编辑会合并进应用的既有配置(例如 AI Assistant 的 GPU 访问等高级设置得以保留),且被编辑过的应用不再被目录更新覆盖;
- Logs / Stats — 实时查看日志输出或当前内存/CPU 占用;
- Update / Remove — 拉取最新版本或移除应用(可选连同镜像一并删除)。
版本可见性:每张卡片在应用名旁直接显示已安装版本(如 Kiwix · 3.7.0),有新版本时卡片上会出现橙色 Update available 标记。
自定义 Open 链接:默认 Open 指向 NOMAD 自身地址;如果你用反向代理或本地 DNS,可通过 Manage › Edit 设置自定义启动地址(例如 https://jellyfin.myhomelab.net)。NOMAD 会把原始链接安全存档,可随时切回,且该覆盖在升级后依然生效。
自动更新:已安装应用可免手动自动更新,两级 opt-in —— Settings → Updates 的总开关加上 Supply Depot 中每个应用的独立开关;且只自动应用 minor 和 patch 更新,major 版本永远手动。完整机制见 Updates 文档。
Bring Your Own App:把第三方容器纳入托管,以及安全护栏
除了精选目录,Supply Depot 可以把你自己的 Docker 容器作为托管应用运行。点击 Add a custom app,告诉 NOMAD:
- 要拉取的 image(例如
ghcr.io/owner/app:1.2.3); - 它需要的 端口映射、卷绑定、环境变量、内存/CPU 限制。
填写过程中 NOMAD 做实时 pre-flight 检查,对端口冲突、风险配置给出警告;部分警告(非受信镜像仓库、无法做版本跟踪的 :latest 标签)属于建议性质,可选择 Install anyway;真正不安全的配置则直接阻止安装。
源码 custom_app_guard.ts 完整展示了这套"硬护栏 + 软警告"的设计(GuardEvaluation 返回 blocked 与 warnings 两类结果):
| 检查项 | 结果 | 说明 |
|---|---|---|
挂载 Docker socket(docker.sock) |
blocked | 等于交出宿主机的完整控制权 |
挂载 /etc、/proc、/sys、/boot、/dev、/run、/var/run 或 / |
blocked | 核心系统目录一律拒绝 |
挂载 NOMAD 安装树本身(/opt/project-nomad)及其任意上级目录 |
blocked | 防止容器看到 NOMAD 自身代码与数据 |
host/container 路径不是绝对路径、或路径中含 :(Docker 绑定分隔符,防解析差集绕过) |
blocked | 保证校验与 Docker 实际解析一致 |
| 镜像引用含空白或非法字符 | blocked | 格式校验 |
镜像来自可信仓库集(docker.io、ghcr.io、lscr.io、quay.io 等)之外 |
warning | 提示"只安装你信任的镜像" |
使用 :latest 或未带标签 |
warning | 提示固定具体版本以获得可复现安装 |
卷绑定落在托管存储根(默认 /opt/project-nomad/storage,可用 NOMAD_STORAGE_PATH 覆盖)之外 |
warning | 提示你确认信任该镜像对该路径的访问 |
自定义容器的默认资源上限为 1024 MB 内存 / 1 CPU(DEFAULT_MEMORY_MB / DEFAULT_CPUS),除非用户显式覆盖。安装完成后,自定义应用与其他应用行为一致:同样的 Manage 菜单、卡片上显示版本、可加入自动更新。文档同时声明边界:自定义应用是你自己的,NOMAD 只负责运行,不提供目录外软件的安装文档与支持。
应用速查表:端口、凭据、数据目录
以下表格汇总自文档与 service_seeder.ts 中各精选应用的镜像、端口绑定与卷绑定配置,方便检索:
| 应用 | 镜像 | 宿主端口 | 首次登录 | 数据目录(storage 根下) | 离线程度 |
|---|---|---|---|---|---|
| Stirling PDF | ghcr.io/stirling-tools/s-pdf:2.13.1 |
8400 | 无(默认跳过登录) | stirling-pdf |
全离线,OCR 加语言需联网 |
| File Browser | filebrowser/filebrowser:v2 |
8410 | admin / nomad(须立即改) |
filebrowser + 内容目录 |
全离线 |
| Calibre-Web | linuxserver/calibre-web:0.6.26-ls386 |
8420 | admin / admin123(须立即改) |
calibreweb + books |
离线,metadata 抓取需联网 |
| IT Tools | ghcr.io/corentinth/it-tools:2024.10.22-7ca5933 |
8430 | 无 | 无 | 全离线 |
| Excalidraw | excalidraw/excalidraw:sha-4bfc5bb |
8440 | 无 | 无(存在浏览器本地) | 基本离线,字体/统计需联网 |
| Meshtastic Web | ghcr.io/meshtastic/web:2.7.1 |
8450 | 无 | 无 | 全离线 |
| Homebox | ghcr.io/sysadminsmedia/homebox:0.26.2 |
8470 | 首次注册即 owner | homebox |
全离线 |
| Vaultwarden | vaultwarden/server:1.36.0 |
8480(HTTPS) | 创建账号 + 主密码 | vaultwarden |
全离线 |
| Jellyfin | jellyfin/jellyfin:10.11.11 |
8490 | 向导中自建管理员 | jellyfin + media |
离线播放,metadata 需联网 |
| Education Platform (Kolibri Gen 2) | learningequality/kolibri:0.19.4 |
8310 | 向导中自建 admin | kolibri-gen2 |
导入频道需联网,其余全离线 |
| MeshCore Web | ghcr.io/axistem-dev/meshcore-web:v1.45.0 |
8500(HTTPS) | 无 | 无 | 全离线 |
Stirling PDF:本地 PDF 工具箱
完整的本地 PDF 处理工具箱:合并/拆分、与 PDF 互转、压缩、旋转、加/去密码、对扫描件做 OCR 使其可搜索、签名、盖章、涂黑编辑,共 50 多个工具。全部运行在你自己的硬件上,文档不会离开 NOMAD。
首次打开:直接进工具页,无需登录。NOMAD 默认配置跳过了 Stirling 的登录屏——在你自己的局域网里它是个人工具,密码墙只会碍事。左下角显示 "Guest" 属正常现象。种子配置的实证见 service_seeder.ts:环境变量 SECURITY_ENABLELOGIN=false(环境变量覆盖镜像内 settings.yml 的默认登录墙)与 LANGS=en_GB,8080 端口映射到宿主 8400,配置与日志分别绑定 storage/stirling-pdf/configs 与 storage/stirling-pdf/logs。
冷启动慢,属正常:Stirling PDF 是一个大体积 Java 应用,安装后给它 30–60 秒完成启动再打开页面。它需要约 1 GB 内存,更适合内存宽裕的 NOMAD。
想加回登录墙? 若多人共享你的 NOMAD,可以从 NOMAD 侧重新开启登录(注意:这是唯一途径——Stirling 自身的设置菜单在登录之后才能访问,登录关闭时只能从 NOMAD 的 Edit 屏操作):
- 在 Supply Depot 找到 Stirling PDF,点 Manage › Edit;
- 在 Environment Variables 中把
SECURITY_ENABLELOGIN=false改为SECURITY_ENABLELOGIN=true; - 保存。NOMAD 重建容器后登录屏回归。
首次登录用 admin / stirling,Stirling 会强制你立即自设密码。
数据存储:设置存在 storage/stirling-pdf。你处理的 PDF 是"上传—操作—下载回你的设备"的临时工件,Stirling 不是长期档案库。
文件来源说明(为什么看不到 NOMAD 上的其他文件):Stirling 只处理你当前设备(笔记本、手机、平板)上传的文件;它无法访问 NOMAD 上的 books 目录、Knowledge Base 文档或 File Browser 里的内容。若 PDF 已在 NOMAD 上,先从它所在之处(如 File Browser)下载一份,再在 Stirling 中打开。多一步,但文件各归其位。
离线:全部 PDF 工具本地运行,完全离线。少数联网功能离线时失效:"Google Drive" 导入项、页脚的 Survey/Discord/GitHub 链接。唯一带联网组件的核心功能是 OCR——英文语言包已内置,添加其他语言时才需要联网。
File Browser:NOMAD 的网页文件管理器
浏览器里的文件管理器:浏览、上传、下载、建目录、重命名、移动、删除,无需在电脑上装任何东西。
首次打开:出现登录屏,用 admin / nomad 登录,请立即修改密码——每台 NOMAD 默认相同,同网络内知道它的人都能进。点设置齿轮 → 个人资料设置 → 设置新密码。
与本页多数应用不同,File Browser 有意保留登录:它能对你 NOMAD 上的真实文件重命名和删除,即便在自家网络里密码也是正确选择。源码印证了这一点:service_seeder.ts 中通过 FB_USERNAME=admin 与 FB_PASSWORD("nomad" 的 bcrypt 哈希,镜像无初始密码时只会在容器日志里打印随机密码,非技术用户无法获取,故种子一个已知凭据)完成首次登录铺设;由于该版本镜像不支持 noauth 模式,登录墙天然存在。
能看到的内容目录(一次性的"挂载即护栏"设计,见种子文件中的绑定注释):
books— 电子书(含你想交给 Calibre-Web 的书);maps— 下载的地图数据;media— 视频、音乐、照片(含想交给 Jellyfin 的内容);zim— Wikipedia 等离线参考库;kb_uploads— 你加入 Knowledge Base 的文档。
这些目录内可上传、下载、重命名、移动、删除,顶层放入的内容也会持久保存(filebrowser/files 根目录是持久卷)。而应用真正依赖的内部目录(AI 模型、搜索索引、密码保险库等)被刻意排除在绑定之外——容器里根本不存在这些路径,所以无法浏览、下载或删除,这就是 NOMAD 的可见性护栏。
关于删除的提醒:这里删掉就是真的删掉,没有回收站。内容大多可重新下载(地图、Wikipedia 库),但你自己加入的书或视频一旦删除即不复存在。请像在自己电脑上一样谨慎。
离线:完全离线,联网与否行为完全一致。
Calibre-Web:电子书阅读与书库管理
浏览器内的电子书阅读器与书库管理:在线阅读、按作者/系列/标签组织、推送到 Kindle 等电纸书。它与 NOMAD 的 books 目录配对,整座书库就在设备上,设备走到哪书库跟到哪。
首次打开(一次性流程):Calibre-Web 需要一个书库路径,NOMAD 在安装时已为你准备好一个空书库(见 install/calibre-empty-library/ 资产与 docker_service.ts 中的 _runPreinstallActions__CalibreWeb),不会卡在 setup 错误上:
- 打开 Calibre-Web,落在 Database Configuration 屏;
- 在 Location of Calibre Database 输入
/books并点 Save(书库绑定为storage/books:/books,宿主端口 8420);看到 "Database Settings updated",空书库即打开; - 完成。书库随时可以填充。
若任何环节要求登录,默认凭据为 admin / admin123,进入后请修改(点右上角 admin → Edit)。
加书:网页上传默认关闭。打开方式:Admin(右上角)→ 编辑基础配置允许上传,之后会出现 Upload 按钮。另一条路:用 File Browser 把电子书直接放进 books 目录,再用 Calibre-Web 的 "scan" 收录。
数据:书库在 books 目录(与 File Browser 中看到的同一个)。备份这一个目录即备份整个书库。
离线:阅读与管理完全离线。唯一联网功能是 "fetch metadata"(拉取封面与简介),离线时该项无作用,但不影响阅读和整理已有书。
IT Tools:100+ 个开发者小工具
100 多个平时要满网去找的小工具合集:哈希生成、Base64/URL 编解码、JSON/SQL 格式化、UUID 生成、二维码制作、颜色转换等。全部运行在 NOMAD 本地,无网络也能用。
首次打开:直接进工具页,无登录、无账号、无配置,侧边栏选工具即用。
数据:无状态——会话之间不在 NOMAD 上存任何文件,无目录、无凭据,是 Supply Depot 中最简单的应用。
离线:所有工具都在浏览器里对你 NOMAD 上的这份副本运行,没有任何联网请求。
Excalidraw:离线白板,但画稿在你的浏览器里
手绘风格虚拟白板:方框、箭头、自由笔触、文本与图片,几十秒画出流程图或网络拓扑图。
首次打开:直接是空白画布,无登录。欢迎提示会告诉你"作品保存在你的浏览器里"——这正是 NOMAD 上 Excalidraw 唯一需要理解的一点。
画稿存在哪(重要):这个版本的 Excalidraw 在 NOMAD 上没有任何存储,画稿保存在你正在用的浏览器(该设备)内。由此推出三条结论:
- 不跨设备:笔记本上画的,手机打开看不到,每个浏览器各自存一份;
- 清浏览器数据或用隐私窗口,画稿即丢失,NOMAD 上没有备份可兜底;
- 所以请把作品存成文件:用左上角菜单 Save to... 存成
.excalidraw文件并放到安全位置(例如经 File Browser 存入 media 或文档目录),以后用 Open 载入即可。这是长期保存或跨设备迁移的唯一方式。
离线:白板本体离线可用(画、改、存文件都不需要网络),三点须知:
- 手绘字体来自互联网:离线时取不到,回退为普通字体,图看起来"没那么潦草",画稿本身完全不受影响;
- 在线时会上报匿名使用统计:应用方内置了基础页面访问统计(Simple Analytics),只记录"应用被打开过",看不到你的画稿;离线时该通道不可达。NOMAD 整体以"不与外界通信"为设计准则,此处特意告知;
- 若干云端按钮在 NOMAD 上无效:"Live collaboration"、"Sign up"、"Excalidraw+" 指向开发者的付费在线服务;形状 Library 浏览器同样拉取在线图库。均可忽略。
Homebox:家庭资产清单
家庭物品盘点系统:按位置和标签分类,附照片、序列号、购入价、保修日期与票据,搜索即得。做保险记录、保修跟踪、"我有什么东西在哪"的可靠工具。
首次打开:落在登录屏,但此时你还没有账号,先注册——点 Register,填写:
- 邮箱(即登录用户名);
- 姓名;
- 密码(Homebox 有强度计,强度不够不让注册,请用真实密码)。
注册即用该邮箱和密码登录。第一个创建的账号即此 Homebox 的 owner,没有默认凭据需要改——账号从创建起就是你的。源码层面,docker_service.ts 在创建 Homebox 容器时会注入一个持久化的 HBOX_AUTH_API_KEY_PEPPER(一次性生成、跨更新复用,因为 Homebox ≥ 0.26 缺少 pepper 会直接启动 panic)。
多人共享 NOMAD? 默认任何能访问它的人都能注册新账号。若你希望注册自己账号后关闭注册:
- 先创建 owner 账号;
- 在 Supply Depot 找到 Homebox,点 Manage › Edit;
- 在 Environment Variables 中加入
HBOX_OPTIONS_ALLOW_REGISTRATION=false; - 保存。NOMAD 重建应用后 Register 不再能创建新账号,已有登录不受影响。
数据:Homebox 全部数据在 storage/homebox 一个目录(一个数据库文件,加上你附的照片与票据)。备份这一个目录即备份整个清单。
离线:完全离线,本地存储,无使用统计,联网与否行为一致;页头的项目链接(GitHub、Discord、官网)离线时点不开,但与你的清单无关。
Vaultwarden:私有的 Bitwarden 兼容密码管理器
跑在自己 NOMAD 上的私有密码管理器。兼容 Bitwarden 生态:加密保险库存放登录凭据、安全笔记与卡信息,官方 Bitwarden 浏览器扩展与手机 App 全部指向你的 NOMAD 而非别人的云。
首次打开会看到安全警告,属预期行为:密码管理器只走 HTTPS,NOMAD 因此为 Vaultwarden 自动配置了 HTTPS(service_seeder.ts 中 ROCKET_TLS 指向安装时由 _runPreinstallActions__Vaultwarden 生成的自签名证书,并启用 WEBSOCKET_ENABLED 供多设备同步)。NOMAD 是私人设备而非公网网站,自签名证书会让浏览器首次警告。一次处理即可:
- 点卡片上的 Open,浏览器显示类似 "Your connection is not private";
- 点 Advanced → Proceed to (你的 NOMAD 地址)(部分浏览器按钮文字是 "Continue" / "Accept the Risk");
- 进入保险库。该设备之后不再提示。
创建保险库:登录页点 Create account,设置邮箱与主密码。
主密码不可找回。Vaultwarden 没有"忘记密码"邮件、没有重置机制,因为它设计上根本看不到你的密码。忘了主密码,保险库及其内容即永久锁定。请选强密码并避免遗失,必要时在物理安全的地方记一份。
多人共享 NOMAD? 默认任何能访问 Vaultwarden 的人都能建自己的账号(账号之间相互独立且各自加密)。要关闭新注册:
- 先建自己的账号;
- 找到 Vaultwarden 卡片,点 Manage › Edit;
- 在 Environment Variables 中加入
SIGNUPS_ALLOWED=false; - 保存。NOMAD 重建应用,新注册关闭,已有账号照常。
手机与浏览器接入:安装官方 Bitwarden App 或浏览器扩展,登录屏选 self-hosted(或 "Server URL")填入 https://(你的NOMAD地址):8480。注意部分手机 App 对自签名证书更严格,可能拒绝连接;从 NOMAD 打开的 Web 保险库始终可用。
数据:加密保险库在 storage/vaultwarden。备份该目录即备份一切。内置管理面板默认关闭(除非设置 admin token,大多数人不需要)。种子文件标注了最低资源建议:256 MB 内存 / 512 MB 磁盘。
离线:完全离线、完全私有,不向任何人发请求。Bitwarden 客户端本地也保存保险库副本,NOMAD 或手机离线时照样能读密码。
Jellyfin:你自己的媒体服务器
私有媒体服务器:指向 NOMAD 上存放电影、剧集、音乐、照片的目录,Jellyfin 以封面与详情组织一切,并向浏览器、手机、平板、智能电视及 Jellyfin 官方 App 串流。它是"你已经拥有"的媒体在大流媒体平台之外的私有离线替代。
首次打开是设置向导,几屏即过:
-
Language — 选界面语言,Next;
-
Create your admin account — 输入用户名与密码。这是控制整台服务器的管理员账号,请用真实密码并记牢(之后可在 Dashboard 加用户,包括儿童受限账号);
-
Add your media — 点 Add Media Library 选内容类型。NOMAD 已在 media 目录内为每种类型建好对应子目录,把每个书库指向对应子目录即可:
- Movies 书库 →
Movies目录; - Shows 书库 →
TV Shows目录; - Music 书库 →
Music目录; - Photos 书库 →
Photos目录。
每个书库指向自己的子目录,不要指向整个
media目录:若一个书库指向media(内含其余所有子目录)而另一个指向其中的Music,Jellyfin 会认为同一批文件被两个书库重复声明("duplicate path"),音乐就会静默消失。一步可跳过,之后在 Dashboard 添加。 - Movies 书库 →
-
Metadata / remote access / finish — 剩余屏幕接受默认值并完成,然后登录。
入库工作流:把文件放进 media 目录的对应子目录(与 File Browser 中同一个 media):电影进 Movies、剧集进 TV Shows、音乐进 Music(每个专辑一个文件夹效果最佳)、照片进 Photos。最省事的流程是:File Browser 上传(或任意方式放入)→ Jellyfin 里点 Scan Library。Jellyfin 读取子文件夹结构,整个专辑文件夹放进 Music 即成为一张专辑;文件命名清晰(如 Movie Name (2020).mp4)最利于匹配封面与详情。
数据:媒体在 storage/media;Jellyfin 自身的设置、用户账号、下载的封面在 storage/jellyfin。媒体文件只读不改。
离线:串流自有媒体完全离线——这就是它的意义。唯一联网部分是 metadata 抓取(封面、简介、演职员):离线时条目以裸名无封面显示,但播放完全正常;重新联网后一次扫描即补齐。
播放性能提示:多数文件播放毫无压力;若视频格式不被设备支持,Jellyfin 需实时转码(transcoding),CPU 负担重。NOMAD 默认不为其配置显卡加速,分辨率很大的视频在配置一般的 NOMAD 上可能卡顿。使用广泛支持的格式(如 MP4/H.264)可避免转码、播放最顺。种子文件同样标注了 2048 MB 内存 / 20480 MB 磁盘的最低建议。
Meshtastic Web:离线网格电台的网页控制台
浏览器端控制台面向 Meshtastic 设备。Meshtastic 是离网、远距离无线电通信:小型便宜的 LoRa 电台自组 mesh 网络,无蜂窝、无互联网、无月费,传输数英里的文本消息与 GPS 位置。本应用让你在完整屏幕上配置电台、收发信息。
前提:你得有一台 Meshtastic 电台。 本应用只是控制台——没有电台时打开就是 "No devices connected" 屏,真正的通信发生在物理设备及其组网的电台之间。
首次打开:无登录直接进入。点 New Connection 可见三种连接方式:
- HTTP — 按 IP 连接已加入 Wi-Fi 的电台。在 NOMAD 上用这一种;
- Bluetooth — 蓝牙配对附近电台;
- Serial — USB 串口连接。
NOMAD 特有的限制(Bluetooth/Serial 需要 HTTPS):浏览器只允许在 HTTPS 页面使用 Bluetooth/USB API。NOMAD 以纯 HTTP 提供 Meshtastic Web(8450 端口),因此 Bluetooth 与 Serial 会被浏览器直接拦截;能用的就是 HTTP:让电台加入与 NOMAD 相同的 Wi-Fi(Meshtastic 电台支持加入 Wi-Fi),然后按 IP 连接。确实需要 USB/蓝牙配对的场景,请改用官方 Meshtastic 手机 App 或官网工具。
数据:NOMAD 上无目录需要配置或管理——电台设置存在电台本身,本应用偏好存在你的浏览器。
离线:完全离线,这正是 Meshtastic 的全部意义。应用由 NOMAD 提供,与电台的通信走局域网或无线电,永远不经过互联网。页脚链接(Vercel、法务)是唯一在线元素,与使用无关。
Education Platform (Kolibri) Gen 2:完整离线学习平台
Learning Equality 出品的完整离线学习平台:视频课程、练习、阅读材料组织成结构化频道(channels),再组织为班级与课程,跟踪学习进度,全程在 NOMAD 上运行、无需互联网。面向学校与低连接/无连接地区的学习者。
首次打开是快速向导:选择机构类型并创建 admin 账号(管理整台设备的超级用户,请用真实密码并记牢)。进入后以频道形式导入学习内容。
导入内容:Kolibri 内容以频道交付。打开 Device → Channels → Import,可从 Kolibri Studio(在线)拉取,也可从本地磁盘或另一台 Kolibri 设备导入已有内容文件。可选内容很多且体积大,只导入需要的频道。
从 Gen 1 迁移(重要):早期 NOMAD 版本附带一个相当旧的 Kolibri(treehouses/kolibri:0.12.8 镜像)。Gen 2 是更新的官方上游 Kolibri(当前目录镜像为 learningequality/kolibri:0.19.4,宿主端口 8310),全新安装——旧频道与学习者数据不会自动迁移,因为两个版本的数据存储差异大到无法安全迁移。若你在用旧版并希望把频道导入新版:
- 从目录安装 "Education Platform (Gen 2)"(它与旧版不同端口并行运行,设置期间互不干扰);
- 启动新版、走完向导,然后从侧边栏进入 Device > Channels > Import,选择 "Local network or internet",再 "Add new device";在弹出对话框中输入旧 Education Platform 的 IP 加端口(默认 8300,例如
http://192.168.1.36:8300),任意命名,点 "Add" 后 "Continue"; - 现在可以逐个选择旧版频道,或选 "Select entire channels instead" 一次全导。点 "Import" 开始传输;
- 确认新安装可用、内容已复制后,从旧应用卡片卸载旧 Education Platform(卡片带 legacy 标记)。建议卸载时同时删除旧镜像与数据卷以腾空间、避免混淆;想暂时留着也无妨。
数据:导入的频道、班级与学习者进度都在 storage/kolibri-gen2。备份该目录即备份整个 Kolibri。
离线:内容导入后完全离线——这正是 Kolibri 的用武之地。唯一需要联网的步骤是从 Kolibri Studio 导入频道;此后的课程浏览、练习、进度跟踪全部在 NOMAD 上。
MeshCore Web:另一套 LoRa mesh 客户端
MeshCore 电台的浏览器客户端。MeshCore 是 Meshtastic 的"表亲"——同样是小型电台组网、无蜂窝、无互联网、无月费地传递文本与位置。本应用用于在完整屏幕上配置 MeshCore 电台并收发信息。如果你没有 MeshCore 设备,上文 Meshtastic 客户端是更常见的起点;这里服务于 MeshCore 用户。
前提:同样,你得一有 MeshCore 电台;没有电台时本应用没有可对话的对象。
首次打开会看到安全警告,属预期:MeshCore 通过 USB 或 Bluetooth 连电台,而浏览器只在 HTTPS 页面开放 Web Bluetooth / Web Serial。因此 NOMAD 将该应用以 HTTPS 提供(service_seeder.ts 中绑定 storage/meshcore-web/nginx-ssl.conf 与自签名证书到容器、发布 443→8500,ui_location 记为 https:8500,Open 按钮据此生成 https 链接)。自签名证书首次会触发浏览器警告,处理一次即可:
- 点卡片 Open,浏览器显示 "Your connection is not private" 之类提示;
- Advanced → Proceed to (你的 NOMAD 地址)(部分浏览器为 "Continue" / "Accept the Risk");
- 进入 MeshCore Web,该设备之后不再提示。
连接电台:请使用 Chrome 或 Edge,二者对浏览器 USB/Bluetooth 支持最好。把电台插到你正在浏览的那台电脑(USB)或放在蓝牙范围内,再在应用内连接。注意:电台连的是你使用的电脑,不是 NOMAD 本身,所以务必从插着电台(或在蓝牙范围内)的设备操作。部分手机对自签名证书更严格可能拒绝连接;桌面版 Chrome/Edge 最可靠。
数据:NOMAD 上无目录需要管理——电台设置存在电台上,应用偏好在浏览器里。
离线:完全离线,这正是 MeshCore 的全部意义。应用由 NOMAD 提供,与电台经 USB/Bluetooth 直连,永远不经过互联网。
共同模式:凭据、数据与离线的三条底线
把 11 个应用放在一起看,NOMAD 对 Supply Depot 的处理遵循三条一致的设计底线,可作为你自己运维时的判断基准:
- 默认凭据要么没有、要么明确且要改:File Browser(
admin/nomad)与 Calibre-Web(admin/admin123)保留默认登录并要求立即修改;Stirling PDF 默认去掉登录墙并给出从 NOMAD 侧恢复的标准步骤;Homebox 与 Vaultwarden 则没有默认账号,第一账号即 owner,并分别提供HBOX_OPTIONS_ALLOW_REGISTRATION=false与SIGNUPS_ALLOWED=false两条关闭注册的开关; - 数据各归其位,一个应用一个目录:每个应用的数据目录都位于 NOMAD 存储根(默认
/opt/project-nomad/storage)下的专属子目录,备份该目录即备份该应用;File Browser 的可见范围由卷绑定选择而非应用内规则实现,敏感目录根本不进容器; - 离线优先,联网功能显式标注:每个应用小节都以 "Works offline" 收尾,逐一列出离线时失效的联网功能(metadata 抓取、OCR 加语言、Excalidraw 字体与匿名统计、频道导入等),离线时核心能力全部保留。
配合 Manage 菜单的版本展示、自定义 Open 链接、两级开关的自动更新(仅 minor/patch 自动、major 永远手动),以及自定义应用那套"硬拦截 + 可覆盖警告"的绑定与镜像护栏,Supply Depot 构成了 NOMAD 在离线前提下"装得进、管得住、找得到数据"的完整应用层。若你只记住一件事:每个应用的数据都在 storage/ 下的专属目录里,备份它们,就备份了你的 NOMAD。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0631
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00