diff --git a/ops/db-bootstrap/set_tradein_fdw_password.sql b/ops/db-bootstrap/set_tradein_fdw_password.sql index 0daf946a..459fb823 100644 --- a/ops/db-bootstrap/set_tradein_fdw_password.sql +++ b/ops/db-bootstrap/set_tradein_fdw_password.sql @@ -17,8 +17,21 @@ -- Reference incident: deploy 2026-05-24 (post-merge PR #503) упал на -- "syntax error at or near ':'" в LINE 4 этого файла — :'pw' дошёл до сервера -- as literal вместо интерполяции. +-- +-- ⚠️ `set_config(name, value, is_local) -> text` ВОЗВРАЩАЕТ установленное +-- значение. Без `\o /dev/null` бы psql напечатал password на stdout → leak в +-- Forgejo Actions deploy logs (retained, visible всем с repo read access). +-- Поэтому оборачиваем оба set_config вызова в `\o /dev/null` / `\o` brackets +-- — output mutes только для этих строк, NOTICE-сообщения из DO block +-- (idempotency signal) остаются видимыми. +-- +-- Rollback path: НЕ revert этого файла (вернёт сломанный `:'pw'` внутри $$). +-- Корректный rollback — unset GENDESIGN_FDW_PASSWORD в /opt/gendesign/backend +-- /.env.runtime на VPS, deploy.yml тогда пропустит этот шаг полностью. +\o /dev/null SELECT set_config('app.fdw_pw', :'pw', false); +\o DO $$ BEGIN @@ -31,5 +44,8 @@ BEGIN END $$; -- Clear GUC after use (defense-in-depth — не оставляем password в session state --- даже на short connection). +-- даже на short connection). Same \o trick — set_config return value is empty +-- string here, но всё равно лишний row в stdout не нужен. +\o /dev/null SELECT set_config('app.fdw_pw', '', false); +\o