Files
Monitorink/.env.example
Jerem 53fefd4654 Claude: refresh OAuth proactif + erreurs fatales distinctes (fini les reconnexions manuelles)
Le refresh token est rotatif : la chaîne se régénère seule indéfiniment tant que
le nouveau token est persisté. La reconnexion manuelle n'était requise que lorsque
cet invariant cassait. Trois correctifs :

- Refresh PROACTIF : on rafraîchit dès qu'il reste < 2h sur le token (~8h de vie)
  au lieu des 2 dernières minutes. Un échec transitoire a des heures de marge avant
  que l'access token meure ; la fenêtre où un kill/timeout perd le token rotatif
  fraîchement rotaté passe de ~8h à quelques ms. Réglable via
  MONITORINK_CLAUDE_REFRESH_LEAD_MIN (défaut 120).
- Distinction FATAL vs TRANSITOIRE : 400 invalid_grant / 401 sur l'endpoint token
  -> _RefreshFatal, sans backoff ni re-soumission en boucle (évite la reuse-detection
  qui révoque toute la famille). 429/5xx/réseau gardent le backoff exponentiel.
- Visibilité + auto-réparation : le cas fatal affiche "Reconnexion Claude requise"
  (pas de repli cache silencieux) et l'alerte se referme seule dès qu'un token frais
  réapparaît sur disque (re-login isolé), sans redémarrer le conteneur.

Timeout du POST de refresh porté à 45s (réglable, MONITORINK_CLAUDE_REFRESH_TIMEOUT)
pour réduire la fenêtre de perte du token après rotation serveur.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 10:46:21 +02:00

87 lines
4.5 KiB
Plaintext

