ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Anarlog Enterprise Control Plane 部署实战:企业级会议捕获 API 的自托管与配置指南

Anarlog Enterprise Control Plane 部署实战:企业级会议捕获 API 的自托管与配置指南 Anarlog Enterprise Control Plane 部署实战企业级会议捕获 API 的自托管与配置指南【免费下载链接】anarlogOpen source Granola AI Alternative项目地址: https://gitcode.com/GitHub_Trending/hy/anarlog导读Anarlog Enterprise control plane 是 anarlog 开源仓库中以商业许可提供的企业级服务它将 workspace 维度的会议捕获 API 与自动 PostgreSQL 迁移、fail-closed 启动配置、优雅停机打包在一起捕获事件被持久化追加到数据库每个 revision 被投影为共享的 session-ingest 契约再投递给已授权的客户端。本文以 enterprise/control-plane/README.md 为主体结合仓库内的 Compose 编排、Dockerfile 与 Rust 源码实现完整讲解评估部署、Infisical 密钥注入、全部环境变量、健康检查、REST API 路由与捕获作业租约协议并给出可在仓库内直接验证的命令与配置。服务定位企业捕获 API 的控制面control plane 是一个独立的二进制服务入口位于 enterprise/control-plane/src/main.rs其职责可以概括为四件事持久化捕获事件以 provider-neutral供应商无关的形式追加 capture events每个被接受的事件会原子性地推进 PostgreSQL checkpoint投影会话契约每个 revision 通过 enterprise/control-plane/src/projector.rs 投影为anlg-session-ingest定义的共享会话契约SessionIngestEnvelope投递给授权客户端客户端按 consumer 分页拉取投递项并显式 ack自动运维启动时自动应用 SQL 迁移、连接池管理、优雅停机。从依赖来看它复用anlg-meeting-capture捕获线缆契约与anlg-session-ingest会话摄入契约两个共享 crate并以anarlog-enterprise-zoom-rtms-worker作为 Zoom RTMS 捕获 worker见 enterprise/control-plane/Cargo.toml。控制面通过 trait 抽象存储与鉴权ControlPlaneStore、WorkspaceAuthenticator核心逻辑位于 enterprise/control-plane/src/api.rs、store.rs、auth.rs、capture.rs、schedule.rs、zoom.rs。评估部署Docker Compose v2 一键启动前置条件与 .env 准备评估部署需要 Docker 与 Compose v2。从仓库根目录执行cp enterprise/control-plane/.env.sample enterprise/control-plane/.enventerprise/control-plane/.env.sample 提供以下模板变量POSTGRES_DBanarlog POSTGRES_USERanarlog POSTGRES_PASSWORDreplace-with-random-hex ANARLOG_ENTERPRISE_DATABASE_URLpostgres://anarlog:replace-with-random-hexpostgres:5432/anarlog ANARLOG_ENTERPRISE_DATABASE_MAX_CONNECTIONS10 ANARLOG_ENTERPRISE_WORKSPACE_TOKENS{evaluation-workspace:replace-with-at-least-32-random-characters} ANARLOG_ENTERPRISE_PORT8080 RUST_LOGinfo,tower_httpinfo按 README 要求替换两处数据库密码为相同的随机十六进制值十六进制值可避免POSTGRES_PASSWORD与ANARLOG_ENTERPRISE_DATABASE_URL中 URL 编码差异导致的不一致并将 workspace bearer token 替换为至少 32 个随机字符。启动、验证与停止docker compose \ --file enterprise/control-plane/compose.yaml \ --env-file enterprise/control-plane/.env \ up --build --wait --detachenterprise/control-plane/compose.yaml 中值得注意的编排细节postgres使用固定 digest 的postgres:17-alpine自带pg_isready健康检查5s 间隔、12 次重试control-plane以read_only: true挂载只读根文件系统/tmp使用 tmpfsnoexec,nosuid,size16m两者都带no-new-privileges: true端口默认只绑定127.0.0.1:${ANARLOG_ENTERPRISE_PORT:-8080}:8080不对外发布 PostgreSQL数据持久化仅通过postgres-datavolumedocker compose down不会删除数据库数据。启动后验证 API 与数据库就绪curl --fail http://127.0.0.1:8080/health/ready curl --fail \ --header Authorization: Bearer YOUR_WORKSPACE_TOKEN \ http://127.0.0.1:8080/v1/workspaces/evaluation-workspace/session-envelopes?consumerIdevaluation-deviceafter0停止服务保留数据docker compose \ --file enterprise/control-plane/compose.yaml \ --env-file enterprise/control-plane/.env \ down镜像与运行约束enterprise/control-plane/Dockerfile 揭示了镜像的加固策略构建与运行镜像均使用固定的 Debian/Rust 基础镜像 digestrust:1.94.0-bookworm与debian:bookworm-slim以 UID/GID10001的非 root 用户anarlog运行USER 10001:10001内置HEALTHCHECK10s 间隔curl/health/ready默认ENV ANARLOG_ENTERPRISE_BIND_ADDRESS0.0.0.0:8080与RUST_LOGinfo,tower_httpinfo。README 强调在将 API 暴露到 localhost 之外前应在可信反向代理处终止 TLS。配置总览环境变量与 fail-closed 启动完整变量表变量必填用途ANARLOG_ENTERPRISE_DATABASE_URL是PostgreSQL 连接 URL。数据库不可用或迁移失败时启动失败。ANARLOG_ENTERPRISE_WORKSPACE_TOKENS是JSON 对象将 workspace ID 映射到 bearer token。至少需要 1 个 32–512 字节的唯一 token。ANARLOG_ENTERPRISE_BIND_ADDRESS否监听地址。默认0.0.0.0:8080镜像中设置相同值。ANARLOG_ENTERPRISE_DATABASE_MAX_CONNECTIONS否PostgreSQL 连接池大小1–100。默认10。ANARLOG_ENTERPRISE_ZOOM_CLIENT_ID成组Zoom RTMS 应用 client ID。ANARLOG_ENTERPRISE_ZOOM_CLIENT_SECRET成组Zoom RTMS 应用 client secret。ANARLOG_ENTERPRISE_ZOOM_WEBHOOK_SECRET成组Zoom webhook 密钥用于校验签名请求体。ANARLOG_ENTERPRISE_ZOOM_ACCOUNT_WORKSPACES成组JSON 对象将已签名的 Zoom account ID 映射到已配置的 workspace ID。RUST_LOG否标准 tracing 过滤规则。默认输出请求与服务信息不导出遥测。源码级的校验逻辑这些约束并不是文档空谈而是由 enterprise/control-plane/src/config.rs 的Config::from_values_with_zoom在进程启动时强制执行的数据库 URL 必须以postgres://或postgresql://开头否则报InvalidDatabaseUrlbind_address必须可解析为SocketAddr默认0.0.0.0:8080DATABASE_MAX_CONNECTIONS解析为u32后必须在1..100区间默认10数据库获取连接超时固定 10 秒workspace token 用serde_json解析为 JSON 对象WorkspaceTokens空对象报EmptyWorkspaceTokensworkspace ID 长度 1–128 且只允许 ASCII 字母数字与-_.token 长度必须在 32–512 字节之间否则报InvalidWorkspaceToken四个 Zoom 变量必须整体出现全缺席 →zoomNone部分出现 →IncompleteZoomConfigurationANARLOG_ENTERPRISE_ZOOM_ACCOUNT_WORKSPACES只能引用ANARLOG_ENTERPRISE_WORKSPACE_TOKENS中已存在的 workspace否则报UnknownZoomWorkspace此外还支持可选的离线 license 变量LICENSE与LICENSE_KEY必须成对出现逻辑见 enterprise/control-plane/src/license.rs。对应测试位于 enterprise/control-plane/src/config.rs 的#[cfg(test)]模块覆盖了最小配置、空凭据失败、短 token 拒绝且错误消息不回显 token 本身、Zoom 成组校验等场景——这也是fail-closed启动即失败绝不带病运行的实践证据。健康检查语义GET /health/live进程级存活探针恒返回{status:ok}不触碰数据库GET /health/ready就绪探针执行store.readiness()检查 PostgreSQL失败时返回 503{status:not_ready}。实现见 enterprise/control-plane/src/api.rs镜像的HEALTHCHECK正是基于/health/ready。使用 Infisical 注入密钥该部署接受的所有密钥都来自环境变量因此 Infisical 可以在不生成.env文件的情况下注入。将.env.sample中的变量存入一个 Infisical 环境然后运行infisical run --envprod -- \ docker compose \ --file enterprise/control-plane/compose.yaml \ up --build --wait --detach注意事项README 明确要求机器身份machine identity与项目选项请参考infisical run官方命令文档生产环境 Compose 进程不要使用--watch当凭据轮换时应执行受控重启Infisical 应在进程启动时注入这些值服务本身不会主动获取、持久化或记录供应商凭据Zoom client secret、webhook secret 等在Debug输出中也会被遮蔽见 config.rs 的测试断言。捕获作业与租约协议事件追加的可靠性机制READ ME 中关于 capture job 的描述是理解系统可靠性的关键捕获 worker 通过POST /v1/workspaces/{workspace_id}/capture-jobs/{job_id}创建持久化作业通过/claim认领作业并持续通过/lease续租返回的60 秒 fencing lease每次追加到/events的新事件必须携带该租约身份worker_id、lease_id、epoch租约过期后可用更高 epoch 重新认领从而阻止前一个 worker 继续推进作业已持久化的完全相同事件重放仍然安全事件 ID 与零基序号zero-based sequence是幂等键每个被接受的事件原子性推进 PostgreSQL checkpoint 并发布一个 delivery revision冲突的 ID、序号、生命周期转换或过期租约都会 fail closed。这些常量在代码中有据可查租约时长CAPTURE_LEASE_DURATION 60sapi.rsclaim 时要求epoch 0api.rs事件请求体契约AppendCaptureEventRequest、CaptureJobLease等类型由anlg-meeting-capture::wire统一导出capture.rs其数据表由 enterprise/control-plane/migrations/0003_capture_job_leases.sql 承载。REST API 路由一览由 api.rs 的router()注册的路由如下方法与路径说明GET /health/live进程存活探针GET /health/readyPostgreSQL 就绪探针POST|GET /v1/workspaces/{workspace_id}/capture-jobs/{job_id}创建捕获作业 / 读取捕获 checkpointPOST /v1/workspaces/{workspace_id}/capture-jobs/{job_id}/events追加捕获事件携带租约身份POST /v1/workspaces/{workspace_id}/capture-jobs/{job_id}/claim认领作业返回 60s 租约POST /v1/workspaces/{workspace_id}/capture-jobs/{job_id}/lease续租GET /v1/workspaces/{workspace_id}/session-envelopes分页拉取会话投递consumerId必填after/limit可选limit 默认 10、上限 100POST /v1/workspaces/{workspace_id}/session-envelopes/{job_id}/ack按 revision contentHash 显式确认投递GET /v1/workspaces/{workspace_id}/sessions/{job_id}读取会话GET|PUT /v1/workspaces/{workspace_id}/capture-policy读写捕获策略PUT /v1/workspaces/{workspace_id}/calendar-events批量 upsert 日历事件单批上限 500生成定时捕获GET|POST /v1/workspaces/{workspace_id}/scheduled-captures列出 / 立即触发到期的定时捕获DELETE /v1/workspaces/{workspace_id}/scheduled-captures/{calendar_event_id}取消定时捕获POST /webhooks/zoom仅在配置 Zoom 后挂载Zoom webhook 入口校验x-zm-request-timestamp与x-zm-signature鉴权与错误语义所有捕获与投递路由都要求Authorization: Bearer tokentoken 被 SHA-256 哈希后与 workspace 映射比对StaticTokenAuthenticator见 auth.rs并且拒绝用某 workspace 的 token 访问其他 workspace返回 403workspace_forbidden。若配置了离线 license还会校验 license 是否授权该 workspaceapi.rs。错误响应统一为{error:{code,message}}结构冲突类错误使用 409如revision_conflict、capture_event_conflict、capture_lease_lost非法事件返回 422invalid_capture_event未授权返回 401 并附带WWW-Authenticate: Bearer。定时捕获调度控制面在启动时还会tokio::spawn一个每 30 秒触发的调度循环lib.rs调用dispatch_due_scheduled_captures(Utc::now())将到期的日历捕获作业批量投递对应 SQL 迁移为 0005_scheduled_captures.sql。定时作业 ID 以cal-前缀标识api.rs。优雅停机与启动流程run()lib.rs先构建状态连接池、自动迁移、可选的 Zoom 恢复与 license再绑定监听地址并通过axum::serve(...).with_graceful_shutdown(...)等待 SIGINTCtrl-C或 SIGTERM收到信号后记录日志并优雅退出lib.rs。Zoom 配置存在时启动阶段还会执行dispatcher.recover_pending()恢复未完成的持久化投递并spawn_recovery()lib.rs。测试与验收路径仓库为控制面提供了可复现的验证手段单元测试Config、auth的鉴权与重复 token 拒绝、API 错误映射等config.rs、auth.rs集成测试enterprise/control-plane/tests/postgres.rs、api.rs、convergence.rs、upgrade.rs冒烟脚本enterprise/control-plane/tests/compose-smoke.sh 可直接用于验证上述docker compose up后的健康检查与投递拉取链路。已知边界README 明确说明静态 token 映射面向评估部署位于WorkspaceAuthenticator接口之后生产级 OIDC、SCIM、离线 license 强制、对象存储与会议浏览器 worker 均不在本服务范围内属后续演进方向。部署时应将镜像与 Compose 中固定 digest 的依赖一并纳入供应链审查并在反向代理层完成 TLS 终结。【免费下载链接】anarlogOpen source Granola AI Alternative项目地址: https://gitcode.com/GitHub_Trending/hy/anarlog创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表