オープンソース
Bookshelf – オブジェクトストレージ上で動作するセルフホスト型電子書籍ライブラリ
Bookshelf – Self-hosted eBook library that runs on object storage (github.com)
要約
Bookshelfは、自身が所有する電子書籍を管理するためのセルフホスト型ライブラリアプリケーションです。EPUBおよびPDF形式の電子書籍をブラウザで直接読めるリーダー機能、検索機能、ダウンロード機能を提供します。Cloudflare WorkerとR2オブジェクトストレージ、またはローカルディスク上のNodeサーバーとして動作させることが可能です。Dockerを使った簡単なセットアップもサポートしています。
全文翻訳
Bookshelf 自身が所有する電子書籍のためのセルフホスト型ライブラリです。1つのサーバーレンダリングされたページにそれらをリスト表示し、検索ボックスでフィルタリングし、ダウンロードを提供し、ブラウザで読み込みます — EPUBとPDFはそれぞれ独自のリーダーを備えています — Cloudflare WorkerをR2上で、またはNodeサーバーをディスク上のディレクトリ上で実行します。
上記すべては npm run demo で実行できます — 公開ドメインのタイトルが生成された棚なので、最初に書籍を見つけなくてもスクリーンショットを再現できます。
はじめに
Node 24以降、およびUnixライクなシステムが必要です。同期ツールは画像ツールを見つけるため、Windowsはサポートされていません。cwebpとpdftoppmがインストールされていると、カバーがより良く表示されます — 公開を参照するか、両方を同梱するDockerを使用してください。
git clone https://github.com/murerkinn/bookshelf.git
cd bookshelf
npm install
書籍(EPUBまたはPDF)を books/ に入れ、ライブラリをどこに配置するかを選択してください。
Dockerを使用する場合
最も簡単な方法です。イメージは独自のcwebpとpdftoppmを備えているため、ホストに何もインストールせずにカバーが正しく表示されます。
mkdir books && cp ~/Downloads/*.epub books/
docker compose run --rm sync --create
docker compose up -d
棚は http://localhost:3000 で利用可能になります。フラグはそのまま渡されるため、docker compose run --rm sync --force および --dry-run はローカルと同じように動作します。1つの名前付きボリューム library が、公開された書籍とアプリがそれらに書き込むすべて(プロファイルと読書位置)を保持するため、バックアップすべきはそれだけです。
イメージはファイルシステムプロバイダー用にビルドされています。Nodeサーバーであり、Cloudflareにはコンテナは不要です。非rootユーザーとして実行され、そのユーザーが所有する /data を作成するため、名前付きボリュームはそのアプリが書き込める所有権を継承します。ホストディレクトリをバインドマウントしたい場合は、まずchownしてください:
chown -R 1000:1000 /srv/bookshelf
Dockerなしで、自身が所有するマシン上で
どこにもアカウントは不要です。bookshelf.config.json をディレクトリに向け、そこに公開し、アプリを実行してください:
// bookshelf.config.json
{
"storage": {
"provider": "fs",
"directory": "shelf-data"
}
}
npm run sync -- --create # library/ をビルドし、shelf-data/ に公開します
npm run build
npm start -w @bookshelf/app
library/ は同期ツールがビルドするツリーです。directory は公開先であり、提供される書籍を保持します。リポジトリからは除外してください — shelf-data/ はすでにそうなっています。
Cloudflare上で
Cloudflareアカウントと npx wrangler login が必要です。2つのチェックインされたファイルがこのプロジェクト自身のバケットとWorker名を保持しており、編集されることを意図しています — R2プロバイダーを参照してください。
npm run sync -- --create # バケットを作成し、アップロードします
npm run deploy
両者はライブラリを保持するバケットについて一致している必要があります。そうでなければ、アプリは空の棚を表示します。アップロード前に互いにチェックされ、不一致は公開されるのではなく報告されます。
デモ棚
手元に書籍がない、またはスクリーンショットに値するものが必要ですか? 9つの生成された公開ドメインのタイトル — 8つのEPUBと1つのPDFなので、両方のリーダーが棚からワンクリックでアクセスできます — 何もダウンロードしません:
npm run demo # books/ に書き込みます
その後、上記のいずれかの方法で公開して提供してください。タイトルと著者は実際の著作権切れの作品なので、棚は棚のように見えます。中の文章はプレースホルダーです。このリポジトリの設定はR2を指しているため、npm run sync は変更しない限りそこへ行きます。
公開インスタンス
見知らぬ人がアクセスできるものは変更を拒否する必要があります: BOOKSHELF_READ_ONLY=1
ストレージは提供を続け、受け入れを停止します。プロファイルを追加、名前変更、削除することはできず、読書位置はブラウザ内に留まります — プロバイダーが書き込めない場合と同じ劣化ですが、アプリにとっては同じ状況です。既存のプロファイル間の切り替えは引き続き機能します。これは変更ではなく、Cookieによるものです。フォームを隠すのではなく、書き込みが発生する場所で強制されるため、アクションを直接投稿しても同じ拒否が得られます。
認証はありません。アプリにアクセスできる人は誰でも、ライブラリ全体を読み込み、ダウンロードできます。そのため、信頼できるネットワーク上、または誰が呼び出しているか尋ねるものの背後に配置してください。
まだ完了していません。
コマンド
これらはすべてリポジトリのルートから実行されます。Turborepoは、タスクが依存するものをすべて先にビルドします。
npm run dev # ローカルR2バケットに対するローカル開発サーバー
npm run sync # ライブラリをビルドし、バケットにアップロードします
npm run build # すべてのワークスペースをビルドします
npm run check-types # すべてのワークスペースの型チェックを行います
npm run preview # Workerをローカルでビルドして実行します
npm run deploy # Cloudflare Workersにビルドしてデプロイします
npm test # テストスイート
npm run lint # リポジトリ全体でBiomeを実行します
npm run cf-typegen -w @bookshelf/app # wrangler.jsonc を編集した後、cloudflare-env.d.ts を再生成します。
ドキュメント
ライブラリの公開同期ツール、そのフラグ、およびカバー
ライブラリフォーマットバケットに最終的に格納されるもの、およびその理由
ストレージプロバイダー契約、および出荷される2つのプロバイダーがそれぞれ何ができるか
Cloudflare R2設定、デプロイ、ローカルでの公開
ファイルシステム自宅のマシンまたはVPSで実行する
プロファイル誰が読んでいるか、そしてどこまで進んだか
ブラウザでの読書章がページに到達する方法
アーキテクチャポート、アダプター、およびコンポジションルート
デモライブラリ公開棚の構築方法、および再構築方法
まだ完了していません認証はありません。URLを持つ人は誰でも、ライブラリ全体を読み込み、ダウンロードできます — そして、その間どのプロファイルでも選択できます。プロファイルは、ハウスメイトのブックマークを区別するためのものであり、誰かを締め出すためのものではありません。1つのプロファイルとして同時に2つのデバイスで読書することは、最後の書き込みが勝ちます。
貢献
CONTRIBUTING.md を参照してください。要約:Node 24、npm install、プッシュ前に npm run lint、npm run check-types、および npm test を実行してください。テストはパッケージとアプリのサービスレイヤーに到達しますが、ページには到達しないため、実行したことも述べてください。
ストレージプロバイダーは拡張ポイントであり、ここに配置する必要はありません。誰かが公開したパッケージをインストールし、設定で名前を付けることができます。
ライセンスMIT — LICENSE を参照してください。これはコードに関するものです。これには、それを使用して構築されたライブラリに入れる書籍については何も述べられていません。それらの著作権はあなたとそれらの出版社との間のものです。