SoundVault · Настройка сервера

Библиотека под твоим контролем.

Каталог музыки, конфигурация, пользователи, облако и федерация.

Два файла настроек

.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 = 60

32 потока — исходный пример для установки с облачным прослушиванием; число подбирается под ресурсы и нагрузку. Каждый облачный поток занимает рабочий поток сервера. Поле 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-доступ и федерация. Не публикуй журналы целиком без удаления приватных сведений.

Подготовлено по исходному коду проекта · 7 октября 2026