7.6 KiB
Configuring the ntfy server
The ntfy server can be configured in three ways: using a config file (typically at /etc/ntfy/config.yml
,
see config.yml), via command line arguments
or using environment variables.
Quick start
By default, simply running ntfy
will start the server at port 80. No configuration needed. Batteries included 😀.
If everything works as it should, you'll see something like this:
$ ntfy
2021/11/30 19:59:08 Listening on :80
You can immediately start publishing messages, or subscribe via the Android app,
the web UI, or simply via curl or your favorite HTTP client. To configure
the server further, check out the config options table or simply type ntfy --help
to
get a list of command line options.
Config options
Each config options can be set in the config file /etc/ntfy/config.yml
(e.g. listen-http: :80
) or as a
CLI option (e.g. --listen-http :80
. Here's a list of all available options. Alternatively, you can set an environment
variable before running the ntfy
command (e.g. export NTFY_LISTEN_HTTP=:80
).
Config option | Env variable | Format | Default | Description |
---|---|---|---|---|
listen-http |
NTFY_LISTEN_HTTP |
[host]:port |
:80 |
Listen address for the HTTP web server |
firebase-key-file |
NTFY_FIREBASE_KEY_FILE |
filename | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. |
cache-file |
NTFY_CACHE_FILE |
filename | - | If set, messages are cached in a local SQLite database instead of only in-memory. This allows for service restarts without losing messages in support of the since= parameter. |
cache-duration |
NTFY_CACHE_DURATION |
duration | 12h | Duration for which messages will be buffered before they are deleted. This is required to support the since=... and poll=1 parameter. |
keepalive-interval |
NTFY_KEEPALIVE_INTERVAL |
duration | 30s | Interval in which keepalive messages are sent to the client. This is to prevent intermediaries closing the connection for inactivity. Note that the Android app has a hardcoded timeout at 77s, so it should be less than that. |
manager-interval |
$NTFY_MANAGER_INTERVAL |
duration | 1m | Interval in which the manager prunes old messages, deletes topics and prints the stats. |
global-topic-limit |
NTFY_GLOBAL_TOPIC_LIMIT |
number | 5000 | Rate limiting: Total number of topics before the server rejects new topics. |
visitor-subscription-limit |
NTFY_VISITOR_SUBSCRIPTION_LIMIT |
number | 30 | Rate limiting: Number of subscriptions per visitor (IP address) |
visitor-request-limit-burst |
NTFY_VISITOR_REQUEST_LIMIT_BURST |
number | 60 | Allowed GET/PUT/POST requests per second, per visitor. This setting is the initial bucket of requests each visitor has |
visitor-request-limit-replenish |
NTFY_VISITOR_REQUEST_LIMIT_REPLENISH |
duration | 10s | Strongly related to visitor-request-limit-burst : The rate at which the bucket is refilled |
behind-proxy |
NTFY_BEHIND_PROXY |
bool | false | If set, the X-Forwarded-For header is used to determine the visitor IP address instead of the remote address of the connection. |
The format for a duration is: <number>(smh)
, e.g. 30s, 20m or 1h.
Firebase (FCM)
!!! info Using Firebase is optional and only works if you modify and build your own Android .apk. For a self-hosted instance, it's easier to just not bother with FCM.
Firebase Cloud Messaging (FCM) is the Google approved way to send push messages to Android devices. FCM is the only method that an Android app can receive messages without having to run a foreground service.
For the main host ntfy.sh, the ntfy Android App uses Firebase to send messages to the device. For other hosts, instant delivery is used and FCM is not involved.
To configure FCM for your self-hosted instance of the ntfy server, follow these steps:
- Sign up for a Firebase account
- Create an app and download the key file (e.g.
myapp-firebase-adminsdk-ahnce-....json
) - Place the key file in
/etc/ntfy
, set thefirebase-key-file
inconfig.yml
accordingly and restart the ntfy server - Build your own Android .apk following these instructions
Example:
# If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app.
# This is optional and only required to support Android apps (which don't allow background services anymore).
#
firebase-key-file: "/etc/ntfy/ntfy-sh-firebase-adminsdk-ahnce-9f4d6f14b5.json"
Behind a proxy (TLS, etc.)
!!! warning
If you are behind a proxy, you must set the behind-proxy
flag. Otherwise all visitors are rate limited
as if they are one.
*TLS/SSL: ntfy does not support TLS at this time.
If you are running ntfy behind a proxy (e.g. nginx, HAproxy or Apache), you should set the behind-proxy
flag. This will
instruct the rate limiting logic to use the X-Forwarded-For
header as the primary identifier
Rate limiting
Rate limiting: Allowed GET/PUT/POST requests per second, per visitor:
- visitor-request-limit-burst is the initial bucket of requests each visitor has
- visitor-request-limit-replenish is the rate at which the bucket is refilled
Command line options
$ ntfy --help
NAME:
ntfy - Simple pub-sub notification service
USAGE:
ntfy [OPTION..]
GLOBAL OPTIONS:
--config value, -c value config file (default: /etc/ntfy/config.yml) [$NTFY_CONFIG_FILE]
--listen-http value, -l value ip:port used to as listen address (default: ":80") [$NTFY_LISTEN_HTTP]
--firebase-key-file value, -F value Firebase credentials file; if set additionally publish to FCM topic [$NTFY_FIREBASE_KEY_FILE]
--cache-file value, -C value cache file used for message caching [$NTFY_CACHE_FILE]
--cache-duration since, -b since buffer messages for this time to allow since requests (default: 12h0m0s) [$NTFY_CACHE_DURATION]
--keepalive-interval value, -k value interval of keepalive messages (default: 30s) [$NTFY_KEEPALIVE_INTERVAL]
--manager-interval value, -m value interval of for message pruning and stats printing (default: 1m0s) [$NTFY_MANAGER_INTERVAL]
--global-topic-limit value, -T value total number of topics allowed (default: 5000) [$NTFY_GLOBAL_TOPIC_LIMIT]
--visitor-subscription-limit value, -V value number of subscriptions per visitor (default: 30) [$NTFY_VISITOR_SUBSCRIPTION_LIMIT]
--visitor-request-limit-burst value, -B value initial limit of requests per visitor (default: 60) [$NTFY_VISITOR_REQUEST_LIMIT_BURST]
--visitor-request-limit-replenish value, -R value interval at which burst limit is replenished (one per x) (default: 10s) [$NTFY_VISITOR_REQUEST_LIMIT_REPLENISH]
--behind-proxy, -P if set, use X-Forwarded-For header to determine visitor IP address (for rate limiting) (default: false) [$NTFY_BEHIND_PROXY]
Try 'ntfy COMMAND --help' for more information.
ntfy v1.4.8 (7b8185c), runtime go1.17, built at 1637872539
Copyright (C) 2021 Philipp C. Heckel, distributed under the Apache License 2.0