Aller au contenu

Déploiement

L’API Apprise est conçue pour fonctionner comme un service conteneurisé.
Cette page explique comment la déployer et l’exploiter, pas comment utiliser les endpoints de l’API.

Si vous cherchez à :

  • envoyer des notifications, consultez Utilisation de l’API
  • l’intégrer avec la CLI ou la bibliothèque Python, consultez Intégrations
  • comprendre les clés, le stockage ou le verrouillage, consultez Configuration

Choisissez ci-dessous une méthode de déploiement pour démarrer rapidement l’API Apprise.

Les exemples auto-hébergés publient normalement le port 8000 afin que les appareils de confiance de votre réseau domestique ou interne puissent se connecter sans proxy supplémentaire. Ils utilisent le mode normal. Ne les exposez pas directement à Internet. Utilisez l’onglet Déploiement derrière un proxy pour un serveur public avec HTTPS, authentification, routage strict et port de conteneur limité à l’adresse locale.

Fenêtre de terminal
docker run --name apprise \
-p 8000:8000 \
-v ./config:/config \
-v ./attach:/attach \
-e APPRISE_STATEFUL_MODE=simple \
-e APPRISE_WORKER_COUNT=1 \
-e APPRISE_DEFAULT_FORMAT=text \
-d caronc/apprise:latest

La commande suivante configure le même conteneur, mais avec une surveillance par health check :

Fenêtre de terminal
docker run --name apprise \
-p 8000:8000 \
-v ./config:/config \
-v ./attach:/attach \
-e APPRISE_STATEFUL_MODE=simple \
-e APPRISE_WORKER_COUNT=1 \
-e APPRISE_DEFAULT_FORMAT=text \
--health-cmd='curl -fsS http://127.0.0.1:8000/status >/dev/null || exit 1' \
--health-interval=30s \
--health-timeout=5s \
--health-retries=3 \
--health-start-period=20s \
-d caronc/apprise:latest

Pour essayer la connexion administrateur intégrée en local, arrêtez d’abord le conteneur de démarrage rapide : les deux exemples utilisent le port 8000. Celui-ci laisse la liste des configurations accessible à admin :

Fenêtre de terminal
docker run --name apprise-auth \
-p 127.0.0.1:8000:8000 \
-v ./config:/config \
-v ./attach:/attach \
-e APPRISE_STATEFUL_MODE=simple \
-e APPRISE_AUTH_REQUIRED=yes \
-e APPRISE_USER=admin \
-e APPRISE_PASSWORD=changeme \
-e APPRISE_WEB_AUTH_SECRET="$(openssl rand -hex 32)" \
-e APPRISE_WORKER_COUNT=1 \
-e APPRISE_DEFAULT_FORMAT=text \
-d caronc/apprise:latest

Ouvrez http://127.0.0.1:8000/cfg et connectez-vous avec admin et le mot de passe changeme. La liste fonctionne grâce au mode simple ; la liste des configurations est affichée par défaut.

Une fois déployés, l’API et l’interface web optionnelle sont disponibles à l’adresse :

http://localhost:8000/

L’API Apprise prend en charge le stockage persistant pour :

  • les configurations enregistrées ;
  • les métadonnées d’authentification mises en cache ;
  • les pièces jointes téléversées.

Le conteneur attend les chemins inscriptibles suivants :

CheminRôle
/configConfigurations enregistrées et état interne
/attachPièces jointes téléversées
/pluginPlugins personnalisés optionnels
/tmpFichiers runtime (sockets, buffers, temp)

Pour la plupart des déploiements, monter uniquement /config et /attach suffit.

Les fonctions persistantes dépendent du mode du serveur, du verrouillage de la configuration et de la connexion actuelle :

ÉtatListe des ConfigurationsDéplacement / SuppressionConnexion de ConfigurationContenu de Configuration
Mode avec état désactivéIndisponibleIndisponibleIndisponibleIndisponible
Authentification désactivée, configuration déverrouilléeDisponible avec APPRISE_STATEFUL_MODE=simple, sauf si APPRISE_ADMIN=noAutoriséIndisponibleDisponible
Authentification désactivée, configuration verrouilléeMasquée et refuséeRefuséIndisponibleMasqué ; les notifications enregistrées fonctionnent toujours
Utilisateur de configuration, déverrouilléeRefuséePeut déplacer son propre ID ; ne peut pas le supprimerPeut modifier son propre mot de passeDisponible pour son ID
Utilisateur de configuration, verrouilléeRefuséeRefuséPeut modifier son propre mot de passeMasqué ; les notifications enregistrées fonctionnent toujours
Administrateur, déverrouilléeDisponible avec APPRISE_STATEFUL_MODE=simple, sauf si APPRISE_ADMIN=noAutorisé pour tous les IDPeut gérer toutes les connexionsDisponible
Administrateur, verrouilléeDisponible avec APPRISE_STATEFUL_MODE=simple, sauf si APPRISE_ADMIN=noAutorisé pour tous les IDPeut gérer toutes les connexionsDisponible

