Create TOC

레이블이 Tvheadend인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Tvheadend인 게시물을 표시합니다. 모든 게시물 표시

2019년 12월 16일

Raspbian/사용하던 서비스를 docker로 이전

기존에 사용하던 서비스를 docker로 옮기는 과정을 기술한다.

docker로 옮길 서비스는 아래와 같다.

  • certbot
  • pihole + dnscrypt
  • tvheadend
  • nginx
  • homebridge

docker 환경 구성

docker 설치

get-docker.sh 를 이용해 설치한다.

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

docker 그룹에 계정을 추가하면 sudo 없이 docker를 실행할 수 있다.

$ usermod -aG docker pi
$ sudo mkdir /docker
$ chown pi /docker

docker-compose 설치

$ sudo apt-get install docker-compose

certbot

설정 옮김

$ mkdir /docker/certbot
$ sudo cp -R /etc/letsencrypt /docker/certbot/config

docker-compose.yml

아래와 같은 /docker/certbot/docker-compose.yml 파일을 만든다.

version: "3"

services:
    certbot:
        container_name: certbot
        image: tobi312/rpi-certbot
        ports:
            - "80:80/tcp"
            - "443:443/tcp"
        entrypoint: certbot renew
        volumes:
            - '/docker/certbot/config/letsencrypt:/etc/letsencrypt'

테스트

$ cd /docker/certbot
$ docker-compose up

문제 없다면 /docker/certbot/docker-compose.yml 파일에서 entrypoint 를 아래와 같이 변경한다.

entrypoint: certbot -q renew

cron

2일 간격으로 인증서 갱신을 위해 certbot을 실행하도록 /etc/cron.d/certbot 파일을 만든다.

0 0 */2 * * root test -x /usr/bin/docker-compose && perl -e 'sleep int(rand(43200))' && docker-compose -f /docker/certbot/docker-compose.yml up

pihole

dnscrypt-proxy-2 대신 cloudflared 를 사용하게 변경했다.

설정 옮김

$ mkdir -p /docker/pihole/
$ sudo cp -R /etc/dnsmasq.d /docker/pihole/config
$ sudo cp -R /etc/pihole /docker/pihole/config

설정 수정

/docker/pihole/config/dnsmasq.d/01-pihole.conf 파일에서 server 를 아래와 같이 수정한다.

server=10.0.0.2#54

/docker/pihole/config/pihole/setupVars.conf 파일에서 PIHOLE_DNS 를 아래와 같이 수정한다.

PIHOLE_DNS_1='10.0.0.2#54'PIHOLE_DNS_2=''

docker-compose.yml

아래와 같이 /docker/pihole/docker-compose.yml 파일을 만든다.

version: "3"

services:
    cloudflared:
        image: visibilityspots/cloudflared
        environment:
            - TZ=Asia/Seoul
        networks:
            pihole_net:
                ipv4_address: 10.0.0.2
        restart: unless-stopped

    app:
        image: pihole/pihole:latest
        ports:
            - '53:53/tcp'
            - '53:53/udp'
            - '8888:80/udp'
        environment:
            - TZ=Asia/Seoul
            - DNS1=10.0.0.2#54
            - DNS2=
            - DNSSEC=true
            - IPv6=false
            - PUID=1000
            - PGID=1000

        volumes:
            - '/docker/pihole/config/pihole/:/etc/pihole/'
            - '/docker/pihole/config/dnsmasq.d/:/etc/dnsmasq.d/'
        networks:
            pihole_net:
                ipv4_address: 10.0.0.3
        dns:
            - 127.0.0.1
            - 1.1.1.1
        restart: unless-stopped

networks:
    pihole_net:
        driver: bridge
        ipam:
            config:
                - subnet: 10.0.0.0/29

테스트

아래와 같이 기존 서비스를 중지하고 docker로 pihole 을 실행한다.

$ sudo systemctl stop dnscrypt-proxy.service
$ sudo pihole disable
$ cd /docker/pihole
$ docker-compose up -d

nslookup 으로 dns query가 잘 되는지 확인한다. 문제가 있다면 docker-compose -f /docker/pihole/docker-compose.yml logs app 명령으로 로그를 확인해 본다.

문제가 없는 것이 확인되면 설치되어 있던 dnscrypt-proxy-2와 pihole는 삭제한다.

기타

pihole-FTL 사용법

pihole-FTL은 아래와 같이 container에서 명령을 실행해서 사용할 수 있다.

$ docker-compose -f /docker/pihole/docker-compose.yml exec app bash -c 'echo ">stats" | nc -w 1 127.0.0.1 4711'

lighttpd 중지

안쓰는 웹서버는 아래 명령으로 중지해놓는다.

$ docker-compose -f /docker/pihole/docker-compose.yml exec app service lighttpd stop

tvheadend

설정 옮김

$ mkdir /docker/tvheadend
$ mkdir /docker/tvheadend/rec
$ sudo -s
# cd /home/hts/.hts
# tar cvfj /docker/tvheadend/tvh.tar.bz2 tvheadend
# exit
$ cd /docker/tvheadend
$ sudo tar xvfj tvh.tar.bz2
$ sudo mv tvheadend config
$ sudo rm tvh.tar.bz2

docker-compose.yml

아래와 같이 /docker/tvheaded/docker-compose.yml 파일을 만든다.

version: "3"

services:
    app:
        image: linuxserver/tvheadend
        ports:
            - "9981:9981/tcp"
            - "9982:9982/tcp"
        environment:
            - TZ=Asia/Seoul
            - PUID=1000
            - PGID=1000
        devices:
            - "/dev/dvb:/dev/dvb"
        volumes:
            - '/docker/tvheadend/config:/config'
            - '/docker/tvheadend/rec:/recordings'
        restart: unless-stopped

테스트

$ cd /docker/tvheadend
$ docker-compose up -d

문제

encoding 이슈

nginx

설정 옮김

기존 설치된 nginx 설정 구조와 docker image의 구조가 달라서 우선 docker image를 설치하고 설정을 수정한다.

docker-compose.yml

아래와 같이 /docker/nginx/docker-compose.yml 파일을 만든다.

version: "3"

services:
    app:
        image: linuxserver/nginx
        network_mode: host
        environment:
            - TZ=Asia/Seoul
            - PUID=1000
            - PGID=1000
        volumes:
            - '/docker/certbot/config/letsencrypt:/etc/letsencrypt'
            - '/docker/nginx/config:/config'
            - '/media/www:/mediw/www'
        restart: unless-stopped

설정 수정

우선 container를 실행한다.

$ cd /docker/nginx
$ docker-compose up -d

ssl

/etc/nginx/ssl 폴더가 있다면 /docker/nginx/config/nginx/ssl 로 복사

nginx

linuxserver/nginx 이미지를 그대로 사용하면 nginx에 많은 모듈이 동작하게 된다.

원하는 모듈만 동작하게 하기 위해 /docker/nginx/config/nginx/nginx.conf 파일에서 기존 /etc/nginx/modules/*.conf 대신 /config/nginx/modules/*.conf 를 사용하도록 수정한다.

# include /etc/nginx/modules/*.conf;
include /config/nginx/modules/*.conf;

/docker/nginx/config/nginx/modules 폴더를 만들고 원하는 모듈의 *.conf만 복사한다.

사용가능한 모듈의 conf는 아래 명령으로 확인할 수 있다.

$ docker-compose -f ~/docker/nginx/docker-compose.yml exec app ls /etc/nginx/modules

복사는 아래와 같이 한다.

$ docker-compose -f ~/docker/nginx/docker-compose.yml exec app cp /etc/nginx/modules/http_echo.conf /config/nginx/modules

site-confs

/docker/nginx/config/nginx/site-confs/default 파일 내용을 비우고 /etc/nginx/site-enabled 파일을 가져온다.

가져온 site 설정에서 아래 내용을 수정한다.

  1. /etc/nginx/ssl 부분을 /config/nginx/ssl 로 변경
  2. log 경로를 /config/nginx/log 로 변경
  3. auth_basic_user_file 을 사용하고 있었다면 파일 경로를 /config/nginx 아래로 변경하고 기존에 사용하던 auth_basic_user_file 을 /docker/nginx/config/nginx 의 정해둔 경로로 복사.

homebridge

설정 옮김

$ mkdir /docker/homebridge
$ cp -R ~/.homebridge /docker/homebridge/config

/docker/homebridge/config/startup.sh 파일을 만들고 설치할 package를 등록한다.

#!/bin/sh

if [ ! -f /homebridge/.install_done ]; then
    npm i miio
    npm i homebridge-websocket
    npm i homebridge-mi-fan
    npm i homebridge-mi-pm2_5
    npm i homebridge-http-temperature-humidity
    touch /homebridge/.install_done
fi;

docker-compose.yml

아래와 같이 /docker/nginx/docker-compose.yml 파일을 만든다.

version: "3"

services:
    app:
        image: oznu/homebridge:raspberry-pi
        network_mode: host
        environment:
            - TZ=Asia/Seoul
            - PUID=1000
            - PGID=1000
            - HOMEBRIDGE_INSECURE=1
            - HOMEBRIDGE_CONFig_UI=1
            - HOMEBRIDGE_CONFig_UI_PORT=18080
        volumes:
            - '/docker/homebridge/config:/homebridge'
        restart: unless-stopped

테스트

기존에 실행하던 homebridge를 중지하고 homebridge container를 실행한다.

$ cd /docker/homebridge
$ docker-compose up -d

로그를 확인해보고 web ui 접속도 해본다.

$ docker-compose -f /docker/homebridge/docker-compose.yml logs app

2016년 10월 11일

Raspbian/Tvheadend 빌드

tvheadend에 h264_omx 코덱을 사용할 수 있게 빌드하는 방법을 기술한다.

빌드 환경 구성

$ apt-get install git cmake build-essential debhelper pkg-config fakeroot libavahi-client-dev libssl-dev libcurl4-gnutls-dev liburiparser-dev  libogg-dev libtheora-dev libvorbis-dev

빌드

$ git clone https://github.com/tvheadend/tvheadend.git
$ cd tvheadend

소스를 받고 빌드 전 아래와 같이 Makefile.ffmpeg 파일을 수정한다.

diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg
index e07ef2d..ff99604 100644
--- a/Makefile.ffmpeg
+++ b/Makefile.ffmpeg
@@ -573,6 +573,9 @@ $(LIB_ROOT)/$(FFMPEG)/.tvh_build: \
                --enable-gpl \
                --extra-cflags="$(ECFLAGS)" \
                --extra-libs="$(ELIBS)" \
+               --enable-omx-rpi --enable-mmal \
+               --enable-decoder="h264_mmal" \
+               --enable-encoder="h264_omx" \
                --pkg-config="$(ROOTDIR)/support/pkg-config.ffmpeg" \
                $(foreach component,$(COMPONENTS),--enable-$(component)) \
                $(foreach extlib,$(EXTLIBS),--enable-$(extlib)) \

h264_omx가 profile을 지원하지 않기 때문에 transcoding.c파일도 수정해야 한다.

diff --git a/src/plumbing/transcoding.c b/src/plumbing/transcoding.c
index 630bb62..ffb9657 100644
--- a/src/plumbing/transcoding.c
+++ b/src/plumbing/transcoding.c
@@ -1347,8 +1347,11 @@ transcoder_stream_video(transcoder_t *t, transcoder_stream_t *ts, th_pkt_t *pkt)
       av_dict_set(&opts, "preset",  t->t_props.tp_vcodec_preset, 0);
       tvhinfo(LS_TRANSCODE, "%04X: Using preset %s", shortid(t), t->t_props.tp_vcodec_preset);

-      // All modern devices should support "high" profile
-      av_dict_set(&opts, "profile", "high", 0);
+      if (0 != strcmp(ocodec->name, "h264_omx"))
+         {
+        // All modern devices should support "high" profile
+        av_dict_set(&opts, "profile", "high", 0);
+      }

       if (t->t_props.tp_vbitrate < 64) {
         // encode with specified quality and optimize for low latency

Makefile.ffmpeg, transcoding.c 파일 수정이 끝나면 아래와 같은 방법으로 빌드한다.

$ AUTOBUILD_CONFIGURE_EXTRA=--enable-ffmpeg_static\ --disable-libx264_static\ --disable-libx265\ --disable-libvpx\ --disable-libtheora_static\ --disable-libvorbis_static\ --disable-bintray_cache ./Autobuild.sh

빌드가 완료되면 아래와 같이 패키지를 설치한다.

$ cd ..
$ sudo dpkg -i tvheadend_4.1-2261~ga9bc3bc-dirty_armhf.deb

2016년 3월 7일

Raspberry Pi/Tvheadend 설정

현재 소유중인 USB TV 수신 카드(Dvico FusionHDTV5 USB Gold)를 Raspberry Pi에 연결하고, Tvheadend를 설정해서 다른 PC에서 TV 방송을 볼 수 있게 설정한다.

TV 수신 카드 설정

firmware 설치

$ sudo wget http://www.linuxtv.org/download/dvb/firmware/dvb-usb-bluebird-01.fw /lib/firmware

펌웨어 설치 후 USB TV 수신 카드를 다시 연결한다.

채널 검색

dvb-apps 패키지를 설치한다.

$ sudo apt-get install dvb-apps

아래와 같이 파일을 복사한다.

$ cp /usr/share/dvb/dvb-legacy/atsc/us-Cable-Standard-center-frequencies-QAM256 ~/kr-Cable-Standard-center-frequencies-8VSB

편집기로 kr-Cable-Standard-center-frequencies-8VSB파일을 열어서 QAM256을 8VSB로 변경한다.

변경이 끝나면 아래와 같은 방법으로 채널을 검색한다.

$ scan /usr/share/dvb/dvb-legacy/atsc/us-ATSC-center-frequencies-8VSB >> ~/channels.conf
$ scan ~/kr-Cable-Standard-center-frequencies-8VSB >> ~/channels.conf

검색 후 ~/channel.conf을 열어보면 아래와 비슷하게 채널 정보가 들어와 있다.

MBC:123012500:8VSB:17:20:1
:129012500:8VSB:33:36:2
:135012500:8VSB:17:20:1

"채널이름:주파수:나머지 정보" 형식을 가지고 있는데 이 중 주파수를 나중에 Tvheadend 설정시 사용한다.

Tvheadend 설정

저장소 추가

저장소에 대한 자세한 설명은 Tvheadend 사이트를 참고한다.

/etc/apt/sources.list.d 디렉토리에 아래와 같은 내용으로 tvheadend.list파일을 생성한다.
deb http://dl.bintray.com/tvheadend/deb jessie release

설정이 끝나면 package 정보를 업데이트 한다.

$ sudo apt-get update

설치

$ sudo apt-get install tvheadend

패키지를 설치할 때 관리자 id와 비밀번호를 입력해야 하는데, 원하는 값을 입력하면 된다. 나중에 다시 바꾸길 원하면 아래와 같은 명령을 입력하면 된다.

$ sudo dpkg-reconfigure tvheadend

설정

http://127.0.0.1:9981 로 접속해서 관리자 id와 비밀번호를 입력하면 관리 페이지를 볼 수 있다. 페이지 접속 후 Configuration 탭을 선택해서 필요한 설정을 해야 한다.

계정 설정

관리자 외에 TV를 시청할 계정을 추가한다.

iOS 기기에서 시청하기 위해서는

  • Web Interface
  • Streaming
  • Advanced Streaming
설정을 check 해주고 Streaming Profile을 matroska로 설정해줘야 한다.

그리고 kodi를 위해서 HTSP Streaming 설정도 check 해준다.

TV adapters 설정

TV adapters 설정에 들어가서 LG Electronics LGDT3303 VSB/QAM Frontend: ATSC #0을 선택하고 Enabled을 check 해준다.

Networks 설정

Networks 설정에 들어가서 Add을 누르고 ATSC Network을 추가한다.

Muxes/Services 설정

Network 추가 후 Muxes 설정으로 자동으로 Mux가 추가되어 있고 Scan 결과가 나오는데 대부분 실패했다. 자동으로 추가된 Mux를 정리하고 위에서 검색한 주파수를 이용해 Mux를 등록한다.

등록한 Mux의 Scan 결과가 OK가 나오면 Services 탭에서 검색된 채널이 표시되는 것을 확인해야 한다. Services 에 추가된 것을 확인하면 EPG 설정을 해야 한다.

EPG 설정

https://nas.moe/archives/1010를 참고해서 설정한다.

우선 Tvheadend 설정 페이지에서 EGP Grabber 설정을 들어가 XMLTV 설정을 check 해준다.

그다음 n2xml.py 파일을 받아온다. 파일을 받아온 후 아래와 같이 /usr/local/bin에 복사한다.

$ sudo cp n2xml.py /usr/local/bin
$ sudo chmod +x /usr/local/bin/n2xml.py

파일 복사 후 하루에 한번 실행하도록 /etc/cron.daily/n2xml 파일을 만든다.

#!/bin/sh

N2XML=/usr/local/bin/n2xml.py
CHANLIST=/usr/local/etc/chanlist.json
XMLTVSOCK=/home/hts/.hts/tvheadend/epggrab/xmltv.sock

if [ -x $N2XML ]; then
        if [ ! -f $CHANLIST ]; then
                $N2XML -u 1 -e 1 --chanlist $CHANLIST > /dev/null 2>&1
        fi
        if [ -S $XMLTVSOCK ]; then
                $N2XML -a --chanlist $CHANLIST -s $XMLTVSOCK > /dev/null 2>&1
        fi
fi

파일을 만든 후 실행 속성을 부과한다.

$ sudo chmod +x /etc/cron.daily/n2xml

속성 부과 후 한번 실행해준다.

$ sudo /etc/cron.daily/n2xml

그 후에 Tvheadend 설정 페이지에서 logout 후 다시 login 한다. 그 다음 Channel 페이지에 가서 Channel을 추가하면 된다.

Tvheadend 클라이언트 설정

iOS

TvhClient앱을 설치하면 된다.

설치 후 Tvheadend 서버를 추가하면 아래와 같이 채널 목록이 표시된다.

채널을 선택하면 해당 채널에 대한 상세한 방송 정보가 표시된다.

Play을 선택하면 메뉴가 하나 뜨는데 내장된 VLC로 볼 수도 있고 외부 플레이어 (NPlayer)로 링크를 넘겨서 재생할 수도 있다.

내장 VLC로도 재생이 잘 된다.

Kodi

Windows, OS/X, Linux 에서는 Kodi를 설정해서 시청하는 것이 제일 편하다.

설정 - 애드온 - PVR 클라이언트 에서 Tvheadend HTSP Client을 설치하고 설정한다.

설정 - TV - 일반을 사용함으로 설정한다.

설정이 끝나면 첫 화면에 TV 관련 메뉴가 표시된다.

채널 목록을 보고 시청이 가능하다.

방송 정보도 한번에 볼 수 있다.