본문 바로가기
서버/리눅스 서버

PLEX 하나의 라이브러리로 다수의 서버 운영하기 (rclone, rsync, dockerd, sqlite3)

by ㅋㅋ잠자 2022. 1. 4.
반응형

안녕하세요? 아래의 작업은 매우 무식하고 정량적인 방법이 아님을 미리 말씀드리고 시작합니다.

 

1. 현 상황

일단 제 라이브러리 구성이 매우 좋은 상황입니다.

이 라이브러리를 PLEX 계정 공유를 통해 아래와 같이 공유합니다.

이렇게 하면 계정에서 직접 제 라이브러리로 시청이 가능합니다.

 

그런데, PLEX 내부 사용자로는 공유할 수 없습니다.

제가 공유받은 라이브러리가 있는데 내부 사용자에게는 제가 직접 로그인 되어 있는 서버의 라이브러리만 공유 가능합니다.

제 라이브러리만 공유가능함을 알 수 있습니다.

 

그렇다면, 어떻게 하면 라이브러리를 공유할 수 있을까요? 파일들이 모두 구글 드라이브에 있어서 구글 드라이브 폴더를 공유해주고, 직접 서버를 운영하도록 한다..

--> 이것도 조금 문제가 있는게 공유폴더의 경우 하루 제한량이 750기가이기 때문에 문제가 있습니다.

 

그러면, API 키를 통해서 제 구드 키를 공유해주고, 파일 액세스를 하게 한다면, 라이브러리 구축하다가 API 리밋에 걸릴 것입니다.

 

추가적으로, 저는 서버를 여러대 운영중에 있습니다. 아래의 서버들입니다.

 

1) 메인 본가 서버

사양 : 4350U / 16기가 / Debian10

용도 : 메인 플렉스 서버 운영용

 

2) 서브 자취방 서버

J5005 / 8기가 / Debian10

용도 : djjproject.com 메인 서버 및 구글드라이브에 영상 때려박는용

(해당 구글 드라이브가 1번과 공유되고 있습니다.)

 

3) 테스트 서버

J4105 / 8기가 / Debian11

용도 : 1번이 죽었을 때 대비 백업서버, 다수 PLEX 서버 구동용

 

그럼 이번에 세팅할 것은 3번서버인데요.

아래와 같이 세팅 예정입니다.

 

1. 1번 서버에서 /var/lib/plexmediaserver 폴더를 그대로 3번서버에 복사

2. overlayfs 기능을 통해 /var/lib/plexmediaserver 폴더를 RO마운트로 설정 함

3. 2번의 폴더를 각기 plex 컨테이너에 연결함

4. 1번 서버와 상관없는 데이터들 속아내기 작업

 

그럼, 시작하겠습니다.

 

2. 메타데이터 복사

이 작업이 매우 무식하게 진행되는 부분입니다. 그냥 냅다가 복사해서 쓰는 방법입니다.

일단 파일을 원격지에서 복사할 때, rsync 를 쓰면 좋겠지만... 파일이 짜잘하게 많으면 속도가 매우 느립니다.

 

그래서 rclone 백엔드에 sftp 로 연결하여 파일 복사 하겠습니다.

먼저 아래와 같이 등록합니다.

root@debian:/opt/scripts# vi ~/.config/rclone/rclone.conf

[4350]
type = sftp
host = 
user = root
port = 
key_pem = ---BEGIN OPENSSH PRIVATE KEY ---------END OPENSSH PRIVATE KEY-----\n

위 처럼 등록할 때, key_pem 이 한줄로 등록이 되어야합니다.

그래서 아래의 명령어를 써서 복사하면 편리합니다.

root@debian:~# awk '{printf "%s\\n", $0}' < ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----\nbAAABlwAAAbdo+3AUNB123sdf4ads6f4as6d4as65d4asdasdL6L+JMgw/WsAAAALcm9vdEBkZWJpYW4=\n-----END OPENSSH PRIVATE KEY-----\n

그리고 정상 작동되는지 확인합니다.

root@debian:~# rclone ls 4350:/
      122 .bash_history
   227929 GoP-0.xml
 26686552 initrd.img
 26610376 initrd.img.old
  5278960 vmlinuz
  5274864 vmlinuz.old
   165632 lib64/ld-linux-x86-64.so.2
  3414871 boot/System.map-4.19.0-11-amd64
  3415048 boot/System.map-4.19.0-12-amd64
  4716012 boot/System.map-5.4.65-1-pve
   206143 boot/config-4.19.0-11-amd64
   206143 boot/config-4.19.0-12-amd64
   237284 boot/config-5.4.65-1-pve
 26610376 boot/initrd.img-4.19.0-11-amd64
 26686552 boot/initrd.img-4.19.0-12-amd64
 65586503 boot/initrd.img-5.4.65-1-pve
  5274864 boot/vmlinuz-4.19.0-11-amd64
  5278960 boot/vmlinuz-4.19.0-12-amd64
 11643264 boot/vmlinuz-5.4.65-1-pve
        0 etc/.pwd.lock
     2981 etc/adduser.conf
       44 etc/adjtime
       51 etc/aliases
    12288 etc/aliases.db
     1994 etc/bash.bashrc
       45 etc/bash_completion
      367 etc/bindresvport.blacklist
     5434 etc/ca-certificates.conf
     1042 etc/crontab
     2969 etc/debconf.conf
        5 etc/debian_version
      604 etc/deluser.conf

파일이 위 처럼 잘 보입니다.

 

그러면 바로 복사를 해보겠습니다.

root@debian:~# mkdir -p /var/lib/plexmediaserver
root@debian:~# rclone sync --transfers=32 --checkers=64 4350:/var/lib/plexmediaserver/ /var/lib/plexmediaserver/ --progress

와.. 용량이 너무 큽니다.

Transferred:       55.102 GiB / 55.102 GiB, 100%, 400.647 KiB/s, ETA 0s
Errors:                 9 (retrying may help)
Checks:            953857 / 953857, 100%
Transferred:       230392 / 230392, 100%
Elapsed time:   1h54m12.4s

 

3. /var/lib/plexmediaserver 폴더 정리

운영중인 서버에 전용으로 필요한 파일들이 있을 것입니다.

필요 없는 파일들을 지워줍니다.

root@debian:/var/lib/plexmediaserver/Library/Application Support/Plex Media Server# ls
 Cache   'Crash Reports'   Logs    Metadata  'Plug-in Support'   Scripts
 Codecs   Diagnostics      Media   Plug-ins   Scanners

일단, Cache 는 필요할 수도 있어서, 그대로 두고 Logs / Diagnostics / Codecs 를 지워줍니다.

# rm -rf Crash\ Reports/*
# rm -rf Logs/*
# rm -rf Diagnostics/*

그리고 db 폴더를 보면 플렉스 오래 운영했을 경우, db 백업 파일들이 있습니다. 필요한 db 만 두고 삭제합니다.

결과적으로 하기의 모습이 되면 됩니다.

root@debian:/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-in Support/Databases# ls
com.plexapp.plugins.library.blobs.db      com.plexapp.plugins.library.blobs.db-wal
com.plexapp.plugins.library.blobs.db-shm  com.plexapp.plugins.library.db

아직 지울 곳이 더 많이 남아 있을 수 있지만 잘 알지 못해 넘어가도록 하겠습니다.

 

4. Docker 볼륨 생성하기 (overlayfs)

이번에 컨테이너를 3개 생성할 예정입니다.

overlayfs 에서 아래와 같이 구성할 예정입니다.

 

/var/lib/plexmediaserver : lower dir

/opt/plex/upper1 : upper dir

/opt/plex/work1 : work dir

 

이렇게 설정하는 이유는, 이미 인덱싱 된 라이브러리의 변동사항만 upperdir 에 기록되도록 하기 위함입니다.

물론 sqlite3 로 되어 있는 db는 변동이 한 필드만 생겨도 db 용량만큼 새 파일이 생기긴 합니다.

 

참고 : https://stackoverflow.com/questions/29550736/can-i-mount-docker-host-directory-as-copy-on-write-overlay

 

각각 3개를 생성해줍니다.

root@debian:~# cd /opt/plex/
root@debian:/opt/plex# mkdir upper1 upper2 upper3 work1 work2 work3

root@debian:/opt/plex# docker volume create --driver local --opt type=overlay \
  --opt o=lowerdir=/var/lib/plexmediaserver,upperdir=${PWD}/upper1,workdir=${PWD}/work1 \
  --opt device=overlay plex_vol1
plex_vol1

root@debian:/opt/plex# docker volume create --driver local --opt type=overlay \
  --opt o=lowerdir=/var/lib/plexmediaserver,upperdir=${PWD}/upper2,workdir=${PWD}/work2 \
  --opt device=overlay plex_vol2
plex_vol2

root@debian:/opt/plex# docker volume create --driver local --opt type=overlay \
  --opt o=lowerdir=/var/lib/plexmediaserver,upperdir=${PWD}/upper3,workdir=${PWD}/work3 \
  --opt device=overlay plex_vol3
plex_vol3

생성한 볼륨을 리스팅 해봅니다.

root@debian:~# docker volume ls
DRIVER    VOLUME NAME
local     plex_vol1
local     plex_vol2
local     plex_vol3

 

5. Docker macvlan 네트워크 생성하기

플렉스 서버의 경우, 컨테이너의 bridge 옵션으로 돌리면 포트포워딩으로는 한계가 있습니다.

그러면 host 네트워크로 돌리면 되지 않는지? 이런 생각을 하게 되는데 이 부분도 어려움이 있습니다.

컨테이너 내부에서는 초기 계정 연동 시, 32400 포트로 생각을 하고 있는데, 그걸 바꾸기에 어려움이 있습니다.

 

따라서 버추얼박스의 어댑터에 브릿지 기능처럼 macvlan 네트워크를 생성하여 연동하겠습니다.

 

일단 현재 네트워크의 정보를 파악합니다.

ifconfig 구동할 경우, 요즘은 ip addr 명령을 쓰기 때문에 net-tools 패키지를 추가로 설치하셔야 합니다.

