


















分析日期:2026-06-01
项目地址:https://github.com/Crosstalk-Solutions/project-nomad
最新版本:v1.32.1(2026-05-27)
开源协议:Apache License 2.0
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 编排一系列容器化工具和资源,负责所有工具的安装、配置和更新。所有功能通过浏览器访问,无需桌面环境。
| 类型 | 地址 |
|---|---|
| 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 |
项目 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 万+ 播放) |
在线展示:
安装完成后可彻底脱离互联网运行。零内置遥测,不向任何外部服务器发送数据。所有计算和存储均在本地完成,是隐私和数据自主权的极致体现。
集成 8 大核心功能模块,覆盖信息获取、AI 对话、教育学习、数据分析等全方位需求:
| 功能 | 技术支撑 | 说明 |
|---|---|---|
| AI 聊天与知识库 | Ollama + Qdrant | 本地 LLM + RAG 语义搜索 |
| 信息图书馆 | Kiwix | 离线维基百科、医学参考、电子书等 |
| 教育平台 | Kolibri | Khan Academy 课程,进度跟踪 |
| 离线地图 | ProtoMaps | 可下载区域地图,搜索和导航 |
| 数据工具 | CyberChef | 加密、编码、哈希和数据分析 |
| 笔记系统 | FlatNotes | 本地 Markdown 笔记 |
| 系统基准测试 | 内置 | 硬件评分 + 社区排行榜 |
| 简易设置向导 | 内置 | 引导式首次配置 |
最低配置仅需:2GHz 双核 CPU + 4GB 内存 + 5GB 存储。在普通旧电脑上即可运行基础功能(不含 AI),运行 AI 推理推荐 32GB 内存 + NVIDIA GPU。
支持 NVIDIA 和 AMD GPU 加速,默认 AI 模型为 Qwen 2.5 3B(30 亿参数),可通过 Ollama 或 OpenAI 兼容 API(LM Studio、llama.cpp)使用更大模型。
所有组件通过 Docker 编排,一键安装、自动更新。6 个核心服务(admin、MySQL、Redis、updater、disk-collector、dozzle)协同工作。
内置 sidecar 更新器容器,可自动检查和安装更新,无需手动维护。使用语义化发布(semantic-release)自动化版本管理,已发布 69 个版本。
内置硬件评分系统,用户可提交跑分数据到社区排行榜,带有 HMAC-SHA256 签名防滥用和 Builder Tag 匿名分享机制。
配合 GL.iNet 等旅行路由器,可将 NOMAD 设备变成便携 Wi-Fi 热点,多设备同时访问。
| 竞品 | 价格 | AI 能力 | 硬件 | 开源 |
|---|---|---|---|---|
| Project NOMAD | 免费 | GPU 加速 LLM | 任意 PC | Apache 2.0 |
| PrepperDisk | $199-$279 | 无 | 树莓派(锁定) | 部分 |
| Doom Box | $699 | 基础 7B | 树莓派(锁定) | 否 |
| R.E.A.D.I. | $499 | 基础 7B | 树莓派(锁定) | 否 |
| 项目 | 最低配置 | 推荐配置(含 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。
| 软件 | 用途 | 安装方式 |
|---|---|---|
| Docker Engine | 容器运行时 | 安装脚本自动安装 |
| Docker Compose v2 | 容器编排 | 安装脚本自动安装 |
| curl | 下载脚本 | apt-get install curl |
NVIDIA GPU 支持为可选安装,安装脚本会自动检测并配置 nvidia-container-toolkit,失败不会中断安装。
| 类别 | 技术 |
|---|---|
| 后端框架 | 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 |
# 一键安装(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
安装后位于 /opt/project-nomad 目录:
| 脚本 | 功能 |
|---|---|
start_nomad.sh |
启动所有已安装的容器 |
stop_nomad.sh |
停止所有容器 |
update_nomad.sh |
更新 Command Center 及依赖容器 |
uninstall_nomad.sh |
完全卸载(不可逆) |
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
docker_service.ts — Docker 容器管理(核心中的核心)整个项目最关键的服务,负责所有 Docker 容器的生命周期管理。通过 dockerode 库与 Docker Engine 通信,实现服务的安装、卸载、启动、停止、更新等操作。
核心方法:
affectContainer(serviceName, action) — 启动/停止/重启容器getServicesStatus() — 获取所有 nomad_ 前缀容器状态(5 秒缓存 + 并发请求合并)createContainerPreflight(serviceName) — 安装前检查(防并发安装)forceReinstall(serviceName) — 强制重装(停止→移除→清理卷→重建)_createContainer(service, containerConfig) — 实际创建容器关键设计:
activeInstallations Set 防止并发安装竞态条件ollama_service.ts — AI 模型管理管理 Ollama 本地 AI 模型的下载、加载和对话。
核心方法:
downloadModel(model, progressCallback, signal, jobId) — 模型下载(支持取消、进度报告、并发去重)chatStream(chatRequest) — 流式聊天(AsyncIterable)embed(model, texts) — 文本向量化(用于 RAG)getModels() — 获取已安装模型列表关键设计:
think 标签的跨 chunk 解析器activeDownloads Map 防止同一模型并发下载rag_service.ts — RAG 检索增强生成知识库的核心服务,负责文档的向量化存储和语义检索。
核心方法:
embedAndStoreText(text, metadata, onProgress) — 文本分块、嵌入、存储到 QdrantpreprocessQuery(query) — 查询预处理(领域术语扩展)extractKeywords(query) — 关键词提取(混合搜索)关键设计:
nomic-embed-text:v1.5 嵌入模型(768 维)download_service.ts — 下载任务调度基于 BullMQ 队列的异步下载管理,处理 ZIM 文件、地图数据、AI 模型等大文件下载。
关键设计:
queue_service.ts — BullMQ 队列服务进程级单例模式,管理 BullMQ 队列连接。修复了之前每个静态调用创建新实例导致 ioredis 连接泄漏的问题(5 小时可泄漏 10000+ 连接)。
用户请求 (浏览器)
│
▼
[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 (知识库摄入状态)
以下为 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_ 前缀容器
// 返回每个容器的运行状态、端口、健康检查结果
}
项目使用 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 │ ... │
│ └────────┘ └────────┘ └────────┘ └──────────┘ │
└─────────────────────────────────────────────────────┘
| 场景 | 说明 |
|---|---|
| 应急准备 | 自然灾害、战争冲突、网络攻击导致基础设施瘫痪时,提供不依赖外部网络的知识终端 |
| 离网生活 | 房车旅行、帆船、偏远小屋,配合太阳能板和电池组,功耗 15-65W 即可运行 |
| 隐私与数据自主 | 零遥测设计,所有计算和存储均在本地,适合不信任云服务的用户 |
| 教育环境 | 为孩子搭建完全可控的学习环境,只有经过筛选的教育内容,无广告和推荐算法 |
| 技术爱好者 / Homelab | 自托管知识库、运行本地 LLM、完全掌控数据 |
| 野外作业 | 地质勘探、科考队、军事单位等需要离线信息支持的场景 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。