PLEX 하나의 라이브러리로 다수의 서버 운영하기 (rclone, rsync, dockerd, sqlite3)
안녕하세요? 아래의 작업은 매우 무식하고 정량적인 방법이 아님을 미리 말씀드리고 시작합니다.
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 용량만큼 새 파일이 생기긴 합니다.
각각 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. 마치며
긴글 보시느라 수고하셨습니다.
이 방법이 과연.. 엔지니어링 코스트가 가성비가 좋은지는 모르겠지만.. 혹시 같은 고민을 하시는 분이 계시면 도움이 되셨으면 좋겠네요.
감사합니다.