DockerでStirling-PDFをデプロイ:HomeLab環境にプライベートなPDFツールキットをセルフホストする

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

オンラインPDF変換ツールに潜むプライバシーリスク

誰しも一度は経験があるのではないでしょうか。署名済みの信託契約書を結合したり、パスポートのスキャンデータを黒塗り(墨消し)したり、60ページに及ぶ確定申告書を圧縮するために、iLovePDFやSmallPDFといった無料のオンラインサービスにアップロードしたことが。その場では何の問題もないように思えますが、暗号化されていない財務諸表やクライアントとの秘密保持契約(NDA)、身分証明書などをサードパーティのクラウドサーバーに渡す行為は、不必要なリスクを伴う危険な賭けです。

無料プランでは15MBのファイル容量制限が課されたり、意図的な速度制限により変換キューで待たされたりする上、リモートサーバー上にファイルが何時間もキャッシュされることが少なくありません。しかし、自宅のHomeLab環境があれば、わずか5分でこの問題を解決できます。ローカルにドキュメント処理エンジンを立ち上げることで、テレメトリ(利用状況の自動送信)なしで完全な処理能力を手に入れ、すべてのデータを自分自身の管理下に置くことができます。

Stirling-PDFのアーキテクチャを理解する

Stirling-PDFは、PDFの分割、結合、回転、黒塗り、透かし追加、OCRなどの操作を単一のセルフホスト型Webスイートにまとめたツールです。個別のCLIスクリプトをパッチワークのように組み合わせる代わりに、Spring Boot、Apache PDFBox、LibreOffice、Tesseract OCRといった実戦で鍛え抜かれたスタックに支えられた、洗練されたWeb UIを利用できます。

イメージの種類:Full vs. Ultra-Lite

適切なコンテナイメージの選択は、ハードウェアリソースと処理するワークロードによって決まります:

  • Full(Fat)イメージ:LibreOffice、OpenCV、Tesseractの言語パックを同梱しています。Office文書(.docxや.xlsxなど)とPDF間の双方向変換や、多言語OCRスキャンが必要な場合はこちらを選択してください。負荷の高い光学文字認識処理を行う際には、メモリ使用量が2GB〜3.5GB程度まで一時的に跳ね上がることを想定しておく必要があります。
  • Ultra-Liteイメージ:LibreOfficeと重量級のOCRエンジンを削ぎ落とした軽量版です。ページの結合、分割、回転、パスワード保護といった基本的なページ操作のみが必要な場合、アイドル時のRAM消費量は120MB未満、ピーク時でも300MB以下に抑えられます。Raspberry Pi 4(2GB)や月額4ドル程度のエントリークラスVPSでも軽快に動作します。

一般的なx86ミニPC(Intel N100搭載機や旧型のLenovo ThinkCentre Tinyノードなど)を使用している場合は、Fullイメージを選択するのが無難です。外部のマイクロサービスやサイドカーを用意することなく、すべての機能をフルに活用できます。

Docker Composeを使ったStirling-PDFのステップ別デプロイ手順

Docker Composeを使用することで、再現性が高く、バージョン管理が容易で、他のホストへの移行もスムーズなデプロイ環境を実現できます。

1. プロジェクトディレクトリの作成

アプリケーションの状態、カスタムTesseractデータ、自動化ワークフローを保存するための専用ディレクトリを作成します:

mkdir -p ~/homelab/stirling-pdf/{trainingData,extraConfigs,logs,pipeline}
cd ~/homelab/stirling-pdf

2. Docker Composeファイルの作成

docker-compose.ymlファイルを作成します:

services:
  stirling-pdf:
    image: frooodle/s-pdf:latest
    container_name: stirling-pdf
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./trainingData:/usr/share/tessdata:rw
      - ./extraConfigs:/configs:rw
      - ./logs:/logs:rw
      - ./pipeline:/pipeline:rw
    environment:
      - DOCKER_ENABLE_SECURITY=false
      - INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
      - LANGS=en_GB,en_US,de_DE,fr_FR
      - SYSTEM_DEFAULTLOCALE=en_US
      - UI_APPNAME=HomeLab PDFスイート
    deploy:
      resources:
        limits:
          memory: 4G