Lorsque le contenu est verrouillé, le formulaire Web de notification exige au moins un tag, car il ne peut pas afficher les destinations enregistrées.

Un administrateur authentifié conserve un accès complet aux configurations lorsque le verrouillage est activé. Les utilisateurs d’une configuration et les appelants non authentifiés ne peuvent pas ajouter, récupérer, inspecter, lister, déplacer ni supprimer une configuration. Un compte user peut toujours envoyer des notifications authentifiées avec ou sans état, tandis qu’un compte locked est limité aux notifications avec état et avec tag.

Les modes globaux sont toujours prioritaires. Même un administrateur ne peut pas envoyer de notification avec ou sans état lorsque le mode correspondant est désactivé. Les identifiants administrateur contournent uniquement l’accès propre à la configuration et son verrouillage.

L’API Apprise permet également de durcir les processus et le système de fichiers. Ces mesures protègent le conteneur, mais n’ajoutent ni HTTPS, ni authentification, ni routage strict. Pour un serveur public ou multi-tenant, combinez-les avec le Déploiement derrière un proxy présenté ci-dessus.

Exemple de configuration conteneur durci :

services:
apprise:
image: caronc/apprise:latest
container_name: apprise
user: "1000:1000"
read_only: true
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
ports:
- "8000:8000"
environment:
APPRISE_STATEFUL_MODE: simple
APPRISE_WORKER_COUNT: 1
APPRISE_DEFAULT_FORMAT: "text"
volumes:
- ./config:/config
- ./attach:/attach
tmpfs:
- /tmp

Points importants :

  • /tmp doit rester inscriptible ;
  • aucun fichier n’est écrit sous /var/log ;
  • tous les logs sont écrits vers stdout et stderr.

Si vous déployez dans Kubernetes, consultez Démarrage Rapide -> Kubernetes -> Durci (rootless + lecture seule) pour un exemple prêt à l’emploi qui :

  • s’exécute avec un utilisateur non-root ;
  • supprime toutes les capacités Linux ;
  • désactive l’escalade de privilèges ;
  • utilise un système de fichiers racine en lecture seule ;
  • monte /tmp comme emptyDir en mémoire.

L’API Apprise expose un endpoint de santé :

GET /status
  • Renvoie HTTP 200 lorsque le service est sain
  • Renvoie HTTP 417 si un problème bloquant est détecté

Exemple :

Fenêtre de terminal
curl http://localhost:8000/status

Cet endpoint convient pour :

  • les health checks Docker ;
  • les probes de liveness Kubernetes ;
  • les systèmes de supervision externes.

Si l’API Apprise est hébergée derrière un proxy inverse ou servie sous un sous-chemin, définissez APPRISE_BASE_URL en conséquence.

Pour un exemple complet de proxy HTTPS avec un accès au conteneur limité à l’adresse locale, consultez Démarrage Rapide -> Docker + Nginx externe ci-dessus.

Exemple :

Fenêtre de terminal
APPRISE_BASE_URL=/apprise

Cela garantit :

  • une génération correcte des URL ;
  • un routage correct de l’interface web ;
  • des liens OpenAPI corrects.

L’API Apprise ne requiert aucune authentification par défaut. Définissez APPRISE_AUTH_REQUIRED=yes pour protéger ses points de terminaison avec HTTP Basic. Seuls les ID de configuration rendus publics peuvent la contourner, uniquement pour les notifications avec tag.

ModeParamètresRésultat
DésactivéAPPRISE_AUTH_REQUIRED=noLes requêtes restent ouvertes. Les paramètres d’administration et les connexions de configuration enregistrées sont ignorés.
Administrateur activéAPPRISE_AUTH_REQUIRED=yes avec APPRISE_PASSWORDL’administrateur peut accéder à toutes les clés et gérer les connexions de configuration. APPRISE_USER est facultatif.
Administrateur désactivéAPPRISE_AUTH_REQUIRED=yes sans APPRISE_PASSWORDLes utilisateurs existants accèdent uniquement à leurs propres clés. Aucune nouvelle connexion ne peut être créée tant qu’un mot de passe administrateur n’est pas configuré.

