Files
transcriber/docs/adr/ADR-2026-08-11-pocketbase-storage-with-admin-panel.md
T
av b46be019fc docs: канон приведён к сегодняшнему состоянию после сверки
- периметр: passport.md и security.md больше не утверждают, что HTTP API
  открыт без аутентификации, а review.md не числит эту находку типовой
  ложноположительной — приём, опрос и файл закрыты сессией с 2026-08-12;
- logging.md писал, что расширение попадает в журнал полем пути: описано
  изъятие инварианта приватности — собственное поле, имени и пути нет;
- узел ревью переименован в repo/pocketbase, поведение конвейера из обзора
  уехало ссылкой в спеку pipeline, Purpose спеки storage написан вместо
  заглушки, в ADR о переезде дописано уточнение о действующей раскладке.
2026-08-12 21:13:06 +03:00

85 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Хранилище, файлы и вход переезжают в PocketBase
- **Дата:** 2026-08-11
- **Источник:** [../research/pocketbase.md](../research/pocketbase.md) — записка
разведки `pocketbase-admin-fit`
## Решение
PocketBase заменяет SQLite с goqu и goose и берёт на себя три вещи разом:
состояние задач и метаданные, файлы записей своим полем и своей раскладкой на
диске, вход пользователей через Authelia своим провайдером OIDC. Панель
администратора работает по всем трём частям только в таком составе.
## Почему
Разведка мерила панель по трём частям, и порознь ни одна перевода не оправдывала.
Правку записей панель даёт целиком, а две остальные упираются в то, где лежат
данные. Цитата из источника, раздел про пользователей:
> Панель показывает свою коллекцию пользователей и ничего больше. Отсюда
> следствие для целевого входа: **пользователи Authelia в панели не появятся,
> если вход делает само приложение**.
И раздел про файлы:
> Сегодняшняя раскладка `data/files` с именами-UUID панели не видна. Путь она
> покажет строкой — прослушать и скачать запись по ней нельзя. Способа
> сослаться на файл, уже лежащий на диске мимо её каталога, нет.
Там же то, что связывает файлы с сохранностью архива:
> **Резервные копии накрывают ровно её каталог.** Файлы, оставленные снаружи, в
> них не попадут — то есть панель и встроенное резервное копирование покупаются
> одной и той же ценой.
Отвергнуты два половинчатых пути, и оба по одной причине — они покупают перевод,
не покупая того, ради чего он затевался:
> **Держать файлы на диске как сейчас, а в базе — путь строкой.** Отвергнуто:
> панель тогда не даёт по файлам ничего, и встроенные копии их не накрывают.
> Довод, ради которого перевод затевался, пропадает целиком.
>
> **Оставить вход у приложения, а PocketBase взять только хранилищем.**
> Отвергнуто: пользователей панель в этом случае не показывает вовсе, и одна из
> трёх частей вопроса остаётся без ответа навсегда, а не до какой-то задачи.
Запись попадает в журнал по двум основаниям сразу. **Откат дорогой:** меняется
раскладка файлов на диске, а она в `../../CLAUDE.md` названа необратимой.
**Пересматривается прежнее решение:** вход через OIDC собирались делать в самом
приложении — так это записано в `../architecture.md`, «Открытые вопросы», и так
поставлена задача `oidc-login`. Парного статуса «заменено на» прежняя запись не
получает: своего ADR у неё нет, решение жило открытым вопросом архитектуры.
## Последствия
- `+` панель даёт владельцу править записи, видеть пользователей и слушать сами
файлы. Проверено на версии 0.39.10; в библиотечной сборке панель отдаётся по
адресу `/_/` того же порта.
- `+` база и записи съезжаются под один каталог, и копия сервера накрывает их
разом. Своё копирование по расписанию с выгрузкой в S3-совместимое хранилище у
PocketBase тоже есть, но копии сервер уже делает своими средствами — берём мы
встроенное или нет, здесь не решено.
- `+` требование CGO уходит: PocketBase ходит в SQLite через
`modernc.org/sqlite`, и пробник собрался при `CGO_ENABLED=0`. Свойство стека в
`../../CLAUDE.md` перестаёт быть верным.
- `` раскладка `data/files` меняется необратимо: файл ложится в
`pb_data/storage/<коллекция>/<запись>/<имя>_<10 случайных символов>` рядом с
файлом атрибутов. Момент перехода назначает человек; данные прежней базы не
переносятся по прежнему решению задачи `pocketbase-storage`.
*Уточнено 2026-08-12:* каталог задаётся ключом `[storage] data_dir` со
значением `data`. Суффикс из десяти знаков дописывает конструктор имени,
которого сервис не зовёт, — имя задаёт он сам. Действующая раскладка —
[../database.md](../database.md), «Представление данных».
- `` вход перестаёт быть нашим: задача `oidc-login` переписывается с
собственной обработки ответа провайдера на настройку провайдера в PocketBase.
Что делать с сессией и где она живёт, решает уже не наш код.
- `` появляется секрет, которого не было: пароль суперпользователя панели. Сама
PocketBase Authelia к панели не подпускает — ни OIDC, ни второй фактор у
коллекции суперпользователей включить не удалось. Своё ограничение по списку
адресов у неё есть, но им же можно запереть себя: сброса в наборе команд нет.
- `` панель висит на том же порту, что и приложение, а порт опубликован в
интернет через обратный прокси. **Закрывает её контур:** тем же решением адрес
`/_/` закрывает Authelia на прокси, пропуская группу администраторов. Приложение
тут ни при чём, и задачи в беклоге у этого нет.