diff --git a/.gitignore b/.gitignore index f3e7eaf..20a38b4 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,9 @@ deploy/watchdog/logs/* logs/ # 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 +*~ diff --git a/deploy/historisation/README.md b/deploy/historisation/README.md index d8158af..f18eda2 100644 --- a/deploy/historisation/README.md +++ b/deploy/historisation/README.md @@ -23,12 +23,29 @@ libres. ```sh cd /volume2/projects/EVCS/EVCS/deploy/historisation -cp historisation.env.exemple historisation.env -# renseigner les trois secrets ; pour le jeton : openssl rand -hex 32 +bash preparer-env.sh # génère .env avec des secrets aléatoires docker compose up -d 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 : ```sh diff --git a/deploy/historisation/compose.yaml b/deploy/historisation/compose.yaml index cb6c99f..656947d 100644 --- a/deploy/historisation/compose.yaml +++ b/deploy/historisation/compose.yaml @@ -19,7 +19,7 @@ # # Mise en service : # 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 logs -f # @@ -42,7 +42,7 @@ services: # Ouvert au réseau local : n8n tourne sur 10.10.10.17 et doit écrire ici. - "5432:5432" env_file: - - historisation.env + - .env environment: - TZ=Europe/Paris - POSTGRES_USER=evcs @@ -69,7 +69,7 @@ services: # Home Assistant, sur 10.10.10.17, écrit ici. - "8086:8086" env_file: - - historisation.env + - .env environment: - TZ=Europe/Paris - DOCKER_INFLUXDB_INIT_MODE=setup @@ -105,7 +105,7 @@ services: # Depot en LECTURE SEULE : ce service n'ecrit que dans la base. - /volume2/projects/EVCS/EVCS:/app:ro env_file: - - historisation.env + - .env environment: - TZ=Europe/Paris - HA_URL=http://10.10.10.17:8123 @@ -113,8 +113,9 @@ services: - PGPORT=5432 - PGUSER=evcs - PGDATABASE=evcs - # PGPASSWORD doit valoir POSTGRES_PASSWORD : les deux sont dans le - # fichier d'environnement, tenus egaux a la main. + # Reprise du mot de passe unique par substitution : il n'y a qu'un seul + # secret PostgreSQL a renseigner, pas deux a tenir egaux a la main. + - PGPASSWORD=${POSTGRES_PASSWORD} - HISTORISE_INTERVAL_S=60 command: ["node", "tools/historise-evcs.mjs"] diff --git a/deploy/historisation/historisation.env.exemple b/deploy/historisation/historisation.env.exemple deleted file mode 100644 index 308ce33..0000000 --- a/deploy/historisation/historisation.env.exemple +++ /dev/null @@ -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 diff --git a/deploy/historisation/preparer-env.sh b/deploy/historisation/preparer-env.sh new file mode 100755 index 0000000..b9a1716 --- /dev/null +++ b/deploy/historisation/preparer-env.sh @@ -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 <