当前位置: 首页 > news >正文

今日开源[第2期]Project N.O.M.A.D. - zhang

Project N.O.M.A.D. 项目深度分析

分析日期:2026-06-01
项目地址:https://github.com/Crosstalk-Solutions/project-nomad
最新版本:v1.32.1(2026-05-27)
开源协议:Apache License 2.0


一、项目介绍

1.1 项目概述

Project N.O.M.A.D. 全称为 "Node for Offline Media, Archives, and Data"(离线媒体、档案与数据节点),是一个自包含的、离线优先的知识与教育服务器。它将本地 AI 助手、完整维基百科离线库、全球地图、医疗急救手册、K-12 全套教育课程、加密分析工具以及文档检索系统打包到一台普通电脑中,安装完成后可彻底脱离互联网运行

N.O.M.A.D. 是一个管理 UI("Command Center")和 API,通过 Docker 编排一系列容器化工具和资源,负责所有工具的安装、配置和更新。所有功能通过浏览器访问,无需桌面环境。

1.2 项目地址

类型 地址
GitHub 仓库 https://github.com/Crosstalk-Solutions/project-nomad
项目官网 https://www.projectnomad.us
安装指南 https://www.projectnomad.us/install
WSL2 安装指南 https://www.projectnomad.us/install/wsl2
硬件指南 https://www.projectnomad.us/hardware
基准测试排行榜 https://benchmark.projectnomad.us
产品路线图 https://roadmap.projectnomad.us
Discord 社区 https://discord.com/invite/crosstalksolutions
Crosstalk Solutions 公司 https://www.crosstalksolutions.com

1.3 项目示意图

项目 Logo:

Project N.O.M.A.D. Logo

官方视频教程:

教程 时长 说明
How to Install Project NOMAD 14 分钟 全新 Ubuntu 机器上的完整安装步骤
Access NOMAD Over Wi-Fi 10 分钟 使用旅行路由器将 NOMAD 变成便携 Wi-Fi 热点
How Much Disk Space Do You Need? 1 分钟 存储空间需求快速介绍(TikTok 30 万+ 播放)

在线展示:

  • 官网交互式演示 — 功能展示、竞品对比、硬件推荐
  • 基准测试排行榜 — 社区用户真实硬件跑分(92 个提交)
  • 已测试硬件页面 — 官方安装、优化和测试过的设备

二、项目亮点

2.1 真正的离线优先设计

安装完成后可彻底脱离互联网运行。零内置遥测,不向任何外部服务器发送数据。所有计算和存储均在本地完成,是隐私和数据自主权的极致体现。

2.2 一站式知识平台

集成 8 大核心功能模块,覆盖信息获取、AI 对话、教育学习、数据分析等全方位需求:

功能 技术支撑 说明
AI 聊天与知识库 Ollama + Qdrant 本地 LLM + RAG 语义搜索
信息图书馆 Kiwix 离线维基百科、医学参考、电子书等
教育平台 Kolibri Khan Academy 课程,进度跟踪
离线地图 ProtoMaps 可下载区域地图,搜索和导航
数据工具 CyberChef 加密、编码、哈希和数据分析
笔记系统 FlatNotes 本地 Markdown 笔记
系统基准测试 内置 硬件评分 + 社区排行榜
简易设置向导 内置 引导式首次配置

2.3 极低硬件门槛

最低配置仅需:2GHz 双核 CPU + 4GB 内存 + 5GB 存储。在普通旧电脑上即可运行基础功能(不含 AI),运行 AI 推理推荐 32GB 内存 + NVIDIA GPU。

2.4 GPU 加速 AI 推理

支持 NVIDIA 和 AMD GPU 加速,默认 AI 模型为 Qwen 2.5 3B(30 亿参数),可通过 Ollama 或 OpenAI 兼容 API(LM Studio、llama.cpp)使用更大模型。

2.5 Docker 容器化架构

所有组件通过 Docker 编排,一键安装、自动更新。6 个核心服务(admin、MySQL、Redis、updater、disk-collector、dozzle)协同工作。

2.6 自我更新机制