APPRISE_USER sans APPRISE_PASSWORD produit un avertissement au démarrage et laisse le compte administrateur désactivé. Consultez les Variables d’Environnement.

APPRISE_BASIC_AUTH_REALM nomme le serveur dans les invites de connexion. Il ne modifie aucun identifiant. La valeur par défaut est Apprise API ; utilisez un nom différent pour chaque instance.

Utilisez HTTPS/TLS. L’authentification Basic ne chiffre pas les identifiants. HTTPS est indispensable en dehors de localhost ou d’un réseau de confiance.

Les clients API envoient Basic Auth avec chaque requête. Le serveur garde brièvement en mémoire les vérifications réussies pour accélérer les requêtes suivantes. Il ne conserve pas les identifiants et ne crée pas de session API.

Les pages Web utilisent une connexion signée afin que Déconnexion puisse fermer la session. Les appels API JSON et texte brut ne peuvent pas utiliser cette connexion Web.

Les clients avec état peuvent conserver des chemins comme /notify/{KEY}. Les points de terminaison compatibles acceptent aussi X-Apprise-Config-ID, ce qui garde la clé hors de l’URL.

Les configurations Nginx fournies exposent explicitement GET /qr, /qr/{KEY} et /qr/@ pour configurer Apprise Mobile. Elles refusent les autres méthodes, ignorent le corps de la requête, désactivent la mise en tampon du proxy et marquent les réponses no-store. Le mode strict leur applique aussi la limite de débit réservée aux routes protégées.

Le plugin apprise:// de la CLI Apprise envoie cet en-tête avec sa version 2, utilisée par défaut. Utilisez ?v=1 uniquement avec un ancien serveur qui exige /notify/{KEY}.

Les connexions Web expirent après 24 heures d’inactivité. Chaque requête authentifiée renouvelle ce délai. Modifier APPRISE_WEB_AUTH_SECRET déconnecte tous les navigateurs.

Le champ ID de configuration permet d’ouvrir une autre configuration sans afficher son ID dans la barre d’adresse. L’utilisateur doit se reconnecter si le nouvel ID utilise d’autres identifiants. Les administrateurs peuvent aussi choisir ou générer un ID avec Nouvelle Configuration.

Chaque ID de configuration utilise un mode d’accès :

AccèsUtilisation des notificationsUtilisation de la configuration
userExige ses identifiants. Les tags sont facultatifs.L’utilisateur peut consulter, modifier, effacer et remplacer sa configuration.
lockedExige les identifiants et un tag précis, jamais all.Masque le contenu. L’utilisateur peut changer son mot de passe et déplacer l’ID de configuration.
publicExige uniquement l’ID de configuration et un tag précis.Masque le contenu. Les identifiants enregistrés conservent les droits locked, s’ils sont présents.
disabledRefuse les notifications de l’utilisateur de configuration.Bloque l’utilisateur tout en conservant la configuration et les identifiants.

L’accès public s’applique uniquement aux appels avec état POST /notify/{KEY}. Les autres points de terminaison exigent toujours des identifiants valides. Les pièces jointes restent prises en charge.

Pour POST /notify sans état, l’administrateur peut s’authentifier directement. Un utilisateur de configuration doit fournir des urls explicites, ses identifiants et l’en-tête X-Apprise-Config-ID correspondant ; l’accès doit être user. Sans urls, la forme v2 avec en-tête conserve l’envoi stateful avec la configuration enregistrée.

Les comptes user et locked peuvent consulter /status et /details avec leurs identifiants et leur ID de configuration. Un compte désactivé ne le peut pas. L’administrateur peut fournir un en-tête X-Apprise-Config-ID valide pour simplifier le client, mais cet en-tête n’est pas obligatoire.

Pour définir l’accès, ouvrez une configuration et sélectionnez son cadenas ou Authentification. Choisissez le mode d’accès, saisissez les identifiants lorsqu’ils sont requis, puis sélectionnez Enregistrer. Les administrateurs peuvent utiliser Générer Aléatoirement pour chaque identifiant.

L’ID de configuration et les identifiants sont des valeurs distinctes. Transmettez l’ID et les identifiants configurés à l’utilisateur. Le nom d’utilisateur est facultatif et le mot de passe enregistré n’est plus affiché.

