Домашний сервер: диск, Navidrome, Nginx и HTTPS

Домашний сервер для тестов и запуска сервисов. На Ubuntu Server крутятся мои Docker-образы: забирают RTSP с китайских камер, отдают RTMP, дальше поток уходит в облако и на сайт (об этом отдельно). Параллельно собираю онлайн-радио и Nextcloud. Купил диск на 2 ТБ, собрал железо и поднял базу.

Сборка и запуск

Собрал, включил:

Домашний сервер: диск, Navidrome, Nginx и HTTPS

В BIOS диск уже виден. Дальше — в терминал.

Домашний сервер: диск, Navidrome, Nginx и HTTPS

В системе диск пока не смонтирован. Смотрим устройства:

fdisk -l
# или короче:
fdisk -l | grep 'Disk /dev/sd'
Домашний сервер: диск, Navidrome, Nginx и HTTPS

Есть диск на 1.82 ТБ.

Домашний сервер: диск, Navidrome, Nginx и HTTPS

fdisk работает в командном режиме. Справка — m. На практике хватает нескольких команд:

  • p — текущая таблица разделов
  • n — новый раздел
  • d — удалить раздел
  • w — записать таблицу и выйти
  • q — выйти без записи

Создаём партицию и пишем таблицу на диск.

Домашний сервер: диск, Navidrome, Nginx и HTTPS

Форматируем и монтируем в /mnt/data/:

Домашний сервер: диск, Navidrome, Nginx и HTTPS

Добавляем в fstab, чтобы раздел поднимался после перезагрузки:

Домашний сервер: диск, Navidrome, Nginx и HTTPS

Navidrome — лёгкий сервер медиатеки, совместимый с клиентами Subsonic/Airsonic: стриминг, загрузки, плейлисты, нормальный веб-интерфейс.

Домашний сервер: диск, Navidrome, Nginx и HTTPS
Домашний сервер: диск, Navidrome, Nginx и HTTPS

Ниже — установка на Ubuntu, конфиг, reverse proxy на Nginx с HTTPS и прокси внешних радиостанций.

1. Установка Navidrome

Бинарник с GitHub удобнее, чем пакеты: версия под контролем, путь явный. Есть и snap, но для гибкости — ручная установка.

sudo mkdir /opt/navidrome
wget https://github.com/navidrome/navidrome/releases/latest/download/navidrome-linux-x64.tar.gz
tar -xvf navidrome-linux-x64.tar.gz -C /opt/navidrome/

Юнит systemd:

sudo nano /etc/systemd/system/navidrome.service
[Unit]
Description=Navidrome Music Server
After=network.target

[Service]
User=navidrome
Group=navidrome
ExecStart=/opt/navidrome/navidrome --configfile /var/lib/navidrome/navidrome.toml
Restart=on-failure

[Install]
WantedBy=multi-user.target

Включаем и стартуем:

sudo systemctl enable navidrome
sudo systemctl start navidrome

2. Конфиг navidrome.toml

Рабочий пример с этого сервера:

# Расписание сканирования музыкальных файлов
ScanSchedule = '@every 24h'

# Путь к музыкальной папке
MusicFolder = "/mnt/data/music/"

# Настройки кеша транскодирования
TranscodingCacheSize = '1500MiB'

# Язык интерфейса по умолчанию
ND_DEFAULTLANGUAGE = "ru"

# Приветственное сообщение на главной странице
ND_UIWELCOMEMESSAGE = "💀🤘 HEAVY METAL, PUNK and so on! 🤘💀"

# Анимация обложек
ND_ENABLECOVERANIMATION = true

# Автоматический импорт плейлистов
ND_AUTOIMPORTPLAYLISTS = true

# Время сессии
ND_SESSIONTIMEOUT = "24h"

# Включение возможности загрузки файлов
ND_ENABLEDOWNLOADS = true

# Кеш изображений
ND_IMAGECACHESIZE = "200MB"

# Прекеширование изображений
ND_ENABLEARTWORKPRECACHE = true

# Ограничение количества запросов авторизации
ND_AUTHREQUESTLIMIT = 5

# Окно времени для авторизации
ND_AUTHWINDOWLENGTH = "20s"

# Включение транскодирования
ND_ENABLETRANSCODINGCONFIG = true

# Внешний вид интерфейса
[Ui]
Theme = "spotify"

3. Nginx: HTTPS и reverse proxy

Снаружи — HTTPS, Navidrome слушает localhost:4533. Отдельно проксирую HTTP-радиостанции, чтобы плеер ходил только по HTTPS.

sudo nano /etc/nginx/sites-available/radio.drslon.ru
server {
    listen 80;
    server_name radio.drslon.ru;

    # Перенаправление с HTTP на HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name radio.drslon.ru;

    # SSL сертификаты
    ssl_certificate /etc/letsencrypt/live/radio.drslon.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/radio.drslon.ru/privkey.pem;

    # SSL настройки
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # Проксирование Navidrome
    location / {
        proxy_pass http://127.0.0.1:4533/;
        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_buffering off;
        proxy_request_buffering off;

        # Тайм-ауты
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        send_timeout 90;

        # Отключение кеширования для потоков
        add_header Cache-Control no-cache;
    }

    # Проксирование HTTP радиостанций через HTTPS
    location /proxy-radio-1/ {
        proxy_pass http://radio.trance-energy.org:8000/trance;
        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_buffering off;
    }

    location /proxy-radio-2/ {
        proxy_pass http://icecast.vgtrk.cdnvideo.ru/mayakfm_mp3_192kbps;
        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_buffering off;
    }

    # Логи
    access_log /var/log/nginx/radio.access.log;
    error_log /var/log/nginx/radio.error.log;
}

Активируем конфиг:

sudo ln -s /etc/nginx/sites-available/radio.drslon.ru /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

4. SSL через Let’s Encrypt

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d radio.drslon.ru

Итог

Железо и диск готовы, медиатека на Navidrome: автоимпорт плейлистов, загрузки, тема Spotify. Снаружи — Nginx + HTTPS, плюс прокси радиостанций, чтобы браузер не ругался на mixed content.

Домашний сервер: диск, Navidrome, Nginx и HTTPS

Дальше можно наращивать сервисы на том же хосте: Nextcloud, камеры, что угодно в Docker.

Источники и ссылки


Комментарии загружаются…