内置 sidecar 更新器容器,可自动检查和安装更新,无需手动维护。使用语义化发布(semantic-release)自动化版本管理,已发布 69 个版本。

2.7 社区基准测试排行榜

内置硬件评分系统,用户可提交跑分数据到社区排行榜,带有 HMAC-SHA256 签名防滥用和 Builder Tag 匿名分享机制。

2.8 丰富的内容生态

  • 支持 ZIM 格式离线内容(维基百科、Stack Exchange、TED 演讲等)
  • 支持分层内容安装(Essential/Standard/Complete)
  • 社区插件支持第三方内容包

2.9 跨平台 Wi-Fi 热点

配合 GL.iNet 等旅行路由器,可将 NOMAD 设备变成便携 Wi-Fi 热点,多设备同时访问。

2.10 竞品碾压级性价比

竞品 价格 AI 能力 硬件 开源
Project NOMAD 免费 GPU 加速 LLM 任意 PC Apache 2.0
PrepperDisk $199-$279 树莓派(锁定) 部分
Doom Box $699 基础 7B 树莓派(锁定)
R.E.A.D.I. $499 基础 7B 树莓派(锁定)

三、项目运行环境介绍和运行条件介绍

3.1 系统要求

项目 最低配置 推荐配置(含 AI) 理想配置
操作系统 Debian 系 Linux(推荐 Ubuntu) 同左 同左
处理器 2 GHz 双核 AMD Ryzen 7 / Intel Core i7 更高性能多核
内存 4 GB 32 GB 64 GB
显卡 非必须 NVIDIA RTX 3060(8GB VRAM) 更高 VRAM(运行更大模型)
存储 5 GB(基础) 250 GB SSD 500 GB+ SSD
网络 安装时需要 同左 同左

注:不含 AI 功能时,最低配置即可运行。GPU 主要加速 LLM 推理和嵌入向量化。支持 NVIDIA(nvidia-container-toolkit)和 AMD(HSA_OVERRIDE)两种 GPU。

3.2 必须安装的软件

软件 用途 安装方式
Docker Engine 容器运行时 安装脚本自动安装
Docker Compose v2 容器编排 安装脚本自动安装
curl 下载脚本 apt-get install curl

NVIDIA GPU 支持为可选安装,安装脚本会自动检测并配置 nvidia-container-toolkit,失败不会中断安装。

3.3 核心技术栈

类别 技术
后端框架 AdonisJS v6(TypeScript 全栈框架)
前端 React 19 + Inertia.js + TailwindCSS 4 + Vite 6
数据库 MySQL 8.0
缓存/队列 Redis 7 + BullMQ
AI 推理 Ollama(OpenAI 兼容 API)
向量数据库 Qdrant
嵌入模型 nomic-embed-text:v1.5(768 维)
容器管理 dockerode
实时通信 @adonisjs/transmit(SSE)
离线内容 Kiwix(ZIM 格式)
离线地图 ProtoMaps(PMTiles 格式,OpenStreetMap)
OCR Tesseract.js
图像处理 Sharp

3.4 快速安装步骤

# 一键安装(Debian 系 Linux)
sudo apt-get update && \
sudo apt-get install -y curl && \
curl -fsSL https://raw.githubusercontent.com/Crosstalk-Solutions/project-nomad/refs/heads/main/install/install_nomad.sh \-o install_nomad.sh && \
sudo bash install_nomad.sh# 安装完成后,浏览器访问
http://localhost:8080

3.5 辅助管理脚本

安装后位于 /opt/project-nomad 目录:

脚本 功能
start_nomad.sh 启动所有已安装的容器
stop_nomad.sh 停止所有容器
update_nomad.sh 更新 Command Center 及依赖容器
uninstall_nomad.sh 完全卸载(不可逆)

四、项目代码介绍

4.1 代码架构图

