Healthchecks v4.4 配置参数详解

Healthchecks v4.4 全部环境变量配置逐项详解:读取优先级、站点标识、数据库、邮件、ping 与数据保留、集成开关、可观测性,附实测回显与生产配置模板。

Healthchecks2026/10/17

Healthchecks v4.4 配置参数详解

目标:系统梳理 Healthchecks v4.4 的全部配置参数——读取机制与优先级、逐项含义与默认值、实测生效验证,并给出小规模/生产两套推荐模板。已在 Ubuntu 22.04 源码部署与官方镜像部署两种形态下实测通过。

一、环境信息

  • Healthchecks:v4.4(源码部署 /opt/healthchecks + 官方镜像 healthchecks/healthchecks:v4.4 双环境实测)
  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Python:3.12.15;Django:6.1
  • 配置文件位置:源码部署 /opt/healthchecks/hc/local_settings.py 与 systemd 环境文件 /etc/healthchecks;镜像部署 .env(配合 env_file: 注入)
  • 数据库:PostgreSQL 16(DB=postgres)与 SQLite(默认)两种形态均验证

二、前置条件

部署形态配置入口生效方式
源码 + systemd/etc/healthchecks(EnvironmentFile)+ hc/local_settings.pysystemctl restart healthchecks-web(sendalerts 同理逐个重启)
官方镜像 + Compose.envdocker compose up -d web(重建容器,restart 不重读)
官方镜像 + docker run--env-file重建容器

三、参数查看与修改方式

3.1 运行时查看实际生效值

Django 提供权威的运行时自查入口 manage.py shell,直接读 settings 对象即可确认当前生效值:

cd /opt/healthchecks
/opt/venv/bin/python manage.py shell -c "from django.conf import settings; print('SITE_ROOT =', settings.SITE_ROOT); print('SITE_NAME =', settings.SITE_NAME); print('DEBUG =', settings.DEBUG); print('ALLOWED_HOSTS =', settings.ALLOWED_HOSTS); print('DB ENGINE =', settings.DATABASES['default']['ENGINE'])"

实测输出:

SITE_ROOT = http://localhost:8000
SITE_NAME = Mychecks
DEBUG = False
ALLOWED_HOSTS = ['localhost', '127.0.0.1', 'hc-server']
DB ENGINE = django.db.backends.postgresql

镜像部署等价命令(替换容器名/服务名):

docker compose exec -T web /opt/healthchecks/manage.py shell -c "from django.conf import settings; print(settings.SITE_ROOT, settings.SITE_NAME)"

3.2 修改方式与优先级

v4.4 的 hc/settings.py 统一从环境变量读取(os.getenv 系列),最后加载可选的 hc/local_settings.py 覆盖同名字段。源码中的加载逻辑(实测代码,hc/settings.py 末尾):

# Read additional configuration from hc/local_settings.py if it exists
if (BASE_DIR / "hc/local_settings.py").exists():
    from .local_settings import *

结论:环境变量先读,local_settings.py 后加载、同名即覆盖;local_settings.py 不存在时完全走环境变量(镜像部署的形态)。两个易踩坑点实测:

  • 敏感值支持文件注入:SECRET_KEY_FILE=/run/secrets/hc_secret 形式对 envsecret 类参数(如 SECRET_KEY、EMAIL_HOST_PASSWORD)有效,settings 会读文件内容并去除首尾空白;
  • 环境变量有格式校验:布尔类参数只接受 True/False 字符串,写 true 会直接启动失败,报 Unexpected value XXX=true, use 'True' or 'False'。

四、参数总览

按功能分组的完整清单(默认值取自 hc/settings.py 与镜像内 docker/.env.example 实际内容):

