Ntfy, qui se prononce “notify”, est un service de notification ultra léger, permettant d’envoyer des messages vers un smartphone ou un ordinateur via de simples scripts, sans besoin de compte et totalement gratuitement !
Ntfy
Installation
Le CLI de ntfy vous permet de publier des messages, de vous abonner à des sujets et d’héberger vous-même votre propre serveur ntfy. C’est très simple. Il suffit d’installer le binaire, le paquet ou l’image Docker, de le configurer et de l’exécuter.
Les étapes suivantes ne sont nécessaires que si vous voulez héberger votre propre serveur ntfy ou si vous voulez utiliser le CLI ntfy. Si vous voulez juste envoyer des messages en utilisant ntfy.sh, vous n’avez pas besoin d’installer quoi que ce soit. Vous pouvez simplement utiliser curl.
Le serveur ntfy se présente sous la forme d’un binaire lié statiquement et est livré sous forme de paquetage tarball, deb/rpm et sous forme d’image Docker. Nous supportons amd64, armv7 et arm64.
Veuillez consulter la page des versions pour les binaires et les paquets deb/rpm.
Debian
manuellement
wget https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_amd64.deb
sudo dpkg -i ntfy_*.deb
sudo systemctl enable ntfy
Arch Linux
Vous pouvez récupérer le fichier binaire ntfy depuis le dépôt GitHub ou installer le paquet
yay -S --noconfirm ntfysh-bin
Création groupe et utilisateur à l’installation
Creating group 'ntfy' with GID 951.
Creating user 'ntfy' (ntfy user) with UID 951 and GID 951.
Configuration du serveur ntfy
Le serveur ntfy peut être configuré de trois manières :
- en utilisant un fichier de configuration (typiquement dans /etc/ntfy/server.yml, voir server.yml),
- via des arguments de ligne de commande
- ou en utilisant des variables d’environnement.
ntfy derrière un proxy
Si vous exécutez ntfy derrière un proxy, vous devez activer le drapeau behind-proxy. Cela demandera à la logique de limitation de taux d’utiliser l’en-tête X-Forwarded-For comme identifiant principal d’un visiteur, plutôt que l’adresse IP distante. Si l’indicateur “behind-proxy” n’est pas activé, tous les visiteurs seront comptés comme un seul, car du point de vue du serveur ntfy, ils partagent tous l’adresse IP du proxy.
Fichier /etc/ntfy/server.yml, les modifications
listen-http: "127.0.0.1:8100"
behind-proxy: true
Démarrer le service
sudo systemctl start ntfy
Proxy Nginx
Le fichier proxy /etc/nginx/conf.d/noti.rnmkcy.eu.conf
server {
listen 80;
listen [::]:80;
server_name noti.rnmkcy.eu;
# redirect all plain HTTP requests to HTTPS
return 301 https://noti.rnmkcy.eu$request_uri;
}
server {
# ipv4 listening port/protocol
listen 443 ssl http2;
# ipv6 listening port/protocol
listen [::]:443 ssl http2;
server_name noti.rnmkcy.eu;
include /etc/nginx/conf.d/security.conf.inc;
location / {
proxy_pass http://127.0.0.1:8100;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3m;
proxy_send_timeout 3m;
proxy_read_timeout 3m;
client_max_body_size 0; # Stream request body to backend
}
}
Vérifier et recharger nginx
sudo nginx -t && sudo systemctl reload nginx
Première connexion depuis un navigateur firefox https://noti.rnmkcy.eu
Instance publique
Envoyer une notification
utiliser la commande ntfy pub
ou une requête POST via curl sur le serveur ntfy.sh
ntfy pub monsujet "Ceci est une notification ntfy"
curl -d "Ceci est une notification ntfy" ntfy.sh/monsujet
Recevoir une notification, utiliser la commande ntfy sub
ntfy sub monsujet
Affichage des messages au format JSON
{"topic":"monsujet","message":"Ceci est une notification ntfy","time":1622656800}
Instance privée
Configurer server.yml
La façon la plus simple de configurer une instance privée est de définir auth-default-access: deny-all
dans le fichier server.yml :
auth-file: /var/lib/ntfy/user.db
auth-default-access: "deny-all"
Créer un utilisateur
Ensuite, il suffit de créer un utilisateur administrateur “leno”
sudo -u ntfy ntfy user add --role=admin leno
user leno added with role admin
Liste des commandes
ntfy user list # Shows list of users (alias: 'ntfy access')
ntfy user add phil # Add regular user phil
ntfy user add --role=admin phil # Add admin user phil
ntfy user del phil # Delete user phil
ntfy user change-pass phil # Change password for user phil
ntfy user change-role phil admin # Make user phil an admin
ntfy user change-tier phil pro # Change phil's tier to "pro"
Une fois que vous avez fait cela, vous pouvez publier et vous abonner en utilisant l’authentification de base avec le nom d’utilisateur/mot de passe donné. Veillez à utiliser HTTPS pour éviter les écoutes et l’exposition de votre mot de passe.
Authentification
Doc netfy
https://www.pofilo.fr/post/2023/09/10-alerte-connexion-ssh/
Utilisateur + mot de passe
Username + password
Lorsque l’agent utilisateur souhaite envoyer des informations d’authentification au serveur, il peut utiliser le champ d’en-tête Authorization
Le champ d’en-tête Authorization est construit comme suit :
- Le nom d’utilisateur et le mot de passe sont combinés avec un seul deux-points (
:
). Cela signifie que le nom d’utilisateur lui-même ne peut pas contenir de deux points. - La chaîne résultante est encodée en une séquence d’octets. Le jeu de caractères à utiliser pour cet encodage est par défaut non spécifié, tant qu’il est compatible avec US-ASCII, mais le serveur peut suggérer l’utilisation d’UTF-8 en envoyant le paramètre charset.
- La chaîne résultante est encodée à l’aide d’une variante de Base64 (+/ et avec remplissage).
- La méthode d’autorisation et un caractère d’espacement (par exemple “Basic “) sont ensuite ajoutés à la chaîne encodée.
Par exemple, si le navigateur utilise Aladdin comme nom d’utilisateur et open sesame comme mot de passe, la valeur du champ est le codage Base64 de Aladdin:open sesame, ou QWxhZGRpbjpvcGVuIHNlc2FtZQ==. Le champ d’en-tête Authorization se présente alors comme suit :
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Pour générer l’en-tête d’autorisation, utilisez la norme base64 pour encoder les <nom d'utilisateur>:<mot de passe>
séparés par deux points et ajoutez-y le mot Basic, c’est-à-dire Authorization : Basic base64(<username>:<password>
).
Voici un pseudo-code qui, je l’espère, l’explique mieux :
username = "testuser"
password = "fakepassword"
authHeader = "Basic " + base64(username + " :" + password) // -> Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk
La commande suivante génère la valeur appropriée pour vous sur les systèmes *nix :
echo "Basic $(echo -n 'testuser:fakepassword' | base64)"
curl
curl \
-u leno:mypass \
-d "accès avec authentification" \
https://noti.rnmkcy.eu/yan_infos
POST http
curl \
-i -s -X POST -H "Authorization: Basic bGVubzpRpbjpvsZW5vNDk=" \
-d "POST/HTTP accès avec authentification" "https://noti.rnmkcy.eu/yan_infos"
JavaScript
fetch('https://ntfy.example.com/mysecrets', {
method: 'POST', // PUT works too
body: 'Look ma, with auth',
headers: {
'Authorization': 'Basic cGhpbDpteXBhc3M='
}
})
Go
req, _ := http.NewRequest("POST", "https://ntfy.example.com/mysecrets",
strings.NewReader("Look ma, with auth"))
req.Header.Set("Authorization", "Basic cGhpbDpteXBhc3M=")
http.DefaultClient.Do(req)
Python
requests.post("https://ntfy.example.com/mysecrets",
data="Look ma, with auth",
headers={
"Authorization": "Basic cGhpbDpteXBhc3M="
})
PHP
file_get_contents('https://ntfy.example.com/mysecrets', false, stream_context_create([
'http' => [
'method' => 'POST', // PUT also works
'header' =>
'Content-Type: text/plain\r\n' .
'Authorization: Basic cGhpbDpteXBhc3M=',
'content' => 'Look ma, with auth'
]
]));
ntfy CLI
ntfy publish \
-u phil:mypass \
ntfy.example.com/mysecrets \
"Look ma, with auth"
Jetons d’accès (tokens)
En plus de l’authentification par nom d’utilisateur/mot de passe, ntfy fournit également une authentification par jetons d’accès. Les jetons d’accès sont utiles pour éviter d’avoir à configurer votre mot de passe dans plusieurs applications de publication/abonnement. Par exemple, vous pouvez utiliser un jeton dédié pour publier à partir de votre hôte de sauvegarde, et un autre à partir de votre système domotique.
Vous pouvez créer des jetons d’accès en utilisant la commande ntfy token
, ou dans l’application web dans la section “Compte” (lorsque vous êtes connecté). Voir les jetons d’accès pour plus de détails.
Une fois le jeton d’accès créé, vous pouvez l’utiliser pour vous authentifier auprès du serveur ntfy, par exemple lorsque vous publiez ou vous abonnez à des sujets.
La commande ntfy token permet de gérer les jetons d’accès des utilisateurs. Les jetons peuvent avoir des étiquettes, et ils peuvent expirer automatiquement (ou ne jamais expirer). Chaque utilisateur peut avoir jusqu’à 20 jetons (codés en dur).
Exemples de commandes (tapez ntfy token –help ou ntfy token COMMAND –help pour plus de détails)
ntfy token list # Affiche la liste des jetons pour tous les utilisateurs
ntfy token list phil # Affiche la liste des jetons de l'utilisateur phil
ntfy token add phil # Crée un jeton pour l'utilisateur phil qui n'expire jamais
ntfy token add --expires=2d phil # Crée un jeton pour l'utilisateur phil qui expire dans 2 jours
ntfy token remove phil tk_th2sxr... # Supprimer le jeton
Création d’un jeton d’accès :
ntfy token add --expires=30d --label="backups" phil
ntfy token list
utilisateur phil
- tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 (sauvegardes), expire le 15 mars 23 14:33 EDT, accédé depuis 0.0.0.0 le 13 février 23 13:33 EST
Une fois le jeton d’accès créé, vous pouvez l’utiliser pour vous authentifier auprès du serveur ntfy, par exemple lorsque vous publiez ou vous abonnez à des sujets.
Voici un exemple utilisant Bearer auth, avec le jeton tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 :
curl
curl \
-H "Authorization: Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2" \
-d "Look ma, with auth" \
https://ntfy.example.com/mysecrets
POST http
POST /mysecrets HTTP/1.1
Host: ntfy.example.com
Authorization: Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2
Look ma, with auth
JavaScript
fetch('https://ntfy.example.com/mysecrets', {
method: 'POST', // PUT works too
body: 'Look ma, with auth',
headers: {
'Authorization': 'Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2'
}
})
Go
req, _ := http.NewRequest("POST", "https://ntfy.example.com/mysecrets",
strings.NewReader("Look ma, with auth"))
req.Header.Set("Authorization", "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2")
http.DefaultClient.Do(req)
Python
requests.post("https://ntfy.example.com/mysecrets",
data="Look ma, with auth",
headers={
"Authorization": "Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2"
})
PHP
file_get_contents('https://ntfy.example.com/mysecrets', false, stream_context_create([
'http' => [
'method' => 'POST', // PUT also works
'header' =>
'Content-Type: text/plain\r\n' .
'Authorization: Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2',
'content' => 'Look ma, with auth'
]
]));
ntfy CLI
ntfy publish \
--token tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 \
ntfy.example.com/mysecrets \
"Look ma, with auth"
Android
Installation
Installer l’application ntfy disponible sur F-Droid
Configuration
Après ouverture de l’application
If faut saisir utilisateur et mot de passe car notification privée
Ligne de commande
Sécuriser
Pour éviter que n’importe qui puisse envoyer ou recevoir des messages, vous pouvez utiliser un mot de passe.
ntfy publish -u admin:myp@ssw0rd ntfy.example.com/monsujet "This is a message"
curl -u admin:myp@ssw0rd -d "This is a message" https://ntfy.example.com/monsujet
Cela implique un hébergement du serveur ntfy
Envoi
ntfy publish -u utilisateur:mot_de_passe ntfysrv.eu/test "Nouveau test depuis PC1 en ligne de commande" |jq
Affichage message expédié
{
"id": "WqRBXcEmOoqv",
"time": 1708692353,
"expires": 1708735553,
"event": "message",
"topic": "test",
"message": "Nouveau test depuis PC1 en ligne de commande"
}
Réception
Se mettre en attente d’un message
ntfy sub -u utilisateur:mot_de_passe ntfysrv.eu/test |jq
Affichage à la réception d’un message
{
"id": "BY9zD5GQqCI9",
"time": 1708693062,
"expires": 1708736262,
"event": "message",
"topic": "test",
"title": "Firefox PC1",
"message": "Nouvel essai depuis le navigateur"
}
Utilitaire jq pour un affichage au format json
Réception avec notify-send
Pour afficher vos notifications directement sur votre environnement de bureau, vous pouvez utiliser la commande ntfy sub
avec notify-send.
ntfy sub -u utilisateur:mot_de_passe ntfysrv.eu/test 'notify-send -t 0 "ntfy" "$m"'
Voir tous les anciens messages
Si vous souhaitez voir l’historique des messages, vous pouvez utiliser le paramètre -s all
ntfy sub -s all monsujet