project-nomad/
├── admin/                          # 核心管理应用(AdonisJS + React)
│   ├── ace.js                      # AdonisJS CLI 入口
│   ├── adonisrc.ts                 # 框架配置
│   ├── app/
│   │   ├── controllers/             # 控制器层(12 个)
│   │   │   ├── benchmark_controller.ts    # 基准测试
│   │   │   ├── chats_controller.ts        # AI 聊天
│   │   │   ├── downloads_controller.ts    # 下载管理
│   │   │   ├── easy_setup_controller.ts    # 安装向导
│   │   │   ├── home_controller.ts         # 首页仪表盘
│   │   │   ├── maps_controller.ts         # 离线地图
│   │   │   ├── rag_controller.ts          # 知识库/RAG
│   │   │   ├── services_controller.ts      # Docker 服务管理
│   │   │   ├── system_controller.ts        # 系统设置
│   │   │   ├── wikipedia_controller.ts     # Wikipedia 内容
│   │   │   ├── docs_controller.ts         # 文档
│   │   │   └── collection_updates_controller.ts  # 内容更新
│   │   ├── models/                  # 数据模型层(14 个)
│   │   │   ├── service.ts                # Docker 服务定义
│   │   │   ├── kv_store.ts               # 键值配置存储
│   │   │   ├── chat_session.ts           # 聊天会话
│   │   │   ├── chat_message.ts           # 聊天消息
│   │   │   ├── content_collection.ts     # 内容集合
│   │   │   ├── content_resource.ts       # 内容资源
│   │   │   ├── benchmark_result.ts       # 基准测试结果
│   │   │   └── kb_ingest_state.ts        # 知识库摄入状态
│   │   ├── services/                 # 服务层(17 个)★ 核心
│   │   │   ├── docker_service.ts         # Docker 容器管理 ★★★
│   │   │   ├── ollama_service.ts         # AI 模型管理 ★★★
│   │   │   ├── rag_service.ts            # RAG 检索增强 ★★★
│   │   │   ├── chat_service.ts           # 聊天业务逻辑
│   │   │   ├── download_service.ts       # 下载任务调度
│   │   │   ├── map_service.ts            # 地图数据管理
│   │   │   ├── queue_service.ts          # BullMQ 队列(单例)
│   │   │   ├── kiwix_library_service.ts  # Kiwix 库管理
│   │   │   ├── benchmark_service.ts      # 基准测试执行
│   │   │   ├── system_service.ts         # 系统信息采集
│   │   │   ├── container_registry_service.ts  # 镜像版本管理
│   │   │   └── zim_extraction_service.ts # ZIM 文件提取
│   │   ├── middleware/               # 中间件
│   │   ├── validators/               # 验证器
│   │   ├── jobs/                     # 后台任务
│   │   └── events/ + listeners/       # 事件系统
│   ├── config/                    # 配置文件
│   ├── database/                  # 数据库迁移和种子
│   ├── inertia/                   # Inertia.js 前端页面
│   ├── resources/                 # 前端资源(React + Vite)
│   └── public/                    # 静态资源(Logo 等)
│
├── collections/                   # 内容集合定义
│   ├── kiwix-categories.json      # Kiwix 内容分类
│   ├── maps.json                  # 地图数据源
│   └── wikipedia.json             # 维基百科内容定义
│
├── install/                       # 安装脚本和配置
│   ├── install_nomad.sh           # 主安装脚本(31KB)
│   ├── management_compose.yaml    # Docker Compose 模板
│   ├── entrypoint.sh              # Docker 入口
│   ├── start/stop/update/uninstall_nomad.sh  # 管理脚本
│   └── sidecar-updater/           # Sidecar 更新器
│
├── Dockerfile                     # 主 Docker 镜像(多阶段构建)
├── package.json                   # 项目元信息
└── LICENSE                        # Apache 2.0

4.2 核心模块介绍

模块一:docker_service.ts — Docker 容器管理(核心中的核心)

整个项目最关键的服务,负责所有 Docker 容器的生命周期管理。通过 dockerode 库与 Docker Engine 通信,实现服务的安装、卸载、启动、停止、更新等操作。

核心方法:

  • affectContainer(serviceName, action) — 启动/停止/重启容器
  • getServicesStatus() — 获取所有 nomad_ 前缀容器状态(5 秒缓存 + 并发请求合并)
  • createContainerPreflight(serviceName) — 安装前检查(防并发安装)
  • forceReinstall(serviceName) — 强制重装(停止→移除→清理卷→重建)
  • _createContainer(service, containerConfig) — 实际创建容器