分组参数
站点标识与访问SECRET_KEY、DEBUG、ALLOWED_HOSTS、SITE_ROOT、SITE_NAME、SITE_LOGO_URL、MASTER_BADGE_LABEL、REGISTRATION_OPEN、SECURE_PROXY_SSL_HEADER、REMOTE_USER_HEADER、RP_ID、USE_GZIP_MIDDLEWARE、USE_PAYMENTS
数据库DB、DB_HOST、DB_PORT、DB_NAME、DB_USER、DB_PASSWORD、DB_CONN_MAX_AGE、DB_SSLMODE、DB_TARGET_SESSION_ATTRS
邮件EMAIL_HOST、EMAIL_PORT、EMAIL_USE_TLS、EMAIL_USE_SSL、EMAIL_HOST_USER、EMAIL_HOST_PASSWORD、EMAIL_USE_VERIFICATION、EMAIL_MAIL_FROM_TMPL、DEFAULT_FROM_EMAIL、SUPPORT_EMAIL、ADMINS
ping 与数据保留PING_ENDPOINT、PING_EMAIL_DOMAIN、PING_BODY_LIMIT、S3_ACCESS_KEY、S3_SECRET_KEY、S3_BUCKET、S3_ENDPOINT、S3_REGION、S3_TIMEOUT、S3_SECURE
集成开关APPRISE_ENABLED、SLACK_ENABLED/SLACK_CLIENT_ID/SLACK_CLIENT_SECRET、TELEGRAM_TOKEN/TELEGRAM_BOT_NAME、DISCORD_CLIENT_ID/DISCORD_CLIENT_SECRET、MSTEAMS_ENABLED、MATTERMOST_ENABLED、MATRIX_HOMESERVER/MATRIX_USER_ID/MATRIX_ACCESS_TOKEN、OPSGENIE_ENABLED、PAGERTREE_ENABLED、PD_ENABLED/PD_APP_ID、ROCKETCHAT_ENABLED、SPIKE_ENABLED、VICTOROPS_ENABLED、PUSHBULLET_CLIENT_ID/PUSHBULLET_CLIENT_SECRET、PUSHOVER_API_TOKEN/PUSHOVER_SUBSCRIPTION_URL/PUSHOVER_EMERGENCY_RETRY_DELAY/PUSHOVER_EMERGENCY_EXPIRATION、SIGNAL_CLI_SOCKET、LINENOTIFY_CLIENT_ID/LINENOTIFY_CLIENT_SECRET、TRELLO_APP_KEY、TWILIO_ACCOUNT/TWILIO_AUTH/TWILIO_FROM/TWILIO_MESSAGING_SERVICE_SID/TWILIO_USE_WHATSAPP、WHATSAPP_DOWN_CONTENT_SID/WHATSAPP_UP_CONTENT_SID、ZULIP_ENABLED、GITHUB_CLIENT_ID/GITHUB_PUBLIC_LINK
可观测性与运维METRICS_KEY、PROMETHEUS_ENABLED、STATSD_HOST、SHELL_ENABLED、UWSGI_PROCESSES、UWSGI_DISABLE_LOGGING、LISTEN_IPV6、SMTPD_PORT、INTEGRATIONS_ALLOW_PRIVATE_IPS

💡 说明:镜像专属参数(UWSGI_*、LISTEN_IPV6、SMTPD_PORT)由 uWSGI/启动脚本消费,源码部署不生效;其余参数两种形态通用。带 *_CLIENT_ID/SECRET/TOKEN 的集成项不配置时对应渠道在界面隐藏,配置即启用。

五、核心参数分类详解

5.1 站点标识与访问

SECRET_KEY(必改)。默认值 "---"(settings 中的占位符,等于没有密钥)。Django 会话签名、CSRF、以及 API Key 的 HMAC 派生都以它为根。生成:

python3 -c "import secrets; print(secrets.token_urlsafe(40))"
S4YD-1n8D2pQmXJ7bKzvLw3hTgUeRcA9F0sVqWxZkOyE

⚠️ 注意:更换 SECRET_KEY 后所有登录会话失效、已签发的 API Key 立即不可用(库中存的是 HMAC(SECRET_KEY, key),换根后校验全失败),需重新生成 API Key。生产可用 SECRET_KEY_FILE 从密钥管理服务挂载。

DEBUG。默认 True,生产必须 False。为 True 时 Django 会在错误页暴露配置与调用栈。

ALLOWED_HOSTS。Host 头白名单,逗号分隔。默认只含 localhost。实测拦截行为——伪造不在白名单的 Host 直接 400:

curl -s -H "Host: evil.example.com" http://127.0.0.1:8000/accounts/login/ -o /dev/null -w "Host=evil.example.com -> %{http_code}\n"
curl -s -H "Host: localhost" http://127.0.0.1:8000/accounts/login/ -o /dev/null -w "Host=localhost -> %{http_code}\n"
Host=evil.example.com -> 400
Host=localhost -> 200

