背景と導入の理由:自宅ラボにおけるインベントリ管理の盲点
多くの自宅ラボ(HomeLab)は小さな構成から始まります。再生品のLenovo ThinkCentre Tinyや中古のDell OptiPlexを手に入れ、Pi-holeといくつかのDockerコンテナを動かすといった具合です。しかし、そうしたささやかな環境はすぐに肥大化していきます。気づけば3ノードのProxmoxクラスタ、エンタープライズ向けのPoEスイッチ、DASディスクシェルフを管理し、引き出しにはDDR4 ECCメモリや予備のPCIe NICが溢れ返っていることでしょう。ハイパーバイザーのライセンスからドメインの更新、内部TLS証明書に至るまで、デジタル資産も同様のスピードで増え続けます。
そしてある日、トラブルは突然やってきます。午前2時にドライブがSMARTエラーを吐き出したり、ハイパーバイザーのノードがオフラインになったりするのです。その時、古びたスプレッドシートやDiscordの個人メモを必死に掘り返す羽目になります。「あの32GBのMicron製メモリはどのノードに入っていたか?」「中古で買ったあの1.92TBエンタープライズSSDの保証は先月切れていなかったか?」「購入日はいつだったか?」
単なるスプレッドシートによる管理はあっという間に破綻します。親となる筐体、換装可能なコンポーネント、そしてソフトウェアライセンスといった相互のリレーションを適切にマッピングできないからです。
データセンターでは、専用のIT資産管理(ITAM)ソフトウェアを導入してこの問題に対処しています。Snipe-ITは、ハードウェアのライフサイクル、交換可能モジュール、消耗品、メンテナンス履歴を追跡するために特化して設計された、オープンソースのWebベースITAMプラットフォームです。Docker Compose上でSnipe-ITを運用すれば、エンタープライズ製品特有の肥大化に悩まされることなく、すっきりと整理されたセルフホスト型のインベントリ管理ハブを手に入れられます。
自宅ラボを本番環境同様に扱うということは、自分がどんなハードウェアを所有し、それがどこにあり、いつ交換時期を迎えるのかを正確に把握しておくことを意味します。
インストール:Docker ComposeによるSnipe-ITのセットアップ
ここでは、Docker Composeを使用してSnipe-ITを2層構成のスタックとしてデプロイします。1つ目のコンテナはApacheとPHP上で動作するSnipe-IT公式アプリケーションサービス、2つ目のコンテナはリレーショナルデータを格納するMariaDB 10.11インスタンスです。
1. ディレクトリ構造の準備
永続アプリケーションボリュームとバックアップを保存するため、Dockerホスト上に専用ディレクトリを作成します。
mkdir -p ~/snipe-it/data ~/snipe-it/dumps
cd ~/snipe-it
2. アプリケーション暗号化キーの生成
Snipe-ITでは、32文字のBase64エンコードされたアプリケーションキー(APP_KEY)が必要です。このキーは、パスワードフィールドやライセンスキーなど、データベース内の機密データを暗号化するために使用されます。スタックを起動する前に、公式イメージを使用してキーを生成しておきます。
docker run --rm snipe/snipe-it:latest php artisan key:generate --show
出力された文字列(base64:... 形式)を保存しておいてください。次のステップで環境変数設定に貼り付けます。
3. 環境変数設定ファイルの作成
作業ディレクトリ ~/snipe-it に .env ファイルを作成します。サンプル値を、生成したキー、自宅ラボのサブネットIP(例: 192.168.1.50)、および強固なデータベースパスワードに置き換えてください。
cat <<'EOF' > ~/snipe-it/.env
# アプリケーション設定
APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:生成したキーをここに貼り付け=
APP_URL=http://192.168.1.50:8080
APP_TIMEZONE=UTC
APP_LOCALE=en-US
# データベース設定
DB_CONNECTION=mysql
DB_HOST=snipe-db
DB_PORT=3306
DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD=SecureAppPass_2026!
# MariaDB Rootパスワード
MYSQL_ROOT_PASSWORD=RootSecretPass_2026!
# 通知設定 ('log' に設定するか、SMTPリレーの認証情報を指定)
MAIL_DRIVER=log
# セッション有効期間(分単位、12000 = 約8日間)
SESSION_LIFETIME=12000
EXPIRE_ON_CLOSE=false
EOF
4. Docker Composeマニフェストの定義
docker-compose.yml ファイルを作成します。永続ストレージ用の名前付きボリューム、隔離されたブリッジネットワーク、そしてアプリケーションコンテナがデータベースのクエリ受付完了を待機できるように明示的なMariaDBヘルスチェックを含めています。
cat <<'EOF' > ~/snipe-it/docker-compose.yml
services:
snipe-db:
image: mariadb:10.11
container_name: snipeit-db
restart: unless-stopped
env_file: .env
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s
networks:
- snipeit-net
snipe-app:
image: snipe/snipe-it:latest
container_name: snipeit-app
restart: unless-stopped
depends_on:
snipe-db:
condition: service_healthy
env_file: .env
ports:
- "8080:80"
volumes:
- snipe_data:/var/lib/snipeit
- snipe_dumps:/var/lib/snipeit/dumps
networks:
- snipeit-net
volumes:
db_data:
snipe_data:
snipe_dumps:
networks:
snipeit-net:
driver: bridge
EOF
5. スタックの起動
デタッチドモードで両方のコンテナを起動します。
docker compose up -d
コンテナのログを追跡し、初期データベースマイグレーションの進行状況を確認します。
docker compose logs -f snipe-app
ログに Apache/2.4... configured -- resuming normal operations と表示されれば、Webサーバーの準備は完了です。
初期設定:初回起動と資産のモデリング
ブラウザで http://192.168.1.50:8080 にアクセスし、セットアップウィザードを開きます。
1. 初期Webセットアップの完了
- Pre-Flight Check(事前チェック): すべてのPHP拡張機能、ストレージディレクトリ、書き込み可能パスに緑色のチェックマークが付いていることを確認します。Next: Create Database Tables をクリックします。
- Create Database Tables(データベーステーブル作成): Snipe-ITが必要なスキーマを自動生成します。Next: Create User をクリックします。
- Admin Account & Branding(管理者アカウントとブランディング): サイト名(例:
Lab Ops Inventory)を入力します。管理用のユーザー名、メールアドレス、安全なパスワードを設定してください。
2. ハードウェアとコンポーネントのカテゴリ設計
Snipe-ITでは、資産(Assets)とコンポーネント(Components)が明確に区別されています。資産は1Uラックマウント筐体やマネージドスイッチのように固有のIDを持つ単体デバイスを指し、コンポーネントはメモリ、SSD、PCIeカードなど、それらの資産内部に取り付けられる交換可能なパーツを指します。
- カテゴリ(Settings > Categories):
Rack Servers、Network Switches、Storage Componentsなどの個別のグループを作成します。換装可能なパーツの場合は、カテゴリタイプを直接 Component に設定してください。 - ステータスラベル(Settings > Status Labels): デプロイの各段階を正確に追跡します。便利なデフォルト例としては、
Active / In Rack(配備可能)、Cold Spare / Shelf(配備可能)、Bench Testing(保留中)、Defective / RMA(配備不可)などがあります。 - 資産モデル(Settings > Asset Models): 具体的なハードウェア仕様を登録します(例:
Dell PowerEdge R730xd、Minisforum MS-01、Ubiquiti USW-Pro-24-PoE)。CPUソケットタイプ、拡張レーン数、電源ワット数などのカスタムフィールドセットを関連付けることも可能です。
3. ハードウェアのチェックインと関連付け
まず、Assets > Create New からメインホストを作成します(例: シリアル番号 4HK9Z22、MACアドレス 00:1E:67:D2:AB:34 を持つ pve-node-01)。次に、Components > Create New に移動し、メモリキット Samsung 32GB DDR4 2666MHz ECC RDIMM を数量 4 で登録します。
そのコンポーネントの Check Out をクリックし、4枚すべてを pve-node-01 に割り当てます。
後日ハードウェア構成を変更する際は、単にそのRAMモジュールを別のマシンへとチェックアウトし直すだけです。Snipe-ITが移行日やメンテナーのメモを自動的に記録してくれます。
4. ソフトウェアライセンスの整理
Licenses > Create New を開きます。Proxmox VEのコミュニティサブスクリプション、ドメイン登録情報、OSのプロダクトキーなどを追加しましょう。シート数(例: 2 CPUソケット分、または10台のアクティブVM分)を設定し、実際に稼働させているマシンにシートをチェックアウトします。Snipe-ITはサービス失効前に期限切れが近いことを通知してくれます。
検証とモニタリング:健全性確認、バックアップ、保守
インベントリ管理ツールは、ドライブ障害や定期的なコンテナアップデートを乗り越えてデータが確実に保持されてこそ真価を発揮します。
1. 稼働中サービスとヘルスチェックの確認
両方のコンテナが正常(healthy)なステータスを示していることを確認します。
docker compose ps
データベースデーモンに直接問い合わせを行い、接続を受け付けていることを確認します。
docker exec -it snipeit-db mariadb-admin ping -u root -p
2. 毎日のデータベースバックアップの自動化
ローカルコンテナのボリュームだけを唯一のセーフティネットにしてはいけません。MariaDBデータベースをダンプし、アップロードされた資産の領収書や写真をアーカイブするホストレベルのバックアップスクリプトを作成しましょう。
cat <<'EOF' > ~/snipe-it/backup-snipeit.sh
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="/var/backups/snipe-it"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
mkdir -p "${BACKUP_DIR}"
# ローカルの .env ファイルからDB認証情報を読み込み
export $(grep -E '^(DB_DATABASE|DB_USERNAME|DB_PASSWORD)=' ~/snipe-it/.env | xargs)
# 稼働中のコンテナから直接データベースをダンプ
docker exec snipeit-db mariadb-dump -u "${DB_USERNAME}" -p"${DB_PASSWORD}" "${DB_DATABASE}" \
| gzip > "${BACKUP_DIR}/snipeit_db_${TIMESTAMP}.sql.gz"
# アップロードされた領収書や資産の写真をアーカイブ
docker run --rm \
-v snipe_data:/source:ro \
-v "${BACKUP_DIR}:/backup" \
alpine tar -czf "/backup/snipeit_data_${TIMESTAMP}.tar.gz" -C /source .
# 過去30日分より古いアーカイブを削除
find "${BACKUP_DIR}" -type f -name "snipeit_*.*" -mtime +30 -delete
echo "[$(date)] バックアップが正常に完了しました: ${TIMESTAMP}"
EOF
chmod +x ~/snipe-it/backup-snipeit.sh
crontab -e でユーザークーロンを編集し、夜間実行のcronジョブを追加します。
0 3 * * * /home/ubuntu/snipe-it/backup-snipeit.sh >> /var/log/snipeit-backup.log 2>&1
3. バーコードを活用した監査の効率化
Snipe-ITには、QRコードおよび1次元バーコードの生成機能が標準で備わっています。Settings > Barcodes に移動し、QRcode または Code 128 を選択してください。標準的なAveryラベルシートに印刷し、サーバーキャディやスイッチのフロントパネルに貼り付ければ、物理ラックのメンテナンス時にスマートフォンでスキャンできるようになります。
わずか10秒のスキャンで、ラックの目の前にいながら詳細なハードウェアスペック、ファームウェアバージョン、保証情報を即座に確認できます。