关键设计:

  • 支持 Linux(Unix socket)和 Windows(named pipe)两种 Docker 连接
  • 内存级 activeInstallations Set 防止并发安装竞态条件
  • 通过 Transmit SSE 广播安装进度事件
  • 卷清理策略:只移除 Docker 命名卷,不动主机绑定挂载

模块二:ollama_service.ts — AI 模型管理

管理 Ollama 本地 AI 模型的下载、加载和对话。

核心方法:

  • downloadModel(model, progressCallback, signal, jobId) — 模型下载(支持取消、进度报告、并发去重)
  • chatStream(chatRequest) — 流式聊天(AsyncIterable)
  • embed(model, texts) — 文本向量化(用于 RAG)
  • getModels() — 获取已安装模型列表

关键设计:

  • 支持远程 Ollama URL,可连接 LM Studio、llama.cpp 等后端
  • 流式聊天中实现了 think 标签的跨 chunk 解析器
  • 广播节流:500ms 间隔防止 SSE 通道被淹没
  • activeDownloads Map 防止同一模型并发下载

模块三:rag_service.ts — RAG 检索增强生成

知识库的核心服务,负责文档的向量化存储和语义检索。

核心方法:

  • embedAndStoreText(text, metadata, onProgress) — 文本分块、嵌入、存储到 Qdrant
  • preprocessQuery(query) — 查询预处理(领域术语扩展)
  • extractKeywords(query) — 关键词提取(混合搜索)

关键设计:

  • 使用 nomic-embed-text:v1.5 嵌入模型(768 维)
  • 文本分块:1500 tokens/块,300 字符重叠
  • 批量嵌入:每批 8 个块(适配低端硬件)
  • 内置应急准备领域术语词典(BOB、EDC、MRE、SHTF 等)
  • 支持多种文件类型:ZIM(HTML)、PDF(OCR + 文本提取)、图片(Tesseract OCR)

模块四:download_service.ts — 下载任务调度

基于 BullMQ 队列的异步下载管理,处理 ZIM 文件、地图数据、AI 模型等大文件下载。

关键设计:

  • 丰富的进度报告(已下载字节/总字节)
  • 基于 Redis 的跨进程 abort signal 支持下载取消
  • 实时状态指示器(绿色=活跃,橙色=停滞,灰色=排队)

模块五:queue_service.ts — BullMQ 队列服务

进程级单例模式,管理 BullMQ 队列连接。修复了之前每个静态调用创建新实例导致 ioredis 连接泄漏的问题(5 小时可泄漏 10000+ 连接)。

4.3 模块间调用关系

用户请求 (浏览器)│▼
[Controllers] ─── 路由层接收 HTTP 请求│├──→ ChatsController ──→ ChatService ──→ OllamaService (AI 对话)│                                  └──→ ChatSession/ChatMessage (持久化)│├──→ ServicesController ─→ DockerService (容器生命周期管理)│                          └──→ ContainerRegistryService (镜像版本)│├──→ DownloadsController ─→ DownloadService ──→ QueueService (BullMQ)│                           └──→ OllamaService (模型下载)│                           └──→ MapService (地图下载)│├──→ RAGController ──→ RagService ──→ OllamaService (嵌入模型)│                       └──→ QdrantClient (向量数据库)│                       └──→ ZIMExtractionService (ZIM 解析)│├──→ MapsController ─→ MapService ──→ CountriesService│                       └──→ DownloadService│├──→ BenchmarkController ─→ BenchmarkService ─→ DockerService (sysbench)│                              └──→ OllamaService (AI 性能测试)│└──→ EasySetupController ─→ DockerService (初始安装向导)│▼
[Models] ─── Lucid ORM (MySQL 8.0)├── Service (Docker 服务定义)├── KVStore (键值配置)├── ChatSession / ChatMessage (聊天)├── ContentCollection / ContentResource (内容管理)├── BenchmarkResult / BenchmarkSetting (基准测试)└── KbIngestState (知识库摄入状态)