接入反代/域名后必须把域名补进白名单(Nginx 反代实测从 400 变 302 的完整过程见《Healthchecks v4.4 Docker Compose 部署指南》第十章)。

SITE_ROOT。对外访问的基础 URL,默认 http://localhost:8000。邮件正文里的链接、Check 的 ping URL、徽章 URL 都由它派生——上 TLS 或换域名后要同步修改,否则告警邮件里的链接指向旧地址。

SITE_NAME。站点名,默认 Mychecks,出现在页面标题与邮件落款。实测改后即时反映在登录页:

# .env 中 SITE_NAME=Mychecks 改为 OpsWatch,重建容器后:
<title>Log In - OpsWatch</title>

MASTER_BADGE_LABEL。全局徽章上的项目标签文字,默认取 SITE_NAME。

REGISTRATION_OPEN。默认 True;设为 False 后关闭自助注册(登录页不再提供注册入口),私有部署建议关闭、由管理员 createsuperuser 发账号。

SECURE_PROXY_SSL_HEADER。放在反代之后启用 HTTPS 判定,格式如 "X-Forwarded-Proto, https";只有反代确实设置了该头才配置,否则有请求伪造风险。

REMOTE_USER_HEADER。配置后信任反代传入的用户头(如 X-Forwarded-User)实现 SSO 免登,默认未启用。

RP_ID。WebAuthn 硬件密钥登录的有效域,默认空(不启用)。

5.2 数据库

数据库引擎由 DB 选择(postgres/mysql/mariadb),不设置 DB 时走 SQLite(默认库名 hc.sqlite,路径 BASE_DIR 下,可用 DB_NAME 改写)。这是 settings.py 的实测分支逻辑:DB=postgres 时启用下方 HOST/PORT/NAME/USER/PASSWORD 连接参数;均不设置时仅 DB_NAME 生效为 SQLite 文件路径。

参数默认值说明
DB_HOST空主机名;Compose 里是服务名 db
DB_PORT空PG 默认 5432
DB_NAMEhc(PG)/ hc.sqlite(SQLite)库名/文件路径
DB_USERpostgres(PG)连接用户
DB_PASSWORD空密码;生产建议配 DB_PASSWORD_FILE 类等价物(同目录 envsecret 机制支持 _FILE 后缀的参数见 3.2)
DB_CONN_MAX_AGE0连接复用秒数,0=每请求新建(PG 可设 60 提升性能)
DB_SSLMODEpreferpsycopg SSL 模式(disable/allow/prefer/require/verify-ca/verify-full)
DB_TARGET_SESSION_ATTRSread-writePG 集群会话属性(主库读写)

版本硬约束实测:v4.4(Django 6.1)要求 PostgreSQL ≥ 15,低于此版本 migrate 直接抛错:

django.db.utils.NotSupportedError: PostgreSQL 15 or later is required (found 14.24).

💡 技术拓展:Django 支持的数据库后端对比——

后端Healthchecks 场景评价适用
PostgreSQL官方默认与推荐,jsonb/并发写好生产首选
MySQL/MariaDB需 mysqlclient 编译与 libmariadb-dev已有 MySQL 运维体系
SQLite零部署、单文件个人/小规模;写入并发弱

本文环境采用 PostgreSQL 16(官方镜像 compose 默认组合)。

5.3 邮件

邮件既是告警出口也是入站 ping 的对端配置源,是自托管最常调的一组参数:

参数默认值说明
EMAIL_HOST空SMTP 主机;设置后settings 才生成 MAILERS 邮件通道
EMAIL_PORT587SMTP 端口
EMAIL_USE_TLSTrueSTARTTLS(587 常用)
EMAIL_USE_SSLFalse隐式 TLS(465 常用),与 USE_TLS 互斥使用
EMAIL_HOST_USER/EMAIL_HOST_PASSWORD空SMTP 认证
EMAIL_USE_VERIFICATIONTrue添加邮件渠道是否需收确认邮件;内网测试可设 False
EMAIL_MAIL_FROM_TMPL空自定义发件人模板(如 "%(site_name)s" <alerts@example.org>)
DEFAULT_FROM_EMAILhealthchecks@example.org默认发件地址
SUPPORT_EMAIL空页面/邮件里的支持联系方式
ADMINS空管理员列表(Name <email>,逗号分隔),配合错误上报

实测证据一:未配置 EMAIL_HOST 时执行任意管理命令会打印告警(配置后消失):

?: (hc.api.W002) No SMTP configuration, cannot send email
        HINT: See https://github.com/healthchecks/healthchecks#sending-emails
?: (mail.W001) Your MAILERS setting has no 'default' entry. Sending email without a valid mailer will fail.

实测证据二:shell 里未加载环境变量直接跑管理命令,发信时报错与提示一致:

AssertionError: No SMTP configuration, see https://github.com/healthchecks/healthchecks#sending-emails

源码部署推荐把邮件变量放 systemd 环境文件(/etc/healthchecks,权限 600),web 与 sendalerts 单元共用:

EMAIL_HOST=smtp.example.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=alert@example.com
EMAIL_HOST_PASSWORD=q1w2e3r4
DEFAULT_FROM_EMAIL=alert@example.com

PING_EMAIL_DOMAIN(默认 localhost):入站邮件 ping 的收件域名。配合镜像参数 SMTPD_PORT(或源码部署 manage.py smtpd)启用后,向 <check-uuid>@<PING_EMAIL_DOMAIN> 发邮件即产生一次成功 ping。该 smtpd 只接受 Check 地址,发给人用的邮箱地址会被拒收(实测 550 5.1.1 Recipient rejected),属设计行为而非故障。

5.4 ping 与数据保留

参数默认值说明
PING_ENDPOINTSITE_ROOT + "/ping/"界面展示的 ping URL 前缀;反代到独立 ping 域名时改它
PING_BODY_LIMIT10000ping body 落库最大字节数,超出截断;设 0 关闭 body 存储
S3_* 系列空配置后 ping body 转存 S3/MinIO(S3_ENDPOINT/S3_BUCKET/S3_ACCESS_KEY/S3_SECRET_KEY/S3_REGION/S3_TIMEOUT/S3_SECURE);pruneobjects 清理任务依赖此配置,未配置时实测输出 Object storage is not configured

⚠️ 注意:PING_BODY_LIMIT 只管 HTTP 上报的 body;邮件 ping 的正文留存策略由数据库定期清理任务控制,见《Healthchecks v4.4 进阶实战与运维》。

5.5 集成开关

每个集成渠道有独立开关(*_ENABLED=True/False)与凭据参数,默认值来自镜像 .env.example:APPRISE_ENABLED=False、MATTERMOST_ENABLED=True、MSTEAMS_ENABLED=True、OPSGENIE_ENABLED=True、PAGERTREE_ENABLED=True、PD_ENABLED=True、ROCKETCHAT_ENABLED=True、SLACK_ENABLED=True、SPIKE_ENABLED=True、VICTOROPS_ENABLED=True、ZULIP_ENABLED=True、WEBHOOKS_ENABLED=True、PROMETHEUS_ENABLED=True。

要点:

  • 开关为 True 且凭据为空时,界面显示渠道但不可用;凭据齐全才真正可用;
  • INTEGRATIONS_ALLOW_PRIVATE_IPS=False(默认):Webhook 目标为内网地址时默认拒绝(防 SSRF),内网集成(如推给内网告警网关)需显式改 True;
  • Telegram 需 TELEGRAM_TOKEN 并执行 manage.py settelegramwebhook 注册回调;Slack/Discord 等 OAuth 类需 CLIENT_ID/SECRET。

5.6 可观测性与运维

METRICS_KEY(默认空)。设置后开放 Prometheus 指标文档端点 /api/v3/metrics/,请求须带 X-Metrics-Key 头。实测(设置 METRICS_KEY=q1w2e3r4-metrics 后):

curl -s http://127.0.0.1:8000/api/v3/metrics/ -o /dev/null -w "无密钥 -> %{http_code}\n"
curl -s -H "X-Metrics-Key: q1w2e3r4-metrics" http://127.0.0.1:8000/api/v3/metrics/
无密钥 -> 403
{"ts": 1792166213, "max_ping_id": 11, "max_notification_id": 6, "num_unprocessed_flips": 0}

返回的是抓取游标文档(配合官方 prometheus exporter 使用),num_unprocessed_flips 持续增长说明 sendalerts 派发积压,是告警链路健康度的重要指标。

STATSD_HOST(默认空)。配置 StatsD 地址后推送 hc.sendalerts.* 等打点指标。

SHELL_ENABLED(默认 False)。界面「Run This Command」调试面板的开关,生产保持关闭。

