mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-02 10:52:22 +00:00
Describe the Monitor pages as the code behaves
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
"reaching": {
|
||||
"heading": "Atteindre le tableau de bord",
|
||||
"intro": "Le ProxMenux Monitor se lie au <code>0.0.0.0:8008</code>. Il y a trois façons communes d'y parvenir:",
|
||||
"outro": "L’accès direct correspond à l’unité systemd par défaut. Le proxy inverse et Secure Gateway sont décrits ci-dessous. Les IP de <code>X-Forwarded-For</code> nécessitent PROXMENUX_TRUST_PROXY=1 et un proxy que vous contrôlez. <code>X-Forwarded-Proto</code> ou <code>X-Forwarded-Host</code> seuls n’activent pas cette confiance ; le frontend construit les URL API depuis l’origine du navigateur."
|
||||
"outro": "L’accès direct correspond à l’unité systemd par défaut. Le proxy inverse et Secure Gateway sont décrits ci-dessous. La confiance accordée aux IP clientes de <code>X-Forwarded-For</code> nécessite PROXMENUX_TRUST_PROXY=1 et un proxy que vous contrôlez. La seule présence de <code>X-Forwarded-Proto</code> ou <code>X-Forwarded-Host</code> n’active pas la confiance envers le proxy. Sur les ports 80/443, le frontend utilise des URL relatives <code>/api/*</code> ; sur tout autre port, il appelle le port 8008 du même nom d’hôte."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Premier démarrage",
|
||||
@@ -117,8 +117,8 @@
|
||||
"loginImageCaption": "Une fois l'authentification configurée, chaque visite au tableau de bord commence ici. Avec 2FA activé, l'écran demande le code à chiffres 6 dans une deuxième étape après l'acceptation du mot de passe.",
|
||||
"loginFlowTitle": "Flux de connexion",
|
||||
"twofaIntro": "Avec 2FA, le premier appel renvoie <code>requires_totp: true</code>. Répétez-le avec le code à six chiffres :",
|
||||
"publicTitle": "Accès public et sondes protégées",
|
||||
"publicIntro": "La connexion et son état sont publics. La création du compte reste possible tant qu’aucun identifiant et mot de passe ne sont enregistrés, même après un refus de protection. Les données système exigent une authentification lorsque la protection est active :",
|
||||
"publicTitle": "Points d’accès publics (sans jeton)",
|
||||
"publicIntro": "La connexion, l’état de l’authentification, la configuration initiale et le point d’accès léger <code>/api/system-info</code> sont publics :",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code> et <code>/api/auth/status</code> sont publics. <code>/api/auth/setup</code> crée le premier compte et refuse d’écraser des identifiants existants.",
|
||||
"<code>/api/system-info</code> est un endpoint public d’informations système légères, dont <code>health.status</code>. Il n’exige pas de jeton. /api/auth/status est également public et permet de vérifier la disponibilité."
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"asset": "Secret TOTP de 2FA",
|
||||
"algorithm": "TOTP standard (RFC 6238), avec secret encodé en base32. Les huit codes de récupération sont à usage unique et conservés sous forme de hachages SHA-256.",
|
||||
"algorithm": "TOTP standard (RFC 6238), avec secret encodé en base32. Les huit codes de secours sont à usage unique et conservés sous forme de hachages SHA-256.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
@@ -243,17 +243,17 @@
|
||||
}
|
||||
],
|
||||
"backupTitle": "Pourquoi les sauvegardes comptent",
|
||||
"backupBody": "Si vous perdez l’appareil, utilisez un code de récupération conservé ou restaurez une sauvegarde préparée auparavant. Synchronisation cloud et exports varient selon l’application : vérifiez que votre méthode restaure bien les secrets TOTP. L’accès root à l’hôte permet aussi une récupération, décrite ci-dessous. Gardez une sauvegarde distincte et sécurisée.",
|
||||
"backupBody": "Si vous perdez l’appareil d’authentification, utilisez un code de secours conservé ou restaurez l’application depuis une sauvegarde préparée auparavant. Synchronisation cloud et exports locaux varient selon l’application : vérifiez que votre méthode restaure bien les secrets TOTP. L’accès root à l’hôte permet aussi une récupération, décrite ci-dessous. Gardez une sauvegarde distincte et sécurisée.",
|
||||
"setupTitle": "Configuration étape par étape depuis le tableau de bord",
|
||||
"setupImageAlt": "Écran de configuration 2FA avec code QR et codes de sauvegarde",
|
||||
"setupImageCaption": "Le dialogue 2FA montre un QR code, le secret Base32 pour la saisie manuelle et huit codes de récupération à usage unique. Copiez-les avant de fermer : ils ne seront plus affichés.",
|
||||
"setupImageCaption": "Le dialogue de configuration 2FA montre un QR code, un secret Base32 pour la saisie manuelle et, après la vérification, huit codes de secours à usage unique. Copiez les codes avant de fermer le dialogue : ils ne seront plus affichés.",
|
||||
"setupSteps": [
|
||||
"<strong>Installez l'application authentificateur sur votre téléphone</strong> (ou ouvrez votre gestionnaire de mots de passe). Une des applications du tableau ci-dessus. Vous n'avez besoin de le faire qu'une seule fois — la même application contiendra des codes pour chaque service que vous protégez.",
|
||||
"<strong>Se connecter au tableau de bord</strong> avec votre nom d'utilisateur et votre mot de passe.",
|
||||
"<strong>Ouvrez l’onglet Sécurité</strong>, puis <strong>Activer 2FA</strong>. Le dialogue montre le QR code, le secret Base32 et huit codes de récupération.",
|
||||
"<strong>Ouvrez l’onglet Sécurité</strong> dans la barre latérale du tableau de bord, puis cliquez sur <strong>Activer 2FA</strong> et <strong>Démarrer la configuration</strong>. Le dialogue montre le QR code et la clé manuelle ; les huit codes de secours apparaissent après la vérification du code.",
|
||||
"<strong>Ajouter l'entrée à l'application authentificateur:</strong>",
|
||||
"<strong>Conservez les codes de récupération.</strong> Gardez les huit dans un gestionnaire de mots de passe, une note chiffrée ou une copie papier sécurisée. Chacun sert une fois si l’application est indisponible.",
|
||||
"<strong>Confirmez avec le code actuel à six chiffres</strong> de l’application dans le champ « Code de vérification », puis validez. Le code change toutes les 30 secondes ; s’il expire pendant la saisie, utilisez le suivant.",
|
||||
"<strong>Confirmez avec le code actuel à six chiffres</strong> de l’application dans le champ « Code de vérification » du dialogue de configuration, puis validez. Le code change toutes les 30 secondes ; s’il expire pendant la saisie, utilisez le suivant.",
|
||||
"<strong>Conservez les codes de secours.</strong> Après la vérification, gardez les huit en lieu sûr dans un gestionnaire de mots de passe, une note chiffrée ou une copie papier sécurisée. Chacun sert une fois si votre application d’authentification est indisponible.",
|
||||
"<strong>Terminé.</strong> 2FA est actif. La prochaine connexion demande d’abord le mot de passe, puis le code actuel à six chiffres."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
@@ -261,17 +261,17 @@
|
||||
"<em>Alternative manuelle</em> si le scan est impossible, notamment sur le même téléphone : <em>Ajouter un compte</em> → <em>Saisir une clé de configuration</em>. Choisissez un nom comme <em>Proxmox Monitor</em>, collez le secret Base32, laissez le <em>Type</em> sur <em>Basé sur le temps</em> et enregistrez."
|
||||
],
|
||||
"testTitle": "Tester avant de déconnecter",
|
||||
"testBody": "Gardez la session actuelle ouverte et testez une nouvelle connexion dans une fenêtre privée <em>immédiatement</em> après la configuration. Si le code échoue, vérifiez les horloges du serveur et du téléphone avant de fermer la session fonctionnelle. Si l’accès est perdu, utilisez un code de récupération ou modifiez <code>auth.json</code> depuis le shell de l’hôte.",
|
||||
"testBody": "Gardez la session actuelle ouverte et testez une nouvelle connexion dans une fenêtre privée <em>immédiatement</em> après la configuration. Si le code est refusé, vérifiez les horloges du serveur et du téléphone avant de vous déconnecter de la session fonctionnelle. Si l’accès est déjà perdu, utilisez un code de secours ou modifiez <code>auth.json</code> depuis le shell de l’hôte.",
|
||||
"lostTitle": "Authentificateur perdu",
|
||||
"lostIntro": "Trois méthodes de récupération, de la moins intrusive à la plus intrusive :",
|
||||
"lostItems": [
|
||||
"<strong>Utilisez un code de récupération.</strong> Saisissez un des huit codes dans le champ TOTP. Il sert une fois ; les autres restent valides. Après connexion, reconfigurez 2FA dans les paramètres pour obtenir huit nouveaux codes.",
|
||||
"<strong>Utilisez un code de secours.</strong> Saisissez un des huit codes enregistrés dans le champ TOTP. Il sert une fois ; les codes inutilisés restent valides. Après connexion, ouvrez Sécurité, choisissez <strong>Désactiver 2FA</strong> puis <strong>Activer 2FA</strong> pour obtenir huit nouveaux codes.",
|
||||
"<strong>Restaurer l'authentificateur à partir du cloud / sauvegarde.</strong> Si votre application a une synchronisation cloud (Google, Microsoft, Authy, Apple Passwords via iCloud Keychain, Ente, 2FAS) l'installe sur un nouvel appareil, se connecte et les entrées réapparaissent. Si votre application utilise un fichier d'exportation chiffré (Aegis, Raivo, FreeOTP+), installer l'application sur le nouvel appareil et importer le fichier.",
|
||||
"<strong>Désactivez 2FA depuis le shell de l'hôte.</strong> Lorsque les options précédentes ne sont pas disponibles, modifiez <code>/root/.config/proxmenux-monitor/auth.json</code> sur l'hôte Proxmox (vous avez besoin de root SSH ou d'un accès à la console), définissez <code>totp_enabled</code> sur <code>false</code>, enregistrez et redémarrez le service :"
|
||||
],
|
||||
"lostShellOutro": "Vous pouvez vous connecter avec le nom d'utilisateur + mot de passe seulement, puis réactiver 2FA depuis Paramètres.",
|
||||
"disableTitle": "Désactiver 2FA",
|
||||
"disableBody": "Ouvrez <strong>Sécurité</strong> et choisissez <strong>Désactiver 2FA</strong>. <code>POST /api/auth/totp/disable</code> exige le mot de passe actuel et un code TOTP ou de récupération valide. Le secret TOTP et les codes sont effacés. Retirez aussi l’ancienne entrée de l’application.",
|
||||
"disableBody": "Ouvrez <strong>Sécurité</strong> et choisissez <strong>Désactiver 2FA</strong>. <code>POST /api/auth/totp/disable</code> exige le mot de passe actuel et un code TOTP ou de secours valide. Le secret TOTP et les codes de secours sont effacés. Retirez aussi l’ancienne entrée de votre application d’authentification.",
|
||||
"rejectedTitle": "Le code à chiffres 6 est toujours rejeté",
|
||||
"rejectedIntro": "TOTP dépend du temps : les horloges du serveur et du téléphone doivent différer de moins d’environ 30 s. Deux contrôles :",
|
||||
"rejectedItems": [
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"intro": {
|
||||
"title": "Désactivé par défaut, un seul interrupteur pour l’activer",
|
||||
"body": "La reformulation IA est désactivée par défaut. Activez-la dans <em>Paramètres → Notifications → Avancé : amélioration IA</em>. Si l’enrichissement ou la reformulation échoue, le texte du modèle original est envoyé. Chaque reformulation a un délai maximal de 25 secondes ; au-delà, le modèle est utilisé sans attendre indéfiniment."
|
||||
"body": "La reformulation IA est désactivée par défaut. Activez-la dans <em>Paramètres → Notifications → Avancé : amélioration IA</em>. Si l’enrichissement ou la reformulation échoue, le répartiteur envoie le modèle original. Les reformulations de la file d’envoi des événements ont un délai maximal de 25 secondes ; une fois ce délai atteint, le modèle est envoyé au lieu d’attendre."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Comment ça marche",
|
||||
@@ -109,7 +109,7 @@
|
||||
],
|
||||
"customNote": "Le mode personnalisé fixe la sortie à 500 tokens, quel que soit le niveau de détail. Vous contrôlez les instructions ; le plafond évite les réponses trop longues.",
|
||||
"sizingTitle": "Taille pratique",
|
||||
"sizingBody": "Estimez la consommation : événements reformulés × canaux IA × tokens d’entrée et de sortie par appel. Exemple : 50 événements × un canal × (500 en entrée + 300 en sortie) = 40 000 tokens par jour. Les valeurs réelles dépendent du modèle, du contexte, du cache et des limites du fournisseur. <link>Détail par canal</link> explique comment utiliser <code>brief</code> pour le chat au lieu de <code>standard</code>, avec des e-mails détaillés."
|
||||
"sizingBody": "Estimez la consommation : événements reformulés × canaux avec IA × tokens d’entrée et de sortie par appel. Exemple : 50 événements × un canal × (2 000 en entrée + 300 en sortie) font environ 115 000 tokens par jour, car l’invite système par défaut compte à elle seule environ 1 500 tokens. La consommation et les coûts réels dépendent du modèle, du contexte, du cache et des limites du fournisseur. La section <link>Détail par canal</link> explique comment utiliser <code>brief</code> pour le chat au lieu de <code>standard</code>, tout en gardant des rapports e-mail détaillés."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "Fournisseurs d'IA",
|
||||
@@ -142,7 +142,7 @@
|
||||
"items": [
|
||||
"Clé API : <a>console.anthropic.com/settings/keys</a>",
|
||||
"Exemples de la liste de modèles fournie : <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
|
||||
"Recommandation fournie : <strong><code>claude-haiku-4-5-20251001</code></strong>. Cette version précise est recommandée ; les anciens modèles Claude 3.5 ne figurent plus dans la liste fournie."
|
||||
"Recommandation fournie : <strong><code>claude-haiku-4-5-20251001</code></strong>, un instantané figé plutôt qu’un alias évolutif."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Crée une sauvegarde vzdump de VM ou LXC. Champs facultatifs à adapter au stockage : <code>storage</code> (cible PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> ou <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> ou <code>none</code>), <code>protected</code> (<code>true</code> ou <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> ou <code>never</code>) et <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> ou <code>data</code>). Renvoie l’UPID de la tâche PVE."
|
||||
"use": "Crée une sauvegarde vzdump d’une VM ou d’un LXC. Champs du corps, tous facultatifs sauf si les valeurs par défaut ne correspondent pas à l’organisation du stockage : <code>storage</code> (un stockage PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> ou <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> ou <code>none</code>), <code>protected</code> (<code>true</code> ou <code>false</code>), <code>notes</code> et <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> ou <code>data</code>). Renvoie l’UPID de la tâche PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
@@ -286,7 +286,7 @@
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Lance un autotest SMART. Schéma du corps : <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
"use": "Lance un autotest SMART. Schéma du corps : <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
|
||||
@@ -73,13 +73,13 @@
|
||||
"intro": "L’AppImage contient un système de fichiers monté à l’exécution. <code>AppRun</code> à sa racine prépare l’environnement et lance <code>flask_server.py</code> :",
|
||||
"consequencesIntro": "Deux conséquences de cette disposition :",
|
||||
"consequences": [
|
||||
"<strong>Environnement Python fourni.</strong> Interpréteur et paquets sont dans l’AppImage, sans installation dans le Python système. L’application utilise toujours les interfaces du noyau et les outils externes de l’hôte.",
|
||||
"<strong>Paquets Python fournis.</strong> Les paquets Python sont livrés dans l’AppImage et s’exécutent avec l’interpréteur Python de l’hôte lui-même, 3.11 (PVE 8) ou 3.13 (PVE 9), sans rien installer dans le Python système de l’hôte. L’application utilise toujours les interfaces du noyau et les outils externes de l’hôte.",
|
||||
"<strong>Clients matériels inclus.</strong> L’AppImage fournit <code>ipmitool</code>, <code>lm-sensors</code> et <code>upsc</code>. Les mesures dépendent du matériel compatible, de l’accès aux capteurs et, pour l’onduleur, d’un serveur NUT configuré."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Structure de l’application Flask",
|
||||
"intro": "<code>flask_server.py</code> crée une instance <code>Flask(__name__)</code> avec CORS limité, enregistre directement neuf blueprints et initialise le terminal. Le tableau montre les modules principaux ; audit, sauvegarde VM et PBS sont aussi enregistrés. Les préchargements PVE ne tournent que sur les hôtes PVE.",
|
||||
"intro": "<code>flask_server.py</code> crée une instance <code>Flask(__name__)</code> avec des origines CORS restreintes, enregistre directement dix blueprints et initialise les routes du terminal. Le tableau montre les modules principaux ; les blueprints PBS, liens du Monitor, audit et sauvegarde VM sont aussi enregistrés. Les préchargements propres à PVE ne tournent que sur les hôtes PVE.",
|
||||
"headerBlueprint": "Blueprint / module",
|
||||
"headerPrefix": "Préfixe des itinéraires",
|
||||
"headerOwns": "Responsabilité",
|
||||
@@ -242,10 +242,10 @@
|
||||
"Mises à jour : paquets en attente et correctifs de sécurité.",
|
||||
"Journaux : motifs persistants, pics et cascades dans le journal système.",
|
||||
"Mémoire : interventions de l’OOM killer et pression mémoire prolongée.",
|
||||
"Température : mesures CPU et disques comparées aux seuils de surveillance ; les capteurs disponibles dépendent du matériel.",
|
||||
"CPU : utilisation et température CPU comparées aux seuils configurables ; les capteurs disponibles dépendent du matériel.",
|
||||
"Sécurité : échecs de connexion, blocages et état du jail Fail2Ban."
|
||||
],
|
||||
"afterIntro": "Les constats utilisent <code>error_key</code>, catégorie et gravité stables. Les lignes d’<code>errors</code> sont mises à jour avec <code>last_seen</code> et le compteur, sans duplication. L’envoi a aussi ses propres empreintes et temporisations.",
|
||||
"afterIntro": "Les constats utilisent <code>error_key</code>, catégorie et gravité stables. Les enregistrements existants d’<code>errors</code> sont mis à jour sur place (<code>last_seen</code>, gravité, motif), sans duplication. L’envoi des notifications a aussi ses propres règles d’empreinte et de temporisation.",
|
||||
"cycleEnd": "Le nettoyage peut résoudre les erreurs anciennes selon la <em>durée de suppression</em> par catégorie et des règles d’état, retirer les entrées orphelines des ressources supprimées et purger <code>events</code> après 30 jours. Voir <link>Tableau de bord → Health Monitor</link> pour les catégories."
|
||||
},
|
||||
"notifications": {
|
||||
@@ -264,9 +264,9 @@
|
||||
"intro": "L’onglet <em>Terminal</em> relie un client léger <code>xterm.js</code> à un PTY du serveur via WebSocket. Deux modes existent :",
|
||||
"items": [
|
||||
"<strong>Mode HTTP, par défaut :</strong> le serveur Flask intégré et <code>flask-sock</code> gèrent le passage au protocole WebSocket.",
|
||||
"<strong>Mode HTTPS / WSS :</strong> utilise <code>gevent.pywsgi.WSGIServer</code> avec <code>geventwebsocket.handler.WebSocketHandler</code> pour WebSocket sur TLS."
|
||||
"<strong>Mode HTTPS / WSS :</strong> le serveur TLS utilise <code>gevent.pywsgi.WSGIServer</code> avec son gestionnaire par défaut ; <code>flask-sock</code> gère les connexions WebSocket sur TLS."
|
||||
],
|
||||
"outro": "Les processus du terminal héritent de <code>User=root</code>. Avec authentification active, WebSocket exige un ticket bref à usage unique obtenu par le point d’accès authentifié avec droits administratifs. Si l’authentification est désactivée ou refusée, la connexion suit ce mode sans authentification.",
|
||||
"outro": "Les processus enfants du terminal héritent de <code>User=root</code> du service. L’ouverture d’un WebSocket exige un ticket bref à usage unique obtenu par le point d’accès authentifié des tickets de terminal avec droits administratifs.",
|
||||
"proxyNote": "Avec un proxy inverse, autorisez WebSocket et ses en-têtes <code>Upgrade</code> et <code>Connection</code>. Le terminal a besoin de ce transfert."
|
||||
},
|
||||
"proxy": {
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
}
|
||||
],
|
||||
"reportTitle": "Rapport de latence réseau (PDF)",
|
||||
"reportIntro": "Les deux modes ont un bouton <strong>Rapport</strong> près du sélecteur de cible. Il génère un PDF des mesures que vous pouvez joindre à une demande d’assistance auprès de votre FAI.",
|
||||
"reportIntro": "Les deux modes ont un bouton <strong>Rapport</strong> près du sélecteur de cible. Il ouvre un rapport imprimable des mesures ; enregistrez-le en PDF depuis la boîte de dialogue d’impression du navigateur et joignez-le à une demande d’assistance auprès de votre FAI.",
|
||||
"reportPreviewAlt": "Première page PDF du rapport de latence : synthèse, jauge, statistiques, graphique et guide des seuils",
|
||||
"reportPreviewCaption": "La première page contient la synthèse, la jauge, les statistiques principales, l’évolution de la latence et le guide des seuils. À partir de la page 2 figurent le tableau des mesures et la méthodologie.",
|
||||
"downloadLabel": "Télécharger un exemple de rapport de latence (PDF)",
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
"configCaption": "Modification du jail sshd : réduisez <em>Max Retries</em> si vous utilisez SSH uniquement depuis votre sous-réseau, ou augmentez <em>Ban Time</em> pour un tableau de bord exposé sur Internet.",
|
||||
"outro": "Le guide <em>Installation, configuration et désinstallation</em> couvre aussi l’installation manuelle, la modification de SSH MaxAuthTries et le journal <code>proxmenux-auth.log</code>. Consultez <link>ProxMenux → Sécurité → Fail2Ban</link>.",
|
||||
"calloutTitle": "Sans Fail2Ban, ce mécanisme ne bloque pas les IP",
|
||||
"calloutBody": "ProxMenux Monitor vérifie les IP bloquées par Fail2Ban au <em>niveau applicatif</em> avant de traiter les requêtes Flask. Il interroge fail2ban-client et conserve le résultat en cache pendant 30 secondes ; il ne lit pas de table SQL de blocages. Sans Fail2Ban, les échecs sont consignés dans <code>proxmenux-auth.log</code>, mais ce mécanisme ne bloque pas les IP."
|
||||
"calloutBody": "ProxMenux Monitor vérifie les IP bloquées dans la jail <code>proxmenux</code> de Fail2Ban au <em>niveau applicatif</em> avant de traiter les requêtes Flask, en gardant le résultat en cache pendant 30 secondes. Sans Fail2Ban, les échecs de connexion sont consignés dans <code>proxmenux-auth.log</code> et le point d’accès de connexion est limité à 5 tentatives par IP toutes les 5 minutes, mais aucune IP n’est bloquée."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Audit de sécurité Lynis",
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Seuils du Health Monitor",
|
||||
"intro": "La carte précédente définit <em>la durée de silence après un rejet</em> ; celle-ci règle <strong>la valeur qui déclenche une alerte</strong>. La plupart des contrôles ont des valeurs <strong>Avertissement</strong> et <strong>Critique</strong> réglables. Le tableau explique les exceptions, dont la règle combinée du swap et le détecteur RAM actuel.",
|
||||
"intro": "La carte précédente définit <em>la durée de silence après un rejet</em> ; celle-ci règle <strong>la valeur qui déclenche une alerte</strong>. La plupart des contrôles à seuil ont des valeurs <strong>Avertissement</strong> et <strong>Critique</strong> réglables. Le tableau ci-dessous explique les exceptions, comme la règle combinée du swap.",
|
||||
"whatForTitle": "À quoi cela sert",
|
||||
"whatForIntro": "Les valeurs par défaut sont un point de départ ; chaque environnement a ses propres conditions :",
|
||||
"whatForItems": [
|
||||
@@ -85,7 +85,7 @@
|
||||
"Choisissez les seuils de température selon les spécifications du disque et ses conditions réelles. Le refroidissement passif ou forcé ne définit pas seul une limite sûre universellement plus basse ou haute.",
|
||||
"Un hôte très virtualisé peut avoir des pics CPU pendant les compilations sans alerter à chaque pic de 80 %, mais doit signaler une saturation durable."
|
||||
],
|
||||
"whatForOutro": "Les modifications prises en charge s’appliquent <strong>à l’analyse suivante</strong>. Le Health Monitor lit <code>/usr/local/share/proxmenux/health_thresholds.json</code> à chaque cycle sans redémarrage. Certains indicateurs, comme la température des disques, utilisent ces valeurs ; des barres de capacité gardent leurs propres limites. La ligne RAM décrit une exception actuelle.",
|
||||
"whatForOutro": "Les modifications de seuils prises en charge s’appliquent <strong>à l’analyse suivante</strong>. Le Health Monitor lit <code>/usr/local/share/proxmenux/health_thresholds.json</code> à chaque cycle sans redémarrage. Certains indicateurs, dont la température des disques, utilisent ces valeurs ; certaines barres de capacité gardent leurs propres limites visuelles.",
|
||||
"coloursTitle": "Couleurs des états Avertissement et Critique",
|
||||
"coloursIntro": "Les widgets utilisant Avertissement/Critique suivent les trois états ci-dessous. D’autres indicateurs, comme les barres de capacité PVE, ont leurs propres limites ; leur couleur seule n’indique pas une alerte Health Monitor.",
|
||||
"headerColour": "Couleur",
|
||||
@@ -125,7 +125,7 @@
|
||||
"section": "Mémoire",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Pression RAM de l’hôte. Le réglage affiche Critique à 95 %, mais le détecteur actuel utilise une règle fixe de 90 % soutenus ; ce réglage ne modifie pas actuellement cette branche d’exécution."
|
||||
"gates": "Pression RAM de l’hôte."
|
||||
},
|
||||
{
|
||||
"section": "Swap (seuil critique uniquement)",
|
||||
@@ -185,7 +185,7 @@
|
||||
"section": "Stockage PVE",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Stockages gérés par PVE : LVM, LVM-thin, ZFS-pool, RBD/Ceph et PBS. Tous ne sont pas des stockages en blocs."
|
||||
"gates": "Uniquement les stockages PVE de type LVM, LVM-thin, ZFS-pool, RBD, CephFS et PBS. Les stockages répertoire, NFS et CIFS relèvent de la ligne d’espace disque de l’hôte."
|
||||
},
|
||||
{
|
||||
"section": "Pool ZFS",
|
||||
@@ -218,7 +218,7 @@
|
||||
"toggleTitle": "Interrupteur de notification lié à la détection",
|
||||
"toggleBody": "L’interrupteur <code>lxc_updates_available</code> par canal dans <strong>Notifications → Services</strong> n’apparaît que si la détection est active. La désactiver masque la ligne pour tous les canaux. Le choix reste dans la base et retrouve sa valeur à la réactivation.",
|
||||
"purgeTitle": "Ce qui est supprimé à la désactivation",
|
||||
"purgeBody": "La désactivation retire aussitôt les entrées <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Les compteurs de mises à jour LXC de Matériel disparaissent à l’actualisation suivante. La réactivation remplit le registre au prochain cycle, ou plus tôt par actualisation manuelle de l’API."
|
||||
"purgeBody": "La désactivation retire aussitôt toutes les entrées <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Les compteurs de mises à jour LXC de l’onglet VM et LXC disparaissent à l’actualisation suivante du tableau de bord. La réactivation remplit le registre au prochain cycle de détection, ou plus tôt par actualisation manuelle de l’API."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Exclusions de stockage distant",
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"items": [
|
||||
"<strong>Chemin du périphérique</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Étiquette de type</strong> — SATA / NVMe et icône associée.",
|
||||
"<strong>Étiquette système</strong> — marque orange pour les disques identifiés comme hébergeant le système. La détection utilise les montages <code>/</code> et <code>/boot</code> et applique l’étiquette <em>System</em>. Son absence ne prouve pas qu’un disque peut être effacé ou réutilisé sans risque.",
|
||||
"<strong>Étiquette système</strong> — marque orange pour les disques utilisés par l’hôte : points de montage système (<code>/</code>, <code>/boot</code>, <code>/usr</code>, <code>/var</code>…), swap actif, membres de pools ZFS, volumes physiques LVM, membres RAID actifs ou étiquettes de partitions système. Son absence ne prouve pas qu’un disque peut être effacé ou réutilisé sans risque.",
|
||||
"<strong>Modèle</strong> — fabricant et modèle de <code>smartctl -i</code>.",
|
||||
"<strong>Capacité</strong> — exprimée en unités lisibles.",
|
||||
"<strong>Température</strong> — valeur actuelle en °C, colorée selon le type de disque ; les seuils NVMe sont plus élevés que SATA.",
|
||||
@@ -112,7 +112,7 @@
|
||||
"pdfPreviewAlt": "Première page du rapport SMART avec synthèse, indicateur PASSED et informations sur le disque",
|
||||
"pdfPreviewCaption": "Première page : synthèse, indicateur PASSED et informations complètes du disque. L’exemple PDF contient l’usure SSD, tous les attributs SMART et l’historique des tests.",
|
||||
"pdfDownloadLabel": "Télécharger un exemple de rapport SMART (PDF)",
|
||||
"pdfSectionsIntro": "Le rapport comporte six sections principales :",
|
||||
"pdfSectionsIntro": "Le rapport comporte ces sections principales :",
|
||||
"pdfSections": [
|
||||
"<strong>Synthèse</strong> — état PASSED/FAILED, évaluation claire du disque — sain, usé ou défaillant — et quatre données : date du rapport, dernier type de test, résultat et attributs vérifiés.",
|
||||
"<strong>Informations sur le disque</strong> — modèle, série, capacité, type HDD/SSD/NVMe, famille, format, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM, température et seuil optimal, heures de fonctionnement, cycles d’alimentation, SMART, secteurs en attente/réalloués et erreurs CRC.",
|
||||
@@ -127,7 +127,7 @@
|
||||
"historyImageCaption": "Historique SMART du disque. Chaque ligne affiche type, date, ancienneté, repère du dernier test et actions de téléchargement de la sortie <code>smartctl</code> et suppression.",
|
||||
"historyIntro": "Tests courts et étendus terminés et conservés pour le disque. Chaque entrée contient la sortie originale <code>smartctl</code> et les champs interprétés par Monitor pour le tableau de bord. Actions par ligne :",
|
||||
"historyItems": [
|
||||
"<strong>Télécharger</strong> — enregistre l’instantané JSON contenant les données <code>smartctl -a</code> utilisées par le rapport. Utile si le support demande les champs de diagnostic originaux.",
|
||||
"<strong>Télécharger</strong> — enregistre l’instantané JSON de ce test (sortie de <code>smartctl -a --json</code>, ou <code>nvme smart-log</code> sur NVMe si smartctl échoue). Utile si le support du fabricant demande les champs de diagnostic originaux.",
|
||||
"<strong>Supprimer</strong> — retire manuellement un test de l’historique. La conservation de Planification (<em>5 / 10 / 20 derniers</em>) supprime automatiquement les plus anciens."
|
||||
],
|
||||
"scheduleTitle": "Onglet 4 — Planification",
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Tableau de bord : VM et LXC | Documentation ProxMenux",
|
||||
"description": "Inventaire des invités avec CPU, mémoire et disque en direct. Les détails montrent configuration, ressources, sauvegardes, résultats récents du journal Proxmox, notes et Démarrer / Éteindre / Redémarrer / Forcer l'arrêt."
|
||||
"description": "L’onglet VM et LXC inventorie tous les invités de l’hôte avec l’utilisation CPU, mémoire et disque en direct. Les détails de chaque invité montrent configuration, ressources, sauvegardes, journal de console des conteneurs OCI, notes et commandes Démarrer / Éteindre / Redémarrer / Forcer l'arrêt."
|
||||
},
|
||||
"header": {
|
||||
"title": "Tableau de bord : VM et LXC",
|
||||
"description": "Inventaire complet du nœud : quatre mesures en haut, une liste triable des VM et LXC et les détails par invité avec configuration, ressources, sauvegardes, journaux et commandes Démarrer / Éteindre / Redémarrer / Forcer l'arrêt.",
|
||||
"description": "Inventaire complet des invités du nœud : quatre mesures en haut, une liste triable de chaque VM et LXC en dessous et les détails par invité avec configuration, ressources, sauvegardes, journal de console des conteneurs OCI et les quatre commandes de cycle de vie (Démarrer / Éteindre / Redémarrer / Forcer l'arrêt).",
|
||||
"section": "ProxMenux Monitor · Tableau de bord"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Commandes des systèmes invités",
|
||||
"body": "Cet onglet contrôle le cycle de vie des invités. Les actions passent par <code>POST /api/vms/<vmid>/control</code> avec confirmation explicite et actualisent la ligne de l'invité. L'arrêt forcé nécessite le bouton dédié Forcer l'arrêt."
|
||||
"body": "Cet onglet contrôle le cycle de vie des invités. Les actions de cycle de vie passent par <code>POST /api/vms/<vmid>/control</code> ; Redémarrer et Forcer l'arrêt demandent de saisir le VMID pour confirmer, et la réponse est reflétée dans la ligne de l’invité. L’arrêt forcé nécessite le bouton dédié Forcer l'arrêt."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Ligne supérieure : quatre cartes statistiques",
|
||||
@@ -186,9 +186,9 @@
|
||||
"source": "Les données PVE RRD (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) sont condensées à une forme facile à tracer."
|
||||
},
|
||||
{
|
||||
"section": "Résultats récents du journal Proxmox",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "<code>pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000</code>. Un échec renvoie une liste vide ; ces données ne constituent pas les journaux système complets de l'invité."
|
||||
"section": "Journal de console OCI (onglet Logs)",
|
||||
"endpoint": "/api/lxc/<vmid>/console-log",
|
||||
"source": "Sortie console du processus principal de l’image, lue depuis <code>/var/log/proxmenux/oci/<vmid>.console.log</code> sur l’hôte. Affiché uniquement pour les conteneurs OCI."
|
||||
},
|
||||
{
|
||||
"section": "Sauvegardes disponibles pour les invités",
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
{
|
||||
"category": "Stockage",
|
||||
"checks": "Stockages Proxmox, système de fichiers racine",
|
||||
"events": "Seuils d’occupation dépassés sur la racine ou un autre système de fichiers surveillé (85% avertissement / 95% critique par défaut) ; export NFS indisponible ; échec d’authentification CIFS ; pool LVM-thin plein."
|
||||
"events": "Seuils d’occupation dépassés sur la racine ou un autre système de fichiers surveillé (85% avertissement / 95% critique par défaut) ; stockages PVE indisponibles ; montages NFS/CIFS figés ou passés en lecture seule de façon inattendue ; stockages LVM-thin et autres pools dépassant les mêmes seuils."
|
||||
},
|
||||
{
|
||||
"category": "Disques & SMART",
|
||||
@@ -98,7 +98,7 @@
|
||||
{
|
||||
"category": "Mises à jour du système",
|
||||
"checks": "Mises à jour en attente, mises à jour de sécurité, version noyau / PVE, âge du système",
|
||||
"events": "Mises à jour de sécurité ou du noyau utilisé en attente ; système non mis à jour depuis longtemps. Le bouton <em>Mettre à jour maintenant</em> apparaît dans l’aperçu lorsque des mises à jour sont disponibles. Il lance la procédure complète ProxMenux ; sa fermeture actualise l’état avec <code>?refresh=1</code> sans attendre le cycle suivant."
|
||||
"events": "Mises à jour de sécurité ou du noyau utilisé en attente ; système non mis à jour depuis longtemps. La catégorie Mises à jour de la fenêtre État de santé affiche un bouton <em>Mettre à jour maintenant</em> lorsque des mises à jour sont en attente. Il lance la procédure complète de mise à jour ProxMenux dans la fenêtre ; sa fermeture actualise l’état avec <code>?refresh=1</code> afin que l’indicateur reflète le nouvel état sans attendre le cycle suivant."
|
||||
},
|
||||
{
|
||||
"category": "Sécurité et certificats",
|
||||
@@ -158,7 +158,7 @@
|
||||
},
|
||||
"dismiss": {
|
||||
"heading": "Masquer les alertes et choisir la durée de mise en sourdine",
|
||||
"intro": "Certains événements persistent, comme <em>Mises à jour système : mises à jour disponibles</em> tant que l’hôte n’est pas mis à jour. Une notification toutes les cinq minutes serait inutile. Le bouton <em>Mettre à jour maintenant</em> de l’aperçu permet de résoudre ce cas directement. Pour les autres cas ou les mises à jour reportées, deux mécanismes liés permettent de masquer les alertes :",
|
||||
"intro": "Certains événements persistent par nature, comme <em>Mises à jour système : mises à jour disponibles</em> tant que l’hôte n’est pas mis à jour, et une notification toutes les cinq minutes pendant une semaine serait inutile. Le bouton <em>Mettre à jour maintenant</em> de la catégorie Mises à jour de la fenêtre État de santé permet de résoudre ce cas directement. Pour les autres cas ou les mises à jour reportées, la surveillance offre aussi deux mécanismes liés pour masquer les alertes :",
|
||||
"step1": "<strong>Masquer un événement</strong> dans la fenêtre. Le menu propose <strong>24 heures</strong>, <strong>7 jours</strong> ou <strong>Définitivement</strong>, indépendamment de la catégorie. Le choix envoie <code>POST /api/health/acknowledge</code> avec <code>error_key</code> et <code>suppression_hours</code> (<code>-1</code> pour une durée permanente). L’événement passe dans la liste masquée avec l’horodatage <code>acknowledged_at</code>.",
|
||||
"dropdownImageAlt": "Menu pour masquer une alerte : 24 heures, 7 jours ou définitivement",
|
||||
"dropdownImageCaption": "La durée choisie ne concerne que cette alerte ; sans choix individuel, la valeur de la catégorie s’applique. Les alertes masquées définitivement portent un badge ambre <em>Permanent</em> et ne se déclenchent normalement plus. La température CPU critique constitue l’exception décrite plus bas.",
|
||||
@@ -187,7 +187,7 @@
|
||||
},
|
||||
{
|
||||
"finding": "ZFS pool DEGRADED / FAULTED",
|
||||
"why": "Les contrôles de capacité des pools ZFS autorisent l’acquittement. Les autres constats suivent leur propre indicateur. Acquitter ne répare pas un pool dégradé ou défaillant."
|
||||
"why": "Les constats d’état des pools ZFS (DEGRADED, FAULTED, UNAVAIL) autorisent explicitement l’acquittement, tout comme les contrôles de capacité des pools. Acquitter ne répare pas un pool dégradé ou défaillant."
|
||||
},
|
||||
{
|
||||
"finding": "Erreurs d'entrée/sortie du disque avec SMART FAILED",
|
||||
@@ -289,7 +289,7 @@
|
||||
},
|
||||
"rest": {
|
||||
"heading": "Points d’accès REST",
|
||||
"intro": "Les actions de la fenêtre sont accessibles par API pour scripts, tableaux de bord ou bots. Si l’authentification du Monitor est activée, un jeton Bearer valide issu de la connexion ou de l’écran des jetons API est requis. Les modifications, comme acquitter, enregistrer ou nettoyer les erreurs orphelines, exigent full_admin ; read_only reçoit 403. Si l’authentification est désactivée ou refusée, ces contrôles autorisent l’accès sans jeton.",
|
||||
"intro": "Les actions de la fenêtre sont aussi accessibles par API pour scripts, tableaux de bord personnalisés ou bots. Les appels exigent un jeton Bearer valide, issu de la connexion ou de l’écran des jetons API. Les modifications, comme acquitter des alertes, enregistrer les réglages de suppression ou nettoyer les erreurs orphelines, exigent la portée full_admin ; read_only reçoit 403.",
|
||||
"headerEndpoint": "Point d’accès",
|
||||
"headerMethod": "Méthode",
|
||||
"headerUse": "Utilisation",
|
||||
@@ -297,7 +297,7 @@
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Contrôle léger renvoyant du JSON avec <code>status</code>, <code>timestamp</code> et <code>version</code>. Convient aux contrôles de mots-clés Uptime Kuma ; si l’authentification du Monitor est activée, le client doit envoyer un en-tête Bearer."
|
||||
"use": "Contrôle léger renvoyant du JSON avec <code>status</code>, <code>timestamp</code> et <code>version</code>. Convient aux contrôles de mots-clés Uptime Kuma ; le client doit envoyer un en-tête Bearer."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"description": "Shell de l’hôte et consoles VM/CT compatibles dans le navigateur via <code>xterm.js</code> et WebSockets. Le mode d’authentification configuré s’applique : désactivé ou refusé, il permet aux clients ayant accès au réseau d’ouvrir une session sans connexion. Cela n’implique pas un audit de chaque commande."
|
||||
"description": "Shell de l’hôte et consoles VM/CT compatibles dans le navigateur via <code>xterm.js</code> et WebSockets. Les sessions ne sont pas auditées commande par commande."
|
||||
},
|
||||
{
|
||||
"name": "Sécurité",
|
||||
@@ -114,7 +114,7 @@
|
||||
"heading": "REST API et intégrations",
|
||||
"intro": "Les points d’accès REST exposent les mesures en JSON par HTTP/HTTPS pour Homepage, Home Assistant, Uptime Kuma et les scripts. Grafana peut utiliser l’exporteur texte Prometheus séparé sur <code>/api/prometheus</code>. Les requêtes peuvent être faites avec <code>curl</code>.",
|
||||
"tokens": "Les jetons API à longue durée de vie (365 jours) sont générés à partir de <strong>Paramètres → API Tokens</strong> ou via <code>POST /api/auth/generate-api-token</code>.",
|
||||
"bearer": "Envoyez les jetons via <code>Authorization: Bearer …</code>. Le point public <code>/api/health</code> convient aux sondes de disponibilité sans identifiants. Sous <code>/api/auth/*</code>, certaines routes de configuration/connexion/état sont publiques, mais celles de gestion du compte et des jetons sont protégées.",
|
||||
"bearer": "Envoyez les jetons via <code>Authorization: Bearer …</code>. <code>/api/health</code> attend aussi l’en-tête Bearer : les sondes de disponibilité ont donc besoin d’un jeton read_only. Sous <code>/api/auth/*</code> se trouvent à la fois des routes publiques de configuration/connexion/état et des routes protégées de gestion du compte et des jetons ; elles ne sont pas toutes anonymes.",
|
||||
"catalog": "Le catalogue complet des points d'accès, les conseils de rotation des jetons et les bonnes pratiques de sécurité se trouvent dans la <linkApi>référence API</linkApi>. Des exemples pour Homepage, Home Assistant, Grafana et Uptime Kuma, ainsi qu'un modèle générique cURL, sont proposés dans les <linkIntegrations>intégrations</linkIntegrations>."
|
||||
},
|
||||
"serviceControl": {
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
"heading": "n8n, Zapier et scripts personnalisés",
|
||||
"intro": "Les workflows et scripts peuvent <em>envoyer</em> des notifications par POST vers <code>/api/notifications/send</code>, par exemple après un échec CI ou une tâche trop longue. Cet envoi direct contourne la file et le délai entre empreintes d’événements. Il conserve le format par canal, l’IA facultative et la livraison. Gérez les doublons dans l’appelant.",
|
||||
"n8nBody": "Dans n8n, utilisez un nœud <em>HTTP Request</em> avec POST, l’URL ci-dessus et le même JSON que curl. Choisissez les identifiants génériques Header Auth : nom <em>Authorization</em> et valeur <code>Bearer YOUR_API_TOKEN</code>, en remplaçant le marqueur. Reliez un planning, webhook ou autre nœud pour déclencher la requête.",
|
||||
"severityBody": "La gravité utilise <code>INFO</code>, <code>WARNING</code> ou <code>CRITICAL</code> en majuscules. L’objet <code>data</code> apporte du contexte. L’IA reçoit le titre et le message rendus avec les enrichissements pris en charge ; tous les champs ne sont pas garantis dans ses instructions ou sa sortie. Voir <link>Notifications → Catalogue des événements</link>."
|
||||
"severityBody": "La gravité utilise <code>INFO</code>, <code>WARNING</code> ou <code>CRITICAL</code> en majuscules. L’objet <code>data</code> apporte le contexte de l’événement et les champs du modèle. Sur ce point d’accès, la reformulation IA ne reçoit que le titre et le message ; les champs de <code>data</code> ne sont pas envoyés au fournisseur. Voir <link>Notifications → Catalogue des événements</link> pour la signification des événements."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Webhook natif Proxmox VE (entrant)",
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
"Ouvrez <a>account.microsoft.com/security</a> et activez la vérification en deux étapes.",
|
||||
"Si votre compte propose <em>Options de sécurité avancées</em> → <em>Mots de passe d’application</em>, choisissez <em>Créer un mot de passe d’application</em>. 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 SMTP avec mot de passe est autorisé, utilisez les paramètres approuvés : <em>Serveur</em> <code>smtp.office365.com</code> pour Exchange Online, <em>Port</em> <code>587</code>, <em>Mode TLS</em> <code>STARTTLS</code>, <em>Identifiant</em> votre adresse et <em>Mot de passe</em> la valeur autorisée. Outlook.com personnel a d’autres paramètres et exigences."
|
||||
"Uniquement si votre fournisseur autorise SMTP avec mot de passe, saisissez ses paramètres approuvés : <em>Hôte SMTP</em> <code>smtp.office365.com</code> pour Exchange Online, <em>Port</em> <code>587</code>, <em>Mode TLS</em> <code>STARTTLS</code>, <em>Nom d'utilisateur</em> l’adresse de votre boîte aux lettres et <em>Mot de passe</em> 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."
|
||||
@@ -266,7 +266,7 @@
|
||||
"howItems": [
|
||||
"<strong>Activation par canal.</strong> Désactivé par défaut. Activez-le seulement là où vous voulez un résumé ; les autres canaux restent en direct.",
|
||||
"<strong>Heure de livraison</strong> locale, 09:00 par défaut. L’envoi se déclenche à environ 60 s près.",
|
||||
"<strong>Inclus :</strong> événements génériques admissibles de niveau <strong>INFO</strong>, comme <em>mise à jour d’application disponible</em>, <em>mise à jour Tailscale disponible</em>, <em>mise à jour d’optimisation ProxMenux disponible</em>, <em>mises à jour de sécurité APT en attente</em> et <em>avis de limitation d’envoi</em>. Résultats de sauvegarde et actions exemptées restent en direct.",
|
||||
"<strong>Inclus dans le résumé :</strong> événements génériques admissibles de niveau <strong>INFO</strong>. Exemples : <em>mise à jour d’application disponible</em>, <em>mise à jour Tailscale disponible</em>, <em>mise à jour d’optimisation ProxMenux disponible</em> et <em>mises à jour de sécurité APT en attente</em>. Les résultats de sauvegarde et les autres événements d’action exemptés restent en direct.",
|
||||
"<strong>Ce qui n'est jamais retardé:</strong>",
|
||||
"<strong>Persistance.</strong> Les événements restent dans SQLite, table <code>digest_pending</code>, jusqu’à l’heure prévue, même après redémarrage.",
|
||||
"<strong>Sans événement, sans résumé.</strong> Aucun résumé vide n’est envoyé si aucun INFO n’attend."
|
||||
@@ -301,7 +301,7 @@
|
||||
{
|
||||
"stage": "Délai de répétition",
|
||||
"what": "Après livraison réussie, les répétitions sont supprimées ; l’état est dans <code>notification_last_sent</code>. Base pour <code>CRITICAL</code>, <code>WARNING</code>, <code>INFO</code>, <code>resources</code> et <code>updates</code> : 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": "Oui : des valeurs explicites par événement ou groupe remplacent les valeurs du répartiteur."
|
||||
"tunable": "Uniquement via l’API des paramètres : une clé <code>cooldown.<event_type></code> ou <code>cooldown.<group></code> remplace les valeurs par défaut ; aucun contrôle n’existe dans l’interface."
|
||||
},
|
||||
{
|
||||
"stage": "Regroupement des rafales",
|
||||
@@ -330,7 +330,7 @@
|
||||
"<strong>Méthode et URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code> sans HTTPS Monitor ; avec HTTPS, récepteur HTTP local séparé sur 8009. Les deux restent sur l’hôte.",
|
||||
"<strong>Modèle du corps.</strong> JSON avec aides Handlebars natives de PVE, stocké en base64 dans la configuration. Une fois décodé :",
|
||||
"<strong>Matcher.</strong> Un bloc d'accompagnement <code>matcher: proxmenux-matcher</code> avec <code>mode all</code> afin que chaque notification PVE atteigne la cible.",
|
||||
"<strong>Configuration privée.</strong> La configuration écrit <code>webhook: proxmenux-webhook</code> dans <code>/etc/pve/priv/notifications.cfg</code> avec le secret partagé en base64. La cible publique le référence pour envoyer X-Webhook-Secret. Le bloc n’est pas vide."
|
||||
"<strong>Configuration privée.</strong> La configuration écrit le bloc correspondant <code>webhook: proxmenux-webhook</code> dans <code>/etc/pve/priv/notifications.cfg</code> avec une entrée <code>secret</code> 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 <code>POST /api/notifications/webhook</code> applique différentes couches de sécurité selon l'origine de la demande:",
|
||||
|
||||
Reference in New Issue
Block a user