OpenIWeb · 开源 · 面向普通人的个人节点
个人应用节点。 由你的 AI 代理运维。
你想要自己的应用,却不想为此去学容器、数据库和网络运维。把 MCP 端点和一把可吊销的 owner 密钥交给 AI 编程代理(Codex、Claude Code……)——它在你自己的节点上部署和运维应用,你握着浏览器控制台和密钥。应用代码无论来自网络复制还是 AI 生成,默认不可信:被关在两层信任运行时里、挡在单端口 Rust 内核之后,整节点闲时内存 ≤ 240 MB。
$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 跨实例一致性的直观演示。
| 应用 | 域名 | 演示内容 |
|---|---|---|
hello | hello.<base> | 纯静态站:只用 celld 的 wrangler assets 文件接口,无 Worker 代码。 |
search | search.<base> | D1(SQLite)数据库搜索:参数化 SQL、中文检索。 |
collab | collab.<base>, collab-b.<base> | 前后端分离;两个 celld 实例共享同一个 Durable Object,WebSocket 跨实例实时协作白板。 |
快速开始
一条 compose 命令,一次健康检查
IWEB_BASE_HOST 只是一个主机名后缀(不含协议/端口/路径)。容器内只发布一个端口(8080,映射随意);TLS 由前置层终止(1Panel、Caddy、nginx……),内核只按 HTTP Host 头路由。
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 逐请求转发凭据,绝不存储。
{ "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 发布不存在(只经镜像供给)。