21 · 部署
目标:把 Netbook(静态站)与 Ainet(二进制/集群)部署到可访问环境。 本文给出 Cloudflare Pages / Vercel / 自托管三种路径;实际域名/账号由部署者提供。
21.1 Netbook:Cloudflare Pages
已部署:https://interactive-netbook.pages.dev(Cloudflare Pages,production branch main)。
已提供 apps/netbook/wrangler.toml(pages_build_output_dir = "./dist")与 public/_headers。
# 首次
cd apps/netbook
pnpm install
pnpm build
npx wrangler pages project create interactive-netbook --production-branch main --force
npx wrangler pages deploy dist --project-name interactive-netbook --branch main
# 后续(仓库根目录)
./scripts/deploy-netbook.sh
--force只用于首次创建项目(wrangler v4 会把 Pages 委托给 Workers); 之后部署不需要--force。
- 自定义域:Cloudflare Dashboard → Pages → Custom domains。
_headers已设置X-Frame-Options、Referrer-Policy、Permissions-Policy、CSP。- CSP 为兼容 Astro 内联引导脚本保留了
'unsafe-inline';后续可抽 nonce/hash 收紧。
- CSP 为兼容 Astro 内联引导脚本保留了
- 纯静态,无服务端 API;WASM 由同源提供。
- 隐私:不接第三方 analytics;如需,使用 Cloudflare Web Analytics(无 cookie)。
21.2 文档站:Cloudflare Pages
已部署:https://interactive-docs.pages.dev
cd apps/docs
pnpm install
pnpm build
npx wrangler pages project create interactive-docs --production-branch main --force # 首次
npx wrangler pages deploy dist --project-name interactive-docs --branch main
后续在仓库根目录:
./scripts/deploy-docs.sh
构建脚本 apps/docs/build.mjs 直接读取 docs/*.md 和 specs/*.md,不复制内容。
21.3 Netbook:Vercel
cd apps/netbook
pnpm build
npx vercel deploy --prebuilt
dist/为静态输出;_headers不生效,需在vercel.json配 headers(可选)。- 自定义域:Vercel Project → Domains。
21.4 Ainet:单机二进制
cargo build --release -p ain-cli
./target/release/ain version
- 部署
ain到/usr/local/bin或容器镜像。 - 运行时数据:
journal/checkpoint/trace目录挂载持久卷。 - 建议 systemd unit 或 Kubernetes Deployment;
cell serve/node serve分别监听端口。
21.5 Ainet:3 节点集群
# 每个节点(mTLS)
ain cell serve --bind 0.0.0.0:7200 --id n1 \
--secret "$AIN_SECRET" --token "$AIN_TOKEN" \
--tls-cert /etc/ain/server-cert.pem \
--tls-key /etc/ain/server-key.pem \
--tls-ca /etc/ain/ca.pem
# 控制端
ain cluster demo \
--nodes n1@node1:7200,n2@node2:7200,n3@node3:7200 \
--secret "$AIN_SECRET" --token "$AIN_TOKEN" \
--tls-cert /etc/ain/client-cert.pem \
--tls-key /etc/ain/client-key.pem \
--tls-ca /etc/ain/ca.pem
flow 调度器:
ain node serve --bind 0.0.0.0:7100 --id n1 --token "$AIN_TOKEN" \
--tls-cert /etc/ain/server-cert.pem \
--tls-key /etc/ain/server-key.pem \
--tls-ca /etc/ain/ca.pem
ain flow distribute examples/research.flow \
--nodes node1:7100,node2:7100 --repeat 100 --chunk-steps 2 --health-check \
--tls-cert /etc/ain/client-cert.pem \
--tls-key /etc/ain/client-key.pem \
--tls-ca /etc/ain/ca.pem
- cell 集群与 flow 调度器都已内置 mTLS;仍需在防火墙层限制端口。
AIN_HTTP_ALLOW必须设置为允许的出站前缀。- 端口:cell worker 7200、flow worker 7100;不要暴露到公网。
- 日志:
ain ...结构化 JSON 尚未实现;当前为文本。
21.6 OpenCode Go 作为 provider
OpenCode Go 提供 OpenAI-compatible chat completions:
export OPENCODE_API_KEY=... # 从 https://opencode.ai/console 复制
ain cluster llm100 \
--nodes n1@node1:7200,n2@node2:7200,n3@node3:7200 \
--openai-base https://opencode.ai/inference/go/openai/v1 \
--openai-key "$OPENCODE_API_KEY" \
--openai-model deepseek-v4.1-flash
- effects 在 coordinator 执行,cell worker 不需要 provider key。
OpenAiEffect会发送user-agent: ainet/<version>与x-opencode-session; 可用OPENCODE_SESSION_ID固定 session。- Go 有订阅用量/速率限制;100 个短请求建议串行或低并发,先小规模验证。
- 一键真实演练:
OPENCODE_API_KEY=... ./scripts/opencode-go-demo.sh(默认step-5-preview,可用AIN_LLM_MODEL覆盖)。 - 2026-11-11 实测:100 cells + kill-after 30 → 100 effects、34 failover、~316–358s。
21.7 环境变量
| 变量 | 用途 |
|---|---|
AIN_TOKEN |
共享 transport token(建议通过 secret manager) |
AIN_SECRET |
cell capability HMAC secret |
AIN_HTTP_ALLOW |
逗号分隔的 HTTP 出站前缀 allowlist |
AIN_EFFECT_LEDGER |
建议的 ledger 路径(当前用 --effect-ledger 传入) |
AIN_CELL_QUEUE_LIMIT |
建议的 per-destination 队列上限(当前用 --cell-queue-limit 传入) |
AIN_TLS_CERT/AIN_TLS_KEY/AIN_TLS_CA |
建议的证书路径(当前用 --tls-* 传入) |
OPENAI_API_KEY |
真实 LLM provider(--openai-*) |
OPENCODE_API_KEY |
OpenCode Go API key(OpenAI-compatible) |
OPENCODE_SESSION_ID |
可选,OpenCode Go 的稳定路由/缓存 session ID |
AIN_LOG |
预留(尚未实现) |
21.8 本地 release 打包
./scripts/package-release.sh 0.1.2
产物在 dist/release/:
ain-0.1.2-<target>.tar.gz:二进制、docs、specs、examples、licenses(macOS arm64 + Linux x86_64/aarch64 musl);netbook-0.1.2.tar.gz:静态站;docs-site-0.1.2.tar.gz:文档站;SHA256SUMS。
Linux 交叉构建:rustup target add x86_64-unknown-linux-musl aarch64-unknown-linux-musl + cargo install cargo-zigbuild;脚本会自动检测并打包。
GitHub Release 可用 gh release create v0.1.2 dist/release/*.tar.gz dist/release/SHA256SUMS --prerelease。
21.9 发布检查
-
wrangler.toml+_headers - 静态构建(6 pages)
- 单机/集群命令文档
- 实际 Cloudflare Pages 部署
- 自定义域名/DNS
- cell 集群 mTLS
- flow 调度器 mTLS
- 生产 secret 轮换
- 监控/告警(uptime、错误率、成本)