镜像专属:UWSGI_PROCESSES(默认 4,小内存可调 2)、UWSGI_DISABLE_LOGGING(关闭访问日志)、LISTEN_IPV6=1(额外监听 IPv6,纯 IPv4 系统开启会导致 uWSGI 启动失败)、SMTPD_PORT(容器内启动入站邮件服务监听该端口,Compose 需同步映射端口)。

六、生产配置模板

小规模(≤50 Check,2G 内存,SQLite 快速起步)——.env:

SECRET_KEY=<python3 -c "import secrets; print(secrets.token_urlsafe(40))" 生成>
DEBUG=False
ALLOWED_HOSTS=hc.example.org
SITE_ROOT=https://hc.example.org
SITE_NAME=OpsWatch
REGISTRATION_OPEN=False
DB_NAME=/opt/healthchecks-data/hc.sqlite
PING_BODY_LIMIT=10000
SHELL_ENABLED=False

生产(数百 Check,PostgreSQL 16,Nginx TLS 反代)——.env:

SECRET_KEY=<同上生成,妥善备份>
DEBUG=False
ALLOWED_HOSTS=hc.example.org
SITE_ROOT=https://hc.example.org
SITE_NAME=OpsWatch
MASTER_BADGE_LABEL=OpsWatch
REGISTRATION_OPEN=False
DB=postgres
DB_HOST=db
DB_PORT=5432
DB_NAME=hc
DB_USER=hc
DB_PASSWORD=<强密码>
DB_CONN_MAX_AGE=60
DB_SSLMODE=prefer
EMAIL_HOST=smtp.example.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=alert@example.com
EMAIL_HOST_PASSWORD=<SMTP密码>
DEFAULT_FROM_EMAIL=alert@example.com
PING_EMAIL_DOMAIN=hc.example.org
PING_BODY_LIMIT=10000
METRICS_KEY=<随机值>
SHELL_ENABLED=False
INTEGRATIONS_ALLOW_PRIVATE_IPS=False
UWSGI_PROCESSES=4

两套模板的适用边界:小规模模板面向个人/家庭实验室(SQLite 单文件、备份即拷贝);生产模板面向团队(PG 独立持久化、TLS 域名、告警邮件、指标端点、Webhook 防内网)。上线前逐项核对:SECRET_KEY 已备份到密码管理器、SITE_ROOT 与反代域名一致、ALLOWED_HOSTS 含全部访问域名。

七、常见问题(FAQ)

Q1:改了 .env / 环境文件没生效?

镜像部署用 docker compose restart web 无效(env_file 只在容器创建时注入),必须 docker compose up -d web 重建;源码部署确认改动写入了 systemd 实际引用的 /etc/healthchecks 并执行 systemctl restart healthchecks-web(逐个服务重启)。复核手段用 3.1 的 manage.py shell 读 settings 对象,所见即生效值。

Q2:布尔参数写成小写 true 启动失败?

settings 对布尔环境变量有严格校验,实测报错:

ImproperlyConfigured: Unexpected value XXX=true, use 'True' or 'False'

统一写首字母大写的 True/False。

Q3:告警邮件里的链接是 localhost,点开不对?

SITE_ROOT 还是默认值。它决定邮件链接、ping URL、徽章 URL 的派生来源,改成对外域名后重启 web 与 sendalerts 两个服务(源码部署)或重建容器(镜像部署)。注意已创建 Check 的 ping URL 界面上会按新 SITE_ROOT 展示,历史邮件里的旧链接无法追溯修正。

Q4:API Key 突然全部失效?

SECRET_KEY 被更换。API Key 在库中存的是 HMAC(SECRET_KEY, key),换根后旧 Key 校验失败是预期行为,重新生成即可;也说明 SECRET_KEY 必须备份且不随意轮换。

Q5:Webhook 推不到内网地址?

默认 INTEGRATIONS_ALLOW_PRIVATE_IPS=False 拒绝私有 IP 目标(SSRF 防护)。内网告警网关场景显式改 True,但要确保 Webhook 目标可信。

Q6:/metrics/ 返回 404 或 403?

404 说明路径不对——指标端点在 API 前缀下,是 /api/v3/metrics/;403 说明 METRICS_KEY 未配置或请求未带 X-Metrics-Key 头(实测两种情形见 5.6)。

八、参考链接