backlog: secrets-env-to-file разложена по приложениям

- Шесть задач `secrets-file-*` вместо одной: outline, wakapi, authelia,
  gramps (средний), gitea, tududi (низкий, выигрыш частичный). Wanderer
  отпал — файловых секретов не умеет ни meilisearch, ни pocketbase.
- Матрица механизмов со ссылками на код уехала в
  docs/drafts/secrets-file-support.md, родитель — на кладбище.
This commit is contained in:
av
2026-07-25 12:25:50 +03:00
parent f9a8c64377
commit fbd0a66f44
14 changed files with 384 additions and 100 deletions
+32
View File
@@ -0,0 +1,32 @@
# authelia: секреты из файлов
**Приоритет:** Средний
В `configuration.template.yml` прямыми значениями стоят семь позиций:
jwt-секрет валидации, секрет сессий, ключ шифрования хранилища, hmac-секрет OIDC,
приватный jwks-ключ, четыре `client_secret` и пароль SMTP. Файл на тысячу строк —
дифф по нему самый ценный в репозитории, и именно его сейчас приходится глушить
целиком.
Пять полей закрываются переменными `AUTHELIA_..._FILE`. Оставшиеся два —
`jwks[].key` и `client_secret` клиентов — через `_FILE` невозможны в принципе:
валидатор отвергает ключи, содержащие `[]`. Их покрывает template-фильтр
(`X_AUTHELIA_CONFIG_FILTERS=template` + `{{ secret "путь" }}`). Механизмы
несовместимы в одном поле, поэтому проще выбрать фильтр — он берёт все семь
позиций разом, `_FILE` только пять.
Отдельная и более дешёвая половина задачи: четыре `client_secret` штатно хранятся
**хэшем** `$pbkdf2-sha512$...` — плейнтекст с 4.38 вызывает warning валидатора и
нужен только при `client_secret_jwt`, чего у наших клиентов нет. После перевода
эти поля перестают быть секретами вообще. Генератор уже есть —
`inv authelia-gen-secret-and-hash`, проверка — `inv authelia-validate-config`.
Готово, когда в отрендеренном конфиге не осталось секретов открытым текстом и
`no_log` с задачи снят — дифф конфига снова читаем.
Разбор по каждому полю, версии и ссылки на код:
[справка по файловым секретам](../drafts/secrets-file-support.md).
Из декомпозиции `secrets-env-to-file` (2026-07-25).
Связано: files/authelia, tasks.py (`authelia-*`), roles/secrets,
[no-secrets-in-playbook-output](no-secrets-in-playbook-output.md).