主な設定ポイントと留意事項:

  • ./trainingData:Tesseract用のカスタム.traineddataモデルをマウントします。非ラテン文字(日本語フォントなど)や特殊なフォントを処理する場合に使用します。
  • DOCKER_ENABLE_SECURITY:falseに設定すると、LAN内から認証なしでダッシュボードにアクセスできます。インスタンスを外部に公開する場合や、ゲストとホームネットワークを共有している場合はtrueに変更してください。
  • LANGS:初回起動時に取得するOCR辞書を指定します。初期コンテナのビルド時間を短縮するために、実際に使用する言語のみに絞り込んでおくことをおすすめします。
  • memory: 4G:300ページにおよぶスキャン文書の変換処理などを行うと、一時的にRAM使用量が急増することがあります。明示的な上限を設定しておくことで、Javaプロセスが同一ホスト上の他のDockerワークロードを圧迫するのを防ぎます。

3. コンテナの起動と確認

デタッチモードでコンテナを起動します:

docker compose up -d

コンテナのログをリアルタイムで追跡し、Javaランタイムや各種依存関係が正常に立ち上がることを確認します:

docker compose logs -f stirling-pdf

ターミナルにSpring Bootのバナーと初期化完了のメッセージが表示されたら、ブラウザでhttp://<サーバーのIPアドレス>:8080にアクセスします。UIでは、「Merge & Split(結合・分割)」「Convert(変換)」「Security(セキュリティ)」「Page Ops(ページ操作)」などのタブで機能が分かりやすく整理されています。

4. 本番運用のためのセキュリティ強化とユーザーアカウント設定

Caddy、Traefik、Cloudflare Tunnelsなどの外部リバースプロキシ経由でトラフィックをルーティングする場合、アクセス制限の設定は必須です。Composeファイルの環境変数フラグを以下のように更新します:

    environment:
      - DOCKER_ENABLE_SECURITY=true
      - SECURITY_ENABLELOGIN=true
      - SECURITY_CSRFDISABLED=false

コンテナを再起動します。デフォルトの管理者ログイン情報は以下の通りです:

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

ログイン後、アカウント設定(Account Settings)から速やかにこのパスワードを変更してください。ここからロールベースのアカウントを発行したり、CLIスクリプトで自動処理を行うためのAPIトークンを生成したりできます。

筆者の検証環境では、4コア・4GB RAMを割り当てた仮想マシン上で、250MBの建築図面や400ページの銀行取引明細書を処理させていますが、メモリリークやスレッドロックを起こすことなく安定して稼働し続けています。

5. 監視フォルダ(Watched Folder)パイプラインの構築

./pipelineのマウントを利用することで、自動バッチ処理が可能になります。ネットワークスキャナーや共有フォルダの保存先を所定の監視サブディレクトリに指定しておけば、Stirling-PDFが新規ファイルを検知し、傾いたページの自動補正(deskew)、OCR処理、非可逆圧縮を適用した上で、整理されたPDF/AアーカイブをNASのストレージフォルダに直接出力してくれます。

まとめと次のステップ

SaaSツールをセルフホスト型の代替ツールに置き換えることは、ホームサーバーを活用する上で手軽に得られる大きな成果の1つです。Stirling-PDFを導入すれば、サードパーティによるトラッカーや月額サブスクリプション料金から解放され、完全に隔離された高速なドキュメント処理環境を手に入れることができます。

長期的な運用の安定性を高めるために、SSL終端を行うリバースプロキシを前段に配置し、Let’s Encryptによる自動証明書更新を設定するとともに、BorgやResticなどの定期スナップショットルーチンにextraConfigsフォルダを含めてバックアップしておきましょう。

Share: