Discourse-health-check:一次性查看 Discourse 服务器状态的 CLI 工具

这是我为自己论坛编写的一个小型 Bash 脚本,用于提供 Discourse 服务器的快速健康概览。分享给任何觉得这种快速概览有用的人。

检查系统资源: Docker、Discourse 服务(Postgres、Redis、Nginx、Unicorn、Sidekiq)、备份新鲜度、TLS 以及基本安全性。最后提供通过/警告/严重摘要,并返回适合 cron 使用的退出码。

安装

curl -O https://raw.githubusercontent.com/haydenjames/discourse-health-check/main/discourse-health-check.sh
chmod +x discourse-health-check.sh
sudo ./discourse-health-check.sh

源码、选项及 cron 示例请参阅 README:


新版本 v1.0.4

两项修复:

  1. Discourse 已用 Pitchfork 替换 Unicorn(2026.2 版本默认使用,2026.4 版本完全移除 Unicorn),因此 Web 服务器检查现在能同时检测两者。感谢 @RGJ 在六月份指出此问题。

  2. 服务探针匹配的是其自身的命令行。pgrep -f <name> 导致 pgrep 匹配到了自身,无论服务是否实际运行,检查都会通过。自 1.0.0 版本以来,Sidekiq 一直无条件报告“运行中”。即使服务已停止,你仍会看到绿色对勾,且 cron 返回退出码 0。这与 1.0.1 中 Puma 误报的根本原因相同,该问题当时只是被重命名而非真正修复。

9 个赞

Discourse 不运行 Puma。

3 个赞

Unicorn。已修复,谢谢。

1 个赞

如今的叉子!!

2 个赞

不错的方案,谢谢!

关于备份,我建议检查最新的备份文件,查看其自写入后是否被读取过。这可以作为判断备份是否已复制到站外的一个代理指标。(或者,如果不只检查最新的,也可以检查所有备份。)

如果一周内没有任何备份被复制到站外,那就值得发出警告了。

(我认为你可以用 stat -c %X 减去 stat -c %Y,或者干脆直接比较这两个值。如果备份文件自写入后被读取过,这两个值就会不同。)

5 个赞

@Ed_S 太棒的建议了。已在 v1.0.2 版本中加入。该功能会对比最新备份的 atime 与 mtime,若自写入后未被读取则发出警告,并包含 noatime 检查以在 atime 不可靠时优雅跳过。已为您署名,谢谢!

4 个赞