Skip to content

OpenIWeb · 开源 · 面向普通人的个人节点

个人应用节点。 由你的 AI 代理运维。

你想要自己的应用,却不想为此去学容器、数据库和网络运维。把 MCP 端点和一把可吊销的 owner 密钥交给 AI 编程代理(Codex、Claude Code……)——它在你自己的节点上部署和运维应用,你握着浏览器控制台和密钥。应用代码无论来自网络复制还是 AI 生成,默认不可信:被关在两层信任运行时里、挡在单端口 Rust 内核之后,整节点闲时内存 ≤ 240 MB。

单端口 Rust 内核 :8080经 MCP 运维两层信任运行时闲时 ≤ 240 MB
快速开始 GitHub ↗
quick-start — zsh

$docker compose up -d --build

iweb-kernel listening :8080 — 唯一发布端口

health: curl -H "Host: $IWEB_BASE_HOST" http://127.0.0.1:9010/_iweb/health

console: https://admin.<base>/ — 用 owner 密钥登录

内部构成

入口 · 01

单端口 Rust 内核

你不必为了跑一打应用而开放(并守卫)一打端口。kernel-rs 是 ~4MB 的 Rust 静态二进制,也是节点唯一发布的端口:它掌管 Host 路由、恢复权威、owner-key 鉴权,以及带 WebSocket 升级隧道的逐应用代理。其余一切——RustFS、控制 API、每个 celld 监听——都只在容器内回环,绝不发布。

运维 · 02

MCP 即运维者

这就是交接本身:你从不登录服务器敲命令——你的代理经一扇由你控制的门干活。mcp.<base>/mcp 是受保护的系统应用:每个 JSON-RPC 请求——包括 initialize 和 tools/list——都必须以 Bearer 令牌携带一把 owner 密钥。工具覆盖工作区读写删与域名清单/注册;Worker 逐请求转发凭据,绝不存储。

信任 · 03

两层运行时信任

代理交付的代码可能来自任何地方,所以承担信任的是运行时,而不是你的警惕。celld v0.3(Cloudflare Workers API)是信任层:镜像种子舰队应用,每应用独立进程 + 看门狗软限。iweb-wasmd 是不可信层、也是唯一的运行时准入路径:任意或 AI 生成的应用包以 wasi:http 0.2 组件形态在 Wasmtime 中执行——引擎内强制隔离、宿主服务、无 socket 能力。

存储 · 04

内置 RustFS

数据状态需要一个家,但不能是又一套要运维的系统。RustFS 是 S3 兼容对象存储(MinIO 血统):单节点友好、低内存封套、仅回环、不开 console。桶:iweb-workspace、iweb-cells-<app>、iweb-apps、iweb-system。

身份 · 05

可吊销的 owner 密钥

把节点交给代理的前提,是授权随时可以收回。一个身份,多把可吊销令牌(GitHub PAT 模式):签发带绝对过期的委托密钥(iwb_<id>_<secret>)、一键复制可直接粘给代理的部署提示词、即时吊销任意密钥——监控 WebSocket 主动关闭、后续请求 401——并读取 append-only、按密钥归因的控制面审计追踪。bootstrap IWEB_API_TOKEN 永远有效且不可吊销:它是恢复法律的凭据面——即使所有委托密钥与 Admin 应用全部失守,owner 仍能直达 Kernel 控制 API。

控制台 · 06

静态控制台,紧凑封套

你唯一常用的那块界面,不该再拖一台自己的服务器。SvelteKit + shadcn-svelte 静态应用以 celld 原生资产服务——和普通应用一样可替换,永远不是密钥配置界面。整节点闲时内存封套 ≤ 240 MB RssAnon(规格见 openspec/specs/node-boundary/)。

入口

一个发布端口路由整个节点

iweb-kernel :8080 是唯一发布端口(单个 Rust 二进制)。除 Kernel 入口外的所有监听——RustFS、控制 API、每个 celld——都只在容器内回环,绝不发布。一台 OpenIWeb 安装 = 一个 owner 的个人节点。