4.4 核心代码解析:Docker 服务安装流程

以下为 docker_service.ts 中服务安装的核心逻辑:

// 安装前检查 —— 防止并发安装
async createContainerPreflight(serviceName: string) {if (this.activeInstallations.has(serviceName)) {throw new Error(`Service ${serviceName} is already being installed`);}this.activeInstallations.add(serviceName);
}// 实际创建容器
async _createContainer(service, containerConfig) {// 1. 解析容器配置(镜像、端口、卷、环境变量等)// 2. 通过 dockerode 创建容器// 3. 启动容器// 4. 通过 SSE 广播安装进度// 5. 更新数据库中的服务状态// 6. 清理 activeInstallations 标记
}// 获取所有服务状态(带缓存和并发合并)
async getServicesStatus() {// 5 秒缓存 + 并发请求合并// 列出所有 nomad_ 前缀容器// 返回每个容器的运行状态、端口、健康检查结果
}

4.5 Docker Compose 架构

项目使用 6 个 Docker 服务协同工作:

┌─────────────────────────────────────────────────────┐
│                  project-nomad                       │
│                                                     │
│  ┌──────────┐  ┌───────┐  ┌───────┐               │
│  │  admin   │  │ mysql │  │ redis │               │
│  │ (8080)   │←→│ (内部)│←→│ (内部)│               │
│  │ AdonisJS │  │  8.0  │  │  7-alp│               │
│  └────┬─────┘  └───────┘  └───────┘               │
│       │ Docker Socket                                │
│       ▼                                              │
│  ┌──────────┐  ┌────────────┐  ┌────────────────┐ │
│  │ updater  │  │dozzle(可选)│  │ disk-collector │ │
│  │(sidecar) │  │ (9999)     │  │ (特权,只读)    │ │
│  └──────────┘  └────────────┘  └────────────────┘ │
│                                                     │
│  管理的下游容器(按需安装):                          │
│  ┌────────┐ ┌────────┐ ┌────────┐ ┌──────────┐     │
│  │ Ollama │ │ Qdrant │ │  Kiwix │ │ Kolibri  │ ... │
│  └────────┘ └────────┘ └────────┘ └──────────┘     │
└─────────────────────────────────────────────────────┘

五、项目的应用、优点和不足

5.1 应用场景

场景 说明
应急准备 自然灾害、战争冲突、网络攻击导致基础设施瘫痪时,提供不依赖外部网络的知识终端
离网生活 房车旅行、帆船、偏远小屋,配合太阳能板和电池组,功耗 15-65W 即可运行
隐私与数据自主 零遥测设计,所有计算和存储均在本地,适合不信任云服务的用户
教育环境 为孩子搭建完全可控的学习环境,只有经过筛选的教育内容,无广告和推荐算法
技术爱好者 / Homelab 自托管知识库、运行本地 LLM、完全掌控数据
野外作业 地质勘探、科考队、军事单位等需要离线信息支持的场景

5.2 项目优点

  1. 真正的离线优先:安装后完全脱离互联网,零遥测,极致隐私保护
  2. 功能全面:8 大模块覆盖 AI、知识库、教育、地图、数据分析等全方位需求
  3. 极低门槛:最低 4GB 内存 + 5GB 存储即可运行基础功能
  4. 架构优雅:Docker 容器化编排,服务解耦,一键安装和自我更新
  5. 代码质量高:TypeScript 全栈,清晰的 MVC 分层,依赖注入,单例模式
  6. 安全意识强:路径遍历防护、CWE-209 安全审计、HMAC 签名防滥用、Dozzle 禁用 shell
  7. 活跃维护:69 个 Release 版本,582 次提交,语义化发布自动化
  8. 社区生态好:27K+ Star,ZDNet/Cybernews/Hacker News 等主流媒体报道
  9. GPU 加速:支持 NVIDIA 和 AMD GPU,可运行从 3B 到 70B+ 参数的 LLM
  10. Apache 2.0 许可:完全自由使用,包括商业用途
  11. 竞品碾压:相比 $199-$699 的商业竞品,功能更强且完全免费
  12. 社区排行榜:硬件基准测试 + 匿名分享,促进社区互动

