This guide provides instructions for installing the ntfy server on various Linux distributions, as well as other operating systems. ntfy is a simple HTTP-based pub-sub notification service.
This method works on any Linux distribution that supports the specific architecture of your system.
Run uname -m to check your architecture:
x86_64 or amd64armv7 or armhfarm64 (aarch64)armv6Example for x86_64/amd64:
wget https://github.com/binwiederhier/ntfy/releases/download/v2.28.0/ntfy_2.28.0_linux_amd64.tar.gz
tar zxvf ntfy_2.28.0_linux_amd64.tar.gz
Example for armv7/armhf:
wget https://github.com/binwiederhier/ntfy/releases/download/v2.28.0/ntfy_2.28.0_linux_armv7.tar.gz
tar zxvf ntfy_2.28.0_linux_armv7.tar.gz
Example for arm64:
wget https://github.com/binwiederhier/ntfy/releases/download/v2.28.0/ntfy_2.28.0_linux_arm64.tar.gz
tar zxvf ntfy_2.28.0_linux_arm64.tar.gz
# Copy the binary to /usr/bin
sudo cp -a <architecture>/ntfy /usr/bin/ntfy
# Create config directory and copy files
sudo mkdir -p /etc/ntfy
sudo cp <architecture>/client/client.yml /etc/ntfy/
sudo cp <architecture>/server/server.yml /etc/ntfy/
sudo ntfy serve
If you want the server to start automatically at boot, use systemd.
systemctl --version).Copy the Service Unit File:
# Replace <architecture> with your system's architecture (e.g., amd64, armv7)
sudo mv <architecture>/server/ntfy.service /etc/systemd/system/
sudo chmod 644 /etc/systemd/system/ntfy.service
Reload Systemd and Start the Service:
sudo systemctl daemon-reload
sudo systemctl enable ntfy
sudo systemctl start ntfy
Verify Status:
sudo systemctl status ntfy
For systems using OpenRC (e.g., Alpine Linux, Gentoo).
Copy the Service Script:
# Replace <architecture> with your system's architecture
sudo mv <architecture>/server/ntfy.openrc /etc/init.d/ntfy
sudo chmod 755 /etc/init.d/ntfy
Start the Service:
sudo rc-service ntfy start
Add to Default Runlevel (to start at boot):
sudo rc-update add ntfy default
Note: As of late 2025, the official repository has moved to archive.ntfy.sh. The old one (heckel.io) is deprecated.
# Add keyring
sudo mkdir -p /etc/apt/keyrings
sudo curl -L -o /etc/apt/keyrings/ntfy.gpg https://archive.ntfy.sh/apt/keyring.gpg
sudo apt install apt-transport-https
# Add repository
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/ntfy.gpg] https://archive.ntfy.sh/apt stable main" | sudo tee /etc/apt/sources.list.d/ntfy.list
# Update and Install
sudo apt update
sudo apt install ntfy
wget https://github.com/binwiederhier/ntfy/releases/download/v2.28.0/ntfy_2.28.0_linux_amd64.deb
sudo dpkg -i ntfy_*.deb
sudo systemctl enable ntfy
sudo systemctl start ntfy
# Install RPM
sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.28.0/ntfy_2.28.0_linux_amd64.rpm
# Enable and Start
sudo systemctl enable ntfy
sudo systemctl start ntfy
paru -S ntfysh-bin
curl https://aur.archlinux.org/cgit/aur.git/snapshot/ntfysh-bin.tar.gz | tar xzv
cd ntfysh-bin
makepkg -si
services.ntfy-sh.enable = true; to your /etc/nixos/configuration.nix and run nixos-rebuild switch.nix-env -iA ntfy-shpkg install go-ntfy
macOS supports the CLI (ntfy publish, ntfy subscribe) but does not support the server via official packages.
curl -L https://github.com/binwiederhier/ntfy/releases/download/v2.28.0/ntfy_2.28.0_darwin_all.tar.gz > ntfy.tar.gz
tar zxvf ntfy.tar.gz
sudo cp -a ntfy_2.28.0_darwin_all/ntfy /usr/local/bin/ntfy
mkdir ~/Library/Application\ Support/ntfy
cp ntfy_2.28.0_darwin_all/client/client.yml ~/Library/Application\ Support/ntfy/client.yml
Note: To run the server on macOS, you must build it manually using Go (see Build Instructions).
brew install ntfy
This installs the CLI only. Server installation requires manual steps.
ntfy.exe in your %Path% (e.g., C:\Program Files\).ntfy.exe -h
sc create ntfy binPath="C:\path\to\ntfy.exe serve" start=auto
sc start ntfy
docker run -p 80:80 -it binwiederhier/ntfy serve
docker run \
-v /var/cache/ntfy:/var/cache/ntfy \
-p 80:80 \
-it \
binwiederhier/ntfy \
serve \
--cache-file /var/cache/ntfy/cache.db
docker run \
-v /etc/ntfy:/etc/ntfy \
-e TZ=UTC \
-p 80:80 \
-u UID:GID \
-it \
binwiederhier/ntfy \
serve
version: '3'
services:
ntfy:
image: binwiederhier/ntfy
container_name: ntfy
command: ["serve"]
environment:
- TZ=UTC
user: "1000:1000" # Replace with your UID/GID
volumes:
- /var/cache/ntfy:/var/cache/ntfy
- /etc/ntfy:/etc/ntfy
ports:
- "80:80"
healthcheck:
test: ["CMD-SHELL", "wget -q --tries=1 http://localhost:80/v1/health -O - | grep -Eo '\"healthy\"\\s*:\\s*true' || exit 1"]
interval: 60s
timeout: 10s
retries: 3
start_period: 40s
restart: unless-stopped
init: true
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: ntfy
spec:
serviceName: ntfy
replicas: 1
selector:
matchLabels:
app: ntfy
template:
metadata:
labels:
app: ntfy
spec:
containers:
- name: ntfy
image: binwiederhier/ntfy
args: ["serve", "--cache-file", "/var/cache/ntfy/cache.db"]
ports:
- containerPort: 80
name: http
volumeMounts:
- name: config
mountPath: /etc/ntfy
readOnly: true
- name: cache
mountPath: /var/cache/ntfy
volumes:
- name: config
configMap:
name: ntfy
- name: cache
persistentVolumeClaim:
claimName: ntfy-cache
---
apiVersion: v1
kind: Service
metadata:
name: ntfy
spec:
selector:
app: ntfy
ports:
- port: 80
targetPort: 80
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ntfy-cache
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
sudo journalctl -u ntfy (systemd) or sudo rc-service ntfy status (OpenRC).server.yml or Docker run command (-p 8080:80)./etc/ntfy/client.yml (or ~/.config/ntfy/client.yml for non-root)./etc/ntfy/server.yml.Edit these files to customize settings like timezone, max message size, or retention policy.
user flag in Docker or systemd service).For more details, visit the ntfy GitHub Repository.
After purchasing this application on Esadax, you will be prompted to provide the configuration parameters below. Esadax adds the supplied variables to the deployment so the application can be launched with the configuration it requires.
| Parameter | Description |
|---|---|
ADMIN_USERNAME |
Value supplied to the deployment for ADMIN_USERNAME. |
ADMIN_PASSWORD |
Value supplied to the deployment for ADMIN_PASSWORD. |
Once the values are configured, click Deploy to launch the application. The purchased application will use the supplied configuration values, including credentials such as usernames and passwords when those parameters are provided.