路由承载
api.<base>Kernel 控制 API(与回环监听同鉴权)
admin.<base>独立 celld :8787(管理控制台)
mcp.<base>/mcp独立 celld :8797(MCP 端点)
<app>.<base>各应用独立 celld(IWEB_CELLD_PORTS)
<base>/<app>/app同一应用的路径别名

代理之后:RustFS(S3 兼容,仅回环,不开 console)支撑 iweb-workspace / iweb-cells-<app> / iweb-apps / iweb-system 桶。

演示应用

三个开箱即点的演示应用

可点击的证据,不是宣传册:镜像内置、端到端验证运行时能力。在 collab 的两个域名各开一个浏览器窗口,一边发消息另一边实时跳动——这就是 Durable Object 跨实例一致性的直观演示。

应用域名演示内容
hellohello.<base>纯静态站:只用 celld 的 wrangler assets 文件接口,无 Worker 代码。
searchsearch.<base>D1(SQLite)数据库搜索:参数化 SQL、中文检索。
collabcollab.<base>, collab-b.<base>前后端分离;两个 celld 实例共享同一个 Durable Object,WebSocket 跨实例实时协作白板。

快速开始

一条 compose 命令,一次健康检查

IWEB_BASE_HOST 只是一个主机名后缀(不含协议/端口/路径)。容器内只发布一个端口(8080,映射随意);TLS 由前置层终止(1Panel、Caddy、nginx……),内核只按 HTTP Host 头路由。

$shell
cp .env.example .env
# 设置唯一的 CELLD_NODE、IWEB_BASE_HOST、足够长的随机 IWEB_API_TOKEN,
# 以及 MinIO 兼容的 root 与 celld S3 凭据。
docker compose up -d --build
curl -H "Host: $IWEB_BASE_HOST" http://127.0.0.1:9010/_iweb/health

打开 https://admin.<base>/,用任意有效 owner 密钥登录——bootstrap IWEB_API_TOKEN,或控制台签发的委托密钥。在「密钥与审计」视图可以一键复制部署提示词:MCP 端点与密钥已模板化的 Agent 指令,直接粘给任何 AI 代理。

MCP

把 AI 代理指向你的节点

每个 JSON-RPC 请求——包括 initialize 和 tools/list——都必须携带 Authorization: Bearer <owner-key>(bootstrap 或委托密钥均可)。工具覆盖工作区读写删与域名清单/注册。Worker 逐请求转发凭据,绝不存储。

mcp.json
{ "mcpServers": { "iweb": { "url": "https://mcp.<base>/mcp",
  "headers": { "Authorization": "Bearer <owner-key>" } } } }

安全边界

默认不可信,隔离即设计

应用代码可能来自网络复制或 AI 生成,因此默认不可信——把每个应用与节点控制面、与其他应用隔离开,是本产品的安全底线。

  • celld 是信任层。 舰队应用(admin、mcp、notes、hello、search、collab)只能经你构建的节点镜像进入,每应用一个独立进程,由用户态资源看门狗约束(软限 SIGKILL + 单应用退避重启)。不存在 celld 运行时准入,celld 也从不承诺对抗性多租户边界。
  • wasm 是不可信层、也是唯一的运行时准入路径。 任意来源(网络下载、AI 生成)的应用包以 wasi:http 0.2 组件形态在 Wasmtime 中执行,隔离由引擎强制(无 socket/TLS/文件系统能力、宿主中介出口、fuel/epoch/store 上限),数据面只有宿主服务(KV/SQL/Logging)。
  • 绝不把密钥放进工作区。 凭据只存在于节点环境变量或 Kernel 签发的密钥。 法律见 openspec/specs/application-sandbox。

坦诚

当前限制

  • TLS/泛域名证书是部署侧事务(容器内内核只做 HTTP Host 路由)。
  • 监控指标是 Kernel 进程生命周期内的,不是持久历史。
  • notes 已部署但未路由(用户路由只指向 wasm 层)。
  • wasm 发布在验收记录与开关就绪前保持关闭;celld 发布不存在(只经镜像供给)。