5.3 项目不足

  1. 仅支持 Debian 系 Linux:不支持 CentOS、Arch、Fedora 等其他 Linux 发行版,Windows/macOS 仅能通过 WSL2 或虚拟机运行
  2. 无身份认证机制:设计为开放可用,不建议直接暴露到互联网,在共享网络环境中存在安全风险
  3. AI 模型能力有限:默认 Qwen 2.5 3B 模型能力有限,运行大模型需要高端 GPU 和大量存储
  4. 离线地图体验有限:区域地图需要预先下载,全球地图数据量巨大(数百 GB),无法与在线地图相媲美
  5. 内容更新依赖手动:ZIM 文件和地图数据需要手动下载更新,无法自动同步最新内容
  6. 存储需求大:完整安装(含维基百科全量 + 地图 + AI 模型)可能需要 500GB+ 存储
  7. RAG 性能依赖硬件:文档向量和语义搜索在低端硬件上较慢,批量嵌入每批仅 8 个块
  8. 前端技术栈较重:AdonisJS + React + Inertia.js 的组合相对小众,社区资源有限
  9. 安装脚本仅支持 x86_64:ARM64(如树莓派)仅为实验性支持
  10. 部分功能尚在开发中:根据公开路线图,部分计划功能尚未实现
http://www.jsqmd.com/news/926163/

相关文章:

  • 2026年苏州本地专业防水补漏领域五家合规经营企业深度梳理与场景适配分析 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 山东大学软件学院创新实训——个人博客(七)
  • 2026年苏州3家资质齐全防水补漏服务商核心市场适配与专业能力分析报告 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 逐位二进制拼接 → 翻转 → 去头零 → 消邻重
  • 汽车行业:从4S店到充电桩,电子合同正在重构汽车服务签约体验
  • AE510 Smart Kit:边缘 AI 视觉套件,让传统售货机迈入智能结算时代
  • 别再傻傻分不清了!用OpenCV+Python实战搞懂单应矩阵、本质矩阵和基础矩阵
  • OpCore Simplify:终极黑苹果配置工具,3步完成复杂EFI配置
  • 用Python和R实战检验皮尔逊相关性五大假设(附完整代码与可视化)
  • 2026年南京五粮液回收服务商评测:四家机构实力对比 - 优质品牌商家
  • 云主机(华为)改密码的流水账
  • K-means实战避坑指南:如何用肘部法则和轮廓系数找到最佳K值(附Python代码)
  • 接收端电路
  • yolov26改进 | 添加注意力机制篇 | 添加DAttention (DAT)注意力机制二次创新C2PSA(附独家网络结构图)
  • 基于PLC两电梯协同运力控制系统设计(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)_文章底部可以扫码
  • 容器之间ros2可发现topic没有数据
  • 3分钟完成GTNH中文汉化:新手完整安装指南
  • 小学期第三周
  • 第一篇:uniapp+Django 互动功能全流程(登录缓存→点赞 / 收藏 / 评论列表显示)
  • HTML5 新特性概览:探索现代 Web 的强大能力
  • 从手动混乱到智能有序:Irony Mod Manager如何让Paradox游戏模组管理效率提升3倍?
  • 给你的 Agent 上一场“砍价考试“:用 Cattle Trade 思路搭一个最小博弈测评
  • VoxCPM 语音模型新手部署与调用全指南
  • Django+Vue智慧农业管理系统源码+论文
  • QGIS新手避坑指南:从高德路网数据到空间分析的全流程实操
  • 云成本治理框架:优化云计算成本
  • 别再当‘黑盒’模型受害者了!用Python的shap库5分钟看懂你的XGBoost模型决策
  • AI自进化的可能与形态:一种结构工程的推演
  • 2026年国产质量流量计TOP5排行 核心参数实测对比 - 优质品牌商家
  • 避坑指南:高通SA8255P平台Nor Flash烧录全流程与‘先擦后写’的血泪教训