资讯详情

资讯详情

AiSOC ADR-0004 实战解读:用 Fly.io 常驻 demo 租户取代 Cloudflare Tunnel 的实时演示策略

人工智能AI Agent网络安全后端前端【免费下载链接】AiSOCOpen-source AI Security Operations Center: alert fusion, LLM-agent triage, MITRE ATTCK investigation, and a replayable decision ledger for every agent step. Self-hostable, runs with no API keys, MIT licensed. Ships an MCP server for Claude, Cursor and Continue.项目地址https://gitcode.com/GitHub_Trending/ai/AiSOC点击查看免费下载一个安全产品的公开演示如果随时可能打不开会比没有演示更伤信任。AiSOC 的 ADR-0004 记录了团队如何把tryaisoc.com/dashboard从维护者笔记本 Cloudflare Tunnel迁移到托管模式管线上的常驻 Fly.io demo 租户并保留了录屏作为兜底。本文以该决策记录为骨架结合仓库里真实存在的infra/fly/部署脚本、seed_demo.py数据灌入器、demo 只读中间件与前端 demo 模式模块逐层还原这套方案的架构、参数、幂等设计与运维验证方式同时明确指出 ADR 中哪些路径至今仍不存在避免读者照抄一个不存在的实现。背景为什么演示掉线比没有演示更糟ADR 开篇给出的现状非常直白tryaisoc.com/dashboard是产品的在线演示但它由一个Cloudflare Tunnel 反向代理到维护者自建机器上的实例the demo at tryaisoc.com is a self-hosted instance fronted by a Cloudflare Tunnel — when its reachable, the stack is running locally on a maintainers box. It can therefore go offline at any time.对安全产品而言这种形态的失败模式是结构性的单一笔记本、单一网络、单一维护者的作息。ADR 引用的两个季度遥测显示隧道在营业时间的约 6%内处于不可用状态。潜客点开落地页 CTA 后看到连接超时会直接推断产品本身坏了而不是演示环境没开。因此决策范围被收敛为二选一(a)投入一个真正常驻的部署保留落地页的实时演示 CTA(b)移除实时演示 CTA改为指向托管录屏Phase 4.3 产出的 90 秒视频。ADR 特别说明Phase 4.3 的录屏与 Phase 4.2 的托管模式管线都已存在所以两条路都不是从零开始。这也是后续两边并存方案能成立的前提。决策常驻 Fly.io demo 租户并保留双通道兜底ADR 的决策是(a)投入一个镜像托管模式管线的常驻 Fly.io 部署保留落地页的实时演示 CTA退役 Cloudflare Tunnel。具体拆成五条可执行约定#决策内容设计意图1用 Phase 4.2 的自动开通管线在tryaisoc.com/dashboard上开一个名为demo的托管租户清单文件放在infra/fly/managed/tenants/demo.yaml由 AiSOC 核心团队而非客户成功团队持有demo 与真实托管租户走同一条代码路径避免演示环境专用的一坨脚本2demo租户拥有独立 Fly 应用栈API realtime web、独立 Fly Postgres、独立 Fly Redis形状与真实托管租户完全一致唯一区别是每次重新部署都灌入确定性 fixtures与录屏录制时使用同一套隔离性与真实租户对齐数据可预测3增加一个每日 GitHub Actions 任务.github/workflows/demo-reseed.yml对 demo 租户执行flyctl ssh console调用services/api/app/demo/seed.py重灌数据过程幂等——先删既有 demo 数据再重建标准场景防止被足够多人点过之后每个潜客看到不同的坏状态4两个展示面并存落地 CTA 指向/dashboard实时同一区块内嵌 90 秒录屏作为兜底部署不可用时录屏仍可播放消除死胡同 UX5README 中demo lives at的措辞改为 demo 租户 SLO目标是 demo dashboard 99.9% 可达若不可达下方录屏为兜底删掉 Cloudflare Tunnel 免责声明不再为演示掉线道歉注意第 3 条与仓库实际实现存在差异后文与仓库现状对齐一节会详细说明仓库里真正落地的重置机制是Fly 定时机器 release_command 部署后 SSH 引导三条路径而不是 GitHub Actions。落地架构一次访问要经过哪些组件ADR 把 demo 定义为与托管租户同形状的一套栈。仓库中的 infra/fly/README.md 给出了这套栈的完整拓扑与主机名划分可以据此还原点开 CTA 之后发生了什么tryaisoc.com api.tryaisoc.com ws.tryaisoc.com │ │ │ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────────┐ ┌──────────────────────┐ │ aisoc-demo- │ │ aisoc-demo-api │ │ aisoc-demo-realtime │ │ web (Next.js)│ │ (FastAPI) │ │ (WebSocket) │ └──────────────┘ └──────────────────┘ └──────────────────────┘ │ │ │ └───── 6PN internal ────┴─────────────────────┘ │ ┌───────────┴───────────┐ ▼ ▼ ┌────────────────────┐ ┌──────────────────────┐ │ aisoc-demo-agents │ │ Fly Postgres / Redis │ │ AISOC_AGENT_MODE │ │ demo 专用实例 │ │ deterministic │ └──────────────────────┘ └────────────────────┘为什么是三个公网主机名而不是全部挂在 apex 上README 给出的理由是实现层面的realtime 服务使用原生 WebSocketNext.js 的 rewrites 在生产环境无法代理 WS而把/api/v1/*全部经 web 应用转发会让每个 API 调用都穿过 web 机器延迟翻倍并限制独立扩容。拆分api./ws.到各自的 Fly 证书上也让浏览器的 CORS/CSP 边界保持显式。为了把 demo 做薄一组可选组件在 demo 路径上被显式关闭对应 infra/fly/api/fly.toml 的[env]段组件demo 状态关闭原因Kafka关闭realtime 在 demo 路径上使用 Redis pub/subClickHouse关闭demo 流程没有分析型查询OpenSearch关闭检测规则随合成匹配载荷一起下发Neo4j关闭攻击图不在标准 demo 路径上Qdrant关闭知识库查询走镜像内 Postgres pg_trgm对应环境变量为AISOC_DISABLE_KAFKA、AISOC_DISABLE_CLICKHOUSE、AISOC_DISABLE_NEO4J、AISOC_DISABLE_QDRANT。自建用户需要完整栈时入口是仓库根目录的docker-compose.yml与各服务Dockerfile。与仓库现状对齐ADR 中哪些路径存在哪些不存在这是本文最需要强调的一节。ADR 自身在 Consequences 里就加了一条:::caution明确说明那七个随 ADR 落地的代码/基础设施变更是计划清单而非已交付记录其中四项从未进入仓库。我逐项核对了当前工作树ADR 列出的路径当前仓库状态说明infra/fly/managed/tenants/demo.yaml不存在tenants/下只有_example.yaml.github/workflows/demo-reseed.yml不存在工作流目录中无此文件services/api/app/demo/seed.py不存在无app/demo/目录docs/runbooks/demo-tenant-down.md不存在docs/runbooks/有service-down.md等通用手册但无此文件apps/web/src/components/landing/Hero.tsx未按此路径落地实际承载 CTA 与录屏卡片的是 onboarding 组件apps/web/public/_redirects不存在—README.md的 Try it live 章节不存在ADR 自己也注明 README 从未有过该标题ADR 给出的等价实现是可执行的确定性的灌入器真实存在于 services/api/app/scripts/seed_demo.py并且可以通过make demo触发。这一点非常重要——ADR 的决策意图成立但引用其路径前必须先核对工作树否则会把读者引向 404。更关键的现状是infra/fly/README.md 顶部记录了 2026-09-28 的实测结论——这套 Fly 栈当前并不存在。Fly 组织存在逾期账单所有应用因欠费被回收三个*.fly.dev主机名均为NXDOMAINapi.与ws.子域仍解析到 Cloudflare 并返回HTTP 525边缘在源站已消失。原本从该目录部署的deploy-api.yml与deploy-web.yml两个工作流也已被移除因为它们早已退化为仅workflow_dispatch可触发、且每次在main上的运行都失败。因此阅读infra/fly/的正确姿势是把它当作一套可复现的部署设计与脚本而不是一个正在运行的环境的说明。README 也给出了恢复顺序见下文运维验证一节。数据确定性seed_demo.py如何保证每个访客看到同一场调查ADR 把确定性 fixtures作为 demo 租户与真实租户的唯一差异这条要求在代码层由 services/api/app/scripts/seed_demo.py 承担。该模块的文档字符串明确了两套模式完整 seed默认填充 BOTS 形状的标准目录——15 个手工编写的INC-RT-*事件其中INC-RT-001是一个进行中的调查、28 条随机化告警以及配套的连接器集合。这就是pnpm aisoc:demo与托管 demo 使用的数据集。快速 seed--demo-quick只填充四个确定性用例DEMO-001钓鱼、DEMO-002云接管、DEMO-003内部人员外泄、DEMO-004勒索并使用固定墙钟时间使重复运行逐字节稳定_purge_demo_quick会在重灌前删除这四个DEMO-*事件保证是干净重置而非重复插入。幂等性在两处体现模块文档明确写入运行两次产生相同数据集且从不重复插入行fly.toml的release_command注释说明灌入器在标准INC-RT-*编号已存在时会短路返回因此可以在每次flyctl deploy上安全执行。INC-RT-001之所以是整条链路的锚点是因为前端 deeplink 直接指向它。在 apps/web/src/lib/demoMode.ts 中export function demoDeeplink(): string { return process.env.NEXT_PUBLIC_DEMO_DEEPLINK?.trim() || /cases/INC-RT-001?tabledger; }注释写明了选择理由INC-RT-001是展示用场景——检测器刚刚触发、加密正在进行、账本正在流式输出 agent 的实时决策运维方可用NEXT_PUBLIC_DEMO_DEEPLINK覆盖为其他事件。[infra/fly/web/fly.toml](https://link.gitcode.com/i/65dd27331999a381bc6db597afa64dc7)中该值同样被显式设为/cases/INC-RT-001?tabledger并注明必须与seed_demo.py保持同步。灌入器还有一道容易被忽略的安全护栏_refuse_in_production()。它会读取AISOC_ALLOW_SEED当该值为1/true/yes时直接放行否则检查ENVIRONMENT/ENV与AISOC_DEMO_MODE仅当处于 demo 模式或dev/development/local/test/空环境时才继续其余情况以退出码 2 终止并提示这会写入合成安全事件请显式设置AISOC_ALLOW_SEED1。仓库根 Makefile 的demo目标正是这样调用的make demo # 内部执行$(COMPOSE) run --rm -e AISOC_ALLOW_SEED1 api python -m app.scripts.seed_demo这条护栏解释了为什么本地复现 demo 数据不会误伤生产库合成数据本身足够逼真才更需要一个显式的确认开关。重播与预热demo_seed.py在 seed 之上多做了什么ADR 第 3 条要求删除既有 demo 数据、重建标准场景。仓库中真正承担重置 预热职责的是 services/api/app/scripts/demo_seed.py它是seed_demo的 kickoff 包装器文档字符串列出了三种调用方式部署后infra/fly/fly-demo-deploy.sh在部署完成后通过flyctl ssh console -a aisoc-demo-api -C python -m app.scripts.demo_seed --reset --kickoff-investigation执行让第一批访客立刻看到进行中的调查每日 cronapi 应用上的 Fly 定时机器每 24 小时在 00:00 UTC 重跑擦除 demo 状态并重灌本地恢复自建者可在仓库根执行python scripts/demo_seed.py --reset该 shim 会转发到本模块。它把三件事收进一个入口清理 demo 租户数据保证每位访客看到同一个INC-RT-001LockBit 3.0 进行中调查复用seed_demo重灌标准数据与自建者pnpm seed:demo得到的数据一致预热一次调查使/cases/INC-RT-001?tabledger在浏览器到达时已有 agent 事件在流。模块另有两点实现细节值得注意它会先等待 API默认 60 秒超时与 agents 健康agents 不健康时降级为跳过 kickoff 而不是失败错过 kickoff 时 demo 仍可用访客只是看到冷事件并且支持--dry-run只打印将要执行的动作而不触碰状态。Fly 配置把冷启动挡在 TTFI 预算之外ADR 的目标是点开即见调查而 infra/fly/README.md 把这个目标量化为sub-60s time-to-first-investigationTTFI。配置层面对应几个关键决定全部在 infra/fly/api/fly.toml 中1.release_command在流量进入前完成迁移与灌数[infra/fly/api/fly.toml](https://link.gitcode.com/i/0ccf4d0f0fd06da61eefa8a43f57b884)第 55–56 行[deploy] release_command /bin/sh -c rm -f /tmp/aisoc-migrations-ok python -m app.scripts.run_migrations { [ -f /tmp/aisoc-migrations-ok ] python -m app.scripts.seed_demo || echo \[release_command] migrations soft-failed (DB unreachable) — seed_demo skipped, API code deploy proceeds\; }这里没有用朴素的原因写在注释里在AISOC_MIGRATIONS_REQUIRED0的 demo 策略下迁移器即使在整个重试预算内都连不上 Postgres 也会以 0 退出避免 Fly Postgres 抖动劫持一次 API 代码发布但此时seed_demo会以同样的连接失败让部署崩溃。包装器用迁移成功哨兵文件来区分两种情况软失败跳过灌数SQL 级硬失败仍以非零退出中止部署。这是可用性优先但不掩盖真实错误的典型折中。2. 常驻而非自动停机同文件第 103–114 行[http_service] internal_port 8000 force_https true auto_stop_machines off auto_start_machines true min_machines_running 1 # keep one warm for sub-60s TTFI注释解释了为什么不能省web 应用通过 6PNaisoc-demo-api.internal:8000代理/api/v1/*而6PN 连接不会触发 Fly 的自动启动。机器一旦停掉即使公网api.tryaisoc.com边缘能唤醒它dashboard 的内部调用仍会 500。因此单台 demo 机器必须 7×24 保持热态。3. 健康检查与规格GET /health15 秒间隔、5 秒超时、20 秒宽限期VM 为shared-cpu-1x/ 1024MB。4. 灌数的三条执行路径infra/fly/README.md 的表格与部署脚本第 318–346 行一致时机方式每次部署[deploy].release_command执行迁移 python -m app.scripts.seed_demo对已灌库为无操作部署后引导flyctl ssh console -a aisoc-demo-api -C python -m app.scripts.seed_demo首次部署的双保险每日刷新00:00 UTCaisoc-demo-api上的定时机器aisoc-demo-seed-cron用同一镜像跑同一命令后退出本地恢复docker-compose -f infra/compose/docker-compose.demo.yml栈内执行同一模块灌入器不是第五个 Fly 应用而是随 api 镜像分发python -m app.scripts.seed_demo这样避免维护第五个 Dockerfile、也避免为跑 30 秒脚本付一个应用的常驻成本。部署脚本用flyctl machine run --schedule daily --name aisoc-demo-seed-cron -- python -m app.scripts.seed_demo创建定时机器重复执行时因名称冲突而非零退出被|| log (daily seed cron already configured)安静吞掉。只读演示面写保护、横幅与前端一致性ADR 要求 demo 保留真实产品可点击的体验同时不能让访客改坏共享数据集。这由两层实现后端DemoModeMiddlewareservices/api/app/middleware/demo_mode.py。文档字符串明确了它的定位——不是auth/RBAC 的替代品而是叠加在 demo 租户只读 RBAC 角色之上的纵深防御。行为分三支安全方法GET/HEAD/OPTIONS或允许前缀/health、/metrics、/api/docs、/api/v1/auth/、/api/v1/waitlist/等直接放行并盖章命中 demo 写白名单则放行。白名单是三条正则第 56–64 行_DEMO_WRITE_ALLOWLIST: tuple[re.Pattern[str], ...] ( re.compile(r^/api/v1/cases/INC(?:-RT)?-\d{3}/investigate$), re.compile(r^/api/v1/investigations/[^/]/cancel$), re.compile(r^/api/v1/alerts/[^/]/ack$), )其余写请求返回 403载荷包含error: demo_mode_read_only、说明文案、self_host_url、blocked_path、blocked_method。每个响应包括被拦截的 403都会被盖上三个头X-AiSOC-Demo: true、X-AiSOC-Demo-Tenant、X-AiSOC-Demo-Banner。注释里还记录了一个真实的 QA 回归/api/v1/waitlist/曾被 demo 模式挡住导致公网转化漏斗对每位访客返回 4032026-07-19因为等待名单与 demo SOC 数据集是不同表写入不会污染共享数据。中间件的挂载点在app.main.create_application中、CORS/GZip 之后这样头部也能落在被缓存的错误响应上。对应测试是 services/api/tests/test_demo_mode.py它用一个 stub Starlette 应用分别验证关闭时中间件透明且不带头部开启时 GET 通过、白名单写通过、任意写返回 403 与demo_mode_read_only。前端runtime 与 build 的优先级。apps/web/src/lib/demoMode.ts 解决了一个容易被忽视的不一致API 用运行时的AISOC_DEMO_MODE决定是否灌数而控制台曾只读NEXT_PUBLIC_DEMO_MODE——后者被 Next 在构建时内联进 bundle于是拉取镜像运行时控制台的答案被冻结在构建时刻可能与 API 的判断相反且外部无从查证。现在的规则是测试覆盖优先服务端读取运行时AISOC_DEMO_MODE命中即返回source: runtime优先级高于编译值否则读构建期NEXT_PUBLIC_DEMO_MODE返回source: build都没有则enabled: false, source: default。浏览器侧只能拿到编译值AISOC_DEMO_MODE无NEXT_PUBLIC_前缀不会被内联因此那是首屏值由DemoBanner用GET /api/runtime-configapps/web/src/app/api/runtime-config/route.ts对账——接口的值不可能过期。横幅文案与 deeplink 同样集中在demoBannerMessage()/demoDeeplink()两个函数里避免多处硬编码漂移。双通道兜底实时 CTA 与录屏并列ADR 第 4 条是两个展示面并存这也是它反对只保留录屏的核心论据。仓库中最接近该意图的实现是 onboarding 首屏组件 apps/web/src/components/onboarding/StartHero.tsx三个主 CTA 之下渲染一个次级卡片DemoScreencast链接到/demo/demo.mp4缩略图用/demo/demo-poster.png真实帧避免手绘 SVG 与内容漂移。该组件的注释记录了一次值得引以为戒的修复这张卡片曾经链接/demo.mp4——一个文本占位符标签写着Coming v8.0等于一个 404 披着承诺并且在三个大版本里没人发现。现在它指向实际存在的录制文案描述的是该录制的真实内容而不是仍未录制的四用例产品导览后者 brief 在apps/web/public/.demo-mp4-placeholder。录屏资产本身在 apps/web/public/demo/README.md 中有完整披露这对事实准确极其重要demo.mp42 分 57 秒1280×720H.264无音轨约 1.6 MBhero.gif17 秒预览循环从demo.mp4截取demo-poster.png1280×720 静帧。也就是说ADR 所说的90 秒录屏与仓库中的 2 分 57 秒部署走查并不是同一个东西StartHero注释也明确写着四用例产品导览仍未录制。此外 README 诚实区分了录制中的真实与编排部分栈、镜像从ghcr.io拉取而非本地构建、威胁情报源、告警与 token 计数都是真实的demo 模式关闭、未灌任何数据被推送的那条事件是按代表性构造的其下游全都是产品自身的工作。终端等待被压缩并由屏上角标全程标注浏览器段落为真实速度。两轮 triage 均回落到确定性路径控制台标为kafka:auto_triage:deterministic录制版本为 v11.0.0早于apps/web/public/screenshots/在 v20.1.0 的重拍。这种按原样保留、不重剪以美化产品的处理方式本身就是 ADR 想传达的态度演示的可信度来自可核对的证据而不是流畅的观感。复用托管模式一份 YAML 如何变成一整套 Fly 应用ADR 第 1、2 条要求 demo 租户走托管模式管线。管线形状记录在 docs/managed-mode.md实现位于 infra/fly/managed/。核心是清单即事实新增租户的唯一产物是在infra/fly/managed/tenants/{slug}.yaml放一个文件。清单字段模板见 infra/fly/managed/tenants/_example.yamlslug: example # 必填[a-z0-9-]{2,32}驱动 Fly 应用名 display_name: Example Inc # 必填面向运维的名称 plan: standard # 必填starter | standard | enterprise region: iad # 主 Fly 区域 base_domain: aisoc.example.com # 必填该租户的公网主机名根 contact_email: opsexample.com # 必填Fly 用于证书续期通知 # 可选旋钮括号为默认值 api_vm_size: shared-cpu-1x # (shared-cpu-1x) agents_vm_size: shared-cpu-2x # (shared-cpu-2x) postgres_plan: development # (development)生产用 ha realtime_min_machines: 1 # (1WS 需要热机)以下划线开头的文件会被工作流忽略因此_example.yaml永远不会误开通真实租户。应用名遵循aisoc-{slug}-{component}组件Fly 应用主机名DNS 生效后APIaisoc-{slug}-apiapi.{base_domain}Webaisoc-{slug}-web{base_domain}Realtimeaisoc-{slug}-realtimews.{base_domain}Agentsaisoc-{slug}-agents仅内部 6PNPostgresaisoc-{slug}-postgres仅内部 6PNRedisaisoc-{slug}-redis仅内部 6PNinfra/fly/managed/provision.sh 的头部注释把八个幂等步骤写得很清楚渲染 manifest 为各组件fly.toml→apps create→postgres create→ 附加 Postgres 注入DATABASE_URL→ 创建 Upstash Redis 并把 URL 写入各应用的REDIS_URL→仅在首次运行时分配 Fernet 密钥AISOC_CREDENTIAL_KEY→ 依序部署 api/agents/realtime/web → 添加主机名并申请证书。脚本要求FLY_API_TOKEN、FLY_ORG默认aisoc-managed并依赖flyctl、yq、envsubst、python3。第 6 步的注释值得单列复用既有 Fernet 密钥是关键因为轮换会让所有已存储的连接器凭据失效。docs/managed-mode.md 补充说明该密钥不会自动轮换轮换需按客户发起请求走运维手册且必须重新加密全部凭据。隔离语义也在此明确每客户一套 Fly 应用集意味着专用 Postgres不靠 RLS 共享集群、专用 Redis、专用网络面agent 只经aisoc-{slug}-api.internal:8000访问 API以及只存在于该栈flyctl secrets中的凭据。文档直言这是刻意强于单共享集群 RLS的隔离契约。另外docs/managed-mode.md说明 CSM 可以开清单 PR但合并需要FLY_API_TOKEN仓库密钥因此只有工程师能合并——合并即是显式的付费提交闸门。若需回滚交易后续 PR 删除该清单文件并将仓库变量AISOC_ALLOW_DEPROVISION设为1即可整体拆除。运维验证不要用部署工具的退出码证明 demo 活着infra/fly/README.md 里有一段话直指本次决策最痛的教训Aflyctl deploythat returns zero is not a demo that works — the machine can boot, fail its first request, and sit there.这正是 README 记载公开演示曾经在绿灯运行背后停摆数周的原因也是被删除的两个工作流唯一比 shell 脚本多做的事问应用而不是问部署工具。对应的冒烟检查是# API 存活 curl -sf https://aisoc-demo-api.fly.dev/health # demo 头部可见 curl -sI https://aisoc-demo-api.fly.dev/api/v1/cases | grep -i x-aisoc # 写请求被拦截 curl -si -X POST https://aisoc-demo-api.fly.dev/api/v1/cases | head -3 # 期望HTTP/2 403 … # 公网域名DNS 生效后 curl -sf https://api.tryaisoc.com/health # 访客路径 open https://tryaisoc.com/cases/INC-RT-001?tabledger常见故障的定位顺序也被整理成表flyctl deploy卡在 builder →flyctl builders destroy首次请求 503 → 冷启动检查min_machines_running1页面显示数据每日重置但写入仍生效 → API 未设AISOC_DEMO_MODEINC-RT-001缺失 → 重跑灌入器幂等每日 cron 未触发 →flyctl machine list -a aisoc-demo-api查aisoc-demo-seed-cronWS 30 秒断开 → 检查 realtime 的auto_stop_machines off证书 pending →flyctl certs show hostname --app app。对于整栈已被回收的当前状态README 要求四项条件按序成立账单结清唯一的非工程任务且阻塞后续三项→ 用fly-demo-deploy.sh --provision重建应用与 Postgres/Redis 挂载 → 重新指向 DNS 并重签证书旧的*.fly.devCNAME 目标已不解析→ 用冒烟检查确认 HTTP 200 才算部署完成。第一项无法用仓库内任何改动绕过因为所有flyctl调用都会先返回账号存在逾期账单。成本与取舍ADR 估算与仓库成本包络ADR 给出的运营成本是最小 VM 规格下一个 demo 租户的 Fly Postgres Redis 约$25/月并说明 reseed 任务免费该组织 OSS 工作流的 Linux 分钟不限、增量工程时间约1 天写 manifest、seed 脚本、reseed 工作流因为托管模式管线已存在。仓库的成本包络更细且与 ADR 的估算不完全一致资源demo 月成本估算3×shared-cpu-1xapi、web、realtime~$61×shared-cpu-2xagents~$51× 定时灌数机器约 1 分钟/天$0.10Fly Postgresdev3GB~$2Upstash Redis$0出站带宽约 50GB~$1合计~$14/月托管租户包络为starter/standard ≈$14/月enterprise含 HA Postgres≈$42/月。差异来源可推断为 VM 规格与 Redis 计费档位的口径不同ADR 未展开因此引用数字时应注明出自哪份文档。demo README 另设定$30/月的可持续性目标并说明若流量超过 50GB/月会把灌数快照缓存到对象存储。备选方案与未决问题ADR 记录了四个被否决的方案理由都属于结构性不可修值得完整继承只保留录屏、移除实时 CTA——否决安全产品可点击的真实产品是最强首触去掉等于放弃头号差异化。保留 Cloudflare Tunnel 并提升可用性——否决失败模式是结构性的单笔记本、单网络隧道配置再怎么打磨也修不了维护者在睡觉。它是 v0 的权宜之计已完成使命。把 demo 部署到 Render / Vercel——否决托管模式已在 Fly 上跨两个平台部署只会让运维面翻倍而无收益。在 Fly 上开 demo 租户但跳过每日重灌让数据累积——否决足够多的潜客交互最终会把 dashboard 推到录屏从未展示的状态确定性重灌是保持首触面可预测的低成本手段。两个未决问题及 v1 默认值身份demo 租户应路由到合成的analysttryaisoc.comSSO 身份还是接受任意 GitHub 登录只读v1 默认后者并在横幅中暴露该限制。仓库中可见的对应实现是NEXT_PUBLIC_DEMO_AUTOLOGIN_EMAIL/NEXT_PUBLIC_DEMO_AUTOLOGIN_PASSWORD与seed_demo.py和dev_auth.py必须保持同步以及apps/web/src/components/demo/DemoAutoLogin.tsx。重灌节奏默认每日若观察到潜客在演示中途丢数据可能降到每周并增加重置我的会话按钮在头 30 天遥测后复盘。ADR 还明确把引导式 demo 导览浮层类似 Stripe 的产品走查划出范围确定性场景 录屏已足够覆盖首触面。结论这份 ADR 的正确用法ADR-0004 的价值不在于它描述了一套正在运行的系统而在于它把演示可用性从一个运维偶然性变成了一个有 SLO、有兜底、有幂等重灌、有明确否决理由的工程决策。阅读与引用它时建议遵循三条纪律决策照单全收路径逐条核对五条决策约定与四个否决理由可以放心引用infra/fly/managed/tenants/demo.yaml、.github/workflows/demo-reseed.yml、services/api/app/demo/seed.py、docs/runbooks/demo-tenant-down.md四项不在工作树中替代实现是services/api/app/scripts/seed_demo.pydemo_seed.pymake demo。区分计划与已交付ADR 自己的:::caution就是最好的提醒infra/fly/与infra/fly/managed/的 README 顶部也各自标注了当前未部署。验证以应用为准/health的 200、X-AiSOC-*头部、写请求的 403、/cases/INC-RT-001?tabledger能打开且账本有事件——这四项才是demo 活着的定义flyctl deploy返回 0 不是。如果要在自己的环境中复现这套演示最短路径是先跑make up make demo建立本地可验证基线再对照infra/fly/fly-demo-deploy.sh与infra/fly/api/fly.toml的注释理解每个 Fly 专有参数为何这样设置最后才考虑托管模式清单化。这样即使 Fly 侧暂时不可用录屏、本地 demo 与合成数据集仍然构成一条完整、可核实的产品体验链。赞分享人工智能AI Agent网络安全后端前端【免费下载链接】AiSOCOpen-source AI Security Operations Center: alert fusion, LLM-agent triage, MITRE ATTCK investigation, and a replayable decision ledger for every agent step. Self-hostable, runs with no API keys, MIT licensed. Ships an MCP server for Claude, Cursor and Continue.项目地址https://gitcode.com/GitHub_Trending/ai/AiSOC点击查看免费下载相关推荐用 portfolio 项目搭建 Bento Grid 作品集页面的完整教程用 portfolio 项目搭建 Bento Grid 作品集页面的完整教程 做作品集时你往往有太多内容想塞进一页协作理念、技术栈、时区偏好、进行中的项目、AiSOC 托管实例tryaisoc.com实战指南入驻流程、租户供给、隔离边界与成本口径AiSOC 托管实例tryaisoc.com实战指南入驻流程、租户供给、隔离边界与成本口径 AiSOC 以开源自托管为主要部署形态同时提供一条 trya人工智能AI Agent网络安全后端前端EmDash 缓存演示站开发指南解读 infra/cache-demo 的 AGENTS.md 与 Astro Cloudflare CMS 实战EmDash 缓存演示站开发指南解读 infra/cache demo 的 AGENTS.md 与 Astro Cloudflare CMS 实战 本文以CMS后端前端插件系统认证鉴权上一篇HedgeDoc 用户档案与认证体系设计解析Identities、Sync Source 与用户名冲突处理下一篇Atria-Dawn-Preview-FP8深度搜索实战如何高效回答DeepSearchQA式复杂问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →