Files
transcriber/docs/adr/ADR-2026-08-11-pocketbase-storage-with-admin-panel.md
T
av 6c996209b7 docs: применены находки вычитки по разведке PocketBase
- сняты повтор слова в записке разведки и та же строка в цитате ADR,
  убран термин «чекпоинт», разведена цепочка местоимений в паспорте
- oidc-login: «зачем» перестало повторять тело, задача заявила пункт 3
  «Завершения» цели multi-user — он не был закрыт ни одной её задачей
2026-08-11 13:17:28 +03:00

7.0 KiB
Raw Blame History

Хранилище, файлы и вход переезжают в PocketBase

Решение

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.
  • вход перестаёт быть нашим: задача oidc-login переписывается с собственной обработки ответа провайдера на настройку провайдера в PocketBase. Что делать с сессией и где она живёт, решает уже не наш код.
  • появляется секрет, которого не было: пароль суперпользователя панели. Сама PocketBase Authelia к панели не подпускает — ни OIDC, ни второй фактор у коллекции суперпользователей включить не удалось. Своё ограничение по списку адресов у неё есть, но им же можно запереть себя: сброса в наборе команд нет.
  • панель висит на том же порту, что и приложение, а порт опубликован в интернет через обратный прокси. Закрывает её контур: тем же решением адрес /_/ закрывает Authelia на прокси, пропуская группу администраторов. Приложение тут ни при чём, и задачи в беклоге у этого нет.