====== Установка и настройка DLNA сервера Serviio ======
{{ :linux:serviio.png?nolink|}}
Внимание! Версия Serviio 1.5 и выше требуют Java 8 ([[linux:centos:java_install|Как установить JRE в CentOS]])
===== Установка Serviio в CentOS 6 =====
==== Скачиваем Serviio ====
# wget http://download.serviio.org/releases/serviio-1.1-linux.tar.gz
==== Распаковываем архив в ''/opt'' ====
# tar -C /opt -zxvf serviio-1.1-linux.tar.gz
# mv /opt/serviio-1.1 /opt/serviio
==== Создаём пользователя Serviio ====
# useradd -d /opt/serviio -r serviio
# chown -R serviio:serviio /opt/serviio
==== Создаём init скрипт ====
Создаём init скрипт ''/etc/init.d/serviio''
#! /bin/sh
#
# chkconfig 35 85 15
# description: Start the serviio DLNA server in headless mode
### BEGIN INIT INFO
# Provides: serviio
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Description: Start the serviio DLNA server in headless mode
### END INIT INFO
SERVIIO_HOME="/opt/serviio"
SERVIIO_DAEMON="serviio.sh"
SERVIIO_BIN="$SERVIIO_HOME/bin/$SERVIIO_DAEMON"
SERVIIO_USER="serviio"
# Source function library.
. /etc/rc.d/init.d/functions
RETVAL=0
check() {
# Check that we're a privileged user
[ $(id -u) = 0 ] || exit 4
# Check if SERVIIO_HOME exists
test -d "$SERVIIO_HOME" || exit 5
# Check if SERVIIO_BIN is executable
test -x "$SERVIIO_BIN" || exit 5
}
start() {
check
echo -n "Starting Serviio DLNA server: "
/bin/su --session-command="$SERVIIO_BIN -headless" $SERVIIO_USER &
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
touch /var/lock/subsys/serviio.sh
echo_success
else
echo_failure
fi
echo
return $RETVAL
}
stop() {
check
echo -n "Shutting down Serviio DLNA daemon: "
# Retrieve JAVA Serviio process ID
PIDDAEMON=`pgrep $SERVIIO_DAEMON`
[ -z "$PIDDAEMON" ] || PIDJAVA=`ps -o pid= --ppid $PIDDAEMON`
# Kill the daemon
killproc "$SERVIIO_BIN"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/serviio.sh
echo
# Kill the JAVA Serviio process if exists
[ -z "$PIDJAVA" ] || kill -9 $PIDJAVA
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
force-reload)
restart
;;
restart)
restart
;;
condrestart)
if [ -f /var/lock/subsys/serviio.sh ]; then
restart
fi
;;
status)
status serviio.sh
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|force-reload}"
RETVAL=2
esac
exit $RETVAL
==== Добавляем сервис в автозагрузку ====
# chmod +x /etc/init.d/serviio
# chkconfig --add serviio
# chkconfig serviio on
Запускаем serviio
# service serviio start
==== Правила для iptables ====
# iptables -A INPUT -p udp -m udp --dport 1900 -j ACCEPT -m comment --comment "Serviio"
# iptables -A INPUT -p tcp --dport 8895 -j ACCEPT -m comment --comment "Serviio"
# iptables -A INPUT -p tcp --dport 23423 -j ACCEPT -m comment --comment "Serviio"
# iptables -A INPUT -p tcp --dport 23424 -j ACCEPT -m comment --comment "Serviio"
===== Установка Serviio в CentOS 7 =====
==== Перед установкой ====
Выключаем SELinux (да да, опять выключаем, а не изучаем, как правильно настроить. paranoid-mode = off).
# sed -i 's/enforcing/disabled/g' /etc/selinux/config /etc/selinux/config
# shutdown -r now
Устанавливаем Java
# yum install java-1.7.0-openjdk
Добавляем репозитории для ffmpeg и других важных мультимедиа пакетов
# yum -y install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
# yum -y install http://linuxdownload.adobe.com/linux/x86_64/adobe-release-x86_64-1.0-1.noarch.rpm
Устанавливаем ffmpeg
# yum install ffmpeg
==== Скачиваем Serviio ====
# wget http://download.serviio.org/releases/serviio-1.4.1.2-linux.tar.gz
# tar -C /opt -zxvf serviio-1.4.1.2-linux.tar.gz
# mv /opt/serviio-1.4.1.2 /opt/serviio
==== Создаём пользователя serviio ====
# useradd -d /opt/serviio -r serviio
# chown -R serviio:serviio /opt/serviio
# passwd serviio (спорный вопрос нужно ли устанавливать пользователю пароль. надо читать форум serviio)
==== Создаём новый systemd сервис ====
# touch /lib/systemd/system/serviio.service
[Unit]
Description=Serviio Server Daemon
After=syslog.target network.target
[Service]
User=serviio
Type=simple
ExecStart=/opt/serviio/bin/serviio.sh
[Install]
WantedBy=multi-user.target
Добавляем в автозагрузку
# systemctl daemon-reload
# systemctl enable serviio
Запускаем Serviio
# systemctl start serviio
==== Настройки для firewall ====
Создаём конфигурационный файл для фаерволла ''/etc/firewalld/services/serviio.xml''
serviio
Serviio Server
Активируем новые правила
# systemctl stop firewalld
# systemctl start firewalld
# firewall-cmd --permanent --zone=public --add-service=serviio
# firewall-cmd --reload
===== Дополнительные возможности =====
==== Веб-интерфейс ====
* http://wiki.serviio.org/doku.php?id=phpwebui
* http://kairoh.bitbucket.org/serviio-webui/
Ссылки выше уже не актуальны, так как Serviio теперь имеет свой собственный интерфейс для настройки.
Console - http://IP:23423/console
{{:linux:serviio_1.png?nolink&700|}}
Mediabrowser - https://IP:23424/mediabrowser
{{:linux:serviio_2.png?nolink&700|}}
==== Access Serviio Media Browser from Internet on port 80 ====
http://wiki.serviio.org/doku.php?id=external_access_and_proxy_forward
NameVirtualHost 10.0.1.16:80
ServerName video.server.com
ProxyPass /cds/ http://10.0.1.16:23424/cds/
ProxyPassReverse /cds/ http://10.0.1.16:23424/cds/
ProxyPass / http://10.0.1.16:23424/mediabrowser/
ProxyPassReverse / http://10.0.1.16:23424/mediabrowser/
==== Конфиг для nginx ====
Пример для nginx без SSL. Доступ к console только для примера. Открывать доступ к нему из глобальной сети имхо крайне опасно.
# Serviio mediabrowser
upstream serviiomb {
server 192.168.13.27:23424;
}
server {
listen 80;
server_name media.serviio.tld;
location / {
proxy_pass http://serviiomb/mediabrowser/;
proxy_set_header Host $http_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;
# By default we dont want redirect it
proxy_redirect off;
# Cache
proxy_buffering off;
proxy_cache off;
}
location /cds/ {
proxy_pass http://serviiomb/cds/;
proxy_set_header Host $http_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;
# By default we dont want redirect it
proxy_redirect off;
# Cache
proxy_buffering off;
proxy_cache off;
}
}
# Serviio console
upstream serviiocs {
server 192.168.13.27:23423;
}
server {
listen 80;
server_name console.serviio.tld;
location / {
proxy_pass http://serviiocs/console/;
proxy_set_header Host $http_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;
# By default we dont want redirect it
proxy_redirect off;
# Cache
proxy_buffering off;
proxy_cache off;
}
location /rest/ {
proxy_pass http://serviiocs/rest/;
proxy_set_header Host $http_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;
# By default we dont want redirect it
proxy_redirect off;
# Cache
proxy_buffering off;
proxy_cache off;
}
}
==== Если не работает загрузка файла лицензии ====
curl -i -H "Content-Type: plain/text; Accept: application/json" -X PUT "http://127.0.0.1:23423/rest/license-upload" -T Serviio_XXX.lic
via http://forum.serviio.org/viewtopic.php?p=50586#p50586
==== init скрипт для CentOS ====
https://github.com/akeusch/serviio
#!/bin/bash
#
# serviio Serviio Startup Script for serviio version 1.6.2
#
# This script comes with no warranty. Use at your own risk.
# Copyright (C) 2015 Arthur Keusch
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# http://www.gnu.org/licenses/gpl-3.0.de.html
#
#
# chkconfig: 35 86 14
# description: Simple script to start / stop the serviio mediaserver on CentOS 6.7
# by Arthur Keusch arthur.keusch@bluemail.ch
#
# Since at least Serviio 1.2 we need a home diretory to store java temp files
# /usr/local/serviio must have serviio as owner and group
# added var java_path seems serviio 1.3 need it
#
# Starting with version 1.6 the force stop/start function is implemented using kill -9 $pid
#
# Source function library.
. /etc/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# enable debug
#set -x
exec="/usr/local/serviio/bin/serviio.sh"
prog="serviio"
user="serviio"
home_dir="/home/$user"
count=0
ffmpeg_path="/usr/bin"
java_path="/opt/jdk1.8.0_45"
lockfile=/var/lock/subsys/$prog
pidfile=/var/run/$prog.pid
start() {
[ -d $home_dir ] || exit 5
[ -x $exec ] || exit 5
echo -n "Starting Serviio media server: "
# if not running, start it up here, usually something like "daemon $exec"
export PATH=$PATH:$ffmpeg_path:/usr/bin
daemonize -u $user $exec > /dev/null 2>1 &
# Wait until serviio runs as user serviio
while [ $count -lt 5 ]
do
PROC_RUN=$(ps -fu serviio | awk '{print $19}' |grep "Dserviio.home")
if [ "$PROC_RUN" = "-Dserviio.home=/usr/local/serviio" ] ; then
#PROC=$(ps -fu serviio | grep Xmx512M | awk '{print $2}')
PROC=$(ps -fu serviio | grep "Dserviio.home=/usr/local/serviio" | awk '{print $2}')
RETVALT=0
touch $lockfile && echo -e '\033[58G' '\033[0;39m' "[" '\033[0;32m' "OK" '\033[0;39m' "]"
echo $PROC > $pidfile
break
else
count=`expr $count + 1 `
sleep 5
RETVALT=1
fi
done
if [ "$RETVALT" -ne "0" ] ; then
echo -e '\033[58G' '\033[0;39m' "[" '\033[0;31m' "FAIL" '\033[0;39m' "]"
fi
return $RETVALT
}
stop() {
echo -n "Stopping Serviio media server: "
$exec -stop > /dev/null 2>1 &
sleep 6
PROC=$(ps -fu $user |grep $exec |head -n1| awk '{print $2}')
if [ "$PROC" = "" ] ; then
RETVALT=0
rm -f $lockfile && rm -f $pidfile && echo -e '\033[58G' '\033[0;39m' "[" '\033[0;32m' "OK" '\033[0;39m' "]"
else
RETVALT=1
echo -e '\033[58G' '\033[0;39m' "[" '\033[0;31m' "FAIL" '\033[0;39m' "]"
fi
return $RETVALT
}
restart() {
stop
sleep 2
start
}
reload() {
restart
}
force_stop() {
PROC=$(pgrep -u $user java)
REVAL=$?
if [ $REVAL -eq 0 ] ; then
echo -n "Killing media server: "
kill -9 $PROC
REVAL=$?
if [ $REVAL -eq 0 ] ; then
rm -f $lockfile && rm -f $pidfile && echo -e '\033[58G' '\033[0;39m' "[" '\033[0;32m' "OK" '\033[0;39m' "]"
RETVALT=0
else
RETVALT=1
echo -e '\033[58G' '\033[0;39m' "[" '\033[0;31m' "FAIL" '\033[0;39m' "]"
fi
else
echo "Serviio Media Server not running"
exit 0
fi
return $RETVALT
}
force_restart() {
force_stop
sleep 2
start
}
rh_status() {
# run checks to determine if the service is running or use generic status
status $prog
}
case "$1" in
start)
$1
;;
stop)
$1
;;
restart)
$1
;;
reload)
$1
;;
force-stop)
force_stop
;;
force-restart)
force_restart
;;
status)
rh_status
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|force-restart|force-stop}"
exit 2
esac
exit $?
\\
==== Рабочий домашний конфиг nginx для Serviio ====
upstream serviio {
server 127.0.0.1:23424;
}
server {
server_name media.example.com;
listen 443 ssl;
listen [::]:443 ssl;
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_certificate /etc/letsencrypt/live/media.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/media.example.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /etc/nginx/dhparam.pem;
# intermediate configuration. tweak to your needs.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
## verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_trusted_certificate /etc/letsencrypt/live/media.example.com/chain.pem;
resolver 8.8.8.8;
location / {
root /home/user/serviio-media-browser/web;
}
location /cds/ {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'authorization, x-serviio-date';
return 204;
}
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header Access-Control-Allow-Origin;
add_header Access-Control-Allow-Origin * always;
proxy_pass http://serviio;
}
location ~ ^/cds/resource/.*\.m3u8$ {
sub_filter 'http://media.example.com/cds/resource/' 'https://media.example.com/cds/resource/';
sub_filter_once off;
sub_filter_types application/vnd.apple.mpegurl;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Accept-Encoding '';
proxy_pass http://serviio;
}
}
===== Ссылки =====
* [[https://en.wikipedia.org/wiki/List_of_UPnP_AV_media_servers_and_clients|List of UPnP AV media servers and clients]]
* [[http://www.rbgrn.net/content/21-how-to-choose-dlna-media-server-windows-mac-os-x-or-linux|How to choose a DLNA Media Server for Windows, Mac OS X or Linux]]
* [[http://itadept.ru/minidlna-debian/|Настройка MiniDLNA в Linux Debian 7]]
* [[http://habrahabr.ru/post/152763/|Почему телевизор Самсунг «теряет» minidlna сервер]]
* [[http://wiki.serviio.org/doku.php?id=howto:linux:install:lean|Install Serviio to a Created Directory In any Linux /home]]