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:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -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
|
||||
*~
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"]
|
||||
|
||||
|
||||
@@ -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
|
||||
66
deploy/historisation/preparer-env.sh
Executable file
66
deploy/historisation/preparer-env.sh
Executable 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"
|
||||
Reference in New Issue
Block a user