fix(gotify): aligner le rôle postgres gotify sur le secret sops (bug identique à vaultwarden)

This commit is contained in:
Hermes Agent
2026-09-26 18:15:32 -04:00
parent 6220fb68c5
commit c1c19aeb22
+48
View File
@@ -11,6 +11,9 @@
};
"gotify/db_password" = {
key = "gotify_db_password";
# lu par gotify-db-password.service, qui tourne en User=postgres
# (gotify lui-même lit le mot de passe via le template sops, pas ce fichier)
owner = "postgres";
};
};
@@ -38,6 +41,51 @@
];
};
# gotify dépend de postgres : sans ces réglages il crash-loopait quand un
# switch redémarre postgresql (RestartSec=100ms par défaut, 5 essais, puis
# start-limit-hit avant que postgres n'accepte de nouveau les connexions).
systemd.services.gotify-server = {
after = ["postgresql.service"];
wants = ["postgresql.service"];
unitConfig = {
StartLimitIntervalSec = 60;
StartLimitBurst = 10;
};
serviceConfig = {
RestartSec = "2s";
};
};
# MÊME BUG QUE VAULTWARDEN (vérifié 25/09/2026 en rejouant le binaire à la
# main) : ensureUsers crée le rôle postgres `gotify` SANS mot de passe, alors
# que le pg_hba effectif exige md5/scram pour ce rôle (services.postgresql.
# authentication est un types.lines : tous les modules se concatènent et la
# règle `host gotify gotify 127.0.0.1/32 md5` passe AVANT le
# `host all all 127.0.0.1/32 trust` générique). Symptôme : gotify-server sort
# en 64 ms avec status=2 et
# failed SASL auth: FATAL: password authentication failed for user "gotify"
# puis start-limit-hit. Fix : aligner le rôle sur le secret sops déjà utilisé
# par GOTIFY_DATABASE_CONNECTION. Idempotent, rejoué à chaque activation.
systemd.services.gotify-db-password = {
description = "Aligne le mot de passe du rôle postgres gotify sur le secret sops";
wantedBy = ["multi-user.target"];
after = ["postgresql.service"];
requires = ["postgresql.service"];
before = ["gotify-server.service"];
requiredBy = ["gotify-server.service"];
serviceConfig = {
Type = "oneshot";
User = "postgres";
RemainAfterExit = true;
};
script = ''
${config.services.postgresql.package}/bin/psql \
-v pw="$(cat ${config.sops.secrets."gotify/db_password".path})" <<'SQL'
ALTER ROLE gotify WITH PASSWORD :'pw';
SQL
'';
};
services.postgresql = {
enable = true;
ensureDatabases = ["gotify"];