实战指南:基于 Twilio 的自托管呼叫转接与升级全流程)
OneUptime 来电策略Incoming Call Policy实战指南基于 Twilio 的自托管呼叫转接与升级全流程【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime导读本指南围绕 OneUptime 的Incoming Call Policy来电策略功能展开讲解如何为自托管的 OneUptime 实例接入你自己的 Twilio 账号让外部来电者拨打一个专属电话号码后通过配置好的升级规则Eskalationsregeln被路由到当前值班的工程师。读完本文你将掌握从 Twilio 账号准备、呼叫/SMS 配置、来电策略创建、电话号码绑定、升级规则与语音播报配置到通话日志查看与故障排查的完整实战能力并能从源码层面理解 OneUptime 的来电路由与升级引擎实现原理。功能概述来电策略如何工作Incoming Call Policy 允许外部来电者通过拨打一个专用电话号码联系到你的值班工程师。当有人来电时OneUptime 会按照你配置的升级规则持续转发电话直到有工程师应答。整个功能的工作流程为在 Twilio 电话号码上接收来电播放可自定义的问候语音Begrüßungsnachricht通过升级规则转发电话目标可以是值班时间表、团队或用户将来电者与第一位可用的值班工程师接通若无人应答则升级到下一条规则继续呼叫。由于你自托管 OneUptime需要配置自己的 Twilio 账号这样你就能完全掌控电话号码与计费。从源码结构看该功能由多张数据表与一个专门的 API 模块协作完成核心文件包括来电策略数据模型IncomingCallPolicy.ts策略主体含问候语、重复策略等字段升级规则数据模型IncomingCallPolicyEscalationRule.tsorder、升级等待时间、目标时间表/用户电话号码数据模型IncomingCallPolicyPhoneNumber.ts绑定到策略的号码作为权威路由依据来电处理 APIIncomingCall.ts接收 Twilio Webhook、生成 TwiML、处理呼叫状态回调通话日志模型IncomingCallLog.ts 与 IncomingCallLogItem.ts呼叫状态枚举IncomingCallStatus.ts前置条件一个 Twilio 账号前往 Twilio 官网注册并完成验证流程你的Twilio Account SID与Auth Token在 Twilio 控制台仪表盘中获取能够访问你的自托管 OneUptime 实例需要确保实例可从互联网被 Twilio 访问到。第一步创建 Twilio 账号前往 Twilio 官网注册账号完成账号验证流程在 Twilio 控制台仪表盘中记录下Account SID和Auth Token。Account SID 通常以AC开头。第二步在 OneUptime 中配置呼叫/SMS 配置登录 OneUptime Dashboard进入项目设置Projekteinstellungen通知Benachrichtigungen通知设置Benachrichtigungseinstellungen点击创建自定义呼叫/SMS 配置Benutzerdefinierte Anruf-/SMS-Konfiguration erstellen填写以下字段字段说明Name便于识别的名称例如 Production Twilio ConfigBeschreibung描述可选的补充说明Twilio Account SID你的 Twilio Account SID以AC开头Twilio Auth Token你的 Twilio Auth TokenTwilio-PrimärrufnummerTwilio 主叫号码来自你 Twilio 账号中、用于外呼的电话号码点击保存Speichern。从源码来看这份配置在数据模型层面对应项目级的ProjectCallSMSConfig来电策略通过projectCallSMSConfigId外键关联到具体配置。IncomingCallPolicy.ts 中明确注释若策略设置了项目级 Twilio 配置则优先使用项目配置而非全局配置且不适用计费。第三步创建来电策略进入值班服务Bereitschaftsdienst来电策略Richtlinien für eingehende Anrufe点击创建来电策略Eingehende Anrufrichtlinie erstellen填写字段Name便于识别的名称例如 Support-HotlineBeschreibung描述可选说明点击保存。数据模型层面策略实体 IncomingCallPolicy.ts 通过CrudApiEndpoint(new Route(/incoming-call-policy))暴露 CRUD API并默认启用isEnabled字段默认值为true这意味着新建的策略默认处于启用状态无需额外开启。第四步将 Twilio 配置关联到策略打开刚创建的来电策略在电话号码路由Telefonnummern-Routing卡片中找到Step 2: Link Twilio Configuration点击选择 Twilio 配置Twilio-Konfiguration auswählen选择第二步创建的配置保存选择。这一步决定了策略在收到来电时使用哪一份 Twilio 凭证来验证 Webhook 签名、生成 TwiML 与发起外呼。第五步配置电话号码配置电话号码有两种方式选项 A使用已有的 Twilio 电话号码在Phone Number卡片中点击使用已有号码Vorhandene Nummer verwendenOneUptime 会从你的 Twilio 账号拉取全部电话号码选择你要使用的号码点击使用此号码Diese verwenden将其分配给策略。注意如果该号码已经配置了 Webhook它会被自动更新为指向 OneUptime。选项 B购买新的电话号码在Phone Number卡片中点击购买新号码Neue Nummer kaufen从下拉列表中选择一个国家/地区Land可选输入区号Vorwahl例如旧金山为 415可选输入号码需包含的数字例如 555点击搜索Suchen查找可用号码从结果中选择一个电话号码点击购买Kaufen。购买成功后号码会从你的 Twilio 账号扣费购买并且Webhook 会被自动配置好——无需任何手动设置。从源码结构看号码与策略的绑定关系以子表行IncomingCallPolicyPhoneNumber为权威数据源IncomingCallPolicyPhoneNumber.ts 对phoneNumber以及(projectCallSMSConfigId, callProviderPhoneNumberId)组合都建立了唯一索引确保同一号码不会被多个策略重复绑定。收到来电时IncomingCall.ts 会先按被叫号码在子表中精确查找策略仅在滚动升级的兼容期才回退到策略上的标量routingPhoneNumber字段。第六步配置升级规则升级规则决定了电话的转发方式打开你的来电策略进入升级规则Eskalationsregeln标签页点击添加升级规则Eskalationsregel hinzufügen配置规则Reihenfolge顺序优先级顺序数字越小越先尝试Eskalieren nach (Sekunden)升级等待秒数在升级到下一条规则前等待的时间Bereitschaftszeitplan值班时间表选择一个时间表路由给当前正在值班的人Teams团队选择特定团队Benutzer用户选择特定用户根据需要继续添加更多升级规则。升级规则示例一个典型的升级链可以这样设计OrderEscalate After目标130 秒一级值班时间表Primary On-Call230 秒二级值班时间表Secondary On-Call330 秒工程团队负责人Engineering Lead即先呼叫一级值班 30 秒无人应答后呼叫二级值班 30 秒再无人应答则呼叫工程负责人若全部失败则播放无人应答提示语音。源码中的升级规则字段约束从 IncomingCallPolicyEscalationRule.ts 可以看出order数值型作为执行顺序1、2、3…用于排序与定位下一条规则escalateAfterSeconds必填且默认值为30秒即未显式指定时每条规则默认等待 30 秒值班时间表与用户互斥代码注释明确 Either onCallDutyPolicyScheduleId OR userId must be set, never bothL403一条规则只能二选一指向值班时间表或具体用户规则实体通过CrudApiEndpoint(new Route(/incoming-call-policy-escalation-rule))暴露管理 API。第七步配置语音播报可选自定义来电者听到的语音内容打开你的来电策略进入设置Einstellungen配置以下项Begrüßungsnachricht问候语来电被接听时播放Keine-Antwort-Nachricht无人应答提示所有升级规则都失败后播放Niemand-verfügbar-Nachricht无人可用提示当前没有值班人员时播放。这些消息使用文本转语音TTS播放数据模型中的默认值如下见 IncomingCallPolicy.ts设置项数据库字段默认值Greeting MessagegreetingMessagePlease wait while we connect you to the on-call engineer.No Answer MessagenoAnswerMessageNo one is available. Please try again later.No One Available MessagenoOneAvailableMessageWe are sorry, but no on-call engineer is currently available. Please try again later or contact support.附加策略设置重复策略除语音消息外策略还支持无人应答时重复策略的选项设置项数据库字段默认值说明Repeat Policy If No One AnswersrepeatPolicyIfNoOneAnswersfalse全部规则失败后是否从第一条规则重新开始Repeat Policy TimesrepeatPolicyIfNoOneAnswersTimes1最大重复尝试次数在 IncomingCall.ts 中当所有规则都无可呼用户时若策略允许重复且repeatCount尚未达到上限OneUptime 会重置currentEscalationRuleOrder并从第一条可用的规则重新呼叫同时递增repeatCount记录到通话日志。查看通话日志查看来电历史记录进入值班服务来电策略点击你的策略进入通话日志Anrufprotokolle标签页。日志展示以下信息来电者电话号码callerPhoneNumber通话状态已接听、无人应答、失败等谁接听了电话answeredByUser通话时长callDurationInSeconds时间戳startedAt/endedAt。源码中的日志模型一次通话两级记录OneUptime 用父子两级模型记录每一次来电见 IncomingCallLog.ts 与 IncomingCallLogItem.tsIncomingCallLog父日志一次来电的整体记录包含被叫路由号码、来电者号码、状态、当前升级规则序号currentEscalationRuleOrder、重复次数repeatCount以及总通话时长与来电/去话成本以美分计。IncomingCallLogItem子日志一次来电中的每一次拨打尝试记录命中的升级规则、被呼叫的用户与号码、单次振铃时长dialDurationInSeconds、是否应答isAnswered以及单次拨打成本。呼叫状态枚举定义在 IncomingCallStatus.ts包含Initiated、Ringing、Connected、Escalated、NoAnswer、Failed、Completed、CallerHungUp、Busy等状态。结合日志模型可以看出OneUptime 会完整记录哪条规则、拨给了谁、等了多久、是否应答、花了多少钱等审计信息。用户电话号码配置工程师如何被呼叫要让用户能接到来电用户必须先拥有经过验证的电话号码用户进入用户设置User Settings通知方式Notification Methods在来电号码Incoming Call Numbers下添加电话号码通过短信验证码验证该号码。只有拥有已验证电话号码的用户才能通过升级规则被呼叫。这条约束在源码中有明确体现在 IncomingCall.ts 的getUserToCall()辅助函数中OneUptime 会查询UserIncomingCallNumberService中isVerified: true的记录若用户没有已验证的来电号码则该规则会被视为当前不可用并跳过。释放电话号码如果不再需要某个电话号码打开你的来电策略在Phone Number卡片中点击释放号码Release Number确认释放。警告被释放的号码将交还给 Twilio之后可能无法再次购买到同一号码。源码视角一次来电的完整调用链理解了 UI 操作之后从 IncomingCall.ts 可以看到一次来电在服务端的完整处理流程POST /voiceWebhookL46-L381Twilio 收到来电后向 OneUptime 发送 webhook。OneUptime 从请求体中取出被叫号码To或Called按号码解析策略Webhook 签名验证读取x-twilio-signature请求头通过provider.validateWebhookSignature()校验请求确实来自 Twilio防止伪造L221-L233策略启用检查若策略被禁用isEnabled false立即记录失败日志并返回挂断 TwiMLSorry, this service is currently disabled.寻找首个可呼规则getNextRuleWithAvailableUser()会按order升序逐条查找跳过值班时间表当前无人或用户无已验证号码的规则而不是让来电者在第一条规则上死等L773-L822生成问候 拨打 TwiMLgenerateGreetingAndDialTwiml()调用 provider 的generateEscalationResponse()生成播放问候语 拨打工程师 设置超时 回调状态 URL的 TwiMLL824-L840POST /dial-status/:callLogId/:callLogItemId回调L384-L693工程师未接时Twilio 将no-answer状态回调到 OneUptimeOneUptime 更新子日志状态然后查找下一条可呼规则若已接通则记录Completed并挂断若所有规则耗尽则按重复策略决定是否重来否则播放无人应答消息并挂断。整个过程中OneUptime 会同步维护IncomingCallLog/IncomingCallLogItem两级日志确保每一次拨打尝试都有据可查。你可以在 IncomingCallAPI.test.ts 与 IncomingCallPolicies.spec.ts 中看到对应的测试用例进一步印证上述流程。故障排查来电接收不到检查 Twilio 配置是否正确关联到策略确保你的 OneUptime 实例可从互联网访问Twilio 的 webhook 需要能到达POST /notification/incoming-call/voice端点核对 Twilio Account SID 与 Auth Token 是否正确检查 Twilio 控制台的错误日志。来电无法接通工程师检查用户是否在通知设置中拥有已验证的电话号码检查升级规则是否正确配置确认规则确实指向了值班时间表、团队或用户确保当前时间段的值班时间表已分配了用户确认策略处于启用状态。语音质量异常确保服务器网络连接稳定查看 Twilio 状态页面是否有进行中的故障确认电话号码格式正确使用 E.164 格式例如15551234567。安全注意事项妥善保管 Twilio Auth Token切勿公开暴露为 OneUptime 实例启用 HTTPSOneUptime 会校验 webhook 签名确保请求确实来自 Twilio对应源码中的validateWebhookSignature调用可以考虑限制哪些电话号码可以呼叫你的来电策略例如结合策略的标签Labels与访问控制权限进行管理。从数据模型看策略与升级规则的 CRUD 均受严格的表级与列级权限控制见 IncomingCallPolicy.ts 与 IncomingCallPolicyEscalationRule.ts 的TableAccessControl仅项目所有者、项目管理员、成员以及具备相应 Settings/策略权限的用户可以创建、修改或删除通读相关代码可以进一步了解权限边界。延伸阅读英文版同主题文档incoming-call-policy.md德文版原文档incoming-call-policy.md另有 10 余种语言版本位于 App/FeatureSet/Docs/Content 对应语言目录下前端电话号码展示工具IncomingCallPolicyPhoneNumberUtil.ts通话日志服务IncomingCallLogService.ts支持如果遇到无法解决的问题检查 Twilio 控制台的错误日志查看 OneUptime 服务器日志通过邮件联系官方支持hellooneuptime.com。【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考