Generer les secrets de la memoire plutot que les inventer

Question du proprietaire : HA_TOKEN il l a, mais les mots de passe PostgreSQL
et InfluxDB, il les invente ? Non — ils se generent. Les deux bases n existent
pas encore, c est ce fichier qui decide de leurs identifiants, et personne ne
les tape jamais : les conteneurs les lisent dans .env et Home Assistant lit le
jeton dans son propre secrets.yaml.

preparer-env.sh les tire avec openssl rand, reprend HA_TOKEN du .env a la
racine plutot que d en creer un nouveau, pose les droits a 600, et affiche la
ligne a recopier dans secrets.yaml. Il refuse d ecraser un .env existant :
regenerer les mots de passe d une base deja creee la rendrait inaccessible.

Corrige au passage un piege laisse dans l exemple : POSTGRES_PASSWORD et
PGPASSWORD etaient deux variables a tenir egales a la main. Le fichier s appelle
desormais .env, donc compose l utilise aussi pour la substitution, et le service
d historisation reprend le mot de passe par substitution. Un seul secret
PostgreSQL desormais.

Generateur essaye dans un bac a sable : fichier conforme, refus de regeneration
verifie. Fichiers d echange des editeurs ajoutes au gitignore.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
Tallagrand Thierry
2026-09-04 01:29:12 +02:00
parent 230039d2a2
commit 7e2ed6d076
5 changed files with 98 additions and 26 deletions

7
.gitignore vendored
View File