# ── Monitorink — copier en .env et compléter (ne jamais versionner .env) ──
# Credentials Claude d'un login ISOLÉ dédié à Monitorink (scope user:profile requis par
# /usage -> login complet obligatoire, `claude setup-token` ne suffit PAS).
# Créer via : CLAUDE_CONFIG_DIR=/home/jerem/.monitorink-claude claude auth login
# Le backend lit/écrit ce fichier (refresh) ; il est monté dans le conteneur sur /creds.
MONITORINK_CLAUDE_CREDS=/creds/.credentials.json
# User-Agent attendu par l'endpoint /usage (doit ressembler à claude-code/<version>)
MONITORINK_CLAUDE_UA=claude-code/2.1.172
# Burn rate via ccusage (nécessite ccusage installé + ~/.claude/projects monté). 0/1
MONITORINK_CCUSAGE=0
# Marge proactive de refresh OAuth (minutes) : rafraîchit le token bien avant son expiration
# (~8 h) pour laisser des heures de marge en cas d'échec transitoire (429/réseau). Défaut 120.
MONITORINK_CLAUDE_REFRESH_LEAD_MIN=120
# Timeout du POST de refresh (secondes). Généreux pour ne pas couper après que le serveur a
# rotaté le refresh token, ce qui le perdrait et forcerait un re-login manuel. Défaut 45.
MONITORINK_CLAUDE_REFRESH_TIMEOUT=45
# Affichage — canevas de rendu en PAYSAGE ; le PNG est pivoté de 90° pour la Kobo.
MONITORINK_TZ=Europe/Paris
MONITORINK_WIDTH=1680
MONITORINK_HEIGHT=1264
# Sens de rotation : "cw" = Kobo posée bouton à droite, "ccw" = bouton à gauche.
MONITORINK_ROTATE=cw
MONITORINK_CACHE_TTL=120
# Refresh partiel e-ink (endpoints /frame.meta + /frame.png).
# Full refresh (flash, efface le ghosting) au 1er lancement/reset puis toutes les N minutes ;
# entre deux, uniquement des partiels serrés sur les zones modifiées. PROD=120 (2 h), DEV=1-2.
MONITORINK_FULL_INTERVAL_MIN=120
# Intervalle mini entre deux appels réels à l'endpoint /usage de Claude (anti-429). Secondes.
MONITORINK_USAGE_TTL=120
# Météo (Open-Meteo, sans clé) — coordonnées
MONITORINK_LAT=48.8566
MONITORINK_LON=2.3522
# NAS (optionnel) — endpoint /api/status du moniteur maison nas_monitor.
# Laisser vide pour masquer la section NAS. Depuis le conteneur, viser l'IP LAN du host.
MONITORINK_NAS_URL=http://192.168.0.43:8766/api/status
# Codex (optionnel) — usage ChatGPT/Codex via wham/usage. Token lu dans le auth.json de
# Hermes monté en lecture seule (cf. docker-compose.yml). Laisser vide pour masquer Codex.
MONITORINK_CODEX_TOKEN_FILE=/hermes/auth.json
# Trackers torrent privés (optionnel) — ratio/envoi/réception du compte, sous le NAS.
# Liste des clés actives, puis UN bloc par tracker. v1 : type "unit3d_nuxt" (ex. c411).
# Le ratio n'est PAS lisible au token API -> login requis (username/password du compte).
# Laisser MONITORINK_TRACKERS vide pour masquer la section.
# Cache : le ratio bouge lentement, on le garde 1 h (TTL) et on le persiste sur disque
# (volume /data) pour ne pas reloguer les 4 trackers après chaque redéploiement.
#MONITORINK_TRACKER_TTL=3600
#MONITORINK_TRACKER_CACHE_FILE=/data/trackers.json
#MONITORINK_TRACKERS=c411,torr9
#MONITORINK_TRACKER_C411_LABEL=c411
#MONITORINK_TRACKER_C411_TYPE=unit3d_nuxt
#MONITORINK_TRACKER_C411_URL=https://c411.org
#MONITORINK_TRACKER_C411_USER=TonUsername
#MONITORINK_TRACKER_C411_PASS=TonMotDePasse
# torr9 : type "torr9" (API JWT dédiée). URL = sous-domaine API. Le passkey ne sert
# qu'au RSS, pas au ratio -> identifiant/mot de passe requis.
#MONITORINK_TRACKER_TORR9_LABEL=torr9
#MONITORINK_TRACKER_TORR9_TYPE=torr9
#MONITORINK_TRACKER_TORR9_URL=https://api.torr9.net
#MONITORINK_TRACKER_TORR9_USER=TonUsername
#MONITORINK_TRACKER_TORR9_PASS=TonMotDePasse
# tr4ker : type "tr4ker" (SPA React, auth cookie). URL = domaine du site.
#MONITORINK_TRACKER_TR4KER_LABEL=tr4ker
#MONITORINK_TRACKER_TR4KER_TYPE=tr4ker
#MONITORINK_TRACKER_TR4KER_URL=https://tr4ker.net
#MONITORINK_TRACKER_TR4KER_USER=TonIdentifiant
#MONITORINK_TRACKER_TR4KER_PASS=TonMotDePasse
# yggreborn (YggTorrent) : type "yggreborn" (Flask + CSRF). ⚠️ USER = EMAIL (login par email).
# Ratio seul (lu dans l'en-tête), pas de up/down ni jetons.
#MONITORINK_TRACKER_YGGREBORN_LABEL=yggreborn
#MONITORINK_TRACKER_YGGREBORN_TYPE=yggreborn
#MONITORINK_TRACKER_YGGREBORN_URL=https://www.yggreborn.org
#MONITORINK_TRACKER_YGGREBORN_USER=ton.email@exemple.com
#MONITORINK_TRACKER_YGGREBORN_PASS=TonMotDePasse
#MONITORINK_TRACKER_TTL=1800
# Home Assistant (optionnel) — laisser vide pour désactiver
MONITORINK_HA_URL=http://homeassistant.local:8123
MONITORINK_HA_TOKEN=
# Entités : "entity_id|Libellé|unité" séparées par des virgules
MONITORINK_HA_ENTITIES=sensor.salon_temperature|Salon|°C, binary_sensor.porte_entree|Porte, person.jerem|Jerem