{
"meta": {
"title": "Notifications Proxmox — Telegram, Discord, courrier électronique, Gotify, Pushover, Apprise | ProxMenux Monitor",
"description": "Envoyez les notifications Proxmox VE vers Telegram, Discord, e-mail, Gotify, Pushover et environ 80 services via Apprise. Les événements du Health Monitor, des journaux et du webhook PVE deviennent des messages avec déduplication, délai de répétition, regroupement, IA facultative et historique.",
"ogTitle": "Notifications Proxmox — Telegram, Discord, courriel, Gotify, Pushover, Apprise",
"ogDescription": "Alertes Proxmox vers Telegram, Discord, e-mail, Gotify, Pushover et environ 80 services via Apprise, avec déduplication, délais de répétition, regroupement et IA facultative.",
"twitterTitle": "Notifications Proxmox | ProxMenux Monitor",
"twitterDescription": "Envoyer des alertes Proxmox VE à Telegram, Discord, Courriel, Gotify, Pushover et ~80 services supplémentaires via Apprise."
},
"header": {
"title": "Notifications",
"description": "Distribue les événements du Monitor vers Telegram, Discord, e-mail, Gotify, Pushover et environ 80 services via Apprise. Déduplication, délais de répétition, regroupement, filtres par événement/canal, IA facultative et historique consultable.",
"section": "Moniteur ProxMenux"
},
"intro": {
"title": "D'où viennent les messages",
"body": "Les notifications distribuent les événements des sources du Monitor : Health Monitor, surveillance du journal et des tâches, webhook PVE, interrogations périodiques et appels internes des scripts ProxMenux. Tous suivent le même traitement avant livraison au téléphone ou par e-mail."
},
"howItWorks": {
"heading": "Comment ça marche",
"intro": "Les collecteurs produisent des événements structurés. Le traitement décide de leur envoi et de leur présentation, l’IA peut les réécrire, puis ils sont distribués aux canaux configurés.",
"arrowLabel": "événement",
"caption": "Vue générale. Les tentatives d’envoi réussies, regroupées ou échouées sont enregistrées dans SQLite. Les événements supprimés par le délai de répétition ne sont pas enregistrés.",
"nodes": {
"sourcesLabel": "Sources",
"sourcesDetail": "Health Monitor\nSurveillance du journal\nSurveillance des tâches\nWebhook PVE\nInterrogations périodiques\nSources internes",
"dispatchLabel": "Traitement de l’envoi",
"dispatchDetail": "Regroupement des rafales\nVérification empreinte / délai\nLimites par groupe\nContrôles par canal",
"aiLabel": "Réécriture par IA (facultatif)",
"aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(désactivé par défaut)",
"channelsLabel": "Canaux",
"channelsDetail": "Telegram\nDiscord\nCourriel (SMTP)\nGotify\nPushover\nApprise (~80 services)"
}
},
"enabling": {
"heading": "Activer le panneau",
"intro": "Après installation, la carte affiche Désactivé et Activer les notifications. Avant ce clic, rien n’est envoyé et la configuration PVE n’est pas modifiée.",
"disabledAlt": "Carte initiale avec statut Désactivé et bouton Activer les notifications",
"disabledCaption": "Le premier état — un clic pour activer.",
"stepsIntro": "Le bouton effectue trois actions successives :",
"steps": [
"Passe à l’état Actif et affiche le formulaire des canaux.",
"Enregistre une cible webhook dans /etc/pve/notifications.cfg. Sans HTTPS, elle utilise POST http://127.0.0.1:8008/api/notifications/webhook ; avec HTTPS, le récepteur HTTP local du port 8009. Les notifications PVE entrent dans le traitement du Monitor. Voir Intégration webhook PVE.",
"Lance le thread d’envoi en arrière-plan, qui consulte la file et traite chaque événement."
],
"activeAlt": "Carte active avec onglets des canaux, nom d’affichage et options avancées d’IA repliables",
"activeCaption": "État actif : canaux Telegram / Gotify / Discord / e-mail / Pushover / Apprise, nom d’affichage, catégories par canal et section Avancé : amélioration par IA."
},
"sources": {
"heading": "Sources des événements",
"intro": "Six types de sources alimentent le moteur : collecteurs en arrière-plan, récepteur webhook et sources internes. Ils produisent des objets structurés NotificationEvent.",
"headerCollector": "Collecteur",
"headerWatches": "Surveille",
"headerEvents": "Événements typiques",
"rows": [
{
"collector": "Moniteur de santé",
"watches": "Dix catégories, toutes les 5 minutes",
"events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent."
},
{
"collector": "Surveillance du journal système",
"watches": "journalctl --follow avec motifs pour les échecs SSH/web, blocages Fail2Ban si la jail est installée, erreurs d’E/S du noyau, OOM et événements smartd.",
"events": "auth_fail, ip_block, oom_kill, disk_io_error, service_fail."
},
{
"collector": "Surveillance des tâches",
"watches": "Consulte /var/log/pve/tasks/index pour trouver les nouveaux UPID et suivre leurs fichiers journaux.",
"events": "backup_start, backup_complete, backup_warning, backup_fail, migration_*, snapshot_complete."
},
{
"collector": "Récepteur webhook Proxmox",
"watches": "Reçoit POST /api/notifications/webhook. Les versions PVE compatibles avec les cibles webhook peuvent y transmettre leurs notifications après configuration ; voir ci-dessous.",
"events": "Tout ce que PVE émet — y compris les événements que le moniteur manquerait autrement (HA, réplication, vzdump de l'interface graphique)."
},
{
"collector": "Collecteur par interrogation périodique",
"watches": "Compare régulièrement les nœuds du cluster, l’expiration des certificats, le passthrough GPU et les mises à jour PVE/ProxMenux.",
"events": "node_disconnect, node_reconnect, pve_update, proxmenux_update, gpu_mode_switch, pci_passthrough_conflict."
},
{
"collector": "Sources internes au processus",
"watches": "Appels directs des scripts ProxMenux et du Monitor (notification_manager.emit_event(...)).",
"events": "system_startup, system_shutdown, system_reboot, ai_model_migrated, événements de test personnalisés."
}
],
"after1": "Chaque événement porte un event_type stable (le catalogue est ci-dessous), un severity (INFO, WARNING, CRITICAL), un category (utilisé pour l'enrichissement émoji et les filtres par groupe) et une charge utile data avec tout ce dont le modèle a besoin (vmid, device, source_ip, reason...).",
"after2": "Chaque event_type utilise un modèle de notification_templates.py pour produire le texte. Ce texte suit le traitement d’envoi et peut être réécrit par l’IA. La page Assistant IA décrit cette interaction."
},
"channels": {
"heading": "Configurer les canaux",
"intro": "Six canaux : Telegram, Discord, Gotify, e-mail SMTP, Pushover et Apprise. Les cinq premiers ont leurs champs dédiés. Apprise ajoute environ 80 services via une URL, notamment ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS et Mattermost. Configuration ci-dessous.",
"credsTitle": "Stockage des identifiants",
"credsBody": "Les jetons, les clés, les URL webhook et les mots de passe SMTP sont stockés localement dans la base de données SQLite de Monitor sous /usr/local/share/proxmenux/. Les valeurs sensibles sont protégées et masquées dans l'interface. Ils ne quittent jamais l'hôte que pour atteindre leurs services respectifs. Une sauvegarde de ce répertoire suffit pour récupérer les canaux configurés."
},
"telegram": {
"heading": "Telegram",
"intro": "Il faut un jeton de bot, réutilisable entre conversations, et un ID de conversation pour la destination privée, le groupe ou le sujet de supergroupe. Le guide intégré détaille la configuration ; les deux formes d’ID sont expliquées ici.",
"guideAlt": "Guide Telegram en quatre sections : BotFather, jeton, ID de conversation, groupes et canaux",
"guideCaption": "Le lien + guide de configuration ouvre quatre étapes pour créer le bot et configurer le canal en environ deux minutes.",
"step1Title": "1 · Créer un robot avec BotFather",
"step1Items": [
"Ouvrez Telegram et contactez @BotFather avec la coche bleue de vérification ; attention aux copies.",
"Envoyer /newbot.",
"Choisissez un nom d'affichage (p. ex. ProxMenux Lab). Il peut être changé plus tard.",
"Choisissez un nom d'utilisateur se terminant par bot (p. ex. proxmenux_lab_bot). Il doit être unique à travers Telegram.",
"BotFather fournit un jeton tel que 123456789:ABCdef…. Il s’agit du jeton de bot : protégez-le comme un mot de passe."
],
"step2Title": "2 · Obtenir l'identifiant de discussion",
"step2Intro": "L’ID indique où le bot publie. Sa forme dépend de la destination.",
"privateLabel": "Chat privé (vous recevez les alertes pour votre propre compte):",
"privateItems": [
"Démarrez une conversation avec votre nouveau robot et envoyez tout message (par exemple : /start).",
"Ouvrez une conversation avec @userinfobot (ou @myidbot) et envoyez /start. Il répond avec votre ID d'utilisateur numérique — c'est-à-dire l'ID de chat. C'est un nombre positif."
],
"privateAlt": "Formulaire de canal Telegram rempli de jeton Bot (masqué), code de discussion positif pour un chat privé et un champ d'identification du sujet en option vide",
"privateCaption": "Chat privé avec le bot — Chat ID est un nombre positif (votre identifiant utilisateur personnel).",
"groupLabel": "Groupe ou supergroupe avec des sujets:",
"groupItems": [
"Ajouter le bot au groupe en tant que membre (et le rendre administrateur si le groupe l'exige pour poster).",
"Envoyez tout message dans le groupe.",
"Ouvrez https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates dans un navigateur. Recherchez le chat.id dans la réponse JSON — pour les groupes, c'est un nombre négatif, pour les supergroupes, il commence par -100.",
"Pour un supergroupe avec Sujets, relevez le message_thread_id voulu et placez-le dans le champ facultatif ID du sujet."
],
"groupAlt": "Formulaire Telegram avec jeton masqué, ID négatif commençant par -100 pour un supergroupe et ID de sujet 3",
"groupCaption": "Supergroupe — Chat ID commence par -100… et l'option Topic ID cible un thread spécifique.",
"step3Title": "3 · Enregistrer et tester",
"step3Body": "Collez jeton et ID, enregistrez, puis Envoyer un test. Le message devrait arriver en une seconde. Sinon, l’Historique indique la cause : jeton invalide, bot absent du groupe ou bloqué par l’utilisateur."
},
"discord": {
"heading": "Discord",
"intro": "Discord reçoit les messages via une URL de webhook associée au canal. Monitor a besoin de cette URL.",
"items": [
"Dans Discord, ouvrez Paramètres du serveur → Intégrations → Webhooks.",
"Choisissez Nouveau webhook, nommez-le par exemple ProxMenux et choisissez le canal. L’avatar est facultatif.",
"Choisissez Copier l’URL du webhook. Format : https://discord.com/api/webhooks/<id>/<token>.",
"Coller dans le champ URL Webhook de l'onglet Discord dans le panneau Notifications et enregistrer."
],
"imageAlt": "Formulaire de canal Discord avec champ URL Webhook commençant par https://discord.com/api/webhooks/",
"imageCaption": "Discord : collez l’URL obtenue dans Paramètres du serveur → Intégrations → Webhooks."
},
"gotify": {
"heading": "Gotify",
"intro": "Gotify est un serveur de notifications auto-hébergé. Il faut son URL de base et un jeton d’application créé dans son administration.",
"items": [
"Si nécessaire, installez Gotify selon le guide officiel d’installation.",
"Connectez-vous comme administrateur et ouvrez Applications → Créer une application. Nommez-la par exemple ProxMenux et copiez le jeton.",
"Dans Gotify, définissez URL du serveur, par exemple https://gotify.example.com, et collez le jeton.",
"Enregistrez et choisissez Envoyer un test."
],
"imageAlt": "Formulaire Gotify avec URL https://gotify.example.com et champ de jeton avec exemple A_valid_gotify_token",
"imageCaption": "Gotify — URL du serveur de votre instance auto-installée plus le token App de l'interface utilisateur d'administration Gotify."
},
"email": {
"heading": "E-mail (SMTP)",
"intro": "L’e-mail nécessite serveur SMTP, port, mode TLS, identifiant et mot de passe facultatifs, adresse d’envoi et au moins un destinataire.",
"imageAlt": "Formulaire SMTP : serveur, port, TLS, identifiant, mot de passe, expéditeur, destinataires séparés par des virgules et préfixe d’objet",
"imageCaption": "SMTP : serveur, port, TLS, identifiant et mot de passe facultatifs, expéditeur, destinataires et préfixe d’objet pour le filtrage.",
"appNote": "Monitor utilise SMTP avec mot de passe. Gmail peut demander un mot de passe d’application. Chez Microsoft, cela dépend du service et des règles du tenant ; un tel mot de passe ne contourne pas l’interdiction de l’authentification de base. Vérifiez la compatibilité du service.",
"gmailTitle": "Mot de passe de l'application Gmail",
"gmailIntro": "Gmail exige la validation en deux étapes pour créer un mot de passe d’application. Sinon, Mots de passe d’application n’est pas disponible.",
"gmailItems": [
"Ouvrez myaccount.google.com/security et activez la validation en deux étapes.",
"Allez sur myaccount.google.com/apppasswords.",
"Saisissez un nom comme ProxMenux et choisissez Créer. Copiez le mot de passe de 16 caractères.",
"Renseignez Serveursmtp.gmail.com, Port587, Mode TLSSTARTTLS, Identifiant votre adresse Gmail et Mot de passe celui d’application de 16 caractères."
],
"outlookTitle": "Mot de passe de l'application Microsoft / Outlook",
"outlookIntro": "Les mots de passe d’application Microsoft exigent la vérification en deux étapes, sans garantir la compatibilité SMTP. Si le service ou tenant exige OAuth2, le client SMTP du Monitor ne peut pas s’authentifier. Utilisez un relais adapté à cette authentification.",
"outlookItems": [
"Ouvrez account.microsoft.com/security et activez la vérification en deux étapes.",
"Si votre compte propose Options de sécurité avancées → Mots de passe d’application, choisissez Créer un mot de passe d’application. Cela ne garantit pas l’acceptation de SMTP avec mot de passe.",
"Si Microsoft crée ce mot de passe, copiez-le et vérifiez son acceptation par le service SMTP.",
"Uniquement si votre fournisseur autorise SMTP avec mot de passe, saisissez ses paramètres approuvés : Hôte SMTPsmtp.office365.com pour Exchange Online, Port587, Mode TLSSTARTTLS, Nom d'utilisateur l’adresse de votre boîte aux lettres et Mot de passe l’identifiant SMTP autorisé. Les paramètres et exigences d’authentification d’Outlook.com personnel sont différents ; ne supposez pas que ces identifiants fonctionneront."
],
"relayTitle": "Relais SMTP auto-hébergé",
"relayBody": "Dirigez Monitor vers un relais SMTP contrôlé, par exemple Postfix. Le relais gère l’authentification du fournisseur. Configurez authentification et TLS selon le relais ; son caractère local ne désactive pas le chiffrement."
},
"pushover": {
"heading": "Pushover",
"intro": "Pushover est un service de push mobile avec des applications officielles pour iOS, Android et les navigateurs de bureau. Le canal ProxMenux dédié parle directement au Pushover API, donc aucune URL Apprise n'est requise.",
"stepsTitle": "Configuration",
"steps": [
"Créer un compte Pushover, installer l'application officielle sur les appareils qui devraient recevoir des alertes et se connecter.",
"Copiez la clé utilisateur du tableau de bord Pushover. Une clé de groupe permet de servir plusieurs personnes ou appareils.",
"Ouvrez Créer une application/un jeton API, créez ProxMenux et copiez son jeton API de 30 caractères.",
"Dans Paramètres → Notifications → Pushover, collez la clé utilisateur ou de groupe et le jeton de l'application API. Les champs périphériques et sonores sont optionnels.",
"Enregistrer les paramètres et appuyez sur Envoyer test. L'application Pushover devrait recevoir le message immédiatement."
],
"priorityTitle": "Correspondance des priorités",
"priorityBody": "Les messages ordinaires utilisent la priorité 0. Avec Priorité haute pour les alertes critiques, les événements CRITICAL utilisent la priorité 1 et contournent les heures de silence Pushover. La priorité d’urgence 2 avec répétition et accusé de réception n’est pas utilisée.",
"secretTitle": "Protéger les deux valeurs",
"secretBody": "Clé utilisateur ou groupe et jeton API autorisent l’envoi. Monitor les protège et les masque dans l’interface. Ne publiez aucune des deux valeurs dans les captures ou journaux de support."
},
"apprise": {
"heading": "Apprise (hub générique pour les services ~80)",
"intro": "Apprise gère environ 80 services via des URL : ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API et d’autres, sans intégration dédiée dans Monitor. Pushover est aussi possible ; son propre onglet reste plus simple pour une destination unique.",
"listIntro": "La liste complète des services pris en charge et le format exact d'URL pour chacun d'eux sont disponibles dans la documentation officielle Apprise:",
"listItems": [
"Documentation des services Apprise — index complet.",
"Principes des URL — structure des URL Apprise."
],
"stepsTitle": "Étapes",
"steps": [
"Choisissez le service cible dans le wiki Apprise et copiez le modèle d'URL. Chaque page de service affiche le schéma exact à utiliser (ntfy://, matrix://, pover://, slack://...) plus les jetons, canaux ou noms d'hôte requis.",
"Remplacez les paramètres par vos identifiants. Exemples : ntfy.sh ntfy://ntfy.sh/my-topic, Pushover pover://user@token, Matrix matrix://user:pass@host:port/#room.",
"Coller l'URL finale dans le champ Apprise URL dans l'onglet Apprise du panneau Notifications et enregistrer.",
"Appuyez sur Envoyer Test pour vérifier que l'URL est accessible et que les identifiants sont acceptés."
],
"deliveredTitle": "Ce qui est livré",
"deliveredBody": "Apprise reçoit titre, texte et gravité, adaptée aux possibilités du service (icône, priorité, couleur). Le formatage et l’IA s’exécutent avant l’envoi, comme pour Telegram ou l’e-mail.",
"fanoutTitle": "Une URL par canal Apprise",
"fanoutBody": "Un champ URL par canal Apprise. Pour plusieurs services, tels ntfy.sh et Matrix, hébergez un serveur API Apprise avec configuration étiquetée. Il distribue l’appel du Monitor aux URL de l’étiquette."
},
"rich": {
"heading": "Messages riches, catégories et filtrage par canal",
"intro": "Trois contrôles par canal : Messages enrichis, onze Catégories de notification repliables avec interrupteurs d’événements, puis Envoyer un test.",
"imageAlt": "Catégories avec Messages enrichis en haut, sections VM/CT, sauvegardes, ressources, stockage, réseau, sécurité, cluster, services, santé et mises à jour, compteurs et bouton de test",
"imageCaption": "La flèche indique Messages enrichis. Dessous : onze catégories et leurs événements. Envoyer un test est en bas.",
"richTitle": "Messages enrichis",
"richIntro": "Avec Messages enrichis, chaque événement reçoit un emoji de catégorie et le format natif du canal, tel HTML Telegram ou carte Discord colorée. Sans cela, le même contenu part en texte simple :",
"plainHeader": "Texte simple — format enrichi désactivé",
"richHeader": "Texte enrichi — format activé",
"richOutro": "Réglage indépendant par canal : e-mail simple, Telegram et Discord enrichis, par exemple. Les canaux sans ce format, comme l’e-mail simple ou Gotify, reçoivent du texte.",
"togglesTitle": "Catégories par événement",
"togglesIntro": "Chaque canal contrôle séparément ses catégories et événements. Une catégorie désactivée supprime ses événements pour ce canal. Les réglages individuels s’appliquent aux catégories actives ; aucun interrupteur global d’événement n’existe dans le répartiteur.",
"togglesItems": [
"Contrôle de catégorie par canal. Désactiver VM/CT supprime vm_start et ses équivalents. Stockage : <channel>.events.<group>.",
"Contrôle d’événement par canal. Dans une catégorie active, choisissez par exemple envoyer backup_complete à Discord, pas à Telegram. Stockage : <channel>.event.<event_type>."
],
"togglesOutro": "Chaque catégorie affiche activés / total et un interrupteur pour tout le groupe, tel les sauvegardes info ou mises à jour, sans l’ouvrir."
},
"quiet": {
"heading": "Heures de silence",
"intro": "Pendant ce créneau propre au canal, seuls les événements CRITICAL passent. INFO, WARNING et actions sont conservés sur disque puis livrés dans un résumé à la fin.",
"imageAlt": "Réglages du canal : heures de silence 22:00–07:00 et aperçu du prochain changement, puis résumé quotidien à 09:00 avec note indiquant que ce résumé ne retarde ni CRITICAL ni WARNING",
"imageCaption": "Deux réglages indépendants par canal : heures de silence en haut, résumé quotidien dessous.",
"purposeTitle": "C'est pour quoi ?",
"purposeItems": [
"Pas d’avis de mise à jour à 03:00. Sauvegardes, mises à jour, optimisations et autres INFO ne font pas sonner le téléphone la nuit.",
"Les événements critiques restent immédiats. Seuls ceux classés CRITICAL contournent le silence. Le nom ne fixe pas la gravité : la surveillance du journal émet les blocages Fail2Ban et les arrêts/redémarrages de l’hôte en INFO, donc ils peuvent attendre.",
"Conserver les avis différés. Ils restent dans un tampon SQLite jusqu’à la fin du créneau."
],
"howTitle": "Comment ça marche",
"howItems": [
"Réglage par canal. Telegram peut rester silencieux de 22:00 à 07:00 tandis que l’e-mail reçoit tout, jour et nuit.",
"Début et fin dans le fuseau local : début inclus, fin exclue. Le créneau peut traverser minuit, par exemple 22:00–07:00.",
"Aperçu immédiat. Sous les champs apparaissent l’état actif et l’heure du prochain changement.",
"Pendant le créneau : CRITICAL suit l’envoi normal ; INFO et WARNING sont stockés dans la table SQLite quiet_pending.",
"À la fin : un résumé chronologique est envoyé, une ligne par événement. Le tampon n’est vidé qu’après confirmation de livraison, afin de résister aux pannes temporaires Telegram ou SMTP.",
"Résiste aux redémarrages. Le tampon reste sur disque. Le cycle suivant détecte les lignes en attente et envoie au besoin un résumé de récupération."
],
"criticalTitle": "Ce qui compte comme CRITIQUE",
"criticalBody": "Le producteur fixe la gravité à la création. Un événement de disque, arrêt ou sécurité n’est pas automatiquement CRITICAL. La surveillance du journal émet ip_block, system_shutdown et system_reboot en INFO. Le Catalogue des événements énumère les types ; consultez le producteur et l’événement reçu pour sa gravité réelle."
},
"digest": {
"heading": "Résumé quotidien des événements INFO",
"intro1": "Le résumé quotidien est facultatif : il rassemble les INFO admissibles, comme les mises à jour, à 09:00 ou à l’heure choisie. Résultats de sauvegarde/réplication et actions directes sont exclus. Les heures de silence diffèrent : elles retardent les messages non critiques durant un créneau.",
"intro2": "Le réglage est sous les heures de silence, dans la même carte ; voir Heures de silence. Chacun s’active séparément.",
"purposeTitle": "C'est pour quoi ?",
"purposeItems": [
"Un bilan matinal. Un résumé à 09:00 rassemble les informations de 20 messages de la veille, sans lire 20 bulles Telegram.",
"Distinguer activité et urgence. INFO décrit les faits ; CRITICAL et WARNING appellent une action. Les INFO admissibles sont regroupés, les autres gardent leur livraison directe."
],
"howTitle": "Comment ça marche",
"howItems": [
"Activation par canal. Désactivé par défaut. Activez-le seulement là où vous voulez un résumé ; les autres canaux restent en direct.",
"Heure de livraison locale, 09:00 par défaut. L’envoi se déclenche à environ 60 s près.",
"Inclus dans le résumé : événements génériques admissibles de niveau INFO. Exemples : mise à jour d’application disponible, mise à jour Tailscale disponible, mise à jour d’optimisation ProxMenux disponible et mises à jour de sécurité APT en attente. Les résultats de sauvegarde et les autres événements d’action exemptés restent en direct.",
"Ce qui n'est jamais retardé:",
"Persistance. Les événements restent dans SQLite, table digest_pending, jusqu’à l’heure prévue, même après redémarrage.",
"Sans événement, sans résumé. Aucun résumé vide n’est envoyé si aucun INFO n’attend."
],
"neverDelayedSub": [
"Les événements CRITICAL passent toujours immédiatement.",
"Les événements WARNING passent toujours immédiatement.",
"Les actions et échecs VM/CT, débuts et résultats de sauvegarde, résultats de réplication et arrêts/redémarrages de l’hôte contournent le résumé même en INFO. Le silence peut encore retarder les événements non critiques."
],
"comboTitle": "Combiner les heures tranquilles et le digest quotidien",
"comboBody": "Un canal peut activer les deux : silence 22:00–07:00 et résumé à 09:00. Les événements non critiques du créneau arrivent au résumé de07:00 ; les INFO admissibles hors créneau vont au résumé quotidien. CRITICAL contourne les deux ; WARNING contourne le quotidien mais attend pendant le silence. Choisissez un créneau silencieux, un résumé à heure fixe, ou les deux."
},
"displayName": {
"heading": "Nom d’affichage",
"intro": "Chaque avis porte un nom d’affichage identifiant l’hôte, tel 🏠 home-lab au bas de l’exemple et dans le préfixe d’objet.",
"imageAlt": "Champ Nom d’affichage avec exemple amd ; un champ vide utilise le nom d’hôte système",
"imageCaption": "Laissez le nom vide pour utiliser celui du système ou saisissez un nom personnalisé.",
"outro": "Si le champ est vide, le moniteur revient au nom d'hôte du système. La redéfinition est surtout utile lorsque vous exécutez plusieurs hôtes ProxMenux qui envoient à la même discussion ou boîte de réception Telegram, une étiquette plus conviviale (home-lab, office-pve) est plus facile à lire que pve01.lan ou pmx-prod-01."
},
"dispatch": {
"heading": "Traitement de l’envoi",
"intro": "Trois mécanismes liés sont décrits ci-dessous. L’ordre réel est regroupement, réservation/vérification du délai, limite par groupe, rendu puis contrôles de livraison par canal :",
"headerStage": "Étape",
"headerWhat": "Ce qu'il fait",
"headerTunable": "Réglable ?",
"rows": [
{
"stage": "Déduplication par empreinte",
"what": "Une empreinte est calculée pour chaque événement (event_type + key fields from data). Les empreintes identiques sur un intervalle court sont considérées comme des doublons.",
"tunable": "Non — logique du répartiteur interne."
},
{
"stage": "Délai de répétition",
"what": "Après livraison réussie, les répétitions sont supprimées ; l’état est dans notification_last_sent. Base pour CRITICAL, WARNING, INFO, resources et updates : 86400 s. Exceptions : 5 s pour actions VM/CT et arrêt/redémarrage, 10 s pour résultats sauvegarde/réplication, 1800–3600 s pour plusieurs états de santé. Les réglages explicites d’événement/groupe prévalent.",
"tunable": "Uniquement via l’API des paramètres : une clé cooldown.<event_type> ou cooldown.<group> remplace les valeurs par défaut ; aucun contrôle n’existe dans l’interface."
},
{
"stage": "Regroupement des rafales",
"what": "Une rafale d’événements semblables, comme des tentatives SSH, devient un message burst_* avec compteur et échantillon.",
"tunable": "Non — la fenêtre et le seuil sont codés en dur par type d'événement."
}
],
"calloutTitle": "Envoi dans un thread en arrière-plan",
"calloutBody": "La requête HTTP se termine à la mise en file ; le thread attend les réponses Telegram, SMTP ou webhook et inscrit les résultats dans l’historique."
},
"aiRewrite": {
"heading": "Réécriture optionnelle de l'IA",
"body1": "Les événements admissibles peuvent être réécrits par un LLM. backup_complete et backup_fail sont exclus. L’IA est désactivée par défaut et s’exécute dans le thread d’envoi. En cas d’erreur ou délai dépassé, le texte du modèle est utilisé.",
"body2": "OpenAI, Anthropic, Google Gemini, Groq, OpenRouter et Ollama local sont disponibles. Par canal : détail (brief, standard, detailed), langue, mode d’instructions (default ou custom) et instructions propres. Guide et exemples : Assistant IA.",
"privacyTitle": "Note de confidentialité",
"privacyBody": "La requête IA peut inclure titre, gravité, texte, instructions système/personnelles et contexte : noms d’hôte, IP, utilisateurs, erreurs et journaux. Elle part vers le serveur choisi. Ollama reste local seulement avec serveur et modèle locaux ; serveur distant ou modèle cloud transmettent les données hors de l’hôte. Désactivez l’IA ou utilisez serveur et modèle locaux contrôlés si le contenu doit rester dans le réseau."
},
"pveWebhook": {
"heading": "Intégration PVE webhook",
"intro1": "Proxmox utilise des cibles de notification sendmail, Gotify, SMTP et, sur les versions compatibles, webhook. Monitor enregistre une cible webhook. Les avis PVE, tels HA, réplication et sauvegardes de l’interface, rejoignent le même traitement.",
"intro2": "La cible est visible à partir du GUI Proxmox à Datacenter → Notifications → Objectifs de notification :",
"imageAlt": "Proxmox VE Modifier la boîte de dialogue Webhook montrant la cible de proxmenux-webhook créée automatiquement avec la méthode POST, URL http://127.0.0.1:8008/api/notifications/webhook et un modèle de corps JSON utilisant le titre d'échappement, message d'échappement, gravité d'échappement, horodatage d'échappement et champs json",
"imageCaption": "La cible webhook côté PVE comme Proxmox la voit (l'interface graphique se trouve dans le local configuré de l'hôte — espagnol dans cet exemple). Les mêmes champs s'appliquent dans n'importe quelle langue.",
"registeredIntro": "Ce qui est enregistré:",
"registeredItems": [
"Méthode et URL.POST http://127.0.0.1:8008/api/notifications/webhook sans HTTPS Monitor ; avec HTTPS, récepteur HTTP local séparé sur 8009. Les deux restent sur l’hôte.",
"Modèle du corps. JSON avec aides Handlebars natives de PVE, stocké en base64 dans la configuration. Une fois décodé :",
"Matcher. Un bloc d'accompagnement matcher: proxmenux-matcher avec mode all afin que chaque notification PVE atteigne la cible.",
"Configuration privée. La configuration écrit le bloc correspondant webhook: proxmenux-webhook dans /etc/pve/priv/notifications.cfg avec une entrée secret nommée X-Webhook-Secret, encodée en base64. Le bloc public de la cible ne contient que le modèle du corps, la méthode et l’URL. Le bloc privé n’est pas une ébauche vide."
],
"securityTitle": "Comment le récepteur est sécurisé",
"securityIntro": "Le récepteur webhook de POST /api/notifications/webhook applique différentes couches de sécurité selon l'origine de la demande:",
"securityItems": [
"Sources locales (127.0.0.1 / ::1). Limitation du nombre de requêtes, sans contrôles distants du secret, de l’heure et des répétitions. Les adresses des interfaces de l’hôte sont aussi locales. La cible PVE automatique utilise loopback.",
"Appels distants. En plus des limites, contrôles du secret X-Webhook-Secret, de l’heure dans X-ProxMenux-Timestamp ou le JSON, des répétitions et d’une liste IP facultative. Le secret est dans SQLite et copié en base64 dans /etc/pve/priv/notifications.cfg pour l’en-tête PVE."
],
"practiceTitle": "En pratique",
"practiceBody": "PVE utilise http://127.0.0.1:8008 sans HTTPS, sinon HTTP 8009. Les intégrations externes sur https://<monitor-host>:<port>/api/notifications/webhook doivent fournir X-Webhook-Secret et une heure actuelle, puis passer les contrôles de répétition et IP. Le secret seul ne suffit pas.",
"actionsIntro": "Le moniteur gère cette cible par trois actions sur l'onglet Paramètres :",
"actionsItems": [
"Configurer crée l’entrée dans /etc/pve/notifications.cfg. Seules les modifications sont écrites ; les trois sauvegardes récentes restent dans /usr/local/share/proxmenux/backups/pve-notifications/. Aucune écriture sans montage de /etc/pve ; la cible est inscrite au retour de pve-cluster.",
"Nettoyer retire l’entrée en gardant la sauvegarde précédente.",
"Lire la configuration affiche cibles et règles de correspondance pour vérifier les routes PVE."
],
"clusterTitle": "Nœuds du cluster",
"clusterBody": "/etc/pve/, URL et secret sont partagés dans le cluster. Chaque nœud appelle son propre récepteur : 127.0.0.1:8008 sans HTTPS, sinon HTTP 8009. Exécutez Monitor sur les nœuds concernés et assurez la cohérence de la cible avec chaque récepteur."
},
"catalogue": {
"heading": "Catalogue des événements",
"intro": "Environ 70 types sont regroupés en onze catégories repliables. Chaque événement possède un interrupteur et est activé par défaut, sauf indication contraire.",
"headerGroup": "Groupe",
"headerEvents": "Événements",
"rows": [
{
"group": "VM/CT",
"events": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, plus les équivalents ct_*, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail."
},
{
"group": "Sauvegardes",
"events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail."
},
{
"group": "Ressources",
"events": "cpu_high, ram_high, temp_high, load_high."
},
{
"group": "Stockage",
"events": "disk_space_low, disk_io_error, storage_unavailable, smart_test_complete, smart_test_failed."
},
{
"group": "Réseau",
"events": "network_down, network_latency."
},
{
"group": "Sécurité",
"events": "auth_fail, ip_block, firewall_issue, user_permission_change."
},
{
"group": "Cluster",
"events": "split_brain, node_disconnect, node_reconnect."
},
{
"group": "Services",
"events": "system_startup, system_shutdown, system_reboot, system_problem, service_fail, oom_kill, system_mail."
},
{
"group": "Moniteur de santé",
"events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent, health_issue_new, health_issue_resolved."
},
{
"group": "Mises à jour",
"events": "update_summary, update_available, pve_update, update_complete, proxmenux_update."
},
{
"group": "Matériel / GPU",
"events": "gpu_mode_switch, gpu_passthrough_blocked, pci_passthrough_conflict, ai_model_migrated."
}
],
"burstNote": "Les types burst_* (burst_auth_fail, burst_ip_block, burst_disk_io, etc.) remplacent les rafales par un résumé. Sans interrupteur propre, ils héritent du réglage de l’événement source.",
"backupResults": {
"heading": "Résultats de sauvegarde",
"intro": "Le rapport du travail de sauvegarde fixe résultat, titre, icône avec Messages enrichis et ligne d’état de l’e-mail.",
"headerIcon": "Icon",
"headerResult": "Résultat",
"headerWhen": "Quand",
"rows": [
{
"icon": "💾✅",
"result": "Sauvegarde terminée",
"when": "Tous les invités ont terminé, sans avertissement dans le rapport."
},
{
"icon": "💾⚠️",
"result": "Sauvegarde terminée avec des avertissements",
"when": "Tous les invités ont terminé, avec au moins un avertissement."
},
{
"icon": "💾❌",
"result": "Erreur de sauvegarde signalée",
"when": "Un invité a échoué, ou le travail s'est arrêté avec une erreur."
},
{
"icon": "💾❔",
"result": "Résultat de sauvegarde non confirmé",
"when": "Le rapport est incomplet ou n'indique pas de résultat pour chaque invité."
}
],
"items": [
"Le titre identifie le travail. Il indique le stockage et, pour un invité unique, son type, nom et ID. En cas d’échec, l’invité concerné est nommé.",
"Le texte détaille chaque invité : résultat, taille, durée et archive, puis totaux du travail.",
"Les mises en garde et les erreurs sont listées une fois. Les lignes répétées sont montrées une seule fois avec la cause principale d'abord; après huit lignes, le reste est compté dans une ligne de fermeture et reste dans le journal des tâches Proxmox.",
"Un travail qui échoue avant son premier invité montre la cause donnée par Proxmox, par exemple un stockage qui n'existe pas.",
"Les résumés gardent le résultat. Une sauvegarde dans le résumé du silence garde son icône. Les résultats de sauvegarde contournent le résumé quotidien."
]
}
},
"history": {
"heading": "Historique",
"body1": "Chaque tentative d’envoi réelle est dans notification_history : date sent_at, canal, événement, gravité, titre, texte, success et, en cas d’échec, error_message. Les rafales ont un type burst_*. Les événements supprimés par le délai ne sont pas enregistrés.",
"body2": "Paramètres → Notifications contient Historique des notifications, fermé par défaut, avec les 20 dernières entrées : résultat, canal, date, erreur et état de chaque résumé quotidien. La page ne propose pas la suppression ; Audit & Report lit les mêmes livraisons.",
"body3": "Les mêmes données sont exposées aux paramètres de requête GET /api/notifications/history avec les paramètres de requête limit, offset, severity et channel, et peuvent être effacées avec DELETE /api/notifications/history."
},
"api": {
"heading": "Points d’accès API",
"headerEndpoint": "Point d’accès",
"headerMethod": "Méthode",
"headerUse": "Utiliser",
"rows": [
{
"endpoint": "/api/notifications/settings",
"method": "GET / POST",
"use": "Lit ou écrit la configuration : canaux, événements, IA et nom d’affichage."
},
{
"endpoint": "/api/notifications/test",
"method": "POST",
"use": "Envoyer une notification de test à un canal : '{'\"channel\":\"telegram\"'}'."
},
{
"endpoint": "/api/notifications/test-ai",
"method": "POST",
"use": "Produit et réécrit un événement de test sans l’envoyer."
},
{
"endpoint": "/api/notifications/provider-models",
"method": "POST",
"use": "Liste des modèles disponibles pour le fournisseur d'IA sélectionné."
},
{
"endpoint": "/api/notifications/send",
"method": "POST",
"use": "Émettre un événement de l'extérieur (intégrations personnalisées)."
},
{
"endpoint": "/api/notifications/history",
"method": "GET / DELETE",
"use": "Consulte l’historique avec filtres ou le supprime."
},
{
"endpoint": "/api/notifications/webhook",
"method": "POST",
"use": "Reçoit les avis Proxmox. Les sources locales évitent les contrôles distants mais gardent la limitation. Les requêtes distantes passent X-Webhook-Secret, l’heure dans X-ProxMenux-Timestamp ou JSON, les contrôles de répétition et la liste IP configurée."
},
{
"endpoint": "/api/notifications/proxmox/setup-webhook",
"method": "POST",
"use": "Enregistrer le moniteur comme cible dans /etc/pve/notifications.cfg."
},
{
"endpoint": "/api/notifications/proxmox/cleanup-webhook",
"method": "POST",
"use": "Supprimer la cible Monitor de la configuration de notification de PVE."
},
{
"endpoint": "/api/notifications/proxmox/read-cfg",
"method": "GET",
"use": "Affiche la configuration actuelle de la notification PVE comme PVE la voit."
}
]
},
"whereNext": {
"heading": "Où aller ensuite",
"items": [
{
"label": "Assistant AI",
"href": "/docs/monitor/ai-assistant",
"tail": " — fournisseurs, modèles, modes d’instructions, langues et détail par canal."
},
{
"label": "Moniteur de santé",
"href": "/docs/monitor/health-monitor",
"tail": "— le plus grand producteur d'événements, avec ses propres durées de suppression par catégorie."
},
{
"label": "Architecture",
"href": "/docs/monitor/architecture",
"tailRich": " — rôle des tables SQLite notification_last_sent, notification_history et du thread d’envoi dans Monitor."
},
{
"label": "Accès et authentification",
"href": "/docs/monitor/access-auth",
"tailRich": " — création des jetons API pour les scripts appelant /api/notifications/send."
},
{
"label": "Tableau de bord → Logs système",
"href": "/docs/monitor/dashboard/system-logs",
"tail": " — vue directe du journal système exploité par la surveillance des événements."
}
]
}
}