Les clients API gèrent l’accès avec POST /auth/{KEY}. Le champ access accepte user, locked, public ou disabled. Un nouvel enregistrement utilise user par défaut, ou locked lorsque APPRISE_CONFIG_LOCK=yes. Un accès user enregistré se comporte alors comme locked sans être réécrit. L’accès public reste public, car il masque déjà le contenu de la configuration. Un utilisateur de configuration peut changer uniquement son mot de passe et doit répéter son nom d’utilisateur. Consultez les Points de Terminaison de l’API.

Les verrous par clé sont ignorés lorsque APPRISE_AUTH_REQUIRED est désactivé, ce qui rétablit le fonctionnement ouvert d’origine. Leurs fichiers sont conservés et redeviennent actifs lorsque l’authentification est activée.

Déconnexion ferme la connexion Web signée. Les identifiants en cache du navigateur ne peuvent pas la rétablir silencieusement.

Les anciens verrous sans configuration sont supprimés après APPRISE_AUTH_PRUNE_SECONDS (30 jours par défaut). Lorsqu’un utilisateur user efface sa configuration, ses identifiants sont conservés et ce délai recommence afin qu’il puisse enregistrer une nouvelle configuration. Les verrous avec configuration sont conservés. Consultez Élagage.

Les navigateurs ajoutent un en-tête Origin lorsqu’une page modifie des données. L’API Apprise vérifie cet en-tête et refuse les modifications envoyées depuis un autre site. Les requêtes provenant du même site sont autorisées.

L’API Apprise n’exige pas l’échange de jeton CSRF de Django. Les appels directs depuis curl, les applications mobiles et les autres programmes omettent normalement Origin et continuent de fonctionner.

Pour un site HTTPS derrière un proxy inverse, définissez APPRISE_TRUSTED_ORIGINS avec l’adresse publique complète, par exemple https://apprise.example.com. Séparez plusieurs adresses par des virgules.

Pour une défense en profondeur, vous pouvez ajouter des protections en dehors de l’application :

  • exposer le conteneur uniquement par un proxy inverse de confiance ;
  • ajouter une authentification au niveau du proxy ou de l’ingress ;
  • restreindre l’accès avec un pare-feu ou une politique réseau.

Des fichiers de surcharge Nginx peuvent également être montés dans le conteneur pour répondre à des besoins particuliers de contrôle d’accès.

Un exemple Kubernetes utilisant un Secret (basic auth .htpasswd) et une ConfigMap (nginx location-override.conf) est disponible dans Démarrage Rapide -> Kubernetes -> Exemple Complet.

Le conteneur exécute chaque jour un cycle de nettoyage à faible priorité. Il couvre les deux domaines ci-dessous et dispose d’une limite de temps :

DomaineCe qu’il élagueParamètre de rétention
État persistantStockage d’état de notification Apprise (APPRISE_STORAGE_DIR).APPRISE_STORAGE_PRUNE_DAYS (défaut 30 jours)
AuthentificationVerrous Basic par clé sans configuration.APPRISE_AUTH_PRUNE_SECONDS (défaut 2592000, soit 30 jours)

APPRISE_PRUNE_INTERVAL_SECONDS contrôle la planification. Réglez APPRISE_PRUNE_ENABLED=no pour désactiver le nettoyage planifié. APPRISE_PRUNE_TIMEOUT_SECONDS modifie la limite de 8 heures. La commande combinée et les commandes individuelles restent exécutables manuellement :

Fenêtre de terminal
docker exec -it apprise python manage.py prune
docker exec -it apprise python manage.py storeprune --days 30
docker exec -it apprise python manage.py authprune --seconds 2592000
  • Tous les logs sont émis vers stdout et stderr
  • Aucun fichier log n’est écrit sur disque
  • Des métriques Prometheus sont disponibles sur /metrics
  • Les appels réussis à /status, /metrics, au favicon et à robots.txt sont omis des journaux d’accès ; les échecs et limitations restent visibles

Pour le développement local, le dépôt inclut des surcharges Docker Compose qui :

  • montent l’arborescence source locale ;
  • rechargent les changements d’UI et de templates sans rebuild ;
  • exposent l’API sur le port 8000.

Ce mode est destiné uniquement au développement et n’est pas recommandé en production.

Une fois l’application déployée, vous pouvez :

  • enregistrer des clés de configuration via l’interface web ou l’API ;
  • envoyer des notifications avec /notify ou /notify/{KEY} ;
  • intégrer des systèmes externes via HTTP ou la CLI Apprise.
Questions ou commentaires ?

Documentation

Vous avez repéré une faute de frappe ou une erreur ?

Problèmes Techniques

Vous rencontrez un problème avec le code ? Ouvrez un ticket sur GitHub :

Conçu avec amour depuis le Canada