DockerでCalibre-Webを使ったセルフホスト電子書籍ライブラリ:どこからでも本を管理・読書・同期する方法

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

よくある悩み:電子書籍が散在していて管理できない

電子書籍を長く集めていると、誰もが同じ壁にぶつかる。ノートPCにPDF、古いUSBメモリにEPUB、KindleからダウンロードしたAZW3ファイル——デバイスに散らばっていて、一元管理する手段がない。Google Play BooksやApple Booksはそれぞれのエコシステムに縛られ、KindleはAmazonでの購入が前提だ。本当に欲しいのはもっとシンプルなもの:自分でコントロールできる、どのブラウザからでもどのデバイスからでもアクセスできる、プライベートなライブラリだ。

数年前、私もまったく同じ状況に陥った。Linuxガイド、Dockerリファレンス、プログラミング入門書など300冊以上の技術書があったのに、メインのワークステーション以外で整理・閲覧する手段がなかった。それを解決したのがDockerで動かすCalibre-Webだ。今ではNextcloudやGiteaと並んで、ホームラボの常駐メンバーになっている。

Calibre-Webとは何か

Dockerコマンドを実行する前に、アーキテクチャを60秒で理解しておこう。

Calibreは電子書籍コレクションを管理するための成熟したデスクトップアプリケーションだ。書籍・著者・カバー画像・メタデータを追跡するmetadata.dbというSQLiteファイルを持つ、フォルダベースのライブラリに全データを保存する。

Calibre-Webは、その同じライブラリフォルダを読み込み、クリーンなWebインターフェースで公開する別のオープンソースプロジェクトだ。以下の機能が使える:

  • 検索・フィルタリング可能な書籍カタログ
  • ブラウザ内での読書(内蔵リーダーによるEPUB形式対応)
  • OPDSカタログのサポート——KOReaderやMoon+などの電子書籍リーダーアプリから直接書籍を取得できる
  • 家族とアクセスを共有するためのユーザーアカウント機能
  • KindleへのメールやEメール送信機能
  • 書籍フォーマット変換(オプション。Calibreバイナリのインストールが必要)

アーキテクチャ上の重要なポイント:Calibre-Web自体は書籍を保存しない。あくまでCalibreライブラリフォルダを読み込むだけだ。実際のファイルはシンプルなディレクトリに残る——独自データベースへの移行も、ベンダーロックインもない。

前提条件

必要なもの:

  • LinuxサーバーまたはNAS(RAM 2GBのRaspberry Pi 4でも十分動作する)
  • DockerとDocker Composeのインストール
  • 既存のCalibreライブラリ、またはこれから作成する意欲

Calibreライブラリがまだない場合は、PCにCalibreデスクトップアプリをインストールして数冊追加しよう。metadata.dbと著者サブフォルダを含むライブラリフォルダが生成される。そのフォルダ全体をサーバーにコピーすれば準備完了だ。

ディレクトリ構造のセットアップ

サーバー上で、Calibre-Webが必要とする2つのフォルダを作成する:

mkdir -p ~/calibre/config
mkdir -p ~/calibre/library

libraryフォルダはCalibreライブラリの置き場所で、metadata.dbが存在するフォルダだ。configフォルダにはCalibre-Web自身の設定、ユーザーデータベース、キャッシュが保存される。

PCにすでにCalibreライブラリがある場合は、次のコマンドでコピーする:

scp -r /path/to/Calibre\ Library/ user@your-server:~/calibre/library/

Docker Composeファイルの作成

~/calibre/内にdocker-compose.ymlを作成する:

version: "3.8"

services:
  calibre-web:
    image: lscr.io/linuxserver/calibre-web:latest
    container_name: calibre-web
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
      - DOCKER_MODS=linuxserver/mods:universal-calibre  # オプション:フォーマット変換を有効化
    volumes:
      - ./config:/config
      - ./library:/books
    ports:
      - "8083:8083"
    restart: unless-stopped

いくつか補足しておこう:

  • PUIDPGID——Linuxユーザーのユーザーとグループのルーマに合わせて設定する。id -uid -gを実行して確認しよう。値が合っていないと、起動時のパーミッションエラーの原因No.1になる。
  • TZ——タイムゾーンを設定してタイムスタンプを正しく表示させる。
  • DOCKER_MODS=linuxserver/mods:universal-calibre——このオプションのModはコンテナ内にフルのCalibreバイナリをインストールし、フォーマット変換(例:EPUB → MOBI)を可能にする。変換が不要なら省略してよい。初回起動時に3〜5分余分にかかる。
  • /booksマウントは、Calibre-Webがライブラリを探す場所だ。

コンテナの起動

cd ~/calibre
docker compose up -d

正常に起動したかログで確認する:

docker compose logs -f calibre-web

一般的なVPSやホームサーバーなら10〜15秒以内に起動する(Calibre Modを有効にした場合はそれより長くかかる)。ブラウザでhttp://your-server-ip:8083を開こう。

初回設定

最初の画面でCalibreライブラリのパスを入力する。/booksと入力しよう——これがComposeファイルで設定したコンテナ側のマウントポイントだ。

デフォルトのログイン情報:

  • ユーザー名:admin
  • パスワード:admin123

他の作業をする前に、すぐに管理者パスワードを変更しよう:Admin → Edit User → adminから更新できる。

管理パネルからは以下も設定できる:

  • 新規ユーザー登録の有効・無効切り替え(プライベート運用では無効にする)
  • Kindleへの送信機能のためのSMTP設定
  • 書籍メタデータ検索のためのGoodreads連携の有効化

電子書籍リーダーアプリ向けOPDSカタログの設定

正直に言うと、この機能こそがCalibre-Webを導入する最大の理由だ。OPDS(Open Publication Distribution System)はほとんどの電子書籍リーダーアプリが対応する標準カタログ形式だ。設定が完了すると、KOReader・Aldiko・Moon+ ReaderからCalibre-Webの書籍を直接ブラウズ・ダウンロードできる——サイドロードもケーブルも不要だ。

Calibre-WebでAdmin → Basic Configuration → Feature Configurationを開き、OPDSフィードにログインなしでアクセスできるようにしたい場合はAnonymous browsingを有効にする。信頼できるホームネットワーク内で便利な設定だ。

OPDSフィードのURLは次のようになる:

http://your-server-ip:8083/opds

KOReaderでは:検索 → OPDSカタログ → カタログを追加から、このURLを貼り付けるだけで完了だ。電子書籍リーダーからライブラリ全体をブラウズできるようになる。

ホームネットワーク外からのアクセス

実用的な方法が2つある:

方法1:NGINXまたはCaddyでリバースプロキシを設定する

すでにホームラボでリバースプロキシを運用しているなら、Calibre-Web用のブロックを追加するだけだ。Caddyなら4行で済む:

books.yourdomain.com {
    reverse_proxy localhost:8083
}

CaddyはLet’s Encryptを使ってHTTPSを自動的に処理してくれる。証明書の管理は不要だ。

方法2:Tailscale(初心者向けのシンプルな方法)

すでにTailscaleを使っているなら、ポートフォワーディングやDNS設定なしにTailscale IPでCalibre-Webのポートに接続できる。Tailscale接続済みのデバイスからhttp://100.x.x.x:8083にアクセスするだけだ。外出先ではこの方法を使っている。

ライブラリを最新の状態に保つ

新しい書籍の追加はいつも通りCalibreデスクトップアプリから行えばよい。変更は共有フォルダ内のmetadata.dbに書き込まれ、Calibre-Webは自動的に反映する。コンテナの再起動は不要——ブラウザを更新するだけでいい。

新しいバージョンのCalibre-Webがリリースされたときのコンテナ更新手順:

cd ~/calibre
docker compose pull
docker compose up -d

linuxserver.ioのイメージはlatestを現在の安定版に追従させているので、この3コマンドだけで完了だ。

実際に運用して学んだこと

2年間この構成を運用してきて、注意すべきポイントがある:

  • 起動時のパーミッションエラー:ほぼ確実にPUID/PGIDの不一致が原因だ。サーバーユーザーでidを実行して、Composeファイルの値と一致しているか確認しよう。
  • metadata.dbがロックされる:PCでCalibreデスクトップを開いたまま、ライブラリがNFS経由でサーバーにマウントされていると、SQLiteのファイルロックが競合する。Calibre-Webがデータベースに書き込もうとする前に、デスクトップアプリを閉じておこう。
  • OPDSに全書籍が表示されない:OPDSクライアントによっては1ページあたりの表示件数が30件に制限されている。カタログが不完全に見える場合は、クライアントのカタログページサイズ設定を確認しよう。
  • 初回のフォーマット変換が遅い:Calibre Modを有効にした場合、初回起動時にフルのCalibreバイナリをダウンロード・インストールするため3〜5分かかるのは正常だ。止まったと思ってコンテナを強制終了しないようにしよう。

最終的に手に入るもの

セットアップが完了すると、次のようなプライベートライブラリが手に入る:

  • どのブラウザでも動作する——アプリのインストール不要
  • OPDS対応アプリ経由でデバイス間の読書位置を同期できる
  • ローカルネットワーク内でフル速度で書籍を配信できる
  • 完全に自分が所有するプレーンなファイルとして保存される
  • すでに持っているサーバーハードウェア以外のコストは一切かからない

セットアップにかかる時間は20分ほどだ。私が決め手になったのはKOReaderとのOPDS連携で、通勤中にタブレットで技術ドキュメントを読んでも、すべてが一か所に集約されている。Raspberry Pi 4上で動くCalibre-WebのRAM使用量はアイドル時100MB以下なので、ホームラボの他のサービスと競合することもない。

電子書籍コレクションをデバイスやクラウドサービスに分散させたままにしておく理由はない。セルフホストのCalibre-Webは軽量でメンテナンスも楽、そして自分の読書ライブラリを完全に自分のコントロール下に置ける——自分のルールで。

Share: