feat(stacks): migrate ntfy.opytex.org

This commit is contained in:
2026-08-13 07:03:19 +02:00
parent 19479e8d4b
commit ac5b728ffd
4 changed files with 195 additions and 0 deletions

View File

@@ -0,0 +1,120 @@
# Administration ntfy
Toutes les commandes s'exécutent depuis le dossier contenant le `docker-compose.yml`.
---
## Utilisateurs
### Lister les utilisateurs
```bash
docker exec -it ntfy ntfy user list
```
### Ajouter un utilisateur standard
```bash
docker exec -it ntfy ntfy user add prenom_user
# → saisir le mot de passe interactivement
```
### Ajouter un administrateur
```bash
docker exec -it ntfy ntfy user add --role=admin prenom_user
```
### Changer le mot de passe
```bash
docker exec -it ntfy ntfy user change-pass prenom_user
```
### Promouvoir un user en admin (ou l'inverse)
```bash
docker exec -it ntfy ntfy user change-role prenom_user admin
docker exec -it ntfy ntfy user change-role prenom_user user
```
### Supprimer un utilisateur
```bash
docker exec -it ntfy ntfy user del prenom_user
```
---
## Droits d'accès (ACL)
Après avoir créé un utilisateur, il faut lui donner accès aux topics UnifiedPush.
### Donner accès à un nouvel utilisateur
```bash
# Synapse peut publier sur les topics "up*" sans compte
docker exec -it ntfy ntfy access '*' 'up*' write-only
# Le user peut lire ses topics "up*"
docker exec -it ntfy ntfy access prenom_user 'up*' read-only
```
> Ces deux commandes sont à exécuter pour **chaque nouvel utilisateur**.
### Voir toutes les ACL configurées
```bash
docker exec -it ntfy ntfy access
```
### Révoquer les droits d'un utilisateur sur un topic
```bash
docker exec -it ntfy ntfy access --reset prenom_user 'up*'
```
### Révoquer tous les droits d'un utilisateur
```bash
docker exec -it ntfy ntfy access --reset prenom_user
```
---
## Checklist : ajouter un nouvel utilisateur
```bash
# 1. Créer le compte
docker exec -it ntfy ntfy user add prenom_user
# 2. Donner accès aux topics UnifiedPush
docker exec -it ntfy ntfy access '*' 'up*' write-only
docker exec -it ntfy ntfy access prenom_user 'up*' read-only
# 3. Vérifier
docker exec -it ntfy ntfy user list
docker exec -it ntfy ntfy access
```
Ensuite, communiquer à l'utilisateur :
- L'URL du serveur : `https://ntfy.mondomaine.fr`
- Son login et mot de passe
- Lui demander d'installer l'app ntfy (F-Droid ou Play Store)
---
## Dépannage
### Un utilisateur ne reçoit pas ses notifications
1. Vérifier que le Matrix gateway répond (voir Supervision)
2. Vérifier que Synapse peut joindre ntfy :
```bash
# Depuis le conteneur Synapse
docker exec -it synapse curl https://ntfy.mondomaine.fr/_matrix/push/v1/notify
```
3. Vérifier les ACL de l'utilisateur :
```bash
docker exec -it ntfy ntfy access prenom_user
```
4. Dans Element-X : Paramètres → Notifications → Troubleshoot notifications
### Les logs montrent des 401 (Unauthorized)
L'utilisateur n'a pas configuré ses identifiants dans l'app ntfy,
ou les identifiants sont incorrects. Refaire un `change-pass` si besoin.
### Les logs montrent des 429 (Too Many Requests)
Le rate limiting est déclenché. Si c'est un usage légitime,
ajuste `visitor-message-daily-limit` dans `config/server.yml`.
Si c'est un abus, l'IP source sera dans les logs.

View File

@@ -0,0 +1,25 @@
# URL publique du serveur — indispensable pour le Matrix gateway intégré
base-url: "https://ntfy.opytex.org"
# Fichiers de données (volumes Docker)
cache-file: "/var/cache/ntfy/cache.db"
auth-file: "/var/lib/ntfy/user.db"
# Accès par défaut : tout refusé sauf config ACL explicite
auth-default-access: "deny-all"
# Les topics UnifiedPush (préfixe "up") doivent être accessibles
# en écriture par Synapse (sans compte), mais en lecture protégée.
# Géré via les ACL utilisateur (voir marche à suivre).
# Rate limiting — protège contre les abus
visitor-message-daily-limit: 1000
visitor-subscription-limit: 30
visitor-request-limit-burst: 60
visitor-request-limit-replenish: 10s
# Activer le rate limiting basé sur l'abonné pour les topics UnifiedPush
# visitor-subscriber-rate-limiting: true
# Cache des messages (utile si le téléphone est hors ligne temporairement)
cache-duration: 12h

View File

@@ -0,0 +1,45 @@
services:
ntfy:
image: binwiederhier/ntfy:v2.20
container_name: ntfy
restart: unless-stopped
command: serve
security_opt:
- no-new-privileges:true
env_file:
- env_file
volumes:
- ./config/server.yml:/etc/ntfy/server.yml:ro
- ntfy-cache:/var/cache/ntfy
- ntfy-auth:/var/lib/ntfy
networks:
- traefik-proxy
labels:
- traefik.enable=true
- traefik.docker.network=traefik-proxy
- traefik.http.routers.ntfy.entrypoints=web-secure
- traefik.http.routers.ntfy.rule=Host(`ntfy.opytex.org`)
- traefik.http.routers.ntfy.tls.certresolver=letsencrypt
- traefik.http.services.ntfy.loadbalancer.server.port=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
volumes:
ntfy-cache:
labels:
- backup.enable=true
ntfy-auth:
labels:
- backup.enable=true
networks:
traefik-proxy:
external: true

View File

@@ -0,0 +1,5 @@
# ntfy — configuration non sensible.
# Le reste de la configuration est dans config/server.yml, monté en lecture
# seule. Aucun secret : les comptes vivent dans le volume ntfy-auth.
TZ=Europe/Paris