SoundVault · Настройка nginx

HTTPS и музыка без задержек.

Прокси для приложения, загрузка больших файлов и потоковая отдача.

Обратный прокси

Пример для Ubuntu и приложения на 127.0.0.1:8008. Укажи собственный домен, направь его DNS на сервер и сохрани конфигурацию в /etc/nginx/sites-available/soundvault. На одном адресе не должно быть конфликтующего server_name.

server {
    listen 80;
    server_name music.example.com;
    client_max_body_size 10G;
    client_body_timeout 3600s;

    location /_media/ {
        internal;
        alias /srv/music/;
        gzip off;
        sendfile on;
        add_header Accept-Ranges bytes always;
    }

    location / {
        proxy_pass http://127.0.0.1:8008;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_connect_timeout 10s;
        proxy_send_timeout 3600s;
        proxy_read_timeout 3600s;
        proxy_request_buffering off;
        proxy_buffering off;
        proxy_redirect off;
    }
}
sudo ln -s /etc/nginx/sites-available/soundvault /etc/nginx/sites-enabled/soundvault
sudo nginx -t
sudo systemctl reload nginx

Это первоначальный HTTP-конфиг для выпуска сертификата. До включения TLS не передавай пароль через публичную сеть.

Сертификат и защищённая сессия

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d music.example.com --redirect
sudo nginx -t
sudo systemctl reload nginx

Когда HTTPS заработал, добавь SOUNDVAULT_HTTPS=1 в .env и перезапусти SoundVault. В INI настрой trusted_proxy = 127.0.0.1; одновременно включать SOUNDVAULT_BEHIND_PROXY не требуется.

Для федерации public_base_url и адрес соседнего сервера должны сразу начинаться с https://: перенаправление подписанного POST с HTTP может изменить запрос.

Отдача локальной музыки через nginx

В soundvault.conf включи:

[service]
x_accel_prefix = /_media

Затем перезапусти службу. Приложение проверит права, а файл отдаст nginx. Значение alias должно точно соответствовать music_dir и заканчиваться слэшем. Директива internal обязательна: прямой URL не должен открывать библиотеку в обход авторизации.

У пользователя www-data должны быть права чтения и входа в каталоги. Облачные и федеративные потоки по-прежнему проходят через сервер. Если интерфейс работает, а музыка отвечает 404, проверь alias и журнал ошибок nginx.

Большие загрузки и проверка

client_max_body_size должен быть не меньше batch_bytes и максимального одиночного файла, который ты разрешаешь. В примере предел запроса 10 ГБ, пакет — 512 МБ, файл — до 2 ГБ. Отключение proxy_request_buffering не даёт прокси сначала накапливать весь пакет на диске.

  • Проверь вход через HTTPS и корректную IP-адресацию в журнале.
  • Загрузи тестовый альбом, проверь прогресс и отсутствие 413.
  • Проверь воспроизведение и перемотку локального трека.
  • Запрос к /_media/ напрямую должен быть отклонён.

Версии и контакты на отдельном домене лендинга

Источник — публичный API SoundVault. Он сейчас не отдаёт разрешение CORS для другого домена. Поэтому лендинг сначала запрашивает /api/capabilities на своём домене: добавь следующий точный location в server-блок сайта лендинга.

# Внутри HTTPS server {} домена лендинга.
# Приложение находится на ЭТОМ ЖЕ сервере и слушает 127.0.0.1:8008.
location = /api/capabilities {
    limit_except GET { deny all; }
    proxy_pass http://127.0.0.1:8008/api/capabilities;
    proxy_set_header Host app.soundvault.ru;
    proxy_set_header Cookie "";
    proxy_set_header Authorization "";
    proxy_hide_header Set-Cookie;
    proxy_connect_timeout 3s;
    proxy_read_timeout 5s;
    add_header Cache-Control "no-store" always;
}
# Служебные материалы не должны раздаваться как публичная статика.
location ^~ /backup/ { deny all; }
location ^~ /tools/ { deny all; }
location ~* ^/docs/.*\.(md|json|png)$ { deny all; }

Этот рабочий вариант рассчитан на размещение лендинга и приложения на одной машине: браузер использует HTTPS, а nginx обращается к приложению по локальному адресу 127.0.0.1:8008. Сначала убедись, что этот адрес возвращает JSON SoundVault. Для приложения на другой машине требуется отдельная настройка upstream. Cookie и Authorization не пересылаются. Не открывай доступ CORS ко всем сессионным маршрутам приложения.

После добавления выполни nginx -t, перезагрузи nginx и открой /api/capabilities на домене лендинга. Ожидается JSON с ok=true. Если размещаешь лендинг в подпапке, маршрут API всё равно задаётся в корне домена.

При прямом открытии HTML с диска или без прокси версии могут быть недоступны. Контактная страница сохранит адрес, подтверждённый API при подготовке сайта, и сообщит о неудачном обновлении.

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