12 KiB
О проекте
Tanabata File Manager или сокращенно TFM — многопользовательский веб-файловый менеджер, организующий файлы по тегам. Работает на клиент-серверной архитектуре, управляется через веб-интерфейс. Главная цель проекта — обеспечить централизованное хранение файлов на сервере, доступ к ним и управление ими через веб как с компьютера, так и со смартфона. В первую очередь данное приложение ориентировано на изображения и видео.
Общая архитектура
- File storage
- Relational database (PostgreSQL)
- REST API service (Go)
- Frontend (SvelteKit)
Приложение предполагается разворачивать внутри контейнера Docker. Фронтенд и бэкенд - в одном контейнере, СУБД - отдельно (на моем сервере планируется подключать к СУБД на хосте). Все файлы, управляемые Танабатой, будут храниться кучей в одной папке. Имя файла на диске совпадает с его UUID в БД.
Приложение является PWA, которое можно установить на компьютер или смартфон.
В будущих версиях планируется введение поддержки других СУБД.
Основные понятия
Файл — один файл на сервере. Может иметь сколько угодно тегов, может принадлежать скольким угодно пулам. Имеет автора, а также может иметь настройки доступа (пользователь (может быть null - таким образом можно делать файл публичным), флаг права на чтение, флаг права на изменение). Имеет оригинальное название и метаданные (ключ-значение, в том числе все данные EXIF).
Тег — метка файла. Может быть привязан к скольким угодно файлам, может быть привязан к одной категории. Имеет название, описание, метаданные (ключ-значение). Может иметь автотеги.
Автотег — правило, согласно которому при привязке к файлу условного тега А к этому же файлу автоматически привязывается условный тег Б.
Категория — сущность, логически объединяющая собой несколько тегов. Имеет название, описание, метаданные (ключ-значение).
Пул — логическое объединение файлов. Имеет название, описание, метаданные (ключ-значение). Файлы внутри могут быть как отсортированы автоматически, так и расположены в порядке, заданном пользователем вручную.
Функциональные требования
- Управление файлами
- Просмотр списка файлов (lazy load, pagination)
- Фильтрация файлов по тегам и метаданным
- Просмотр и редактирование настроек сортировки (сохраняется для каждого пользователя)
- Выделение нескольких файлов (Ctrl, Shift) и действия с ними
- Привязка/отвязка тегов
- Копирование/вставка тегов
- Добавление в пул
- Просмотр и редактирование настроек доступа
- Удаление (с запросом подтверждения)
- Просмотр одного файла
- Действия с одним файлом
- Привязка/отвязка тегов
- Копирование/вставка тегов
- Добавление в пул
- Просмотр и редактирование настроек доступа
- Замена файла (загрузка нового под таким же ID)
- Удаление (с запросом подтверждения)
- Листание файлов, как в галерее
- Загрузка новых файлов через веб-интерфейс (через форму или drag-n-drop прямо на список)
- Импорт новых файлов из папки на сервере
- Выявление дубликатов, в частности, изображений и видео
- Отображение групп дубликатов
- Возможность отвязывания фальшивых дубликатов (чтобы приложение запомнило, что изображение А не является дубликатом изображения Б)
- Возможность выбора дубликата для удаления/сохранения
- Возможность выбора, какие поля от какого дубликата подтягивать
- Корзина
- Просмотр файлов в корзине
- Восстановление из корзины
- Окончательное удаление
- Управление тегами
- Просмотр списка тегов (lazy load, pagination)
- Поиск по названию
- Просмотр и редактирование настроек сортировки (сохраняется для каждого пользователя)
- Выделение нескольких тегов (Ctrl, Shift) и действия с ними
- Назначение автотегов
- Изменение категории
- Удаление (с запросом подтверждения)
- Просмотр одного тега
- Действия с одним тегом
- Редактирование названия, описания и метаданных (ключ-значение)
- Изменение категории
- Назначение автотегов
- Удаление (с запросом подтверждения)
- Создание тега
- Внесение названия, описания и метаданных (ключ-значение)
- Назначение категории (опционально)
- Назначение автотегов
- Управление категориями
- Просмотр списка категорий (lazy load, pagination)
- Поиск по названию
- Просмотр и редактирование настроек сортировки (сохраняется для каждого пользователя)
- Выделение нескольких категорий (Ctrl, Shift) и действия с ними
- Просмотр привязанных общих тегов и тегов, привязанных к некоторым, но не ко всем
- Привязка/отвязка тегов
- Удаление (с запросом подтверждения)
- Просмотр одной категории
- Действия с одной категорией
- Редактирование названия, описания и метаданных (ключ-значение)
- Просмотр привязанных тегов
- Привязка/отвязка тегов
- Удаление (с запросом подтверждения)
- Создание категории
- Внесение названия, описания и метаданных (ключ-значение)
- Привязка тегов
- Управление пулами
- Просмотр списка пулов (lazy load, pagination)
- Поиск по названию
- Просмотр и редактирование настроек сортировки (сохраняется для каждого пользователя)
- Выделение нескольких пулов (Ctrl, Shift) и действия с ними
- Просмотр и редактирование настроек доступа
- Удаление (с запросом подтверждения)
- Просмотр одного пула
- Действия с одним пулом
- Редактирование названия, описания и метаданных (ключ-значение)
- Просмотр и редактирование настроек доступа
- Просмотр всех файлов, входящих в пул
- Фильтрация файлов по тегам
- Изменение настройки сортировки файлов (в том числе можно отключить автоматическую сортировку)
- Ручное изменение порядка файлов (при отключенной сортировке)
- Удаление (с запросом подтверждения)
- Создание категории
- Внесение названия, описания и метаданных (ключ-значение)
- Привязка тегов
- Управление пользовательскими настройками
- Имя пользователя
- Пароль
- Сессии
- Завершение сессии
- Путь к папке на сервере, которая будет сканироваться при импорта файлов
- Управление настройками сервера (админка)
- Пользователи
- Просмотр списка
- Просмотр одного
- Создание
- Удаление
- Блокировка/разблокировка
- Установка роли (читатель/редактор)
- Пользователи
- Журналирование пользовательских действий в БД
- Просмотры файлов
- Смены настроек доступа к файлам
- Создание/редактирование/удаление файла, тега, категории, пула, связи файл-тег
- Создание/блокировка/разблокировка/удаление пользователя
- Смена роли пользователя
- Авторизация/логаут пользователя
- Завершение сессии
Нефункциональные требования
- Интерфейс должен быть максимально простым и удобным, все необходимое должно быть под рукой, доступным за минимальное количество действий
- Интерфейс должен быть адаптирован под десктоп и под мобильные устройства
- Интерфейс должен иметь темную и светлую темы
- Использование технологии PWA (также должна быть кнопка, при нажатии которой PWA будет полностью сбрасываться (кроме кэша) и заново загружаться с сервера)
- Возможность сохранять некоторые файлы в кэш и просматривать их оффлайн при использовании установленного PWA
- При первичном запуске приложение должно требовать минимума действий: автоматическая миграция БД, заранее готовый файл docker compose, файл .env с настраиваемыми параметрами установки
- Использование подхода DDD для сервера API
- Не принимать файлы, чей MIME отсутствует в БД (нет в БД — нет поддержки)