書類の山を捨てよう:DockerでPaperless-ngxをセルフホストする方法

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

「書類の山」問題

物理的なファイリングシステムは、生産性の墓場です。多くの人が何年もかけて出生証明書や確定申告書、家電の保証書などを溜め込みますが、いざ2019年の特定の書類が必要になったとき、埃をかぶったフォルダの中から30分もかけて発掘作業をしなければならないことに気づきます。HomeLabを運用している人にとって、PDFをスキャンして「Invoice_Electricity_March.pdf」とリネームし、フォルダにドラッグする手作業は、人間の怠慢さゆえにいずれ破綻するプロセスです。

昨年、食洗機の修理担当者に保証書を求められた際、持っているはずなのに見つけられなかったことで限界に達しました。そのイライラした1時間の捜索がきっかけで、単にファイルを保存するだけでなく、内容を「理解」してくれるソリューションを探すことにしました。Paperless-ngxは、オリジナルのPaperlessプロジェクトの後継です。これは書類のための「デジタル頭脳」として機能し、OCR(光学文字認識)を使用してすべての単語をインデックス化し、内容に基づいて自動的にタグを付けてくれます。

アーカイブをこの環境に移行してから、1,200件以上の書類を処理しました。物理的な紙の記録は今やほとんど存在しません。所有するすべての記録は、Google検索と同じくらい高速なウェブインターフェースから検索可能です。

システムのデータ処理の仕組み

Paperless-ngxは単一の巨大なアプリケーションではありません。Docker内で連携して動作する、ドキュメント処理の重労働を担うサービス群の集合体です。

  • Webserver: UIを提供しロジックを管理する Djangoベースのコア。
  • Consumption Folder: 「魔法の」ディレクトリ。ここにファイルを置くと、システムが即座に処理を開始します。
  • Redis: タスクマネージャーとして機能。50個のPDFを一気に投入しても、Redisがキューを管理して一つずつ処理するため、CPUがクラッシュすることはありません。
  • PostgreSQL: SQLiteもサポートされていますが、長期的な安定性のためにPostgresを推奨します。ライブラリが大きくなっても、大規模なインデックスをより効率的に処理できます。
  • Tesseract OCR: 画像を「読み取る」エンジン。スマートフォンの不鮮明なレシート写真でも、5〜10秒ほどで完全に検索可能なテキストに変換します。

環境の準備

DockerとDocker Composeがインストールされたマシンが必要です。データのポータビリティとバックアップのしやすさを考慮し、専用のディレクトリを作成することをお勧めします。私は通常、システムから分離するために ~/homelab/paperless 以下にすべてをマッピングしています。

まず、ディレクトリ構造を作成します:

mkdir -p ~/homelab/paperless/{config,data,db,consume,export}

consume フォルダが入り口です。ネットワークスキャナーでもスマホアプリでも、データベースに取り込まれる前の生のファイルはここに保存されます。export フォルダは、バックアップコマンドを実行するまで空のままです。

Docker Composeの設定

Docker Composeの設定 によるデプロイが標準的な方法です。このファイルでウェブアプリ、データベース、ブローカーを一つの機能単位としてリンクします。ポートの競合を防ぎ、OCRエンジンが優先すべき言語を認識できるように、この設定を最適化しました。

version: "3.9"
services:
  broker:
    image: docker.io/library/redis:7
    restart: unless-stopped
    volumes:
      - ./redisdata:/data

  db:
    image: docker.io/library/postgres:15
    restart: unless-stopped
    volumes:
      - ./db:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: your_secure_password

  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    restart: unless-stopped
    depends_on:
      - db
      - broker
    ports:
      - "8010:8000"
    volumes:
      - ./config:/usr/src/paperless/data
      - ./data:/usr/src/paperless/media
      - ./export:/usr/src/paperless/export
      - ./consume:/usr/src/paperless/consume
    environment:
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBHOST: db
      PAPERLESS_DBNAME: paperless
      PAPERLESS_DBUSER: paperless
      PAPERLESS_DBPASS: your_secure_password
      PAPERLESS_OCR_LANGUAGES: eng vie
      PAPERLESS_TIME_ZONE: Asia/Ho_Chi_Minh
      USER_ID: 1000
      GROUP_ID: 1000

PAPERLESS_OCR_LANGUAGES 変数に注目してください。英語とベトナム語の両方の書類がある場合、両方を指定することでTesseractエンジンが正しい文字セットを使用するようになります。また、他のウェブサービスとの衝突を避けるため、内部ポート8000をホストの8010にマッピングしています。

インスタンスの起動

設定を保存したら、イメージをプルしてデタッチドモードでコンテナを起動します:

docker compose up -d

コンテナは起動しましたが、まだログインはできません。実行中のウェブサーバーコンテナ内で直接コマンドを実行して、管理者アカウントを作成する必要があります:

docker compose exec webserver python3 manage.py createsuperuser

認証情報を設定したら、ブラウザを開いて http://your-server-ip:8010 にアクセスしてください。これでデジタル化の準備は完了です。

ワークフローの自動化

ソフトウェアの設定は戦いの半分に過ぎません。本当の魔法は、摩擦をなくしたときに起こります。半年間使用してみて、マッチングアルゴリズムこそが綺麗なアーカイブを維持する秘訣だと気づきました。これらのルールにより、人間の介入なしにPaperless-ngxがファイルを分類できるようになります。

例えば、「Utility(公共料金)」タグを作成し、「Power Company」や「Kilowatt」という単語を探すマッチングルールを設定しました。これで、電力会社からのPDFをフォルダに放り込むだけで、システムが自動的にタグ付けし、「Monthly Bills(月次請求書)」というドキュメントタイプに割り当て、テキスト内から見つけた日付を使ってファイル名を変更してくれます。手入力は一切不要です。

これを真にシームレスにするには、Microsoft Lensのようなモバイルアプリを使用してください。スキャンしたデータをスマートフォンのフォルダに直接保存し、Syncthing経由でサーバーと同期するように設定します。これにより、物理的なレシートから完全にインデックス化されたデジタル記録まで、「ワンタップ」の経路が出来上がります。

信頼性の高いバックアップ

このシステムには一生分の書類が保管されるため、データの紛失は許されません。Dockerボリュームをバックアップするだけでなく、組み込みのエクスポーターツールを使用してライブラリの「ハードコピー」を作成してください。私は以下のコマンドを実行する週次のcronジョブを運用しています:

docker compose exec webserver document_exporter ../export

このコマンドは、すべてのドキュメントをすべてのメタデータを含むJSONファイルと共に出力します。万が一Dockerの設定が壊れても、どのコンピュータでも読み取れる完璧に整理された PDFフォルダが手元に残ります。

結論

物理的な「書類の山」から検索可能なデジタルアーカイブへの移行は、HomeLabで取り組める最も価値のあるプロジェクトの一つです。サーバーを趣味の玩具から、家庭の重要なインフラへと進化させます。Paperless-ngxは非常に安定しており、マッチングルールさえ設定してしまえばメンテナンスはほとんど不要です。大切な記録を見失うことに疲れたなら、今日これをデプロイして、二度と埃っぽいフォルダを漁る必要のない生活を始めましょう。

Share: