15000rpm

흔해 빠진 생각의 흔적

TrueNAS 에 Calibre-Web 설치


TreuNAS 에서는 Calibre-Web 을 커뮤니티 플러그인으로 제공하는데, 지금 내가 사용하고 있는 버젼에서는 설치가 되질 않았다. 뭐라뭐라 하는데 신경쓰기 귀찮아서 그냥 수동으로 설치했다. 어차피 플러그인으로 설치해도 rc.d 스크립트가 야리꼬리해서 따로 손을 대야 한다. 이왕 이렇게 된 거 하나하나 정리해보려고 한다.

Calibre-Web 은 뭔가?

이름에서 짐작할 수 있듯이 Calibre ( 캘리버 라고 읽더라… ) 라는, 리눅스에서는 유구한 역사와 전통을 가진 도서 관리 앱을 Python 을 이용하여 Web 에서 이용할 수 있게 포팅한 것이 Calibre-Web 이다. 일반적인 도서를 관리하는 데에는 더 이상이 없다 싶을 정도지만, 제작자가 의도한 루틴에서 조금이라도 벗어나면 엄청난 노가다가 기다리고 있다. 가장 좋은 예가 만화책. Calibre 에서 만화책은 열람도 관리도 다른 대부분의 만화책 관리 앱과는 조금 궤도가 다르다. 그리고 그걸 아주 충실하게 고대로 구현해놓으면서 중복체크나 파싱 등의 일부 기능은 아직 추가되지 않있다.

그런 이유로 Calibre-Web 만으로는 서적, 특히 만화책을 관리하기가 상당히 힘들다. 처음 설치 할 때도 그렇고 무조건 로컬에 Calibre 를 설치하여 작업할 수 있는 환경이 갖춰져 있어야 한다. 이걸 이해 못해서 에어코믹스 등으로 눈을 돌려 봤지만, 내가 쓰는 환경에서는 Calibre-Web 이 그나마 맞추기 편했다.

이러니 저러니 해도 지금 잘 쓰고 있다. 아직 막노동(?)을 더 해야 하긴 하지만…

작업 순서

  1. Jail 을 만든다
  2. 유져 생성
  3. 저장소 설정
  4. Calibre-Web 설치
  5. metadata.db 파일을 복사
  6. 시작 스크립트 작성

Jail 생성

Jail 을 생성한다. 다른 거 만들 때 처럼, Base, 최신 버젼, DHCP, VNET 으로 설정한다.

유져 생성

root 계정에 설치해서 운용해도 별 문제는 없다고 생각하지만, 보안 측면에선 별로 좋은 선택은 아니다. 그러니 적당한 계정을 생성한다. 주의해야 할 점은, 유져 계정으로 서비스를 운영하면 Well-Known Port 는 할당할 수 없다. 대충 1000번대 이하다. 그러니 그냥 기본 포트 ( 8083 ) 로 운영하자. 여기서는 ‘caluser’ 라는 계정으로 서비스를 운용한다고 가정한다.

shell > adduser 
Username: caluser
...
Username   : caluser
Password   : ****
Full Name  : calibre user
Uid        : 1001
Class      :
Groups     : /caluser
Home       : /home/caluser
Home Mode  : 
Shell      : /bin/sh
Locaked    : no
OK?   (yes/no): yes
...
Add another user? (yes/no): no
Goodbye!
shell > 

저장소 설정

Calibre-Web 의 저장소를 설정한다. 따로 추가하지 않고 그냥 Jail 에 저장하는 방법도 있지만, 나는 TrueNAS 에서 제공하는 FTP, SMB 를 사용할 예정이라 Dataset 을 따로 생성해서 적당한 경로에 붙여주었다.

마운트 할 폴더를 적당한 경로에 생성하고 caluser 에게 소유권을 넘긴다.

shell > cd /mnt
shell > mkdir calibredata
shell > chown caluser:caluser ./calibredata
shell >

Jail 을 종료하고, TrueNAS 의 Menu -> Storage -> Pools 를 클릭한다. 적당한 경로에 Dataset 을 생성한다. 부모가 될 Dataset 의 가장 오른쪽의, 세로로 점 세개 있는 걸 클릭하면 나오는 팝업메뉴에서 Add Dataset 을 클릭하면 생성할 수 있다.

이 폴더를 Jail 에 마운트시킨다. Jail 을 정지하고 Mounts Points 를 클릭한다. Actions 을 클릭하면 나오는 팝업메뉴에서 Add 를 클릭하면 설정화면으로 이동한다. Source 가 Dataset 이고, Destination 이 Jail 에 만든 폴더다.

대충 이런 식으로 나오면 된다. 마운트 하고 나서 권한 바꾸려면 안 바뀌니까, Jail 의 shell 에서 권한 설정을 다 하고 마운트를 시켜야 한다.

Calibre-Web 설치

가장 중요한 패키지는 파이썬이다. 아마 파이썬 패키지 설치하면서 자동으로 설치되겠지만, ZIP, RAR 등의 압축 라이브러리와 ImageMagic7 같은 이미지 라이브러리가 필요하다. Calibre-Web 자체는 파이썬만 있으면 설치와 구동이 가능하지만, 웹에서 ebook-convert 기능을 사용하기 위해서는 Calibre-Server 를 따로 설치해야 한다.

헷갈릴까봐 조금 설명을 붙이자면, Calibre-Server 는 로컬에서 운용하는 Calibre 에 붙어있는 server 기능을 따로 분리해 놓은 것이다. 그래서 열람, 목록관리, 업로드 등이 가능하긴 하지만, 너무 투박하고 간단해서 유져 관리 권한 같은건 언감생심이다. 하지만 로컬의 Calibre 로 관리와 열람을 하고, 저장소만 따로 분리하는 식으로 운용한다면 오히려 이쪽이 더 나을수도 있다.

shell > pkg update & pkg upgrade -y
shell > pkg install py39-pip py39-lxml py39-cython py39-sqlite3 sqlite3 rust
.....
Proceed with this action? [y/N]: y

나는 pip 만 설치하고, 그 pip 로 Calibre-Web 을 설치하면서 없다고 징징대는 패키지들을 pkg 를 이용해 하나씩 추가하는 식으로 했다. 위 목록은 최초 실행할 때 에러 메시지가 안 나게 하는 정도고, 운용하면서 필요한 패키지는 그때그때 추가해 줘야 한다. 사실, 추가 패키지 대부분은 ebook-convert 에 관련된 것들이라 당장 없다고 해도 실행엔 별 영향은 없다.

shell > pip install calibreweb

설치가 다 되면 실험삼아 실행해 본다.

shell > su caluser -c cps&

그후 웹 브라우져로 해당 Jail 의 IP:8083 으로 접속해본다. ‘192.168.0.99:8083’ 같은 식이다.

시작 스크립트 작성

Jail 이 시작하면 자동으로 시작되도록 rc.d 스크립트를 작성한다. 비슷하게 파이썬으로 구동되는 JupyterLab 의 스크립트가 많은 참고가 되었다.

shell > cd /usr/local/etc/rc.d
shell > vi calibreweb

에디터에 아래 내용을 붙여넣는다. user name 과 home 폴더의 경로에 주의한다. 만약 root 로 설치하고 실행한다면 강조된 부분들을 수정해야 한다. 그러니 그냥 user 로 운용하자…

#!/bin/sh
. /etc/rc.subr
name=calibreweb
command=/home/caluser/.local/bin/cps
rcvar=calibreweb_enable
load_rc_config $name
calibreweb_enable="${calibreweb_enable-"NO"}"
calibreweb_user="${calibreweb_user-"caluser"}"
start_cmd="su ${calibreweb_user} -c '${command}'&"
stop_cmd="${name}_stop"
status_cmd="${name}_status"
calibreweb_stop()
{
    calibreweb_pid=$(pgrep -u ${calibreweb_user} -f ${command})
    echo "Stopping ${name}."
    kill -s TERM "${calibreweb_pid}"
}
calibreweb_status()
{
    calibreweb_pid=$(pgrep -u ${calibreweb_user} -f ${command})
    if [ -n "${calibreweb_pid}" ];
    then
        echo "${name} running with pid: $calibreweb_pid"
    else
        echo "${name} not running? (pid not found)"
    fi
}
command_args=""
load_rc_config $name
run_rc_command "$1"

위 스크립트의 stop, status 에 있는 pid 를 가져오는 명령 ( pgrep ) 에 조심해야 할 부분이 있다. su 명령을 통해 실행하기 때문에 command 만으로 검색하면 su 명령 + 실제 실행하는 Python 해서 두개의 PID 가 나온다. 뭐, 두개 나와도 둘 중 하나만 종료하면 되긴 하지만, 그래도 찜찜하니까… 그래서 user 랑 command 를 같이 조건을 걸어 검색했다. 만약 root 로 실행한다면 그에 맞게 적당히 옵션을 수정해야 한다.

부팅 될 때 시작되도록 rc.d 에 등록한다.

shell > sysrc calibreweb_enable=YES

metadata.db 파일을 복사

이 부분이야 말로 제작자의 의도를 가장 잘 알 수 있다. CalibreWeb 은 metadabase.db 파일을 생성하지 못한다. 그래서 로컬의 Calibre 앱에서 깨끗한 metadata.db 파일을 생성해서 저장소로 사용할 폴더에 넣어줘야 한다.

적당한 위치에 서재를 새로 생성하고, 그 폴더 안에 있는 metadata.db 파일을 새로운 저장소로 복사한다. 수단과 방법을 가리지 말고…ㅋㅋㅋ

내 calibre 에서 생성한거라 어떤 설정이 섞였을지 모르겠지만… 이걸 wget 으로 받아서 저장하면 별 문제 없을거다.

확인

아마 50MB 를 전후로 cbz 가 잘 안 열리거나 속도가 대단히 느리다. 이유는 모르겠지만 제작자가 cbz 를 열람 할 때, 로컬 캐시나 인덱스용 썸네일을 도입할 법 한데도 아직까지 해당 기능을 구현하지 않았다. 내 생각으로는 그냥 로컬에서 pdf 나 epub 로 변환해서 관리하라는 것 같다. epub 는 ebook 기기에 옮기면 잘 되지만 CalibreWeb 에서는 초반 몇 장만 열려서 딱 확인만 가능한 수준이고, pdf 는 600MB 가 넘는 파일도 상당히 원활하게 볼 수 있다.

제작자는 업로드 용량조차 기본으로 설정된 100MB 를 건드리지 않았다. 나는 따로 Tornado 서버 설정을 수정해서 GB 단위로 늘려 놓긴 했지만, 실제 운용해보니 그닥 쓸데는 없다. CalbreWeb 에서 Upload 하면 중복체크도 되지 않고, 파일 이름에서 제목과 저자 등을 파싱하는 것도 안되서 급할 때 사용하는 정도에 불과하다. 아마 제작자도 그냥 로컬에서 관리하고 SMB 나 FTP 등을 이용해 Sync 하는 걸 염두에 두는 것 같다.

저것 외에도 이런저런 단점이 있긴 하지만, 현존하는 무료 솔루션 중에서는 원탑이라고 감히 칭하고 싶다. 물론 인터넷은 연결되어 있어야 하지만, 언제 어디서든, 아이패드건, 안드로이드건 상관없이 주소 치고 들어가서 책을 클릭하면 딱 열리는것도 편리하고, 유져 관리가 되니까 야한책 넣어놔도 태그만 딱 걸어놓으면 다른 사람이 볼 염려 없이 필요한 책이나 Report 를 공유 할 수도 있고…ㅋㅋ

다 열린다!!!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다