食料廃棄をなくす:DockerでGrocyをセルフホストしてスマートな在庫管理を実現する

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

現代のパントリー(食品庫)が抱える課題

家庭のパントリー管理は、監視機能がまったくないレガシーサーバーを運用しているようなものです。戸棚にあるものを二重に買ってしまう一方で、冷蔵庫の奥にある牛乳は一度のアラートも出さずにEOL(サポート終了)を迎えてしまいます。

ある推計によると、家庭では購入した食品の約30%が廃棄されています。エンジニアとして、私たちはこのような非効率を嫌います。GrocyはキッチンのためのERP(企業資源計画)システムとして機能し、Docker上で実行することが、プロ仕様のホームキッチンを実現する最も信頼性の高い方法です。

私はこの構成を2年以上「本番環境」で使用しています。複数のハードウェア移行やバージョンアップを経験しましたが、スパイスラックや冷凍庫の在庫データを一つも失うことなく稼働し続けています。

デプロイ:立ち上げと実行

Linuxserver.ioがメンテナンスしているイメージをお勧めします。彼らはパーミッションやアップデートを一般的なビルドよりもはるかにクリーンに処理してくれます。これはほぼ何でも動かすことができ、2GBのRAMを搭載したRaspberry Pi 4でも十分すぎるほどです。コンテナのメモリ消費量は通常150MB未満です。

まず、スタック用の専用ディレクトリを作成します。

mkdir -p ~/homelab/grocy && cd ~/homelab/grocy

次に、docker-compose.ymlファイルを作成します。自分の環境に合わせてTZPUIDPGIDの値を必ず更新してください。ターミナルでid $USERを実行することで、自分のIDを確認できます。

services:
  grocy:
    image: lscr.io/linuxserver/grocy:latest
    container_name: grocy
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    volumes:
      - ./config:/config
    ports:
      - 9283:80
    restart: unless-stopped

次のコマンド一つでコンテナを起動します:

docker-compose up -d

これで http://your-server-ip:9283 からインターフェースにアクセスできます。デフォルトの認証情報は admin / admin です。データを保護するため、すぐに変更してください。

アーキテクチャとデータの永続化

GrocyはSQLiteデータベースを使用する PHPアプリケーションです。これにより、システム全体がポータブルで高速になります。./config:/configボリュームをマッピングすることで、コンテナを削除してもgrocy.dbファイル、製品画像、カスタム設定が保持されるようにします。SQLiteを使用しているため、ディスクI/Oが唯一のボトルネックとなります。SDカードで実行している場合は、インターフェースの動作を軽快に保つために、configフォルダをSSDに移動することを検討してください。

リバースプロキシの設定

ポート9283をインターネットに直接公開しないでください。スーパーで在庫を確認したい場合は、Nginx Proxy ManagerやTraefikなどのリバースプロキシを使用してください。Grocyはヘッダーを適切に処理しますが、プロキシがX-Forwarded-Protoを渡すように設定する必要があります。これにより、HTTPS経由でダッシュボードにアクセスする際のミックスコンテンツエラーを防ぐことができます。

自動化:バーコードとAPI

手動の在庫管理システムは、生活が忙しくなった瞬間に破綻します。Grocyを家庭で実際に機能させるには、データ入力を自動化する必要があります。ここでAPIが重要な役割を果たします。

モバイル連携

Grocyコミュニティは、AndroidとiOSの両方に優れたアプリを提供しています。これらを使えば、スマートフォンのカメラが高速バーコードスキャナーに早変わりします。連携するには、Web UIの「**APIキーの管理 (Manage API Keys)**」に移動してキーを生成し、表示されたQRコードをスマホでスキャンするだけです。設定は30秒もかかりません。

外部データベースのルックアップ

システムがその商品を知らなければ、13桁のEANバーコードをスキャンしても意味がありません。GrocyはOpenFoodFactsに接続して、製品名や画像を自動的に取得できます。これは、configボリューム内のdata/config.phpファイルを編集することで切り替えられます。メタデータの自動取得を有効にするには、外部API設定を探してください。

Home Assistantとの相乗効果

Home Assistantを運用しているなら、Grocyインテグレーションは革新的です。私はキッチンの壁掛けタブレットに「賞味期限間近」リストを表示しています。また、買い物リストが5項目を超えたときにパントリーのライトを点滅させたり、Telegramメッセージを送信したりする自動化を作成することも可能です。

長期運用のための戦略

数千のアイテムを追跡してきた結果、システムを使いやすく保つための2つの特定の機能を見つけました。

親製品の活用

小麦粉やパスタのブランドごとに個別のエントリを作成しないでください。「強力粉」という「親製品」を作成し、特定のブランドを「子製品」として扱います。これにより、ブランドに関わらず、合計で10kgの小麦粉があることを把握できます。

開封済みアイテムの追跡

マヨネーズの瓶は棚の上では1年持つかもしれませんが、開封後は30日しか持ちません。Grocyはこれを完璧に処理します。UIで「開封 (Open)」をクリックすると、「開封後のデフォルト賞味期限」設定に基づいて、システムが自動的に賞味期限を再計算します。この機能だけで、私は何度か食中毒の危機から救われました。

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

すべての状態が数個のファイルに保存されているため、バックアップは簡単です。私は毎晩、configフォルダを圧縮してNASに移動する cronジョブを実行しています。

# シンプルなバックアップスクリプトの断片
tar -czf /backups/grocy_$(date +%F).tar.gz ~/homelab/grocy/config

データ入力の疲れを克服する

最大のハードルは技術的なセットアップではなく、最初の在庫登録です。初日に家中のすべてのアイテムをスキャンしようとしないでください。燃え尽きてしまいます。代わりに、買ってきた食材を片付けるときに、新しいものだけをスキャンするようにしましょう。3週間もすれば、常備品の約90%がシステムに登録され、日々のメンテナンスは数分で済むようになります。

Share: