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

- **Дата:** 2026-08-11
- **Источник:** [../research/pocketbase.md](../research/pocketbase.md) — записка
  разведки `pocketbase-admin-fit`
- **Статус:** заменено на [ADR-2026-08-22-storage-without-pocketbase](ADR-2026-08-22-storage-without-pocketbase.md)

## Решение

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 на прокси, пропуская группу администраторов. Приложение
  тут ни при чём, и задачи в беклоге у этого нет.