@@ -16,4 +16,9 @@ deploy/watchdog/logs/*
logs/ logs/
# Secrets de la memoire de mesures (mots de passe, jeton InfluxDB) # Secrets de la memoire de mesures (mots de passe, jeton InfluxDB)
deploy/historisation/historisation.env deploy/historisation/.env
# Fichiers d echange des editeurs
*.swp
*.swo
*~

View File

@@ -23,12 +23,29 @@ libres.
```sh ```sh
cd /volume2/projects/EVCS/EVCS/deploy/historisation cd /volume2/projects/EVCS/EVCS/deploy/historisation
cp historisation.env.exemple historisation.env bash preparer-env.sh # génère .env avec des secrets aléatoires
# renseigner les trois secrets ; pour le jeton : openssl rand -hex 32
docker compose up -d docker compose up -d
docker compose logs -f docker compose logs -f
``` ```
### D'où viennent les secrets
| secret | origine |
|---|---|
| `HA_TOKEN` | **existe déjà** — repris du `.env` à la racine du dépôt |
| `POSTGRES_PASSWORD` | **créé ici** — la base n'existe pas encore, ce fichier décide de son mot de passe |
| `DOCKER_INFLUXDB_INIT_PASSWORD` | **créé ici**, idem (InfluxDB exige au moins 8 caractères) |
| `DOCKER_INFLUXDB_INIT_ADMIN_TOKEN` | **créé ici** — c'est le jeton que Home Assistant utilisera pour écrire |
Aucun ne s'obtient auprès de quelqu'un, et aucun ne doit être choisi à la main :
personne ne les tape jamais — les conteneurs les lisent dans `.env`, et Home
Assistant lit le jeton dans son propre `secrets.yaml`. Une phrase inventée est
plus courte et plus devinable qu'elle n'en a l'air ; `openssl rand` ne l'est pas.
`preparer-env.sh` refuse d'écraser un `.env` existant : régénérer les mots de
passe d'une base déjà créée la rendrait inaccessible, puisqu'elle continuerait
d'attendre les anciens.
Vérifications : Vérifications :
```sh ```sh

View File

@@ -19,7 +19,7 @@
# #
# Mise en service : # Mise en service :
# cd /volume2/projects/EVCS/EVCS/deploy/historisation # cd /volume2/projects/EVCS/EVCS/deploy/historisation
# cp historisation.env.exemple historisation.env puis y mettre les mots de passe # bash preparer-env.sh (genere .env avec des secrets aleatoires)
# docker compose up -d # docker compose up -d
# docker compose logs -f # docker compose logs -f
# #
@@ -42,7 +42,7 @@ services:
# Ouvert au réseau local : n8n tourne sur 10.10.10.17 et doit écrire ici. # Ouvert au réseau local : n8n tourne sur 10.10.10.17 et doit écrire ici.
- "5432:5432" - "5432:5432"
env_file: env_file:
- historisation.env - .env
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
- POSTGRES_USER=evcs - POSTGRES_USER=evcs
@@ -69,7 +69,7 @@ services:
# Home Assistant, sur 10.10.10.17, écrit ici. # Home Assistant, sur 10.10.10.17, écrit ici.
- "8086:8086" - "8086:8086"
env_file: env_file:
- historisation.env - .env
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
- DOCKER_INFLUXDB_INIT_MODE=setup - DOCKER_INFLUXDB_INIT_MODE=setup
@@ -105,7 +105,7 @@ services:
# Depot en LECTURE SEULE : ce service n'ecrit que dans la base. # Depot en LECTURE SEULE : ce service n'ecrit que dans la base.
- /volume2/projects/EVCS/EVCS:/app:ro - /volume2/projects/EVCS/EVCS:/app:ro
env_file: env_file:
- historisation.env - .env
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
- HA_URL=http://10.10.10.17:8123 - HA_URL=http://10.10.10.17:8123
@@ -113,8 +113,9 @@ services:
- PGPORT=5432 - PGPORT=5432
- PGUSER=evcs - PGUSER=evcs
- PGDATABASE=evcs - PGDATABASE=evcs
# PGPASSWORD doit valoir POSTGRES_PASSWORD : les deux sont dans le # Reprise du mot de passe unique par substitution : il n'y a qu'un seul
# fichier d'environnement, tenus egaux a la main. # secret PostgreSQL a renseigner, pas deux a tenir egaux a la main.
- PGPASSWORD=${POSTGRES_PASSWORD}
- HISTORISE_INTERVAL_S=60 - HISTORISE_INTERVAL_S=60
command: ["node", "tools/historise-evcs.mjs"] command: ["node", "tools/historise-evcs.mjs"]

View File

@@ -1,17 +0,0 @@
# Copier en historisation.env et renseigner. Ce fichier-ci est un exemple
# versionné ; historisation.env, lui, est ignoré par git (secrets).
# --- PostgreSQL (proposition A) ---
POSTGRES_PASSWORD=a_remplacer
# Doit valoir EXACTEMENT le meme mot de passe : c'est celui qu'utilise le
# service d'historisation pour se connecter.
PGPASSWORD=a_remplacer
# Le jeton HA du service d'historisation (meme que celui du depot).
HA_TOKEN=a_remplacer
# --- InfluxDB (proposition B) ---
DOCKER_INFLUXDB_INIT_USERNAME=evcs
DOCKER_INFLUXDB_INIT_PASSWORD=a_remplacer_16_caracteres_minimum
# Ce jeton est celui que Home Assistant utilisera pour écrire.
# Le générer plutôt que l'inventer : openssl rand -hex 32
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=a_remplacer

View File

@@ -0,0 +1,66 @@
#!/bin/bash
# Génère deploy/historisation/.env avec des secrets ALÉATOIRES.
#
# Ces secrets ne viennent de nulle part : les deux bases n'existent pas encore,
# c'est ce fichier qui décide de leurs identifiants. Il ne faut donc pas les
# choisir à la main — une phrase inventée est plus courte et plus devinable
# qu'elle n'en a l'air, et personne ne les tape jamais : les conteneurs les
# lisent ici, et Home Assistant lit le jeton dans son propre secrets.yaml.
#
# Le seul secret qui vient d'ailleurs est HA_TOKEN : c'est le jeton Home
# Assistant, déjà en service, repris du .env à la racine du dépôt.
#
# Usage : bash preparer-env.sh
set -euo pipefail
cd "$(dirname "$0")"
if [ -f .env ]; then
echo "REFUS : .env existe déjà."
echo "Le régénérer changerait les mots de passe d'une base déjà créée, qui"
echo "continuerait d'attendre les anciens. Le supprimer d'abord si c'est"
echo "vraiment ce que vous voulez — et alors supprimer aussi les volumes."
exit 1
fi
alea() { openssl rand -hex "$1"; }
HA_TOKEN_VAL="$(grep -E '^\s*HA_TOKEN\s*=' ../../.env 2>/dev/null | head -1 | cut -d= -f2- | tr -d ' "'"'" || true)"
if [ -z "$HA_TOKEN_VAL" ]; then
echo "HA_TOKEN introuvable dans le .env à la racine du dépôt."
echo "Le renseigner à la main dans .env après génération."
HA_TOKEN_VAL="a_remplacer"
fi
PG="$(alea 24)"
INFLUX_PW="$(alea 16)"
INFLUX_TOKEN="$(alea 32)"
cat > .env <<EOF
# Généré par preparer-env.sh le $(date '+%d/%m/%Y %H:%M').
# Ne pas versionner : ce fichier est dans .gitignore.
# --- PostgreSQL ---
# Un seul mot de passe : le service d'historisation le reprend par
# substitution dans compose.yaml.
POSTGRES_PASSWORD=$PG
# --- InfluxDB ---
DOCKER_INFLUXDB_INIT_USERNAME=evcs
DOCKER_INFLUXDB_INIT_PASSWORD=$INFLUX_PW
# C'est CE jeton que Home Assistant utilisera pour écrire. À recopier dans
# /mnt/ARCH3/docker/HA/secrets.yaml sous la clé influxdb_token
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=$INFLUX_TOKEN
# --- Home Assistant ---
# Repris du .env à la racine du dépôt : jeton déjà en service, pas un nouveau.
HA_TOKEN=$HA_TOKEN_VAL
EOF
chmod 600 .env
echo "✓ .env généré (droits 600)."
echo
echo "À reporter dans /mnt/ARCH3/docker/HA/secrets.yaml :"
echo
echo " influxdb_token: \"$INFLUX_TOKEN\""
echo
echo "Puis : docker compose up -d"