内容
<div align="center">
<img src="public/favicon.svg" alt="Nimbus" width="72" height="72" />
# 宁默斯
<sub>[**官网**](https://trynimbus.dev) · [**文档**](https://docs.trynimbus.dev) · [**快速开始**](#使用Docker运行推荐)</sub>
**与你的云对话。**
一个由 AI 驱动的云控制平台。一个可以读取你的代码、理解你的架构、根据真实的 AWS 和 GCP 凭证执行操作、并修复你的存储库的代理 —— 所有这些都通过普通的对话。
[](LICENSE)
[](https://nodejs.org)
[](https://react.dev)
[](https://vitejs.dev)
<img src="public/og-image.jpg" alt="Nimbus dashboard" width="820" />
</div>
---
## 什么是宁默斯?
与其在云控制台、终端、CI 仪表板和 IaC 文件之间切换,你在一个地方与一个可以设计基础设施、部署它、监视它、并修复其背后的代码的代理合作。把它想象成一个高级平台工程师,居住在你的团队聊天中。
宁默斯围绕三个理念构建:
- **意图驱动的操作** — 描述你想要的结果;宁默斯生成一个计划,你批准它,它执行。读取是自主的;每次写入都需要确认。
- **每个项目一个共享工作区** — 通道、云连接、机器、修复和架构画布与你的团队共享。只有你与宁默斯的私人聊天保持个人。
- **真实执行,有证据** — 每个声明都基于代理实际读取或运行的内容(文件、日志、实时资源),每个更改都可审计。
## 功能
| | |
|---|---|
| 💬 **对话式代理** | 一个 ReAct 聊天循环,带有工具使用 — 检查库存、读取日志和遥测、估计成本、部署和打开 PR。设计模式草拟架构;代理模式操作真实云。 |
| 🎨 **实时架构画布** | 请求宁默斯设计一个系统,并观看节点实时渲染(React Flow)— 负载均衡器 → 应用 → 数据库 → 缓存。 |
| ☁️ **多云** | 通过每个用户、每个项目的 MCP 服务器连接 **AWS** (密钥或 IAM 角色,短期 STS)和 **GCP** (服务帐户 JSON 或无密钥 *Connect with Google* OAuth)。 |
| 🧭 **实时云数据** | 概述、资源和成本提取真实库存、遥测和支出,一旦连接云。 |
| 🛠️ **共享计算修复** | 连接笔记本电脑或 CI 运行器;宁默斯驱动你的本地 **Claude Code** 逐一修复存储库,然后推送分支并打开 PR。机器按项目池化。 |
| 🔌 **GitHub 和更多** | 通过 Composio 连接存储库;代理读取你的代码、PR 和 CI,然后采取行动。 |
| 👥 **团队和权限** | 通过电子邮件邀请;每个成员的通道、机器和修复以及云和资源的切换。 |
| 🔐 **安全设计** | 凭证静止加密(AES-256-GCM),永不打印或记录;基于成员资格的访问强制执行;服务器端审计跟踪。 |
<div align="center">
**在实时画布上设计基础设施**
<img src="docs/images/canvas.png" alt="Nimbus architecture canvas" width="840" />
**按需租用机器 · 在真实机器上修复代码**
<img src="docs/images/rent-a-machine.png" alt="Rent a machine" width="420" /> <img src="docs/images/repairs.png" alt="Repairs" width="420" />
</div>
## 工作原理
```mermaid
flowchart LR
A["Web 应用<br/>聊天 · 画布 · 仪表板"] -->|HTTP /api| G
B["连接的机器<br/>@nimbus/cli"] -. "轮询 · 修复" .-> G
F["租用的机器<br/>Fly"] -. "通过 API 驱动" .-> G
G(["宁默斯代理<br/>ReAct 循环 + 工具"])
G --> SEC["计划后执行<br/>写入需要批准"]
G --> MCP["每个用户的 MCP 服务器"] --> CLOUD["AWS · GCP<br/>完整的 CLI 界面"]
G --> CANVAS["实时架构画布"]
G --> REPAIR["修复 → 打开 PR<br/>Claude Code"]
G --> OBS["成本 · 日志 · 遥测"]
G --> VAULT["加密凭证库<br/>AES-256-GCM"]
classDef agent fill:#FF9900,stroke:#FF9900,color:#111111,font-weight:bold;
classDef box fill:#161b22,stroke:#30363d,color:#e6edf3;
class G agent;
class A,B,F,SEC,MCP,CLOUD,CANVAS,REPAIR,OBS,VAULT box;
```
你从 Web 应用(或在通道中 @ 提及)与宁默斯代理对话。它读取你的代码和真实的云状态,并根据证据(文件、日志行、实时资源)得出每个答案。它通过 **每个用户的 MCP 服务器** 与你的云凭证作用,这些服务器限定在你自己的凭证中,使其具有完整的 `aws` 和 `gcloud` 接口。**读取是自主的;任何更改计费资源的操作都需要你的批准。** 秘密存储在加密的库中,永不达到模型。修复在你连接的机器(你的笔记本电脑、CI 或租用的机器)上运行,并作为拉取请求返回。
## 架构
宁默斯是一个 **React 单页应用**,与 **薄 Express API** 通信,该 API 将请求分发到服务、存储库、代理和每个用户的云 MCP 服务器。单独的 **CLI 工作器** 连接外部机器进行修复。
```
┌──────────────────────┐ ┌───────────────────────────────────────────────┐
│ Web 应用(Vite/React)│ /api │ API 服务器(Express) │
│ localhost:5280 │ ─────► │ localhost:8788 │
│ • 聊天 + 画布 │ 代理 │ │
│ • 仪表板 │ │ 路由/ → HTTP 处理程序(每个资源) │
│ • 连接 │ │ 服务/ → 云、遥测、成本、规格… │
└──────────────────────┘ │ 存储库/ → SQLite 持久性 │
│ 代理/ → ReAct 聊天循环 + 分析 │
┌──────────────────────┐ │ 工具/ → 代理工具(画布、修复…) │
│ 连接的机器 │ 轮询 │ 库/ → 模型、MCP、composio、aws/gcp │
│ @nimbus/cli + Claude │ ◄────► │ mcp/ → aws / gcloud / cloud-run MCP │
│ 代码(你的笔记本电脑) │ (PR) └───────────────────────────────────────────────┘
└──────────────────────┘ │
SQLite(better-sqlite3)· 凭证静止加密
```
用户身份**严格来自会话 cookie**;`req.user.id` 是每个服务和 MCP 调用作用的隔离边界。
### 技术栈
- **前端** — React 18,Vite 5,React Router,React Flow,`@ai-sdk/react`,react-markdown
- **后端** — Node ≥ 20,Express,`better-sqlite3`,Helmet,Zod
- **AI** — Vercel AI SDK(`ai`),Databricks(主要)与 OpenRouter 跨提供商备用,模型上下文协议(`@modelcontextprotocol/sdk`)
- **集成** — Composio(GitHub),AWS 和 GCP MCP 服务器,Fly.io(配置 / 租用机器)
## 使用 Docker 运行(推荐)
运行宁默斯的最快方式。镜像包含云 MCP 服务器所需的一切 —
`git`,`uv`(AWS),GCP CLI(GCP)和 Node — 因此不需要安装其他内容。你只需要提供你的 `.env`。
```bash
git clone https://github.com/hritvikgupta/nimbus.git
cd nimbus
cp .env.example .env
# 1. 生成主加密密钥并追加到 .env(保护存储的凭证):
echo "NIMBUS_ENC_KEY=$(openssl rand -base64 32)" >> .env
# 2. 打开 .env 并填写你的 AI 模型 — LLM_PROVIDER,LLM_MODEL,OPENROUTER_API_KEY。
# (可选:FLY_API_TOKEN 以租用机器,COMPOSIO_API_KEY 以连接 GitHub。)
# 3. 运行它:
docker compose up --build
# 打开 http://localhost:8788
```
> 没有 `openssl`?使用 `node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"` 并将结果作为 `NIMBUS_ENC_KEY=` 粘贴到 `.env` 中。
一个容器为应用**和** API 提供服务,端口为 `8788`。你的数据(SQLite 数据库 + 加密连接)在重启时保存在 `nimbus-data` 卷中。
> 更喜欢普通的 `docker`?`docker build -t nimbus . && docker run -p 8788:8788 --env-file .env -v nimbus-data:/app/server/.data nimbus`
要从源代码运行(用于开发),请按照以下步骤进行。
## 快速开始(从源代码)
### 先决条件
- **Node.js ≥ 20** 和 npm
- 一个 **LLM 提供商** — 一个 Databricks 服务端点 *或* 一个 OpenRouter API 密钥
- *(可选)* 一个 **Composio** API 密钥用于 GitHub,和 AWS/GCP 凭证用于连接真实云
- 对于云 MCP 服务器:[`uv`](https://docs.astral.sh/uv/) (AWS)和 [`gcloud` CLI](https://cloud.google.com/sdk/docs/install) (GCP)— 自动在 Docker 中捆绑
### 1. 安装
```bash
git clone https://github.com/hritvikgupta/nimbus.git
cd nimbus
npm install
```
### 2. 配置
```bash
cp .env.example .env
```
填写 `.env`(参见 [配置](#配置))。至少设置一个 `NIMBUS_ENC_KEY` 和一个 LLM 提供商:
```bash
# 生成主加密密钥
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
```
### 3. 设置云 MCP 服务器
代理通过 [`server/mcp/`](server/mcp) 下的三个 MCP 服务器与你的云通信 — **AWS** (`aws-mcp`,Python via `uvx`),**Cloud Run** (`cloud-run-mcp`)和 **gcloud** (`gcloud-mcp`)。它们的源代码存储库中;安装它们的依赖项(并构建 gcloud 包)一次:
```bash
npm run setup:mcp
```
这运行 `npm install` 为 Node 服务器,构建 `gcloud-mcp`,并检查 [`uv`](https://docs.astral.sh/uv/) (需要启动 AWS 服务器)。如果你只使用一个云,可以跳过此步骤 — 只有存在匹配连接时,相应的服务器才会被启动。
**主机先决条件** (MCP 服务器调用这些 — 安装你使用的云的先决条件):
| 云 | 需要主机上 | 为什么 |
|---|---|---|
| **AWS** | [`uv`](https://docs.astral.sh/uv/) | 启动 `aws-api-mcp-server`(Python);从 PyPI 拉取其依赖项。提供完整的 `call_aws` 工具。 |
| **GCP** | `PATH` 上的 [`gcloud` CLI](https://cloud.google.com/sdk/docs/install) | `gcloud-mcp` 执行 `gcloud` 命令 — 完整的 `run_gcloud_command` 接口。 |
安装后,代理具有 **完整的 AWS 和 gcloud 命令接口** 加上 Cloud Run 部署/日志 — 服务器本身是完整的上游实现,不是修剪后的子集。你仍然在应用中连接你自己的云凭证(**连接**)。
### 4. 运行
宁默斯有两个进程 — API 和 Web 应用。在两个终端中运行它们:
```bash
npm run api # 后端 → http://localhost:8788
npm run dev # 前端 → http://localhost:5280 (代理 /api 至 :8788)
```
打开 **http://localhost:5280**,创建一个帐户,引导式演练将介绍工作区。从 **连接** 连接存储库和云,然后开始聊天。
## 配置
所有配置都通过 `.env` 中的环境变量进行(由 `npm run api` 加载)。
| 变量 | 必需 | 描述 |
|---|---|---|
| `NIMBUS_ENC_KEY` | **是** (生产)| Base64 32 字节主密钥;用 AES-256-GCM 加密云凭证静止。 |
| `LLM_PROVIDER` | 是 | `databricks` 或 `openrouter`。 |
| `LLM_MODEL` | 是 | 所选提供商的模型 ID。 |
| `DATABRICKS_HOST` / `DATABRICKS_TOKEN` / `DATABRICKS_MODEL` | 如果是 databricks | 主要服务端点。 |
| `OPENROUTER_API_KEY` | 如果是 openrouter | 跨提供商备用 / 主要。 |
| `COMPOSIO_API_KEY` | 可选 | GitHub(和其他应用)连接。 |
| `GITHUB_TOKEN` | 可选 | 提高 GitHub API 速率限制。 |
| `GOOGLE_OAUTH_CLIENT_ID` / `GOOGLE_OAUTH_CLIENT_SECRET` | 可选 | GCP 无密钥 *Connect with Google*。 |
| `FLY_API_TOKEN` / `FLY_ORG` / `FLY_REGION` / `FLY_APP` / `FLY_MACHINE_IMAGE` | 可选 | 配置和租用机器。 |
| `AGENT_PORT` | 可选 | API 端口(默认 `8788`)。 |
| `APP_URL` | 可选 | 公共应用 URL — GCP OAuth 重定向 + 链接(开发 `http://localhost:5280`;Docker `http://localhost:8788`)。 |
| `ALLOW_SIGNUP` | 可选 | `false` 在公共部署中关闭注册。 |
| `AGENT_DAILY_LIMIT` | 可选 | 每个用户的每日昂贵代理/云操作上限。 |
| `CORS_ORIGINS` | 可选 | 以逗号分隔的允许列表;空 = 仅限同源。 |
| `DOCS_HOST` | 可选 | 额外主机提供文档(除了 `docs.*`)。 |
| `OPS_SCAN_MINUTES` | 可选 | `> 0` 启用计划的事件扫描。 |
| `WEBHOOK_BASE` | 可选 | 入站 Webhook 的公共基准 URL。 |
**你真正需要:**
- **总是:** `NIMBUS_ENC_KEY` + AI 模型(`LLM_PROVIDER` + `LLM_MODEL` + `OPENROUTER_API_KEY`,或 Databricks 三元组)。你的提供商,你的密钥,你的计费。
- **租用机器(Fly):** 你自己的 `FLY_API_TOKEN` (+ 可选 `FLY_*`)。留空以禁用此功能。租用机器不需要 **公共 URL** — 工作器在服务器内运行,并通过其 API 驱动 Fly。租用者在其 UI 中提供自己的编码代理密钥。
- **连接你自己的笔记本电脑/CI 进行修复:** 这里不需要 — 该机器运行 [`@nimbus/cli`](cli/README.md) 工作器并 **轮询** 此服务器,因此 **它** 指向宁默斯(`nimbus start <key> --url https://your-host`),而不是相反。
- **公开托管:** 设置 `APP_URL` 为你的真实 URL(用于 GCP OAuth 重定向 + 链接),并可选地设置 `WEBHOOK_BASE`,`CORS_ORIGINS`,`ALLOW_SIGNUP=false`。
> **永远不要提交你的真实 `.env`。** 它被 gitignore 了;`.env.example 是模板。
## 连接一台机器(修复)
修复在你拥有的真实机器上运行,通过 [`@nimbus/cli`](cli/README.md) 工作器。 它轮询宁默斯(仅出站 — 在任何 NAT/防火墙后面都有效);当调度修复时,它克隆存储库,驱动你的本地 Claude Code 找到并修复问题,并打开 PR。
```bash
npm install -g @nimbus/cli
# 在应用中:修复 → 连接机器 → 生成密钥
nimbus start <worker-key>
```
机器需要 **Claude Code** (已安装 + 登录),**git** 和 **gh**。参见
[`cli/README.md`](cli/README.md) 以获取完整的工作器文档。
## 项目结构
```
nimbus/
├── src/ # React SPA — 页面、组件、上下文、样式
├── server/ # Express API
│ ├── server.mjs # 薄 HTTP 入口 — 挂载路由器
│ ├── routes/ # HTTP 处理程序(每个资源一个文件)
│ ├── services/ # 业务逻辑(云、遥测、成本、规格、修复…)
│ ├── repositories/ # 持久性(通过 better-sqlite3 的 SQLite)
│ ├── agents/ # ReAct 聊天循环 + 代码库分析代理
│ ├── tools/ # 代理工具(画布、修复、遥测、代码…)
│ ├── libs/ # 外部客户端(模型、MCP、composio、aws、gcp)
│ ├── mcp/ # AWS / gcloud / Cloud Run MCP 服务器
│ └── middlewares/ # 会话身份验证 + 云范围
├── cli/ # @nimbus/cli — 连接的机器修复工作器
├── docs-site/ # Fumadocs 文档站点(静态导出)
├── deploy/ # Fly.io 部署配置(登陆 + 文档)
├── docs/ # 架构和设计文档(生产就绪、租用计算…)
└── public/ # 静态资产(徽标、品牌)
```
## 部署
宁默斯针对 **[Fly.io](https://fly.io)**。 API 服务器还为 `docs.*` 请求提供静态导出的文档站点(来自 `docs-site/out`),因此 `docs.yourdomain` 不需要单独的进程。
```bash
cd docs-site && npm run build # 重新生成 docs-site/out
# 然后将 API + 构建的 SPA 部署到 Fly(参见 docs/production-readiness)
```
生产强化 — 部署架构、安全层和扩展 — 在
[`docs/production-readiness/`](docs/production-readiness) 中有文档。
## 安全
- **凭证静止加密** 使用 AES-256-GCM;主密钥(`NIMBUS_ENC_KEY`)仅存在于环境中。
- **机密从不打印、记录或返回** 在聊天或 API 响应中。
- **计划后执行** — 代理在创建、扩展、修改或删除计费资源之前,从不显示计划并获得明确确认。
- **基于成员资格的访问控制** 在服务器上用于每个项目范围的动作。
- 云 MCP 运行 **仅限项目的凭证**;AWS STS / GCP 令牌为短期。
发现漏洞?参见 [SECURITY.md](SECURITY.md)。请勿 **公开问题**。
## 贡献
欢迎贡献 — 参见 [CONTRIBUTING.md](CONTRIBUTING.md) 以获取开发设置、约定和 PR 流程。
## 许可证
**宁默斯在 [商业源代码许可证 1.1](LICENSE) 下源代码公开。** © 2026 Hritvik Gupta.
你可以**阅读、自托管、修改和使用**它,免费用于内部、开发、评估和非商业用途。你不能**将宁默斯作为竞争性托管/管理服务提供给第三方**。在**更改日期(2030-01-01)**,每个发布的版本转换为 **Apache 2.0**。
- **商标(“宁默斯”,徽标)** 保留 — 参见 [TRADEMARKS.md](TRADEMARKS.md)。
- **第三方组件(`server/mcp/` 下的托管 MCP 服务器)** 保留其自己的 Apache-2.0 许可证 — 参见 [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md)。
- 需要商业或托管许可证?联系维护者。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器