diff --git a/deploy/historisation/README.md b/deploy/historisation/README.md index 9e0dd1c..5dd2d1e 100644 --- a/deploy/historisation/README.md +++ b/deploy/historisation/README.md @@ -92,6 +92,25 @@ Le bon créneau est le milieu de matinée. À faire après l'étape 1 — n8n a besoin que la base existe pour qu'on y crée l'identifiant de connexion. +## Accès en lecture pour l'analyse + +```sh +sudo bash creer-role-lecture.sh +``` + +Crée le rôle `evcs_lecture` en **lecture seule** et dépose son mot de passe dans +le `.env` à la racine du dépôt. Le mot de passe est généré, jamais choisi, et +**n'est pas affiché** : il va du générateur au fichier, donc rien à recopier et +rien à exposer dans une capture. + +Deux raisons de ne pas analyser avec le compte `evcs` : une mémoire dont tout +l'intérêt est de ne pas être réécrite ne se consulte pas avec un compte qui peut +écrire, et un mot de passe rangé dans un fichier lisible ne doit pas être celui +qui gouverne la base. + +Le script est rejouable : si le rôle existe déjà et que son mot de passe est +dans le `.env`, il ne fait rien. + ## Ce qu'aucune des deux ne fait Elles ne remontent pas dans le passé. La mémoire commence le jour où on les diff --git a/deploy/historisation/creer-role-lecture.sh b/deploy/historisation/creer-role-lecture.sh new file mode 100755 index 0000000..37b7825 --- /dev/null +++ b/deploy/historisation/creer-role-lecture.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# Crée le rôle PostgreSQL en LECTURE SEULE dont Claude se sert pour analyser la +# mémoire de mesures, et dépose son mot de passe dans le .env à la racine du +# dépôt — celui que ce compte-là sait lire. +# +# Pourquoi un rôle séparé plutôt que le compte `evcs` : une mémoire dont tout +# l'intérêt est de ne pas être réécrite ne se consulte pas avec un compte qui +# peut écrire. Et un mot de passe d'analyse qui traîne dans un fichier lisible +# ne doit pas être celui qui gouverne la base. +# +# Le mot de passe est GÉNÉRÉ, jamais choisi, et n'est PAS affiché : il va +# directement du générateur au fichier. Rien à recopier, donc rien à exposer +# dans une capture d'écran. +# +# Usage, depuis 10.10.10.22 : +# cd /volume2/projects/EVCS/EVCS/deploy/historisation +# sudo bash creer-role-lecture.sh +set -euo pipefail +cd "$(dirname "$0")" +ENV_DEPOT="../../.env" + +if [ ! -f "$ENV_DEPOT" ]; then + echo "REFUS : $ENV_DEPOT introuvable. Lancer ce script depuis le dépôt." + exit 1 +fi + +EXISTE=$(docker compose exec -T postgres psql -U evcs -d evcs -tAc \ + "SELECT 1 FROM pg_roles WHERE rolname='evcs_lecture'" 2>/dev/null || true) + +if [ "$EXISTE" = "1" ]; then + echo "Le rôle evcs_lecture existe déjà." + if grep -q '^PG_LECTURE_PASSWORD=' "$ENV_DEPOT"; then + echo "Et son mot de passe est déjà dans $ENV_DEPOT. Rien à faire." + exit 0 + fi + echo "Mais son mot de passe est absent de $ENV_DEPOT — il va être RÉINITIALISÉ." +fi + +MDP="$(openssl rand -hex 24)" + +docker compose exec -T postgres psql -U evcs -d evcs -v ON_ERROR_STOP=1 <> "$ENV_DEPOT" +fi + +echo "✓ Rôle evcs_lecture créé, lecture seule." +echo "✓ Mot de passe déposé dans $ENV_DEPOT — non affiché, rien à recopier." +echo +echo "Contrôle (doit renvoyer une erreur de permission) :" +echo " docker compose exec -T postgres psql -U evcs_lecture -d evcs -c \"DELETE FROM mesure\""