实例健康状态
介绍“设置与健康状态”页面、各项检查的含义、如何消除检查问题,以及如何在命令行运行相同检查。
Warmbly 分别报告配置发现、服务可达性和运行测量。一个没有动静的实例,从外部看可能与健康实例完全一样。面板会明确展示缺失、部分和过期的覆盖,不把没有消息当成健康证明。
设置与健康状态
页面位于 :5174 的管理面板,路径为实例 > 设置与健康状态。发现列出配置问题,服务提供逐服务可达性探测和平台邮件卡片,运行展示只读运行测量。这是运维工具,不是客户控制台,背后每条路由都受平台管理权限控制。选项卡支持直接链接,例如 /health?tab=operations。
配置错误和警告也会显示在管理概览,侧边栏徽章统计这些发现。信息性说明不计入徽章。没有错误或警告时,“发现”显示未报告错误或警告,不表示所有检查都已执行或实例健康。独立的概览监控面板显示运行信号和大于零的消息代理队列测量。
| 严重级别 | 含义 |
|---|---|
error | 当前已有故障或不安全状态,影响发送、登录或密钥访问 |
warning | 今天仍能工作,但存在隐患,例如配置错误、公开秘密值或集中风险 |
info | 无需操作,提前说明以免之后意外 |
列表只显示发现项。通过的检查不返回内容,但跳过或不可用的检查也可能没有发现。健康响应目前报告 execution_coverage: "unreported";空列表不是已确认的全面正常。没有此新增字段的旧响应也按相同方式处理。“发现”显示的接收时间,是浏览器收到响应的时间,不是来源证据时间戳。
每行包含标题、附修复方法的完整消息,以及解释该问题的文档链接。目前所有检查都在实例范围运行,因此没有行限定到单个邮箱、工作节点或营销活动。
下方说明配置检查;运行证据有独立的覆盖范围和限制。
在命令行运行检查
make doctor它运行 warmblyctl status,先打印实例状态,包括账户、平台管理员、注册模式、邮件传输和 APP_URL,再在检查部分列出相同发现。任何错误级别问题都会使命令以非零状态退出。它适合放在部署脚本结尾,也适用于后端健康状况差到管理面板无法加载时。
每条命令都适用于任意运行环境:
docker compose -p warmbly exec backend warmblyctl status # docker compose
docker exec -it warmbly-backend warmblyctl status # plain docker
kubectl exec -it deploy/warmbly-backend -- warmblyctl status
warmblyctl status # bare binarystatus 是九个命令之一。其余命令,包括无人能登录时创建账户和重置密码的命令,见 warmblyctl 参考。
健康检查端点
这些端点回答不同问题。
| 端点 | 身份验证 | 用途 |
|---|---|---|
GET /health | 无 | 存活检查,确认进程是否运行,供负载均衡器或编排器探测 |
GET /admin/instance/health | 平台管理员,view_analytics | 深度诊断,即面板显示的发现列表 |
GET /admin/system/status | 平台管理员,view_analytics | 在 checked_at 时刻执行的特定基础服务探测,不是发送或同步吞吐量 |
GET /admin/instance/monitoring | 平台管理员,view_analytics | 带版本的运行快照,按来源过滤权限,并明确测量覆盖范围 |
不要让负载均衡器探测深度诊断端点
诊断端点会报告配置警告,但警告不是将节点移出服务轮换的理由。存活检查使用 GET /health,诊断交给面板和 make doctor。
面板实例下还有以下相邻端点:
| 端点 | 身份验证 | 返回内容 |
|---|---|---|
GET /admin/instance/config | manage_settings | 所有配置项及其解析值、来源和是否需要重启。敏感键只返回指纹,不返回值 |
GET /admin/instance/limits | view_analytics | 当前构建编译进来的实际发送、预热和速率限额 |
GET /admin/instance/update | view_analytics | 运行构建、最新发布和更新器状态。为侧边栏底部版本标记提供数据,见更新 |
运行监控
运行展示版本 "1" 的快照,来自 GET /admin/instance/monitoring。它覆盖已登记工作节点、工作节点样本接收、已确认发送、营销活动预留、派发、安全暂停、同步状态和合理使用等待、已存储邮箱错误、作业、死信、Webhook、客户通知行、发送结果效果、域检查、预热邮箱加载,以及消息代理队列观察。没有安全重放证明的死信,即使已超过重试日期,仍显示为恢复未验证;到期、等待和未安排计数仅覆盖不发送邮件的营销活动唤醒轮次。消费者没有用于自动重放的任务调度器。不支持的来源仍显示为不可用,包括详细发送等待归因和外部跟踪代理诊断。可选来信发件箱测量在 Schema 不存在时不可用;监控不要求来信迁移,也不需要新的工作节点传输版本。
后端收集总超时为八秒,单来源三秒,最多四个并发收集器。管理员间共享一分钟快照,再按每个响应过滤来源权限。HTTP 响应不可缓存。收集失败时,可保留来源最后一次成功测量最多五分钟,标为过期,并保留原观察和证据时钟;之后变为不可用。来源样本有数量边界,已测/预期范围计数及不完整覆盖会暴露截断。部分样本中的计数可能只是下界,绝不会外推为整个节点集群总量。
未解决邮箱报告是存储的证据,不能证明服务商仍在失败。新的传输报告明确区分 sync、send 和 unknown 操作。其 created_at 仍表示最新失败观察;observation_source 区分有效工作节点时钟和接收时间回退,received_at 单独记录后端接收时间。工作节点时间缺失、无效或位于未来时,回退到接收时间。更旧的重投不能把最新观察时间向后移。升级不会改写历史时钟,也不会根据可空任务 ID 猜测操作类型。
入站同步不能证明发送已恢复。完成的服务商同步轮次,只会自动核对更早、明确属于同步范围的原生传输报告。服务商确认的发送则在现有发送结果事务中,凭已确认任务来源,独立核对更早的原生发送报告。各操作保留自己的单调成功时钟,因此延迟到达的旧原生失败会保持为已解决历史,不会重新打开故障或产生新警告。失败时间戳精度为秒;恢复必须晚一秒以上。凭据和策略错误继续使用现有恢复流程。
传输恢复还要求工作节点提供不可变、仅属于本实例的邮箱代际标识。控制平面在同一数据库快照中读取该标识、邮箱配置和凭据。它是工作节点执行身份的一部分,因此即使恢复时凭据未变,也会等待旧邮箱传输结束并替换,而不是重新贴标签。只有新完成的服务商同步轮次才记录其代际;导入示例、进度、部分或延期轮次、心跳和续接检查点,都不能产生新证明。发送在执行前捕获已加载传输的代际,并保留到真实结果中。任务执行或派发标记本身不能证明恢复后的配置,也不能建立同步恢复。
工作区导入会在事务中,为实际插入或覆盖的邮箱轮换代际并使派生时钟失效,包括实际写入邮箱凭据表的情况。跳过、外部组织、回滚和未受影响的行,保留原代际和时钟。这是恢复实例化边界,不是每次普通设置编辑或令牌刷新的版本。代际比较和恢复写入,会获取与恢复相同的邮箱边界锁,并保留先任务后邮箱的锁顺序。迟到的导入前结果或跨越导入的结果,即使时间戳较新,也不能重建当前恢复。真实发送结果仍正常结算,包括计数和审计;代际不匹配绝不会丢弃结果或改变限制性暂停。运维确认及导入确认历史不授权传输恢复,即使元数据带有代际也是如此。
缺少代际仍表示未证实。旧工作节点通过升级后的消费者仍可发送和同步,但不能推进这些派生恢复时钟。新的类型化工作节点会自动恢复,无需客户确认、重新登记节点或改变共享令牌权限。JSON 和 Kafka/Avro 字段是新增字段;原生注册表回归测试在 FULL_TRANSITIVE 兼容性下检查双向兼容。先升级数据库和所有后端、消费者,再升级工作节点。本地回归结果不能证明生产服务商已恢复。
观察来源未知的旧版及导入报告,不参与原生活跃报告去重和自动恢复。其 ID、时间戳、任务引用和解决记录仍可读取。未类型化的工作节点事件,即使观察时钟有效,操作范围仍为未知。同步或发送本身都不能自动清除含糊的操作证据。新类型化报告无需客户新增操作。传输恢复不能证明收件人已收到、收件箱已同步到最新,也不代表允许重放结果不确定的发送。来信队列仍积压时,同步轮次也可能完成。报告核对不会清除未知发送安全暂停。
应用迁移 288 前,应暂停旧邮箱错误写入者和结果消费者:旧的“账户加代码”冲突目标与新的原生唯一索引不兼容。先发布 Schema 及所有后端/结果消费者,再部署类型化工作节点。旧工作节点仍可通过新消费者使用,但未类型化报告保持未知。不要让旧结果消费者与类型化工作节点同时运行,因为旧消费者仍可能执行账户范围解决。工作区导入只对实际写入的邮箱重置报告操作和观察来源,并使目标派生时钟失效。整实例数据库备份保留原来源和时钟。如果旧唯一性无法表示一组未解决报告,包括同一操作的多个历史报告,降级会拒绝,而不会丢弃证据或虚构恢复。真实驱动拒绝降级后,迁移元数据会保持 dirty,类型化 Schema 保持完整。应验证保留的 Schema 并向前修复,不要删除报告或清除安全暂停来强制降级。
如果任务处理器成功返回,但任务仍待处理且计划时间已到,本地任务派发器还会等待五分钟再访问它。这样新到期工作有机会运行,也不会把无操作结果当成失败。它保留任何更晚的重试下限、原计划时间、发送结果和安全暂停。已完成、变为活跃或重新安排到未来的任务,不会额外等待。重试等待不是服务商恢复证据。
失败尝试保留现有重试策略。混合版本发布期间,旧本地派发器仍可能清除成功但无操作的等待。只有所有运行本地派发器的服务升级后,才应验证派发公平性。
工作节点心跳总量和最多 20 个节点详情,共用一个 PostgreSQL 快照和一个数据库观察时钟,该时钟在读取已登记节点后捕获。因此来源观察可能晚于整体快照开始;其收集尝试时钟仍表示刷新请求开始,不是测量时间。空时间戳、至少五分钟前的时间戳,以及晚于该观察时刻的时间戳,都会保持可见。未来时间的节点详情属于未知时钟证据,不能证明节点停止:HTTP 心跳登记使用数据库时钟,Redis 镜像心跳保留节点时间戳。仅含未来值的汇总也属于未知;只要有过期或空心跳,汇总就保留过期遥测条件。计数和已有警告严重级别不变,不假定任何时钟偏差容差。预期范围统计全部匹配节点,已测范围统计有界详情;即使汇总完整,详情截断仍属于部分覆盖。
解读状态快照
通过单次数据库查询收集的汇总来源,包括同步和工作节点健康样本,会为全部阈值、窗口和来源/指标观察捕获同一数据库参考时间。查询开始时可见的正常完成或接收记录,与该参考时间比较,而不是更早的刷新请求开始时间。真正位于未来的证据仍会警告,不设时钟偏差容差。快照检查时间和缓存到期时间仍以收集开始为基准;数据库观察不确认服务商恢复。
- 快照检查时间和收集尝试时间是收集时钟,不确认投递、同步或恢复。来源观察时间和观察时间是测量时钟;证据起始时间、最新证据、各自时长及窗口互相独立。刷新失败后,界面保留原时钟并将测量标为过期。浏览器成功获取旧数据,不会让数据变新。
fresh、stale和unavailable描述测量可用性。界面也会将超过两分钟或不合理地位于未来的观察标为过期/未知。完整覆盖只针对已测来源,不代表每个客户操作都成功。- 可空计数表示未测量,不是零。成功测得零,表示该指标范围和窗口内没有匹配行。近期发送为零表示没有匹配的近期证据,不表示吞吐健康。任务完成、心跳、低内存占用或同步跳动,都不能证明投递或恢复。
- 近期或持续失败证据、恢复未验证、安全暂停、积压和过期遥测,是不同状态。旧失败之后没有确认发送证据,表示恢复未验证,不证明当前正发生新失败。分配缺失等未知警告仍为未知,不会虚构服务商故障。
- 计划等待、重试等待、预算等待、每日限额等待和在途工作属于信息性状态。下次符合条件时间描述资格,不承诺成功。安全暂停是一项限制,不是故障;监控不会清除它。
- 历史回填运行状态过期警告,只适用于活跃且没有有效合理使用暂停的邮箱。未激活或已撤销邮箱仍出现在回填历史计数中,但不会把停止邮箱视为当前同步失败。重新激活不会重置历史或声称恢复;未变化的旧运行状态会再次警告。
- 未知暂停数量下降,本身不能证明发送成功。明确结果或通过随机令牌保护的尚未开始命令退役,可以解决未知;但若仍有其他未知或未解决结果冲突,取消、延期和授权修复都会继续暂停邮箱。应比较任务范围证据,而不只比较前后总数。
- 矛盾的明确结果保留最初已应用结果和计数,记录不含载荷的冲突结果,并暂停发送,不重放。自动冲突证据与运维/服务商确认分开。重复结果不能撤销针对该冲突的新本地确认。修复和结果处理共享相同任务与邮箱锁,避免并发冲突在重新计算暂停时消失。
- 工作区归档保留恢复审计历史,但重置其本地来源。导入或较早的审计历史若没有明确本地来源,不能执行运维确认结果,也不能解除冲突暂停。独立权威工作节点结果仍会自动核对未知发送;只有真正未解决的证据才需要新的本地管理员/服务商确认。两个矛盾的明确结果,不能靠选择最后到达者解决。升级不会推断历史确认来自本地。只要仍有审计行,恢复审计回滚就会拒绝;应向前修复,不要删除证据强制降级。
- 正常客户发送、邮箱连接和身份验证流程不会新增确认步骤。管理员检查服务商证据后,通过现有受作用域限制的恢复 API 处理例外的不确定结果;客户无需读日志或提供技术任务标识符。状态开关、凭据修复和重复结果,都不能绕过另一项未解决发送。在混合版本后端集群启用审计扩展前,参见发送安全升级顺序。
- 大于零的消息代理延迟、待处理、等待确认和重投计数,会在概览显著显示,即使后端有意将它们标为
unknown、严重级别为info。Kafka 已提交延迟不包括未提交处理;JetStream 待处理和等待确认是不同测量,二者都不是服务商发送吞吐量。重投不是生命周期重试率;组成员缺失可能发生在重新平衡期间。 - 计数、受影响邮箱、受影响组织和组织未知的行,是不同数量。指标与逐工作节点范围可能重叠。“需要关注”总量统计已记录信号,不是失败发送或独立客户数;不要把各指标计数相加。
- 查询错误、权限拒绝、能力不支持、依赖或 Schema 缺失,以及超时,都不会产生全面正常结论。没有来源或指标表示覆盖未知。监控面板不显示原始服务商/连接错误、凭据、载荷或邮箱地址。
概览和“运行”选项卡共用同一个前端查询缓存,按管理员身份和权限掩码限定。在可见选项卡挂载期间,监控最多每分钟轮询一次,不因重新聚焦而获取,也不自动重试,并提供遵守 refresh_after 的刷新控件。“服务”选项卡挂载时,每 15 秒探测一次;通过的探测只证明当时可达。失败或过期探测始终明确显示,包括缓存探测此前通过还是失败,但隐藏原始组件连接错误。现有平台邮件卡片只向具有 manage_settings 的管理员显示,其检查和测试发送端点也要求该权限。
这是只用于观察的工具。它不会订阅消息代理、创建流或组、重连邮箱、移动分配或偏移量、回收任务、重放结果、清除暂停、通知客户或部署改动。当现有管理页面覆盖测量人群时,调查链接会打开对应页面,其中操作仍遵循原有确认和权限。汇总派发和发送测量没有直接链接,因为现有仅营销活动详情页不包含部分计入的待处理或预热任务。通过已授权后端诊断调查时,应同时保留计数和证据时间供参考。
监控权限
每次监控请求都要求经过 MFA 验证的平台管理员会话和 view_analytics,不能使用工作区 API 密钥。各来源部分还要求下表附加权限位。被拒绝来源只保留带 permission_denied 的不可用占位,不含计数、范围测量或私有指标。前端也会过滤部分,并检查每个调查链接目标的权限。旧身份响应没有已知管理权限掩码时,监控保守拒绝。
| 来源 ID | 附加平台管理权限位 |
|---|---|
send_safety、sync、mailbox_errors、arrivals、domain_auth | view_users |
sends、campaign_reservations、dispatch、dead_letters、result_effects、warmup_loading、send_wait_attribution | view_campaigns |
workers、worker_samples、worker_command_broker | view_workers |
jobs、backend_event_broker、tracking_broker | view_analytics,已是基础要求 |
webhooks | view_organizations |
notifications | manage_settings |
例如,管理员具有 view_organizations 时可以看到 Webhook 测量,但没有 view_campaigns 就不能链接到“发送”。工作节点详情、同步/邮箱、组织详情、作业和配置链接,也都要求对应页面原生权限位。不接受任意或外部调查 URL。
安全与机密信息
secret_published_default
AUTH_SECRET、KMS_LOCAL_MASTER_KEY、CREDENTIALS_ENCRYPTION_KEY、INTERNAL_API_TOKEN 或 SECRET_KEY_BASE 中至少一个仍使用 docker-compose.yml 随附的值。这些值已公开在仓库中,因此任何人都可以伪造会话令牌,或解开所有组织密钥。
生成真实值并重启,参见秘密值。APP_ENV 不为 dev 时,后端会拒绝使用公开默认值启动;但只有后端执行此检查,消费者和所有工作节点仍会使用这些值启动,因此需要此检查项。
allow_insecure_defaults
ALLOW_INSECURE_DEFAULTS=true 会覆盖上述启动拒绝。生成真实值后应移除。
credentials_key_unset
CREDENTIALS_ENCRYPTION_KEY 为空,因此邮箱 SMTP 和 IMAP 密码未密封存储。连接任何邮箱前,设置一个 64 字符十六进制密钥,可用 openssl rand -hex 32 生成,并做好备份;丢失后,已连接邮箱将无法恢复。参见加密。
internal_token_unset
INTERNAL_API_TOKEN 为空,因此发往 /api/v1/internal/ 的所有请求都被拒绝。工作节点无法获取组织密钥,跟踪服务无法解析点击链接。启动时不会失败,只在运行时出错。参见工作节点。
trusted_proxies_unset
加载此页面的请求携带 X-Forwarded-For,但 TRUSTED_PROXIES 为空,因此 Warmbly 将代理地址记录为客户端地址。按 IP 登录限流、会话记录、审计行和 API 密钥 IP 白名单都会读取错误地址。将 TRUSTED_PROXIES 设置为代理的 CIDR。参见网络与代理。
captcha_misconfigured
CAPTCHA_PROVIDER=turnstile 配合空 TURNSTILE_SECRET,会使每次验证失败,导致无人能登录。设置密钥,或改为 CAPTCHA_PROVIDER=none。参见验证码。
turnstile_bypass_set
已设置 TURNSTILE_BYPASS_TOKEN。它仅在 APP_ENV=dev 时生效,因此在生产部署中除了让后来维护的人困惑外没有作用,应移除。
dev_mode_public
APP_ENV 不为 prod,同时 APP_URL 不是回环地址。开发模式允许公开默认秘密值并启用调试日志。请设置 APP_ENV=prod。参见部署。
unsafe_webhook_urls
WARMBLY_ALLOW_UNSAFE_WEBHOOK_URLS=true 允许客户 Webhook 指向 http:// 和私有地址,意味着任何工作区成员都可能让后端访问内部网络。仅适用于开发。参见 Webhook。
tls_verification_off
已开启 SMTP_TLS_INSECURE_SKIP_VERIFY 或 MAIL_TLS_INSECURE,平台邮件或邮箱连接的 TLS 证书验证因此关闭。只有使用私有证书机构的中继才适合这样设置。
URL 与可达性
控制台、API 和管理面板可以使用不同主机。APP_URL 指定邮件链接中的客户控制台,不是 API 或管理面板。检查不会把它与后端请求主机或管理面板来源比较;HTTPS 和 CORS 检查仍然适用。
app_url_unset
APP_URL 和 FRONTEND_BASE_URL 都为空,因此密码重置、邀请和设置链接基于 https://app.warmbly.com 生成。它们会到达托管服务,而不是你的实例,其中有效的重置令牌会离开你的部署。将 APP_URL 设为控制台来源。参见地址。
app_url_insecure
APP_URL 在非回环主机上使用 http://。浏览器拒绝在非安全上下文使用 WebAuthn,因此通行密钥不可用,会话 Cookie 也明文传输。请为控制台启用 HTTPS。
cors_missing_origin
访问 API 的某个来源不在解析后的 CORS 列表中,浏览器会阻止请求。实际表现为应用加载成功,随后所有请求失败。将该来源加入 CORS_ALLOW_ORIGINS。
api_public_url_unset_oidc
已设置 OIDC_ISSUER_URL,但 API_PUBLIC_URL 和 OIDC_REDIRECT_URL 都为空,因此没有重定向 URL,单点登录路径被禁用。将 API_PUBLIC_URL 设置为后端公开基础地址。参见单点登录。
oidc_discovery_failed
启动时无法从配置的签发者完成发现,因此不显示单点登录按钮。消息包含底层错误。检查签发者 URL、TLS 证书链,以及后端能否访问它。
app_origin_wildcard
既没有 APP_ORIGIN,也没有可用的 APP_URL,因此邮箱 OAuth 回调页面用通配目标来源,将授权码发回控制台。将 APP_URL 设置为控制台来源;控制台位于其他位置时,可设置 APP_ORIGIN。仅设置 APP_URL 就能消除此项,因为回调页会从它派生目标。
tracking_domain_unreachable
已设置 TRACKING_DOMAIN,但后端探测没有得到响应,因此营销活动邮件中的打开像素和点击链接不会记录。收件人仍会收到邮件。
平台邮件
mail_transport_log
MAIL_TRANSPORT=log 将每封邮件写入后端日志,不实际投递。登录验证码、密码重置、团队邀请和通知摘要都不会到达收件人。
邀请仍然可用:从设置 > 成员复制邀请链接并自行发送。参见没有邮件中继时。要完整解决,请将 MAIL_TRANSPORT 指向中继,参见平台邮件。
mail_preflight_failed
传输本应实际投递,但中继不接受连接。消息包含原始 SMTP 对话。修复前,无人能重置密码或接收邀请。如果已触发 mail_transport_log,此检查不会重复报告,让一个事件只占一行。
mail_identity_unset
缺少 EMAIL_ADDRESS 或 EMAIL_NAME。后端会拒绝启动,但消费者只警告,并悄悄关闭全部通知和摘要邮件,因此实例可能看似健康,却没有任何邮件发送。
mail_from_domain_mismatch
平台邮件发件域与控制台域不同,邮箱服务商可能将其视为不匹配。只有这种差异并非你有意设置时,才需要处理。
login_code_demoted
由于传输不实际投递,启动时将 AUTH_LOGIN_CODE=always 降为 new_device。否则无人能完成登录。参见登录验证码。
更新
update_available
存在更新的 Warmbly:配置渠道中的发布新于运行构建,或检出目录落后分支。消息会指出两个版本及应用方法。更新器运行时,侧边栏底部版本标记提供更新并重启按钮;否则使用 git pull && make up。参见更新。
updater_unreachable
已设置 UPDATER_URL,但地址没有响应,因此更新按钮无法工作。启动更新器,使用 updater Compose 配置组或裸机 systemd 单元;也可修正地址,或移除变量并手动更新。参见启用更新器。
账户与访问权限
registration_mode
始终作为信息项报告,并说明当前模式。DISABLE_REGISTRATION=false 表示开放公众注册,不是禁用。invite_only 关闭公众注册,但保留邀请;通过邀请注册还要求 access.allow_invited_signup。true 同时关闭注册和邀请。设置 SSO_AUTO_PROVISION=true 时,说明还会指出:已验证的单点登录身份可独立于该模式创建账户。参见注册模式。
no_sign_in_method
DISABLE_PASSWORD_LOGIN=true,同时没有配置 OIDC、Google 或 Apple 服务商,会让实例完全没有登录方式。设置 DISABLE_PASSWORD_LOGIN=false,或配置 OIDC_ISSUER_URL。只有服务商所需全部值都存在,才算配置完成,下面两项检查会报告缺失。
google_sign_in_incomplete
Google 登录配置部分存在、部分缺失,因此不显示按钮。GOOGLE_CLIENT_ID 和 GOOGLE_CLIENT_SECRET 都必需;回调还需要重定向 URI,默认从 API_PUBLIC_URL 派生,前提是未设置 GOOGLE_REDIRECT_URI。重定向 URI 指向控制台时,同一检查也会警告,因为回调由 API 提供。参见登录方式。
apple_sign_in_incomplete
“使用 Apple 登录”的对应检查,需要同时提供 APPLE_APP_ID,即 Services ID,APPLE_TEAM_ID、APPLE_KEY_ID 和 APPLE_KEY_SECRET,以及 HTTPS 重定向 URI。Apple 拒绝普通 HTTP 返回地址,因此不能在本地 HTTP 安装上使用。
single_platform_admin
只有一个账户拥有授予管理权限。只读或运维管理员不能作为授予权限的备份。这是一项恢复建议,不表示实例故障。可从账户 > 管理员添加第二位可信管理员并授予该权限;有相应权限时,发现项会链接到该页面。也可通过 warmblyctl user grant-admin 恢复。参见平台管理员。
bootstrap_password_still_set
部署环境中仍有 WARMBLY_BOOTSTRAP_PASSWORD。它只在 users 表为空时读取,现在除了将明文密码留在 docker inspect 可读位置外,没有任何作用。请移除。参见首位所有者。
setup_link_outstanding
实例没有账户,且有有效的一次性设置链接。通过 make claim 查找,或使用 warmblyctl setup-link 打印新链接。参见首次运行。
expired_invitations
有些邀请已过期,无法接受,也不再出现在控制台,但不会阻止新邀请:重新邀请同一地址会替换过期行。拥有 manage_organizations 的管理员,可在发现项上选择移除过期邀请,确认跨全部工作区移除,然后自动刷新检查。仅删除已经过期的记录;活跃邀请、用户和工作区成员关系不变。清理会记录到管理审计日志。参见邀请。
工作节点
no_worker_heartbeat
邮箱仍分配给工作节点,但超过五分钟没有任何节点报到,因此没有发送或同步。
先确认工作节点进程运行,再检查 ENCRYPTED_KEYS_BACKEND_URL 和 ENCRYPTED_KEYS_WORKER_TOKEN:任一为空,都会让节点启动并订阅,却从不登记,也没有日志说明。参见工作节点。
tracking_domain_shares_brand
TRACKING_DOMAIN 与 APP_URL 或 API_PUBLIC_URL 位于同一个注册域名下。每个营销活动的链接和退订页面都会携带该主机,因此任一工作区的投诉都可能让它进入 URL 黑名单,并波及承载营销网站和平台邮件的域名。
请为跟踪使用独立注册域名,并让各工作区迁移到自己的已验证跟踪域名,使链接信誉归各自所有,而不是共享。
fleet_infra_unreachable
有来自多台机器的节点报到,但 NATS_URL、REDIS 或 ENCRYPTED_KEYS_BACKEND_URL 仍指向只在本机可解析的主机,例如 Compose 服务名或回环地址。加入节点会原样继承这些值,因此能登记并通过 HTTP 持续心跳,却无法访问总线和缓存。整个期间节点集群都可能看似健康,因此这是检查项,而不只是日志。参见分拆部署。
多台机器按活跃节点中不同地址数大于一判断,因此同主机上的扩容副本不会触发。
codec_registry
CODEC_PROVIDER 为 avro,但 SCHEMA_REGISTRY_URL 为空。Avro 每个事件都需要注册表,因此没有可用于编码的 Schema。请设置它,或改用无需注册表的 CODEC_PROVIDER=json。参见事件总线。
数据库
migrations_dirty
schema_migrations 行标记为 dirty。后端启动时应用迁移;dirty 表示某个迁移中途失败,实例使用前必须解决。消息会说明停在哪个版本。
warmup_pools_missing
预热池少于两个,预热无法放置邮箱,每个预热任务都会失败。只有迁移 000156 会在每个实例创建免费和付费池;仅数据恢复或手动删除会移除它们,而迁移不会再次运行。请按固定 ID 恢复:
INSERT INTO warmup_pools (id, pool_type, name)
VALUES ('77777777-aaaa-0000-0000-000000000001', 'free', 'Free warmup pool'),
('77777777-aaaa-0000-0000-000000000002', 'premium', 'Premium warmup pool')
ON CONFLICT (id) DO NOTHING;Redis
redis_unreachable
Redis 不可达。速率限制、组织密钥缓存、实时桥接和首次设置令牌都不可用。参见缓存。
实时服务
websocket_unreachable
后端将 WEBSOCKET_URL 转换为 /health URL,但实时服务没有响应,因此控制台不会实时更新,在线状态为空。任何低于 500 的状态都视为响应,所以身份验证拦截页不会触发此项。
实时服务可达、控制台却仍无实时功能,属于另一种原因,没有检查项报告:后端的 AUTH_SECRET 必须与实时服务 JWT_SECRET 完全相同,否则每个令牌都被拒绝。实例 > 配置 > 环境为敏感值显示四字符指纹,便于比较而不暴露原值。
存储
blob_root_missing
BLOB_PROVIDER=filesystem,但 BLOB_FS_ROOT 未设置、不存在或不可写,因此无法存储邮件正文、附件和头像。检查会写入并删除探测文件,证明路径可用。主机上的后端、消费者和所有工作节点必须共享该路径。参见存储。
fleet_blobs_not_shared
BLOB_PROVIDER=filesystem,但节点从多台机器报到。工作节点需要读取后端写入的正文,因此不共享此文件系统的节点无法发送,直到发送最后一步才会报错。请改为 BLOB_PROVIDER=s3,使用双方都可访问的存储桶。参见分拆部署。
各服务达到健康状态所需的条件
| 服务 | 要求 |
|---|---|
| backend | 五个秘密值、PRIMARY_DB、REDIS、提供程序开关、公开 URL、EMAIL_ADDRESS、EMAIL_NAME 和 GEODB_PATH |
| consumer | 相同共享配置。它写入 Postgres,因此需要 PRIMARY_DB 和两个加密密钥;还需要邮件身份,否则会悄悄不发送任何邮件。GEODB_PATH 可选,只为打开和点击补充位置 |
| worker | 不需要数据库。需要事件总线、REDIS、两个加密密钥、ENCRYPTED_KEYS_BACKEND_URL 和工作节点令牌,以及 BOX_* OAuth 客户端 |
| tracking | 事件总线,以及 BACKEND_INTERNAL_URL 和 INTERNAL_API_TOKEN;后二者缺少任一个,启动时就会退出 |
| realtime | JWT_SECRET 与后端 AUTH_SECRET 相等,另需 SECRET_KEY_BASE 和 DATABASE_URL,三者不全则拒绝启动。REDIS_URL、PHX_HOST 和连接限额都有默认值 |
| web 和 admin | 只需要 WARMBLY_* URL,在容器启动时读取并写入 /config.js |