root@debian:/opt/plex# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:ecff:fe5b:5cb6  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ec:5b:5c:b6  txqueuelen 0  (Ethernet)
        RX packets 155  bytes 6140 (5.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 160  bytes 10636 (10.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.130  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::21e:6ff:fe45:472  prefixlen 64  scopeid 0x20<link>
        ether 00:1e:06:45:04:72  txqueuelen 1000  (Ethernet)
        RX packets 162997468  bytes 202405683144 (188.5 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 109615890  bytes 11062662452 (10.3 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 10613  bytes 2122756 (2.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10613  bytes 2122756 (2.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

서브넷은 192.168.0.0/24 게이트웨이는 192.168.0.1로 확인되며, enp2s0 와 연결을 해야합니다.

아래와 같이 macvlan 네트워크를 만듭니다.

root@debian:/opt/plex# docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=enp2s0 docker_bridge

생성 되었는지 확인해봅니다.

root@debian:/opt/plex# docker network ls
NETWORK ID     NAME            DRIVER    SCOPE
e087dd19438d   bridge          bridge    local
130fdbcc3263   docker_bridge   macvlan   local
f01a2e283305   host            host      local
5fb2b3adeb0d   none            null      local

기본적으로 있는 bridge host null 을 제외하고 macvlan 네트워크가 추가 되었습니다.

 

6. PLEX 컨테이너 생성하기

J4105 제품이기 때문에 VAAPI 꼭 써야합니다. 각 컨테이너가 모두 사용할 수 있는지는 잘 모르겠지만 일단 설정해봅니다.

 

기존에 라이브러리 경로와 맞춰줘야하기 때문에 명령은 아래와 같습니다.

흠.. docker-compose 를 써보려고 했는데 아직 적응이 되지 않아 스크립트로 냅다가 생성합니다.

root@debian:/opt/plex# cat create.sh

#!/bin/bash

NAME=plex1
VOLUME=plex_vol1
IPADDR=192.168.0.150
docker run -dit --privileged \
        --name $NAME \

# 네트워킹 설정
        --network=docker_bridge \

# macvlan ip 할당 설정
        --ip=$IPADDR \

# plex 실행 계정 설정 (조금 문제가 있는 것 같습니다.)
        -e PLEX_UID=0 \
        -e PLEX_GID=0 \

# /var/lib/plexmediaserver 의 소유자를 계속 바꾸려고 하는걸 막는 환경변수 입니다.
# 실제로 작동하지 않아서 꼼수를 써야합니다.
        -e CHANGE_CONFIG_DIR_OWNERSHIP="false" \

# 타임존 설정
        -e TZ="Asia/Seoul" \

# MEDIA 폴더 마운트, 재스캔을 하지 않기 위해 오리지널 메타데이터가 보고 있는 곳과 맞춰줍니다.
        -v /media/gdrive/100.djjproject/video:/media/volume1/gdrive/100.djjproject/video:ro \

# plex_vol1 (overlayfs 로 생성한 볼륨) 을 /config 와 바인딩합니다.
        -v $VOLUME:/config:rw \

# VAAPI HW 트랜스코딩을 위해 device 를 넣어줍니다.
        --device /dev/dri:/dev/dri \

# 제가 중지하지 않으면 재시작 되도록 설정합니다.
        --restart unless-stopped \
        plexinc/pms-docker
NAME=plex2
VOLUME=plex_vol2
IPADDR=192.168.0.151
docker run -dit --privileged \
        --name $NAME \
        --network=docker_bridge \
        --ip=$IPADDR \
        -e PLEX_UID=0 \
        -e PLEX_GID=0 \
        -e CHANGE_CONFIG_DIR_OWNERSHIP="false" \
        -e TZ="Asia/Seoul" \
        -v /media/gdrive/100.djjproject/video:/media/volume1/gdrive/100.djjproject/video:ro \
        -v $VOLUME:/config:rw \
        --device /dev/dri:/dev/dri \
        --restart unless-stopped \
        plexinc/pms-docker

이렇게 하고 나면 plexmediaserver 가 꽤 오랜시간 올라오지 않습니다. log를 살펴보면 

[cont-finish.d] done.
[s6-finish] waiting for services.
[s6-finish] sending all processes the TERM signal.
[s6-finish] sending all processes the KILL signal and exiting.
[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] 40-plex-first-run: executing...

여기서 멈춰 있는데요. 이게 뭔지 찾아 보았습니다.

root@debian:/opt/plex# docker exec -it plex1 /bin/bash
root@868606b6eb31:/#
# sysv-init 컨테이너라 하기와 같이 찾을 수 있습니다.
root@868606b6eb31:/# find . -name "40-plex-first-run"
./etc/cont-init.d/40-plex-first-run

# 내용을 확인해봅니다.
root@868606b6eb31:/# cat ./etc/cont-init.d/40-plex-first-run

# Update ownership of dirs we need to write
if [ "${CHANGE_CONFIG_DIR_OWNERSHIP,,}" = "true" ]; then
  if [ -f "${prefFile}" ]; then
    if [ ! "$(stat -c %u "${prefFile}")" = "$(id -u plex)" ]; then
      find /config \! \( -uid $(id -u plex) -gid $(id -g plex) \) -print0 | xargs -0 chown -h plex:plex
    fi
  else
    find /config \! \( -uid $(id -u plex) -gid $(id -g plex) \) -print0 | xargs -0 chown -h plex:plex
  fi
  chown -R plex:plex /transcode
fi

확인해보니 chown 에서 오래 걸리네요. 그러면, CHANGE_CONFIG_DIR_OWNERSHIP 이 변수를 true 로만 하지 않으면 실제로 반영이 되어야하는데.. 반영이 되지 않아서 컨테이너를 시작하고 30초 뒤에 종료하고 upper_dir 을 정리하고 다시 컨테이너를 시작하면 됩니다.

 

이는, 아래의 경로만 권한이 맞는지 체크하고 넘어가기 때문에 처음에 실행되다가 멈춰주면 아래의 경로는 권한이 맞는 상태입니다.

root@868606b6eb31:~/Library/Application Support/Plex Media Server#

그리고 overlayfs 특성상, chown 당한(?) 파일들은 upper_dir 에 새로 파일이 생성 되었을 것입니다.

컨테이너를 끄고 파일을 싹 지워주시면 됩니다.

root@debian:/opt/plex# docker stop plex1
root@debian:/opt/plex# rm -rf upper1/Library/Application\ Support/Plex\ Media\ Server/*
root@debian:/opt/plex# docker start plex1

그냥 스크립트를 수정해서 해도 되지만, 차후 컨테이너를 업데이트 할 때, 매번 해줘야하는 불편함 때문에 이렇게 진행합니다.

그러면 하기와 같이 잘 실행 됩니다.

root@debian:/opt/plex# docker logs -f plex1

[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] 40-plex-first-run: executing...
Plex Media Server first run setup complete
[cont-init.d] 40-plex-first-run: exited 0.
[cont-init.d] 45-plex-hw-transcode-and-connected-tuner: executing...
[cont-init.d] 45-plex-hw-transcode-and-connected-tuner: exited 0.
[cont-init.d] 50-plex-update: executing...
[cont-init.d] 50-plex-update: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
Starting Plex Media Server.

 

7. 계정 연동하기

서버가 시작되었으면, 아래의 URL 로 이동해봅니다.

http://192.168.0.150:32400/web

 

잘 됩니다.

라이브러리는 이미 설정되어 있는 상태입니다.

그럼 내 PLEX 계정에 서버가 하나 생깁니다.

일단 해결해야될 부분이 2가지가 있습니다.

 

1. 시청기록이 남아 있습니다.

시청기록을 정리해야합니다.

 

2. 실시간 TV / DVR 도 공유해주고 싶은데..

DB가 꼬여서 아래와 같이 설정이 안됩니다.

 

8. PLEX 시청 기록 정리하기

시청 기록은 1번 서버에서 넘어왔습니다.

그러면, RO 마운트의 경로에서 정리해야합니다.

(db 의 변동이 생겨 각 upper_dir 에도 파일이 생성되었을 수 있음으로 삭제해줍니다.)

 

컨테이너를 먼저 중지합니다.

아직 테스트 중이라 2개만 구동하고 있습니다.

root@debian:/opt/plex# docker stop plex1
root@debian:/opt/plex# docker stop plex2

다음으로, upper_dir 을 정리합니다.

root@debian:/opt/plex# rm upper1/Library/Application\ Support/Plex\ Media\ Server/Plug-in\ Support/Databases/*
root@debian:/opt/plex# rm upper2/Library/Application\ Support/Plex\ Media\ Server/Plug-in\ Support/Databases/*

실제 라이브러리에서 정리를 하는 방법을 검색을 매우 많이 해 보았습니다.

아래의 글을 찾을 수 있었습니다.

https://www.reddit.com/r/PleX/comments/d4d9b2/remove_deleted_account_watch_history/

 

일단 잘 모르니까 시키는 대로 해보겠습니다.

그런데 제가 내부 사용자 ID 를 잘 모르는데 ... 일단 sqlite3 를 깔아서 구경좀 해보았습니다.

 

내부 사용자는 아래와 같이 있고, db에도 id 로 존재할 것입니다.

sqlite3 를 설치하고 db를 열어보겠습니다.

root@debian:/opt/plex# cd /var/lib/plexmediaserver/Library/Application\ Support/Plex\ Media\ Server/
root@debian:/var/lib/plexmediaserver/Library/Application Support/Plex Media Server# cd Plug-in\ Support/Databases/

# sqlite3 를 설치합니다.
apt install sqlite3

# sqlite3 com.plexapp.plugins.library.db
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
sqlite>

여기서 sqlite 커맨드는 .(점) 으로 시작합니다.

.table 등이 가능합니다.

나갈때는 .quit 으로 나가시면 됩니다.

 

먼저 테이블 리스트를 조회합니다.

sqlite> .table
accounts                             media_part_settings
activities                           media_parts
blobs                                media_provider_resources
cloudsync_files                      media_stream_settings
devices                              media_streams
directories                          media_subscriptions
external_metadata_items              metadata_item_accounts
external_metadata_sources            metadata_item_clusterings
fts4_metadata_titles                 metadata_item_clusters
fts4_metadata_titles_docsize         metadata_item_settings
fts4_metadata_titles_icu             metadata_item_views
fts4_metadata_titles_icu_docsize     metadata_items
fts4_metadata_titles_icu_segdir      metadata_relations
fts4_metadata_titles_icu_segments    metadata_subscription_desired_items

중간에 metadata_item_accounts 가 보입니다.

조회해보겠습니다.

sqlite> select * from metadata_item_accounts;
1|1|14511
2|22486120|14601
3|26253054|43432
4|17344846|64536
7|17344839|78481
8|41321667|83554
9|54235547|83916
10|17344846|108568

오.. 제가 확인해보니 1번이 MASTER 계정 / 나머지는 내부 사용자로 추정이 되네요.

레딧의 가이드 대로 싹 날려버리겠습니다.

 

일단 Reddit 글에 따르면 아래와 같은데요.

DELETE FROM media_item_settings WHERE account_id = 3026979;
DELETE FROM media_part_settings WHERE account_id = 3026979;
DELETE FROM media_stream_settings WHERE account_id = 3026979;
DELETE FROM metadata_item_accounts WHERE account_id = 3026979;
DELETE FROM metadata_item_settings WHERE account_id = 3026979;
DELETE FROM metadata_item_views WHERE account_id = 3026979;
DELETE FROM play_queues WHERE account_id = 3026979;
DELETE FROM plugin_permissions WHERE account_id = 3026979;
DELETE FROM statistics_bandwidth WHERE account_id = 3026979;
DELETE FROM statistics_media WHERE account_id = 3026979;
DELETE FROM view_settings WHERE account_id = 3026979;

일단 명령어를 한타에 조질려면, WHERE ~ IN 구문을 사용하면 됩니다.

제 기준으로 아래와 같습니다.

DELETE FROM media_item_settings WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');

바로 삭제하겠습니다.

sqlite> DELETE FROM media_item_settings WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM media_part_settings WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM media_stream_settings WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM metadata_item_accounts WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM metadata_item_settings WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM metadata_item_views WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM play_queues WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM plugin_permissions WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM statistics_bandwidth WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM statistics_media WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');
DELETE FROM view_settings WHERE account_id IN ('1','22486120','26253054','17344846','17344839','41321667','54235547','17344846');

삭제가 잘 되었는지 한 테이블만 다시 확인합니다.

sqlite> select * from metadata_item_accounts;

그리고 컨테이너를 다시 시작하면 아래와 같이 클린하게 되어 있습니다.

이어보기 정보나 컨티뉴 와칭 정보가 모두 사라졌습니다.

 

9. PLEX DVR 고치기

이 부분은 방법을 찾는 중입니다. ^^;; ㅠ

아래 링크에 해결 방법이 있네요.

https://www.reddit.com/r/PleX/comments/il5uhq/multi_ghost_dvr_how_do_i_delete/g40hv5j/

 

플렉스 컨테이너 중지하고, db를 수정합니다.

# docker stop plex1 && docker stop plex2

root@debian:/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-in Support/Databases# sqlite3 com.plexapp.plugins.library.db "DELETE FROM media_provider_resources"

# upper_dir 을 다시 초기화합니다.
root@debian:/opt/plex# rm upper1/Library/Application\ Support/Plex\ Media\ Server/Plug-in\ Support/Databases/*
root@debian:/opt/plex# rm upper2/Library/Application\ Support/Plex\ Media\ Server/Plug-in\ Support/Databases/*

이제는 db 초기화 할일 없겠죠?

다시 컨테이너를 시작합니다.

root@debian:/opt/plex# docker start plex1 && docker start plex2

확인 해봅니다.

휴.. 살아났네요..

 

10. (번외) rclone vfs 마운트

저는 간단하게 이렇게 사용중입니다.

 

1. rc-local 활성화

# systemd 서비스 작성
root@debian:~# vi /etc/systemd/system/rc-local.service

[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

# 서비스 enable
root@debian:~# systemctl enable rc-local.service

# rc.local 더미 작성
root@debian:~# echo -e "#!/bin/bash\n\n exit 0" > /etc/rc.local
root@debian:~# chmod a+x /etc/rc.local

# rc.local 내용 작성
root@debian:~# cat /etc/rc.local

#!/bin/bash

su root -c "/bin/bash /opt/scripts/init.sh"

exit 0

 

2. init.sh 작성

root@debian:~# cat /opt/scripts/init.sh
#!/bin/bash

# time synchronization
ntpdate -s kr.pool.ntp.org

# folder
mkdir -p /media/{gdrive,rclone}
mkdir -p /media/temp/{gdrive_ro,gdrive_rw,rclone_cache}
mkdir -p /media/temp/rclone_cache/gdrive

umount -l /media/gdrive
umount -l /media/temp/gdrive_ro

# sleep
sleep 10

# kill rclone
pkill -9 -ef rclone

# rclone gdrive mount
# rc 와 daemon 은 공존이 불가하여 nohup 처리 하였습니다.
nohup /usr/bin/rclone mount gdrive-eddylab: /media/temp/gdrive_ro \
--read-only \
--umask 000 \
--allow-other \
--allow-non-empty \
--cache-dir=/media/temp/rclone_cache/gdrive \
--dir-cache-time 86400h \

# API 리밋 때문에 폴 인터벌을 0로 하고 수동 갱신합니다.
--poll-interval 0 \
--log-level INFO \
--syslog \
--vfs-read-chunk-size=1024M \
--vfs-cache-mode full \
--vfs-cache-max-size 100G \
--vfs-cache-max-age 86400h \
--bwlimit-file 16M \
--buffer-size 64M \
--vfs-read-ahead 8192M \
--transfers 16 \
--rc \
--rc-no-auth \
--rc-addr 127.0.0.1:55001 \
< /dev/null > /dev/null 2>&1 &

# ro mount
umount -l /media/rclone
rclone mount --daemon --allow-other gdrive-eddylab: /media/rclone

# sleep
sleep 10

# unionfs
unionfs-fuse -o allow_other,cow,uid=0,gid=100,umask=0 \
/media/temp/gdrive_rw=RW:/media/temp/gdrive_ro=RO \
/media/gdrive

/usr/bin/rclone rc vfs/refresh recursive=true --rc-addr 127.0.0.1:55001 _async=true

exit 0

 

3. refresh crontab 작성

매 시간 0분마다 갱신합니다.

root@debian:~# crontab -e

# m h  dom mon dow   command
0 * * * * /usr/bin/rclone rc vfs/refresh recursive=true --rc-addr 127.0.0.1:55001 _async=true

 

11. 2 컨테이너에서 동시 /dev/dri/card0 엑세스

문제 없는 것 같습니다.

아래 2 인스턴스 모두 HW 트랜스코딩 중입니다.

 

12. 번외편 / 테스트 서버 배치

 

13. 마치며

긴글 보시느라 수고하셨습니다.

 

이 방법이 과연.. 엔지니어링 코스트가 가성비가 좋은지는 모르겠지만.. 혹시 같은 고민을 하시는 분이 계시면 도움이 되셨으면 좋겠네요.

 

감사합니다.

반응형

댓글