Два файла настроек
.env хранит секреты и параметры запуска. soundvault.conf — обычные настройки. Текущий код требует SOUNDVAULT_SECRET_KEY, SOUNDVAULT_CONFIG и DATABASE_URL: без них запуск прекращается. Файл конфигурации и обязательные секции также должны существовать.
Ниже — нейтральный пример для /opt/soundvault. Замени домен, почту, пароль и секрет; не копируй значения-заглушки в работающий сервер.
SOUNDVAULT_SECRET_KEY=REPLACE_WITH_RANDOM_SECRET
SOUNDVAULT_CONFIG=/opt/soundvault/soundvault.conf
DATABASE_URL=sqlite:////opt/soundvault/music.db
SOUNDVAULT_AUTHOR_EMAIL=you@example.com
# Только для первого запуска пустой базы
SOUNDVAULT_CREATE_DEFAULT_ADMIN=1
SOUNDVAULT_ADMIN_USERNAME=admin
SOUNDVAULT_ADMIN_PASSWORD=REPLACE_WITH_STRONG_PASSWORD
# Включить после настройки HTTPS
# SOUNDVAULT_HTTPS=1
# Независимые Fernet-ключи, если нужны эти функции
# SOUNDVAULT_YANDEX_KEY=...
# SOUNDVAULT_FEDERATION_KEY=...Сгенерируй случайный секрет:
python3 -c "import secrets; print(secrets.token_hex(32))"Файл .env должен принадлежать пользователю службы и иметь права 600. После первого входа убери параметры создания администратора. Их назначение — первоначальное создание на пустой базе.
Рабочий soundvault.conf
Этот пример содержит все обязательные секции текущего кода. Обычные параметры читаются из INI-файла; не рассчитывай, что произвольная одноимённая переменная окружения их переопределит.
[service]
host = 127.0.0.1
port = 8008
threads = 32
log_dir = /opt/soundvault/logs
trusted_proxy = 127.0.0.1
trusted_proxy_count = 1
public_base_url = https://music.example.com
x_accel_prefix =
[media]
music_dir = /srv/music
[database]
sqlite_timeout = 30
sqlite_journal_mode = WAL
sqlite_synchronous = NORMAL
[upload]
max_content_length = 10737418240
max_file_size = 2147483648
max_form_parts = 10000
batch_size = 100
batch_bytes = 536870912
conflict_default = overwrite
[scan]
lock_timeout_seconds = 7200
scan_commit_every = 200
[health_check]
enabled = true
[federation]
sync_interval_minutes = 60
availability_check_seconds = 6032 потока — исходный пример для установки с облачным прослушиванием; число подбирается под ресурсы и нагрузку. Каждый облачный поток занимает рабочий поток сервера. Поле x_accel_prefix оставлено пустым до настройки nginx.
Папки, обложки и сканирование
/srv/music/
public/ # общая музыка
Artist/Album/
cover.jpg
01 - Track.flac
users/ # личные каталоги пользователей
garbage/ # удалённые папки до очисткиЛичные каталоги создаются при заведении пользователей. Не перемещай их произвольно после настройки аккаунтов. Музыку можно загружать через «Мои файлы» или копировать на диск с корректными правами службы.
В панели администратора запусти сканирование; пользователь может пересканировать свою область. Сканирование обновляет каталог, а не удаляет музыку с диска. Автоматическое сканирование локальной библиотеки по расписанию в описываемой конфигурации не предусмотрено.
Пользователи и права
| Роль | Возможности |
|---|---|
| Администратор | Библиотека, пользователи, сканирование, права, корзина и узлы. |
| Пользователь | Своя папка, публичная музыка и предоставленный доступ. |
| Гость | Просмотр и прослушивание публичной музыки в вебе; Android не поддерживается. |
Права выдаются на вкладке «Доступ» и распространяются на вложенные папки. Личные папки не становятся публичными от установки сервиса. Удаление папки перемещает её в корзину; место освобождается после очистки.
Подключение Яндекс.Музыки
Создай отдельный Fernet-ключ и сохрани его в SOUNDVAULT_YANDEX_KEY в .env. Перезапусти службу, затем пользователь сможет войти через «Облачные сервисы».
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"Команду выполняй Python из виртуального окружения с установленными зависимостями. Ключ шифрует токены, его нужно сохранять вместе с защищённой резервной копией настроек. Не используй секрет сессий вместо Fernet-ключа. Без настройки облако недоступно, локальная библиотека продолжает работать.
Настройка федерации
На каждом сервере задай HTTPS-адрес в public_base_url и отдельный SOUNDVAULT_FEDERATION_KEY. Для него сгенерируй новый Fernet-ключ той же командой; не переиспользуй ключ Яндекса.
Админка → «Узлы»: создай или прими приглашение, сверь отпечатки и подтверди связь с обеих сторон. Выдай соседу права на выбранные папки и включи отображение его контента.
Синхронизация метаданных по умолчанию выполняется раз в 60 минут, проверка доступности — раз в 60 секунд. Пять неудачных проверок скрывают контент соседа до восстановления связи. Это не удаляет выданные права.
Не теряй ключ шифрования: новый случайный ключ не восстановит существующие связи. При обновлении базы со старыми связями подготовь его до первой миграции.
Применение и диагностика
sudo systemctl restart soundvault
sudo journalctl -u soundvault -n 100 --no-pager
curl http://127.0.0.1:8008/api/health
curl http://127.0.0.1:8008/api/capabilitiesПроверь loaded=true и database.ok=true, доступ к своей библиотеке и воспроизведение. Журналы находятся в log_dir: приложение, сканирование, аудит, HTTP-доступ и федерация. Не публикуй журналы целиком без удаления приватных сведений.