- POST /admin/users/{id}/reset-recommendations clears the taste profile
(onboarding, CF vector, bandit), play stats and wave impressions; likes,
dislikes and history stay, wave sessions stay so a playing wave keeps going
- moderators may reset plain users, admins anyone including themselves;
the reset is written to the audit log
- users panel gets the menu action with a confirmation; docs updated
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
15 KiB
Руководство администратора
Повседневная работа с сервером после установки (install-guide.md): пользователи, музыка,
очередь на добавление, «Моя волна», обновления, бэкапы и диагностика. Все команды — из каталога
/opt/pipu-music/deploy. Справочник по сервисам и переменным — deployment.md.
1. Первый вход
- Логин
admin. Пароль —BOOTSTRAP_ADMIN_PASSWORDиз.env, а если он не задан — сгенерированный, его печатает лог один раз:docker compose logs api | grep -i bootstrap. - Сервер сразу попросит сменить логин и пароль администратора (пароль ≥ 12 символов). До этого остальные разделы недоступны.
- Подключите хранилище с музыкой (раздел 3) — после первого скана появятся библиотека, поиск и «Моя волна».
2. Пользователи и роли
«Администрирование → Пользователи».
| Роль | Что может |
|---|---|
| Пользователь | Слушать, искать, собирать коллекцию, «Моя волна» |
| Модератор | Плюс: заводить пользователей и сбрасывать им пароли, смотреть статус библиотеки, предлагать треки |
| Администратор | Всё: хранилища, сканы, очередь на добавление, настройки сервера, роли, аудит |
Полная матрица прав — auth-and-roles.md.
- Новый пользователь: «Создать» → логин, имя, роль. Сервер выдаёт временный пароль — он показывается один раз, передайте его человеку. При первом входе пароль придётся сменить.
- Забыл пароль: «Сбросить пароль» — новый временный пароль, все сессии пользователя завершаются.
- Волна «застряла» во вкусе: «Сбросить рекомендации» — профиль вкуса, статистика прослушиваний и показы волны стираются, онбординг покажется снова. Лайки, дизлайки и история остаются (и по-прежнему влияют на подбор).
- Заблокировать — вход запрещён, история и лайки сохраняются; удалить — безвозвратно вместе с историей.
- Последнего администратора нельзя понизить, заблокировать или удалить.
- Аудит («Администрирование → Аудит»): кто, когда и что сделал — создание пользователей, смена ролей, сбросы паролей, изменения хранилищ и настроек, решения по очереди.
3. Хранилища и библиотека
«Администрирование → Хранилища».
- Папка на сервере — каталог хоста из
LIBRARY_HOSTв.env(например, смонтированный диск/mnt/music); в форме указывается путь внутри него. NFS — сервер и экспорт; монтируетstorage-agent. - «Проверить» — доступ к хранилищу, число найденных аудиофайлов.
- Шаблоны путей («Шаблоны»): как из пути файла получить исполнителя, альбом, год и номер трека, если в тегах пусто. «Предпросмотр» показывает разбор реальных путей до сохранения. Что важнее — теги или путь, задаётся в карточке хранилища (по умолчанию теги).
- Скан: обычный — только новые и изменённые файлы (по расписанию — интервал в карточке хранилища — и после изменения настроек), «Полный» — перечитать всё. Удалённые с диска файлы помечаются отсутствующими, а не стираются из истории.
- «Администрирование → Библиотека» — счётчики, прогресс скана и аудиоанализа, файлы с ошибками чтения (битые файлы, неизвестные форматы) и «Переиндексировать поиск» — если поиск выдаёт устаревшее (обычно не нужно: индекс обновляется сам и пересобирается при старте api).
- Аудиоанализ (темп, энергия, настроение — для «Моей волны») идёт в фоне: на 10 тыс. треков — несколько часов
при 4 ядрах (
analyzerвcompose.yaml,--workers). Волна работает и до его окончания, но точнее — после. Не удалось проанализировать часть треков (например, пока диск не был смонтирован) — «Повторить» под счётчиком ошибок возвращает их в очередь; рядом показана самая частая ошибка. Пропавшие файлы анализатор не считает попыткой и ждёт, пока диск вернётся.
4. Очередь на добавление
Модераторы и администраторы предлагают треки («Предложить треки»), администратор решает, что попадёт в библиотеку. Подробно — uploads.md.
- Куда пишутся файлы: у хранилища включите «Принимать загрузки» и задайте шаблон раскладки — «Подобрать» предложит шаблон по уже лежащим файлам, «Проверить» убедится, что из пути, построенного шаблоном, сканер получит те же исполнителя, альбом и номер трека. Хранилище по умолчанию — в «Настройках сервера».
- Рассмотрение («Очередь на добавление»): прослушать, поправить метаданные (в том числе сразу для всего альбома), одобрить или отклонить с причиной — автор её увидит. Итоговый путь пересчитывается при правке. Отметка «возможный дубль» — со ссылкой на похожий трек библиотеки; точные копии отсекаются ещё до загрузки.
- Импорт: одобренный файл записывается в хранилище только под окончательным именем, с проверкой контрольной суммы; кроме самих аудиофайлов (и папок для них) на диск ничего не пишется.
- Квота («Настройки сервера»): общий лимит очереди (10 ГБ по умолчанию), лимит на одного модератора (выключен) и максимальный размер файла (2 ГБ). Отклонённые файлы и дубли место не занимают; снижение лимита ниже занятого не удаляет загрузки, просто новые не принимаются.
5. «Моя волна»
- «Администрирование → Библиотека → Моя волна за 7 дней»: сколько треков выдано, доля дослушанных до конца, ранних скипов и лайков на 100 треков. Ориентир — ранних скипов меньше 30%.
- Таблица по версиям модели:
heuristic-v1— эвристика,heuristic-v1+cf— она же с коллаборативной фильтрацией (ALS),lgbm-…— обученный ранжировщик. По ней видно, стало ли лучше после смены модели. - Обучение — каждую ночь в 3:00 UTC: ALS по прослушиваниям, бандит по источникам кандидатов, ранжировщик по показам волны. Новая модель включается, только если по проверке на последней неделе не хуже текущей. Ранжировщику нужно ~20 тыс. показов с известным исходом — до этого работает эвристика.
- Новые пользователи с почти пустой историей проходят онбординг вкуса: выбирают исполнителей и жанры библиотеки. Пропуск тоже запоминается.
6. Обновление
./update.sh
Скрипт делает копию базы, переключается на последний релиз, собирает образы, перезапускает сервисы и ждёт
готовности; миграции применяются при старте api. Конкретная версия — ./update.sh v1.0.0; откат на старую версию
требует PIPU_ALLOW_DOWNGRADE=1 (миграции не откатываются — сначала проверьте совместимость). Перед обновлением
прочитайте заметки к релизу на странице релизов Gitea.
Android-приложение обновляется само: при запуске оно сверяется с сервером и предлагает новый APK.
Раздать приложение — ссылка https://<ваш-домен>/android (без входа): кнопка «Скачать APK» последнего релиза,
адрес сервера для копирования и короткая инструкция; та же страница — внизу экрана входа и в меню профиля.
7. Бэкапы и восстановление
- Каждую ночь (
BACKUP_HOUR, по умолчанию 3:30 UTC) контейнерbackupделает копию базы в/srv/pipu/backups/daily(14 последних) и раз в неделю — вweekly(8 последних). - Раз в неделю копия проверяется восстановлением во временную базу. Результат:
docker compose logs backup | tail; при ошибке в логе — «ПРОВЕРКА НЕ ПРОЙДЕНА». - Копия сейчас:
docker compose run --rm backup once. - Восстановление:
./restore.sh— список копий,./restore.sh daily/<файл>— восстановить. Прежняя база остаётся рядом какpipu_before_restore_<время>; убедившись, что всё в порядке, удалите её:docker compose exec postgres dropdb -U pipu pipu_before_restore_<время>. - В копию входит всё, что нельзя пересоздать: пользователи, история, лайки, состояние плеера, очередь на добавление, результаты аудиоанализа и модели волны. Поиск, обложки и транскоды восстанавливаются сами.
- Сама музыка не бэкапится приложением — это ваш диск или NFS. Каталог бэкапов тоже лежит на сервере:
копируйте
/srv/pipu/backupsна другую машину, напримерrsyncпо cron.
8. Наблюдение
| Что | Как |
|---|---|
| Сервер жив и готов | curl -s https://music.example.com/readyz → все зависимости ok |
| Состояние сервисов | docker compose ps |
| Логи | docker compose logs -f --tail=100 api (или recommender, analyzer, storage-agent, backup) |
| Место на диске | df -h /srv/pipu; больше всего занимают cache/transcode (чистится сам) и backups |
| Версия | grep PIPU_VERSION .env, GET /api/v1/server-info; Android — внизу вкладки «Профиль» |
| Нагрузка | tests/load/smoke.js — см. testing.md |
9. Частые ситуации
| Ситуация | Что делать |
|---|---|
Ни один трек не играет («Не удалось воспроизвести трек»), в логе api no such file or directory |
Диск с музыкой не смонтирован: findmnt <LIBRARY_HOST>, sudo mount -a. Контейнеры увидят диск сами; скан на пустой папке прерывается с ошибкой «is the disk mounted?» и ничего не помечает пропавшим |
| Трек не находится поиском | Есть ли он в «Библиотеке» (скан завершён, файл не в «ошибках»); затем «Переиндексировать поиск» |
| Неверный исполнитель или альбом | Поправьте теги файла или шаблон путей и запустите скан |
| Хранилище в статусе «Ошибка» | Текст ошибки на карточке; диск смонтирован (findmnt), NFS доступен с сервера; «Проверить» |
| Волна однообразная | Идёт ли аудиоанализ («Библиотека → Аудиоанализ»); чем больше прослушиваний, тем точнее волна |
| Загрузка застряла в «Обработке» | `docker compose logs api |
| Пользователь не может войти | Не заблокирован ли; «Сбросить пароль» |
| Сервис перезапускается по кругу | docker compose logs <сервис>; часто — закончилось место на диске |
Остальное — install-guide.md.