From c1c19aeb22d9dc4e5d2fb05da36834f2a8ac5d40 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sat, 26 Sep 2026 18:15:32 -0400 Subject: [PATCH] =?UTF-8?q?fix(gotify):=20aligner=20le=20r=C3=B4le=20postg?= =?UTF-8?q?res=20gotify=20sur=20le=20secret=20sops=20(bug=20identique=20?= =?UTF-8?q?=C3=A0=20vaultwarden)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/gotify/default.nix | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/services/gotify/default.nix b/services/gotify/default.nix index 1c8713b..250952e 100644 --- a/services/gotify/default.nix +++ b/services/gotify/default.nix @@ -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"];