Обратный прокси
Пример для 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 при подготовке сайта, и сообщит о неудачном обновлении.