排障与已知限制¶
排障¶
启动失败¶
| 错误 | 原因与处理 |
|---|---|
ACMECAST_JWT_SECRET 相关配置错误 |
必需,缺失拒绝启动 |
| credential key 相关配置错误 | 必需;须为 base64 编码的 32 字节(openssl rand -base64 32) |
| 口令哈希非法 PHC | ACMECAST_ADMIN_PASSWORD_HASH 必须形如 $argon2id$...,用 hash-password 子命令重新生成 |
| 迁移失败(报版本号) | 数据库 schema 与迁移版本冲突;看日志中失败版本,切勿手工改已应用的迁移 |
| 不支持的数据库方言 | 连接串 scheme 仅支持 sqlite/mysql(mariadb)/postgres(postgresql) |
登录¶
- 401
invalid_credentials:用户名或口令错误(统一文案,不区分哪种错)。 注意ACMECAST_ADMIN_USERNAME是否被改过。 - 429
too_many_attempts:连续失败 5 次锁定 15 分钟。锁定是进程内计数, 重启进程即清零。 - 500
configuration_error:未配置管理员口令哈希——服务能启动但无人能 登录,启动日志有对应告警。
证书申请¶
- 挑战超时,错误提示「提供商侧没认」:DNS 凭据权限不足或 zone 填错——
检查
dns_zone(缺省从主域名去第一段推导,多级后缀如a.b.co.uk需显式 给出b.co.uk)。 - 挑战超时,错误提示「解析器没看到」:传播慢或用了内网 DNS。内网 zone
请在
cert.apply输入里设wait_propagation=false。 - 报「异值残留」:
_acme-challenge下有上次失败留下的旧 TXT 记录。 这是刻意的保护(防 CA 读到旧值);手工删掉残留记录后重跑。 externalAccountRequired:该 CA(ZeroSSL/Google 等)要求 EAB,在acme.account凭据里成对补eab_kid/eab_hmac_key。- 通配符失败:通配符只能 DNS-01,确认
challenge为dns-01。
部署¶
- 权限/属主报错:改他人所有的文件需 root;容器内 uid 65532 对宿主机 目录的写权限要单独处理。
- 重载命令失败但文件已写好:
Reload错误携带命令、退出码与合并输出; 文件不会回滚,修好命令后重跑(同指纹会跳过写入但仍执行重载)。 - SSH 连接失败:先用凭据的「测试」按钮(10 秒超时的真实探测)定位是 网络、认证还是权限问题。
凭据¶
- 500
credential_decryption_error:ACMECAST_CREDENTIAL_KEY被更换或 数据目录来自另一套密钥的环境。密钥无法找回时只能逐个重建凭据。 - 删除被拒(409):错误里列出了引用该凭据的流水线与步骤序号,先改流水线。
日常诊断¶
- 日志:
RUST_LOG=debug或按模块RUST_LOG=info,acmecast_dns=debug。 - 每个请求带
x-request-id,报错时连同该值检索日志。 - 运行历史与逐步骤日志:
GET /api/histories/{id}/logs。 - 触发审计(为什么没触发/触发了几次):
GET /api/schedules/trigger-logs。
已知限制¶
- SSH 部署未接入 known_hosts:接受任何主机密钥(每次连接记 warn 并打出 SHA-256 指纹),有中间人风险的环境请配合网络层隔离。
- HTTP-01 只有材料计算能力:没有投放通道,申请步骤请用 DNS-01。
- 登录限流是进程内计数:多副本部署下需在反向代理层做防护。
- DNS 提供商仅内置 Cloudflare 与阿里云;其它厂商需扩展
acmecast-dns的 provider。 - 换数据库不迁移数据:SQLite → MySQL/PG 需自行导出导入或重新申请。
- 同一流水线同时只允许一个运行:重复触发被跳过(不排队),需要并发 跑同一批域名时请拆成多条流水线。