最稳方式是用 docker 运行 gatus;配置文件必须为 config.yaml 且挂载路径权限正确,http 类型 endpoint 才支持 [status]、[response_time] 等条件判断。

直接用 Docker 跑 gatus 是最稳的,二进制方式容易因系统缺失 libc 或 openssl 版本不兼容而启动失败;配置文件里写错一个缩进或引号,服务就静默退出——它不会报 YAML 解析错误,只会卡在启动日志末尾不动。
docker run 启动时为什么 config 挂载后没生效?
常见现象是页面显示 “No endpoints configured”,但 docker logs 看不到报错。根本原因是挂载路径权限或配置文件名不匹配。
-
docker run必须用-v /your/config/dir:/config,且目录下必须存在名为config.yaml的文件(不是gatus.yaml或其他名字) - 宿主机目录需对容器内 UID 1001 可读:
chmod -R 755 /your/config/dir && chown -R 1001:1001 /your/config/dir - 若用
docker-compose,注意volumes映射的是目录,不是单个文件;./config:/config表示把本地./config目录整体挂进容器/config - 启动后执行
docker exec -it <container> ls -l /config</container>,确认能看到config.yaml且大小非零
config.yaml 中 endpoint 的 conditions 怎么写才真正生效?
条件判断只在 HTTP 类型 endpoint 上起作用,ICMP 或 TCP 类型 endpoint 不支持 [RESPONSE_TIME] 或 [BODY] 这类字段——它们压根没有响应体。
- HTTP/HTTPS endpoint 才能用:
[STATUS] == 200、[RESPONSE_TIME] 、<code>[BODY] != ""、[BODY] =~ "healthy" - ICMP endpoint 只能靠
duration(ping 延迟)和success(是否通)两个隐式指标,不能写条件表达式 - 写多个
conditions是“与”关系:全部满足才算健康;任一失败即标记为 failure - 别在 condition 里用中文引号或全角符号,
"[STATUS] == 200"必须是英文双引号 + 半角括号
SQLite 存储报错 “database is locked” 怎么办?
这是 gatus 默认 SQLite 存储在高频率检查(如 10s 间隔)+ 多 endpoint 场景下的典型并发问题,不是磁盘满或权限问题。
- 临时缓解:把
endpoints[].interval从10s改成30s或更长,降低写入压力 - 长期方案:换 PostgreSQL,
storage.type: "postgres",配合storage.connection-string使用;Docker Compose 中务必让gatus服务依赖postgres,并加healthcheck确保 DB 就绪后再启 Gatus - SQLite 不支持 WAL 模式自动启用,强行加
?_busy_timeout=5000到storage.path后无效,该参数只对 PostgreSQL 生效
真正麻烦的从来不是启动,而是当 gatus 把某个 endpoint 标成红色后,你得立刻分清:是目标服务真挂了,还是它的 /health 接口返回了 503 却没被 condition 捕获?或者 condition 写成了 [STATUS] == 200,但服务其实返回的是 204 —— 这种细节不会报错,只会让你盯着看板怀疑人生。











