diff --git a/docs/adr/ADR-2026-08-11-pocketbase-storage-with-admin-panel.md b/docs/adr/ADR-2026-08-11-pocketbase-storage-with-admin-panel.md index a60b8e1..50462d7 100644 --- a/docs/adr/ADR-2026-08-11-pocketbase-storage-with-admin-panel.md +++ b/docs/adr/ADR-2026-08-11-pocketbase-storage-with-admin-panel.md @@ -23,8 +23,8 @@ PocketBase заменяет SQLite с goqu и goose и берёт на себя И раздел про файлы: -> Сегодняшняя раскладка `data/files` с именами-UUID панели не видна. Путь строкой -> она покажет строкой — прослушать и скачать запись по ней нельзя. Способа +> Сегодняшняя раскладка `data/files` с именами-UUID панели не видна. Путь она +> покажет строкой — прослушать и скачать запись по ней нельзя. Способа > сослаться на файл, уже лежащий на диске мимо её каталога, нет. Там же то, что связывает файлы с сохранностью архива: diff --git a/docs/passport.md b/docs/passport.md index 8b896c0..59d01c2 100644 --- a/docs/passport.md +++ b/docs/passport.md @@ -59,9 +59,9 @@ ни языковую модель: и речь, и выводы из текста считает внешний сервис. - **Управление учётными записями.** Пользователей заводит и проверяет внешний провайдер, свою регистрацию и свои пароли не делаем. Одно исключение появилось - 2026-08-11 вместе с решением про PocketBase: в её панель администратора - владелец входит своим паролем, потому что закрыть её провайдером она не - умеет. + 2026-08-11 вместе с решением про PocketBase: в панель администратора владелец + входит своим паролем, потому что подпустить к ней внешнего провайдера + PocketBase не даёт. - **Живая расшифровка.** Работаем с готовой записью, поток в реальном времени не обрабатываем. - **Диктофон.** Запись звука делает телефон, а приложение принимает готовый diff --git a/docs/research/pocketbase.md b/docs/research/pocketbase.md index cd5b73a..b7326c9 100644 --- a/docs/research/pocketbase.md +++ b/docs/research/pocketbase.md @@ -69,8 +69,8 @@ pb_data/storage/<коллекция>/<запись>/<имя>_<10 случайн Проверено загрузкой файла в 200 КБ: имя `sample.ogg` превратилось в `sample_uztrv6wvz3.ogg`, рядом лёг файл атрибутов. -Сегодняшняя раскладка `data/files` с именами-UUID панели не видна. Путь строкой -она покажет строкой — прослушать и скачать запись по ней нельзя. Способа сослаться +Сегодняшняя раскладка `data/files` с именами-UUID панели не видна. Путь она +покажет строкой — прослушать и скачать запись по ней нельзя. Способа сослаться на файл, уже лежащий на диске мимо её каталога, нет. Поле помечается защищённым, и тогда файл не отдаётся по прямой ссылке: без токена @@ -103,6 +103,7 @@ pb_data/storage/<коллекция>/<запись>/<имя>_<10 случайн - **Оставить вход у приложения, а PocketBase взять только хранилищем.** Отвергнуто: пользователей панель в этом случае не показывает вовсе, и одна из трёх частей вопроса остаётся без ответа навсегда, а не до какой-то задачи. -- **Отказаться от перевода.** Отвергнуто человеком на чекпоинте 2026-08-11: +- **Отказаться от перевода.** Отвергнуто человеком 2026-08-11 при выборе из трёх + способов: вместе с панелью отказ выбрасывал бы уход CGO и встроенное резервное копирование, которых у сервиса-архива нет никаких. diff --git a/tasks/BACKLOG.md b/tasks/BACKLOG.md index 6c4b637..d853900 100644 --- a/tasks/BACKLOG.md +++ b/tasks/BACKLOG.md @@ -24,8 +24,8 @@ - [🐞 Убирать записанный файл, когда приём отказал на середине](items/orphan-file-on-failed-intake.md) — Отказ чтения метаданных и отказ записи на диск оставляют файл в каталоге хранения без задачи и без учёта: сопоставить его не с чем, удалять приходится руками. - [🧹 Задать таймауты обращениям к внешним сервисам](items/external-call-timeouts.md) — Ни у Telegram, ни у Object Storage, ни у SpeechKit нет таймаута: молчащий собеседник держит шаг конвейера до истечения часового захвата. - [🔬 Очередь задач: своя таблица или готовая библиотека](items/job-queue-choice.md) — Очередь написана вручную: захват двумя запросами без транзакции, протухание временем, опрос раз в секунду вхолостую тремя воркерами. -- [🧹 Перевести хранилище и файлы записей на встроенный PocketBase](items/pocketbase-storage.md) — Записи, метаданные и файлы лежат порознь, и владелец не видит их ничем: панель PocketBase покажет и то и другое, только если они переедут к ней. -- [✨ Пускать в приложение только после входа через OIDC](items/oidc-login.md) — HTTP API открыт наружу без аутентификации: любой из интернета заводит задачи за наши деньги и читает чужие расшифровки по идентификатору. Ответ провайдера разбирает PocketBase, а не наш код. +- [🧹 Перевести хранилище и файлы записей на встроенный PocketBase](items/pocketbase-storage.md) — Записи, метаданные и файлы лежат порознь, и владелец не видит их ничем, кроме консоли на сервере: панель PocketBase покажет и то и другое, только если они переедут к ней. +- [✨ Пускать в приложение только после входа через OIDC](items/oidc-login.md) — HTTP API открыт наружу без аутентификации: любой из интернета заводит задачи за наши деньги и читает чужие расшифровки по идентификатору. - [✨ Привязать запись к владельцу и отдавать только свои](items/record-ownership.md) — У задачи и файла нет владельца, поэтому знание UUID задачи и есть право её читать. - [✨ Сопоставить пользователя Telegram с учётной записью](items/telegram-account-link.md) — Белый список сверяется с именем пользователя Telegram, которое владелец меняет в любой момент, а записи из бота ни с кем не связаны. - [✨ Свести приём и чтение записей к одному контракту для приложения](items/json-api-for-spa.md) — Сегодняшний API отвечает 404 на любую ошибку чтения и 500 на любую ошибку приёма: строить на нём экраны нечем. diff --git a/tasks/items/oidc-login.md b/tasks/items/oidc-login.md index a14b793..9c04b79 100644 --- a/tasks/items/oidc-login.md +++ b/tasks/items/oidc-login.md @@ -2,11 +2,12 @@ - **Тип:** feature - **Категория:** Очередь -- **Зачем:** HTTP API открыт наружу без аутентификации: любой из интернета заводит задачи за наши деньги и читает чужие расшифровки по идентификатору. Ответ провайдера разбирает PocketBase, а не наш код. +- **Зачем:** HTTP API открыт наружу без аутентификации: любой из интернета заводит задачи за наши деньги и читает чужие расшифровки по идентификатору. - **Теги:** goal:multi-user, question -Двигает пункт 1 «Завершения» цели: неаутентифицированный запрос к записям не -проходит ни к странице, ни к API. +Двигает пункты 1 и 3 «Завершения» цели: неаутентифицированный запрос к записям +не проходит ни к странице, ни к API; вход идёт через OIDC у Authelia, а выход из +сессии работает. Провайдер — Authelia по OIDC. Своей регистрации и своих паролей не делаем, это граница из [паспорта](../../docs/passport.md). Разграничения записей по владельцу diff --git a/tasks/items/pocketbase-storage.md b/tasks/items/pocketbase-storage.md index 125546c..186ba56 100644 --- a/tasks/items/pocketbase-storage.md +++ b/tasks/items/pocketbase-storage.md @@ -2,7 +2,7 @@ - **Тип:** chore - **Категория:** Очередь -- **Зачем:** Записи, метаданные и файлы лежат порознь, и владелец не видит их ничем: панель PocketBase покажет и то и другое, только если они переедут к ней. +- **Зачем:** Записи, метаданные и файлы лежат порознь, и владелец не видит их ничем, кроме консоли на сервере: панель PocketBase покажет и то и другое, только если они переедут к ней. PocketBase встраивается библиотекой в тот же бинарник и приносит хранилище, учётные записи и панель администратора разом. Конвейер и оба входа работают