healthchecks_healthchecks/templates/docs/self_hosted_configuration.md
2024-10-02 09:44:03 +03:00

1047 lines
36 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Server Configuration
Healthchecks prepares its configuration in `hc/settings.py`. It reads configuration
from environment variables. Below is a list of environment variables it reads and uses.
<ul class="self-hosted-configuration-toc">
<li><a href="#ADMINS">ADMINS</a></li>
<li><a href="#ALLOWED_HOSTS">ALLOWED_HOSTS</a></li>
<li><a href="#APPRISE_ENABLED">APPRISE_ENABLED</a></li>
<li><a href="#DB">DB</a></li>
<li><a href="#DB_CONN_MAX_AGE">DB_CONN_MAX_AGE</a></li>
<li><a href="#DB_HOST">DB_HOST</a></li>
<li><a href="#DB_NAME">DB_NAME</a></li>
<li><a href="#DB_PASSWORD">DB_PASSWORD</a></li>
<li><a href="#DB_PORT">DB_PORT</a></li>
<li><a href="#DB_SSLMODE">DB_SSLMODE</a></li>
<li><a href="#DB_TARGET_SESSION_ATTRS">DB_TARGET_SESSION_ATTRS</a></li>
<li><a href="#DB_USER">DB_USER</a></li>
<li><a href="#DEBUG">DEBUG</a></li>
<li><a href="#DEFAULT_FROM_EMAIL">DEFAULT_FROM_EMAIL</a></li>
<li><a href="#DISCORD_CLIENT_ID">DISCORD_CLIENT_ID</a></li>
<li><a href="#DISCORD_CLIENT_SECRET">DISCORD_CLIENT_SECRET</a></li>
<li><a href="#EMAIL_HOST">EMAIL_HOST</a></li>
<li><a href="#EMAIL_HOST_PASSWORD">EMAIL_HOST_PASSWORD</a></li>
<li><a href="#EMAIL_HOST_USER">EMAIL_HOST_USER</a></li>
<li><a href="#EMAIL_PORT">EMAIL_PORT</a></li>
<li><a href="#EMAIL_USE_TLS">EMAIL_USE_TLS</a></li>
<li><a href="#EMAIL_USE_SSL">EMAIL_USE_SSL</a></li>
<li><a href="#EMAIL_USE_VERIFICATION">EMAIL_USE_VERIFICATION</a></li>
<li><a href="#http_proxy">http_proxy and https_proxy</a></li>
<li><a href="#INTEGRATIONS_ALLOW_PRIVATE_IPS">INTEGRATIONS_ALLOW_PRIVATE_IPS</a></li>
<li><a href="#LINENOTIFY_CLIENT_ID">LINENOTIFY_CLIENT_ID</a></li>
<li><a href="#LINENOTIFY_CLIENT_SECRET">LINENOTIFY_CLIENT_SECRET</a></li>
<li><a href="#MASTER_BADGE_URL">MASTER_BADGE_LABEL</a></li>
<li><a href="#MATRIX_ACCESS_TOKEN">MATRIX_ACCESS_TOKEN</a></li>
<li><a href="#MATRIX_HOMESERVER">MATRIX_HOMESERVER</a></li>
<li><a href="#MATRIX_USER_ID">MATRIX_USER_ID</a></li>
<li><a href="#MATTERMOST_ENABLED">MATTERMOST_ENABLED</a></li>
<li><a href="#MSTEAMS_ENABLED">MSTEAMS_ENABLED</a></li>
<li><a href="#OPSGENIE_ENABLED">OPSGENIE_ENABLED</a></li>
<li><a href="#PAGERTREE_ENABLED">PAGERTREE_ENABLED</a></li>
<li><a href="#PD_APP_ID">PD_APP_ID</a></li>
<li><a href="#PD_ENABLED">PD_ENABLED</a></li>
<li><a href="#PING_BODY_LIMIT">PING_BODY_LIMIT</a></li>
<li><a href="#PING_EMAIL_DOMAIN">PING_EMAIL_DOMAIN</a></li>
<li><a href="#PING_ENDPOINT">PING_ENDPOINT</a></li>
<li><a href="#PROMETHEUS_ENABLED">PROMETHEUS_ENABLED</a></li>
<li><a href="#PUSHBULLET_CLIENT_ID">PUSHBULLET_CLIENT_ID</a></li>
<li><a href="#PUSHBULLET_CLIENT_SECRET">PUSHBULLET_CLIENT_SECRET</a></li>
<li><a href="#PUSHOVER_API_TOKEN">PUSHOVER_API_TOKEN</a></li>
<li><a href="#PUSHOVER_EMERGENCY_EXPIRATION">PUSHOVER_EMERGENCY_EXPIRATION</a></li>
<li><a href="#PUSHOVER_EMERGENCY_RETRY_DELAY">PUSHOVER_EMERGENCY_RETRY_DELAY</a></li>
<li><a href="#PUSHOVER_SUBSCRIPTION_URL">PUSHOVER_SUBSCRIPTION_URL</a></li>
<li><a href="#REGISTRATION_OPEN">REGISTRATION_OPEN</a></li>
<li><a href="#REMOTE_USER_HEADER">REMOTE_USER_HEADER</a></li>
<li><a href="#ROCKETCHAT_ENABLED">ROCKETCHAT_ENABLED</a></li>
<li><a href="#RP_ID">RP_ID</a></li>
<li><a href="#S3_ACCESS_KEY">S3_ACCESS_KEY</a></li>
<li><a href="#S3_BUCKET">S3_BUCKET</a></li>
<li><a href="#S3_ENDPOINT">S3_ENDPOINT</a></li>
<li><a href="#S3_REGION">S3_REGION</a></li>
<li><a href="#S3_SECRET_KEY">S3_SECRET_KEY</a></li>
<li><a href="#S3_TIMEOUT">S3_TIMEOUT</a></li>
<li><a href="#S3_SECURE">S3_SECURE</a></li>
<li><a href="#SECRET_KEY">SECRET_KEY</a></li>
<li><a href="#SECURE_PROXY_SSL_HEADER">SECURE_PROXY_SSL_HEADER</a></li>
<li><a href="#SHELL_ENABLED">SHELL_ENABLED</a></li>
<li><a href="#SIGNAL_CLI_SOCKET">SIGNAL_CLI_SOCKET</a></li>
<li><a href="#SITE_LOGO_URL">SITE_LOGO_URL</a></li>
<li><a href="#SITE_NAME">SITE_NAME</a></li>
<li><a href="#SITE_ROOT">SITE_ROOT</a></li>
<li><a href="#SLACK_CLIENT_ID">SLACK_CLIENT_ID</a></li>
<li><a href="#SLACK_CLIENT_SECRET">SLACK_CLIENT_SECRET</a></li>
<li><a href="#SLACK_ENABLED">SLACK_ENABLED</a></li>
<li><a href="#SPIKE_ENABLED">SPIKE_ENABLED</a></li>
<li><a href="#TELEGRAM_BOT_NAME">TELEGRAM_BOT_NAME</a></li>
<li><a href="#TELEGRAM_TOKEN">TELEGRAM_TOKEN</a></li>
<li><a href="#TRELLO_APP_KEY">TRELLO_APP_KEY</a></li>
<li><a href="#TWILIO_ACCOUNT">TWILIO_ACCOUNT</a></li>
<li><a href="#TWILIO_AUTH">TWILIO_AUTH</a></li>
<li><a href="#TWILIO_FROM">TWILIO_FROM</a></li>
<li><a href="#TWILIO_MESSAGING_SERVICE_SID">TWILIO_MESSAGING_SERVICE_SID</a></li>
<li><a href="#TWILIO_USE_WHATSAPP">TWILIO_USE_WHATSAPP</a></li>
<li><a href="#USE_PAYMENTS">USE_PAYMENTS</a></li>
<li><a href="#VICTOROPS_ENABLED">VICTOROPS_ENABLED</a></li>
<li><a href="#WEBHOOKS_ENABLED">WEBHOOKS_ENABLED</a></li>
<li><a href="#WHATSAPP_DOWN_CONTENT_SID">WHATSAPP_DOWN_CONTENT_SID</a></li>
<li><a href="#WHATSAPP_UP_CONTENT_SID">WHATSAPP_UP_CONTENT_SID</a></li>
<li><a href="#ZULIP_ENABLED">ZULIP_ENABLED</a></li>
</ul>
## `ADMINS` {: #ADMINS }
Default: `""` (empty string)
A comma-sepparated list of email addresses to send code error notifications to.
When `DEBUG=False`, Healthchecks will send the details of exceptions raised in the
request/response cycle to the listed addresses. Example:
```ini
ADMINS=alice@example.org,bob@example.org
```
Note: for error notifications to work, make sure you have also specified working
SMTP credentials in the `EMAIL_...` environment variables.
## `ALLOWED_HOSTS` {: #ALLOWED_HOSTS }
Default: `*`
The host/domain names that this site can serve. You can specify multiple domain names
by separating them with commas:
```ini
ALLOWED_HOSTS=my-hc.example.org,alternative-name.example.org
```
Apart from the comma-separated syntax, this is a standard Django setting.
Read more about it in the
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#allowed-hosts).
## `APPRISE_ENABLED` {: #APPRISE_ENABLED }
Default: `False`
A boolean that turns on/off the [Apprise](https://github.com/caronc/apprise)
integration.
Before enabling the Apprise integration, make sure the `apprise` package is installed:
```bash
pip install apprise
```
## `DB` {: #DB }
Default: `sqlite`
The database engine to use. Possible values: `sqlite`, `postgres`, `mysql`.
## `DB_CONN_MAX_AGE` {: #DB_CONN_MAX_AGE }
Default: `0`
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#conn-max-age).
## `DB_HOST` {: #DB_HOST }
Default: `""` (empty string)
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#host).
## `DB_NAME` {: #DB_NAME }
Default: `hc` (PostgreSQL, MySQL) or `/path/to/projectdir/hc.sqlite` (SQLite)
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#name).
## `DB_PASSWORD` {: #DB_PASSWORD }
Default: `""` (empty string)
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#password).
## `DB_PORT` {: #DB_PORT }
Default: `""` (empty string)
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#port).
## `DB_SSLMODE` {: #DB_SSLMODE }
Default: `prefer`
PostgreSQL-specific, [details](https://www.postgresql.org/docs/10/libpq-connect.html#LIBPQ-CONNECT-SSLMODE)
## `DB_TARGET_SESSION_ATTRS` {: #DB_TARGET_SESSION_ATTRS }
Default: `read-write`
PostgreSQL-specific, [details](https://www.postgresql.org/docs/10/libpq-connect.html#LIBPQ-CONNECT-TARGET-SESSION-ATTRS)
## `DB_USER` {: #DB_USER }
Default: `postgres` (PostgreSQL) or `root` (MySQL)
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#user).
## `DEBUG` {: #DEBUG }
Default: `True`
A boolean that turns on/off debug mode.
_Never run a Healthchecks instance in production with the debug mode turned on!_
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#debug).
## `DEFAULT_FROM_EMAIL` {: #DEFAULT_FROM_EMAIL }
Default: `healthchecks@example.org`
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#default-from-email).
## `DISCORD_CLIENT_ID` {: #DISCORD_CLIENT_ID }
Default: `None`
The Discord Client ID, required by the Discord integration.
To set up the Discord integration:
* Register a new application at
[https://discordapp.com/developers/applications/me](https://discordapp.com/developers/applications/me)
* Add a Redirect URI to your Discord application. The URI format is
`SITE_ROOT/integrations/add_discord/`. For example, if `your SITE_ROOT`
is `https://my-hc.example.org` then the Redirect URI would be
`https://my-hc.example.org/integrations/add_discord/`
* Look up your Discord app's _Client ID_ and _Client Secret_. Put them
in the `DISCORD_CLIENT_ID` and `DISCORD_CLIENT_SECRET` environment
variables.
## `DISCORD_CLIENT_SECRET` {: #DISCORD_CLIENT_SECRET }
Default: `None`
The Discord Client Secret, required by the Discord integration. Look it up at
[https://discordapp.com/developers/applications/me](https://discordapp.com/developers/applications/me).
## `EMAIL_HOST` {: #EMAIL_HOST }
Default: `""` (empty string)
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#email-host).
## `EMAIL_HOST_PASSWORD` {: #EMAIL_HOST_PASSWORD }
Default: `""` (empty string)
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#email-host-password).
## `EMAIL_HOST_USER` {: #EMAIL_HOST_USER }
Default: `""` (empty string)
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#email-host-user).
## `EMAIL_PORT` {: #EMAIL_PORT }
Default: `587`
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#email-port).
## `EMAIL_USE_TLS` {: #EMAIL_USE_TLS }
Default: `True`
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#email-use-tls).
## `EMAIL_USE_SSL` {: #EMAIL_USE_SSL}
Default: `False`
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#email-use-ssl).
## `EMAIL_USE_VERIFICATION` {: #EMAIL_USE_VERIFICATION }
Default: `True`
A boolean that turns on/off a verification step when adding an email integration.
If enabled, whenever a user adds an email integration, Healthchecks emails a
verification link to the new address. The new integration becomes active only
after the user clicks the verification link.
If you are setting up a private healthchecks instance where
you trust your users, you can opt to disable the verification step. In that case,
set `EMAIL_USE_VERIFICATION` to `False`.
## `http_proxy` and `https_proxy` {: #http_proxy}
Default: `""` (empty string)
Specifies the proxy server to use for outgoing HTTP and HTTPS requests.
Supports different proxy server types. Examples:
```ini
https_proxy=http://example.org:1234
https_proxy=https://example.org:1234
https_proxy=socks4://example.org:1234
https_proxy=socks5://example.org:1234
```
Healthchecks uses libcurl as the HTTP client library for making HTTP(S) requests.
For more information about the proxy functionality, please see
[libcurl documentation](https://curl.se/libcurl/c/CURLOPT_PROXY.html).
Note: If your proxy server has a private IP address, you will also need to
set the `INTEGRATIONS_ALLOW_PRIVATE_IPS` setting to `True` to use it.
## `INTEGRATIONS_ALLOW_PRIVATE_IPS` {: #INTEGRATIONS_ALLOW_PRIVATE_IPS }
Default: `False`
A boolean that controls whether the integrations are allowed to make
HTTP(S) requests to private IP addresses (127.0.0.1, 192.168.x.x, ...). This setting
is set to `False` by default, because allowing users to define webhooks that probe
internal addresses is a security risk.
Only enable this setting if you run your Healthchecks instance in a trusted
environment, and need to integrate with services running in your internal network.
This setting affects all integration types, not just webhooks. For example,
if you run a Gotify instance on `localhost`, you will need to enable
`INTEGRATIONS_ALLOW_PRIVATE_IPS` to be able to use it via the Gotify integration.
This setting affects all outbound HTTP requests, including those made
while setting up new integrations (e.g. during the OAuth2 authorization flow).
This setting also affects connections to the proxy server when the `http_proxy` or
`https_proxy` environment variables are set. If your proxy server has a private
IP address, you will need to enable `INTEGRATIONS_ALLOW_PRIVATE_IPS` to use it.
## `LINENOTIFY_CLIENT_ID` {: #LINENOTIFY_CLIENT_ID }
Default: `None`
## `LINENOTIFY_CLIENT_SECRET` {: #LINENOTIFY_CLIENT_SECRET }
Default: `None`
## `MASTER_BADGE_LABEL` {: #MASTER_BADGE_URL }
Default: same as `SITE_NAME`
The label for the "Overall Status" status badge.
## `MATRIX_ACCESS_TOKEN` {: #MATRIX_ACCESS_TOKEN }
Default: `None`
The [Matrix](https://matrix.org/) bot user's access token, required by the Matrix
integration.
To set up the Matrix integration:
* Register a bot user (for posting notifications) in your preferred Matrix homeserver.
* Use the [Login API call](https://www.matrix.org/docs/guides/client-server-api#login)
to retrieve bot user's access token. You can run it as shown in the documentation,
using curl in the command shell.
* Set the `MATRIX_` environment variables. Example:
```ini
MATRIX_ACCESS_TOKEN=[a long string of characters returned by the login call]
MATRIX_HOMESERVER=https://matrix.org
MATRIX_USER_ID=@mychecks:matrix.org
```
## `MATRIX_HOMESERVER` {: #MATRIX_HOMESERVER }
Default: `None`
The Matrix bot's homeserver address, required by the Matrix integration.
## `MATRIX_USER_ID` {: #MATRIX_USER_ID }
Default: `None`
The Matrix bot's user identifier, required by the Matrix integration.
## `MATTERMOST_ENABLED` {: #MATTERMOST_ENABLED }
Default: `True`
A boolean that turns on/off the Mattermost integration. Enabled by default.
## `MSTEAMS_ENABLED` {: #MSTEAMS_ENABLED }
Default: `True`
A boolean that turns on/off the MS Teams integration. Enabled by default.
## `OPSGENIE_ENABLED` {: #OPSGENIE_ENABLED }
Default: `True`
A boolean that turns on/off the Opsgenie integration. Enabled by default.
## `PAGERTREE_ENABLED` {: #PAGERTREE_ENABLED }
Default: `True`
A boolean that turns on/off the PagerTree integration. Enabled by default.
## `PD_APP_ID` {: #PD_APP_ID }
Default: `None`
PagerDuty application ID. If set, enables the PagerDuty
[Simple Install Flow](https://developer.pagerduty.com/docs/app-integration-development/events-integration/).
If `None`, Healthchecks will fall back to the even simpler flow where users manually
copy integration keys from PagerDuty and paste them in Healthchecks.
To set up:
* Register a PagerDuty app at [PagerDuty](https://pagerduty.com/) Developer Mode My Apps
* In the newly created app, add the "Events Integration" functionality
* Specify a Redirect URL: `https://your-domain.com/integrations/add_pagerduty/`
* Copy the displayed app_id value (PXXXXX) and put it in the `PD_APP_ID` environment
variable
## `PD_ENABLED` {: #PD_ENABLED }
Default: `True`
A boolean that turns on/off the PagerDuty integration. Enabled by default.
## `PING_BODY_LIMIT` {: #PING_BODY_LIMIT }
Default: `10000`
The upper size limit in bytes for logged ping request bodies.
The default value is 10000 (10 kilobytes). You can adjust the limit or you can remove
it altogether by setting this value to `None`.
## `PING_EMAIL_DOMAIN` {: #PING_EMAIL_DOMAIN }
Default: `localhost`
The domain to use for generating ping email addresses. Example:
```ini
PING_EMAIL_DOMAIN=hc.example.org
```
In this example, Healthchecks would generate ping email addresses similar
to `3f1a7317-8e96-437c-a17d-b0d550b51e86@hc.example.org`.
This setting only controls how the ping email addresses are constructed, and
does not by itself enable the ping-by-sending-email functionality. To receive
emails, you will also need:
* A DNS record pointing `hc.example.org` to your Healthchecks
instance's IP address.
* `manage.py smtpd` (Healthchecks' SMTP listener service) running, listening
on port 25, and reachable from the outside world. If you are using the
[official Docker image](https://hub.docker.com/r/healthchecks/healthchecks),
see [the instructions here](../self_hosted_docker/#SMTPD_PORT) for enabling the SMTP
listener service.
## `PING_ENDPOINT` {: #PING_ENDPOINT }
Default: `SITE_ROOT` + `/ping/`
The base URL to use for constructing ping URLs for display. Healthchecks constructs ping
URLs by appending either an UUID value or `<ping-key>/<slug>` value to `PING_ENDPOINT`.
Notes:
* Make sure the `PING_ENDPOINT` value ends with a trailing slash. If a trailing slash
is missing, Healthchecks will *not* add it implicitly.
* Healthchecks uses `PING_ENDPOINT` for formatting ping URLs for display.
The `PING_ENDPOINT` value does not influence the routing of incoming HTTP requests.
If you change the `PING_ENDPOINT` value, you will likely also need to add matching
URL rewriting rules in your reverse proxy configuration.
Example:
```ini
PING_ENDPOINT=https://ping.my-hc.example.org/
```
With this setting, Healthchecks will generate ping URLs similar to:
```
https://ping.my-hc.example.org/3f1a7317-8e96-437c-a17d-b0d550b51e86
https://ping.my-hc.example.org/1fj9XWM6Ns8vLGTmnPGk9g/dummy-slug
```
## `PROMETHEUS_ENABLED` {: #PROMETHEUS_ENABLED }
Default: `True`
A boolean that turns on/off the Prometheus integration. Enabled by default.
## `PUSHBULLET_CLIENT_ID` {: #PUSHBULLET_CLIENT_ID }
Default: `None`
The Pushbullet Client ID, required by the Pushbullet integration.
To set up the Pushbullet integration:
* Add a new OAuth client at
[https://www.pushbullet.com/#settings/clients](https://www.pushbullet.com/#settings/clients)
* Add a `redirect_uri` to your OAuth client. The URI format is
`SITE_ROOT/integrations/add_pushbullet/`. For example, if `your SITE_ROOT`
is `https://my-hc.example.org` then the `redirect_uri` would be
`https://my-hc.example.org/integrations/add_pushbullet/`
* Look up your OAuth client's `client_id` and `client_secret` values. Put them
in the `PUSHBULLET_CLIENT_ID` and `PUSHBULLET_CLIENT_SECRET` environment
variables.
Read more about setting up a Pushbullet OAuth client in the
[Pushbullet OAuth2 guide](https://docs.pushbullet.com/#oauth2).
## `PUSHBULLET_CLIENT_SECRET` {: #PUSHBULLET_CLIENT_SECRET }
Default: `None`
The Pushbullet Client Secret, required by the Pushbullet integration. Look it up at
[https://www.pushbullet.com/#settings/clients](https://www.pushbullet.com/#settings/clients).
## `PUSHOVER_API_TOKEN` {: #PUSHOVER_API_TOKEN }
Default: `None`
The [Pushover](https://pushover.net/) API token, required by the Pushover integration.
To enable the Pushover integration:
* Register a new Pushover application at
[https://pushover.net/apps/build](https://pushover.net/apps/build).
* Within the Pushover application configuration, enable subscriptions.
Make sure the subscription type is set to "URL". Also make sure the redirect
URL is configured to point back to the root of the Healthchecks instance
(e.g., `https://my-hc.example.org/`).
* Put the Pushover application's _API Token_ and the _Subscription URL_ in
`PUSHOVER_API_TOKEN` and `PUSHOVER_SUBSCRIPTION_URL` environment
variables. The Pushover subscription URL should look similar to
`https://pushover.net/subscribe/yourAppName-randomAlphaNumericData`.
## `PUSHOVER_EMERGENCY_EXPIRATION` {: #PUSHOVER_EMERGENCY_EXPIRATION }
Default: `86400` (24 hours)
Specifies how many seconds an emergency Pushover notification
will continue to be retried for.
More information in [Pushover API documentation](https://pushover.net/api#priority).
## `PUSHOVER_EMERGENCY_RETRY_DELAY` {: #PUSHOVER_EMERGENCY_RETRY_DELAY }
Default: `300` (5 minutes)
Specifies how often (in seconds) the Pushover servers will send the same notification
to the user.
More information in [Pushover API documentation](https://pushover.net/api#priority).
## `PUSHOVER_SUBSCRIPTION_URL` {: #PUSHOVER_SUBSCRIPTION_URL }
Default: `None`
The Pushover Subscription URL, required by the Pushover integration.
## `REGISTRATION_OPEN` {: #REGISTRATION_OPEN }
Default: `True`
A boolean that controls whether site visitors can create new accounts.
Set it to `False` if you are setting up a private Healthchecks instance, but
it needs to be publicly accessible (so, for example, your cloud services
can send pings to it).
If you close new user registration, you can still selectively invite users
to your team account.
## `REMOTE_USER_HEADER` {: #REMOTE_USER_HEADER }
Default: `None`
Specifies the request header to use for external authentication. If you use
a reverse proxy that handles user authentication, and the reverse proxy can pass
the authenticated user's email address in an HTTP request header, you can use this
setting to integrate Healthchecks with it.
When `REMOTE_USER_HEADER` is set, Healthchecks will:
- in views that require authentication, look up the request header
specified in `REMOTE_USER_HEADER`
- assume the header contains the user's email address
- automatically log in the user with a matching email address
- automatically create a user account if it does not exist
- disable the default authentication methods (login link to email, password)
The header name in `REMOTE_USER_HEADER` must be specified in upper-case,
with any dashes replaced with underscores, and prefixed with `HTTP_`. For
example, if your authentication proxy sets a `X-Authenticated-User` request
header, you should set `REMOTE_USER_HEADER=HTTP_X_AUTHENTICATED_USER`.
**Important:** When this option is enabled, **Healthchecks will trust the header's
value implicitly**, so it is **very important** to ensure that attackers cannot
set the value themselves (and thus impersonate any user). How to do this varies by
your chosen proxy, but generally involves configuring it to strip out headers that
normalize to the same name as the chosen identity header.
**On using `local_settings.py`:**
When Healthchecks reads settings from environment variables and encounters
the `REMOTE_USER_HEADER` environment variable, it sets *two* settings,
`REMOTE_USER_HEADER` and `AUTHENTICATION_BACKENDS`. This logic has already run by the
time Healthchecks reads `local_settings.py`. Therefore, if you configure Healthchecks
using the `local_settings.py` file instead of environment variables, and specify
`REMOTE_USER_HEADER` there, you will also need a line which sets the other setting,
`AUTHENTICATION_BACKENDS`:
```
REMOTE_USER_HEADER = "HTTP_X_AUTHENTICATED_USER"
AUTHENTICATION_BACKENDS = ["hc.accounts.backends.CustomHeaderBackend"]
```
## `ROCKETCHAT_ENABLED` {: #ROCKETCHAT_ENABLED }
Default: `True`
A boolean that turns on/off the Rocket.Chat integration. Enabled by default.
## `RP_ID` {: #RP_ID }
Default: `None`
The [Relying Party identifier](https://www.w3.org/TR/webauthn-2/#relying-party-identifier),
required by the WebAuthn second-factor authentication feature.
Healthchecks optionally supports two-factor authentication using the WebAuthn
standard. To enable WebAuthn support, set the `RP_ID` setting to a non-null value.
Set its value to your site's domain without scheme and without port. For example,
if your site runs on `https://my-hc.example.org`, set `RP_ID` to `my-hc.example.org`.
Note that WebAuthn requires HTTPS, even if running on localhost. To test WebAuthn
locally with a self-signed certificate, you can use the `runsslserver` command
from the `django-sslserver` package.
## `S3_ACCESS_KEY` {: #S3_ACCESS_KEY }
Default: `None`
Access key of an account in S3 service.
Healthchecks can optionally upload ping request body data to S3-compatible object
storage instead of storing it in the database. To use this feature, provide valid
credentials to an S3-compatible service by setting the following environment variables:
* `S3_ACCESS_KEY` (example: `AKIAFIXMEFIXME`)
* `S3_BUCKET` (example: `my-bucket`)
* `S3_ENDPOINT` (example: `s3.eu-central-1.amazonaws.com`)
* `S3_REGION` (example: `eu-central-1`)
* `S3_SECRET_KEY`
## `S3_BUCKET` {: #S3_BUCKET }
Default: `None`
Name of the bucket in S3 service for storing ping request body data.
## `S3_ENDPOINT` {: #S3_ENDPOINT }
Default: `None`
URL to the S3-compatible service.
## `S3_REGION` {: #S3_REGION }
Default: `None`
Region name of buckets in S3 service.
## `S3_SECRET_KEY` {: #S3_SECRET_KEY }
Default: `None`
The secret key of an account in S3 service.
## `S3_TIMEOUT` {: #S3_TIMEOUT }
Default: `60`
Timeout for individual S3 operations, in seconds.
## `S3_SECURE` {: #S3_SECURE }
Default: `True`
Whether to use secure (TLS) connection to S3 or not. To
use unencrypted HTTP requests, set this value to `False`.
## `SECRET_KEY` {: #SECRET_KEY }
Default: `---`
A secret key used for cryptographic signing. Should be set to a unique,
unpredictable value.
This is a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#secret-key).
## `SECURE_PROXY_SSL_HEADER` {: #SECURE_PROXY_SSL_HEADER }
Default: `None`
Comma-separated HTTP header name and value that signifies a request is secure
(made over https://). This information is important for CSRF protection.
If Healthchecks is running behind a proxy, the proxy may be "swallowing" whether the original
request uses HTTPS or not. In this case, you may see HTTP 403 errors when submitting
forms (for example, trying to log in).
If set, the value should contain the name of the header to look for and the required
value, separated with comma. The header name must be specified in upper-case,
with any dashes replaced with underscores, and prefixed with `HTTP_`. Example:
```ini
# environment variable
SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https
```
You should *only* set this environment variable if you control your proxy or have some
other guarantee that it sets/strips this header appropriately.
**Note on using `local_settings.py`:**
When Healthchecks reads settings from environment variables, it expects
`SECURE_PROXY_SSL_HEADER` to contain header name and value, separated with comma.
If you set `SECURE_PROXY_SSL_HEADER` in `local_settings.py`, it should be a
a tuple with two elements instead:
```ini
# in local_settings.py
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
```
This environment variable maps to a standard Django setting, read more in
[Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#secure-proxy-ssl-header).
## `SHELL_ENABLED` {: #SHELL_ENABLED }
Default: `False`
A boolean that turns on/off the "Shell Commands" integration.
The "Shell Commands" integration runs user-defined local shell commands when checks
go up or down. This integration is disabled by default and can be enabled by setting
the `SHELL_ENABLED` environment variable to `True`.
Note: be careful when using "Shell Commands" integration, and only enable it when
you fully trust the users of your Healthchecks instance. The commands will be executed
by the `manage.py sendalerts` process and will run with its system permissions.
## `SIGNAL_CLI_SOCKET` {: #SIGNAL_CLI_SOCKET }
Default: `None`
The path to the signal-cli UNIX socket, or the hostname:port of the signal-cli
TCP socket.
Example (UNIX socket):
```ini
SIGNAL_CLI_SOCKET=/tmp/signal-cli.socket
```
Example (TCP socket):
```ini
SIGNAL_CLI_SOCKET=example.org:7583
```
Healthchecks uses [signal-cli](https://github.com/AsamK/signal-cli) to send Signal
notifications. Healthcecks interacts with signal-cli over UNIX or TCP socket (requires
signal-cli 0.10.0 or later).
To enable the Signal integration:
* Set up and configure signal-cli to expose JSON RPC on an UNIX or TCP socket
([instructions](https://github.com/AsamK/signal-cli/wiki/JSON-RPC-service)).
Example: `signal-cli -a +xxxxxx daemon --socket /tmp/signal-cli-socket`
* Put the socket's location in the `SIGNAL_CLI_SOCKET` environment variable.
## `SITE_LOGO_URL` {: #SITE_LOGO_URL }
Default: `None`
An URL pointing to the image you want to use as the site logo. If not set,
Healthchecks will use a fallback image: `/static/img/logo.png`.
You can place a custom logo in `/static/img/`, run `manage.py collectstatic`, and
point `SITE_LOGO_URL` to it like so:
```ini
SITE_LOGO_URL=/static/img/my-custom-logo.png
```
Or you can serve the logo from another server, and point to it using an absolute URL:
```ini
SITE_LOGO_URL=https://example.org/cdn/my-custom-logo.png
```
Either way, Healthchecks will use the provided `SITE_LOGO_URL` value as-is in HTML
pages, and you should use an URL that **the end user's browser will be able to
access directly**. The logo image can use any image format supported by browsers
(PNG, SVG, JPG are all fine).
**Docker note.** You can build a custom Docker image with your logo "baked in". To
do so, use a Dockerfile with the following contents, and with your logo.png placed next
to it:
```docker
FROM healthchecks/healthchecks
COPY logo.png /opt/healthchecks/static-collected/img/
```
This overwrites the default placeholder logo, so, in this case, you do not need to
specify `SITE_LOGO_URL`. Notice that the logo must be placed in `static-collected`, not
`static`. This is because `manage.py collectstatic` has already been run in the base
image's build time, and the web server will not recognize any new files placed in the
`static` directory.
Please do not use the Healthchecks.io logo (the one with the dark green background) on
self-hosted instances. This logo is not part of the Healthchecks open-source project.
## `SITE_NAME` {: #SITE_NAME }
Default: `Mychecks`
The display name of this Healthchecks instance. Healthchecks uses it throughout
its web UI and documentation.
## `SITE_ROOT` {: #SITE_ROOT }
Default: `http://localhost:8000`
The base URL of this Healthchecks instance. Healthchecks uses `SITE_ROOT` whenever
it needs to construct absolute URLs.
## `SLACK_CLIENT_ID` {: #SLACK_CLIENT_ID }
Default: `None`
The Slack Client ID, used by the Healthchecks integration for Slack.
The integration can work with or without the Slack Client ID. If
the Slack Client ID is not set, in the "Integrations - Add Slack" page,
Healthchecks will ask the user to provide a webhook URL for posting notifications.
If the Slack Client ID _is_ set, Healthchecks will use the OAuth2 flow
to get the webhook URL from Slack. The OAuth2 flow is more user-friendly.
To set it up, go to [https://api.slack.com/apps/](https://api.slack.com/apps/)
and create a _Slack app_. When setting up the Slack app, make sure to:
* Add the [incoming-webhook](https://api.slack.com/scopes/incoming-webhook)
scope to the Bot Token Scopes.
* Add a _Redirect URL_ in the format `SITE_ROOT/integrations/add_slack_btn/`.
For example, if your `SITE_ROOT` is `https://my-hc.example.org` then the
Redirect URL would be `https://my-hc.example.org/integrations/add_slack_btn/`.
## `SLACK_CLIENT_SECRET` {: #SLACK_CLIENT_SECRET }
Default: `None`
The Slack Client Secret. Required if `SLACK_CLIENT_ID` is set.
Look it up at [https://api.slack.com/apps/](https://api.slack.com/apps/).
## `SLACK_ENABLED` {: #SLACK_ENABLED }
Default: `True`
A boolean that turns on/off the Healthchecks integration for Slack. Enabled by default.
## `SPIKE_ENABLED` {: #SPIKE_ENABLED }
Default: `True`
A boolean that turns on/off the Spike.sh integration. Enabled by default.
## `TELEGRAM_BOT_NAME` {: #TELEGRAM_BOT_NAME }
Default: `ExampleBot`
The [Telegram](https://telegram.org/) bot name, required by the Telegram integration.
To set up the Telegram integration:
* Create a Telegram bot by talking to the
[BotFather](https://core.telegram.org/bots#6-botfather). Set the bot's name,
description, user picture, and add a "/start" command.
* After creating the bot you will have the bot's name and token. Put them
in `TELEGRAM_BOT_NAME` and `TELEGRAM_TOKEN` environment variables.
* Run the `settelegramwebhook` management command. This command tells Telegram
where to forward channel messages by invoking Telegram's
[setWebhook](https://core.telegram.org/bots/api#setwebhook) API call:
```bash
$ ./manage.py settelegramwebhook
Done, Telegram's webhook set to: https://my-monitoring-project.com/integrations/telegram/bot/
```
For this to work, your `SITE_ROOT` must be publicly accessible and use the "https://"
scheme.
## `TELEGRAM_TOKEN` {: #TELEGRAM_TOKEN }
Default: `None`
The Telegram bot user's authentication token, required by the Telegram integration.
## `TRELLO_APP_KEY` {: #TRELLO_APP_KEY }
Default: `None`
The [Trello](https://trello.com/) app key, required by the Trello integration.
To set up the Trello integration, get a developer API key from
[https://trello.com/app-key](https://trello.com/app-key) and put it in the
`TRELLO_APP_KEY` environment variable.
## `TWILIO_ACCOUNT` {: #TWILIO_ACCOUNT }
Default: `None`
Twilio Account SID, required by the SMS, Call, and WhatsApp integrations.
## `TWILIO_AUTH` {: #TWILIO_AUTH }
Default: `None`
Twilio Auth token, required by the SMS, Call, and WhatsApp integrations.
## `TWILIO_FROM` {: #TWILIO_FROM }
Default: `None`
The Twilio phone number to use as the sender for SMS and WhatsApp notifications,
and as the caller for Call integrations.
Example:
```ini
TWILIO_FROM=+15017122661
```
## `TWILIO_MESSAGING_SERVICE_SID` {: #TWILIO_MESSAGING_SERVICE_SID }
Default: `None`
The Twilio Messaging Service SID for sending SMS and WhatsApp notifications.
`TWILIO_MESSAGING_SERVICE_SID` is **required** for sending WhatsApp notifications.
`TWILIO_MESSAGING_SERVICE_SID` is **optional** for sending SMS notifications. If specified,
Healthchecks will pass it in the "MessagingServiceSid" field to Twilio API. This will
result in Twilio using a Messaging Service instead of a plain sender number to deliver
the SMS messages. If not specified, Healthchecks will fall back to using
the "From" field with the value configured in [TWILIO_FROM](#TWILIO_FROM).
Example:
```ini
TWILIO_MESSAGING_SERVICE_SID=MGe56e622d540e6badc52ae0ac4af028c6
```
## `TWILIO_USE_WHATSAPP` {: #TWILIO_USE_WHATSAPP }
Default: `False`
A boolean that turns on/off the WhatsApp integration. For the WhatsApp integration
to work, you will also need to specify:
* [TWILIO_ACCOUNT](#TWILIO_ACCOUNT)
* [TWILIO_AUTH](#TWILIO_AUTH)
* [TWILIO_FROM](#TWILIO_FROM)
* [TWILIO_MESSAGING_SERVICE_SID](#TWILIO_MESSAGING_SERVICE_SID)
* [WHATSAPP_DOWN_CONTENT_SID](#WHATSAPP_DOWN_CONTENT_SID)
* [WHATSAPP_UP_CONTENT_SID](#WHATSAPP_UP_CONTENT_SID).
## `USE_PAYMENTS` {: #USE_PAYMENTS }
Default: `False`
A boolean that turns on/off billing features.
## `VICTOROPS_ENABLED` {: #VICTOROPS_ENABLED }
Default: `True`
A boolean that turns on/off the Splunk On-Call (VictorOps) integration.
Enabled by default.
## `WEBHOOKS_ENABLED` {: #WEBHOOKS_ENABLED }
Default: `True`
A boolean that turns on/off the Webhooks integration. Enabled by default.
## `WHATSAPP_DOWN_CONTENT_SID` {: #WHATSAPP_DOWN_CONTENT_SID }
Default: `None`
Identifier of the Twilio content template to use for WhatsApp "down" notifications.
Required by the WhatsApp integration.
Meta requires WhatsApp message templates to be pre-registered and approved.
Create a content template in your Twilio account with the following contents:
````
The check “{{1}}” is DOWN.
````
You can tweak the message contents as needed, but make sure it has a single placeholder
similar to the above example.
## `WHATSAPP_UP_CONTENT_SID` {: #WHATSAPP_UP_CONTENT_SID }
Default: `None`
Identifier of the Twilio content template to use for WhatsApp "up" notifications.
Required by the WhatsApp integration.
Meta requires WhatsApp message templates to be pre-registered and approved.
Create a content template in your Twilio account with the following contents:
````
The check “{{1}}” is now UP.
````
You can tweak the message contents as needed, but make sure it has a single placeholder
similar to the above example.
## `ZULIP_ENABLED` {: #ZULIP_ENABLED }
Default: `True`
A boolean that turns on/off the Zulip integration. Enabled by default.