このプロジェクトについて
UniPlateTrackerは、UniFi Protectカメラによってキャプチャされたライセンスプレートを追跡するためのセルフホスト型プライベートダッシュボードです。UniFi NVRからWebhook経由で検出イベントを受け取り、PostgreSQLデータベースに記録し、Webインターフェースを通じて車両活動の閲覧、検索、分析を行います。サムネイルとビデオファイルはユーザーのサーバーに保存され、UK DVLAルックアップは唯一の外部データソースとして説明されています。
機能
- リアルタイムイベント処理: ライセンスプレート検出はUniFi ProtectのWebhookから到着し、即座に処理されます。
- オンデマンドビデオキャプチャ: 独立したNode.jsワーカーが、カメラのRTSPストリームから各検出の短いクリップを記録します。事前および事後のバッファリングは、別のバッファマネージャープロセスによって処理されます。
- オプションのDVLA統合(UK): メーカー、色、税金、MOTステータスなどの車両詳細を取得します。国際モードではUK固有の機能を無効にできるため、他の地域でもアプリを実行できますが、ENABLE_INTERNATIONAL_APIが設定されていない限り、非UKプレートは「不明」と表示されます。
- 管理ダッシュボード: チャートと使用統計を含む保護された管理エリア。階層的な管理アカウントがあり、初期管理者は他の管理者のアクセスを付与または取り消すことができます。これらのアクションは、レビュー用の監査トレイルに書き込まれます。
- 検出テーブル: 密度が高く、並べ替え可能なテーブルで、高速な読み取りを目的としています。並べ替えとフィルタリングはデータベースで実行されるため、順序は現在のページだけでなく、結果セット全体に適用されます。画面が狭い場合は、カードリストにリフローします。
- ステータスハイライト: 有効なMOTを持つ課税車両は視覚的に目立たず、期限切れ、未課税、SORN車両はハイライトされます。「DVLA記録なし」は、明確な空の破線チップとして表示されるため、欠落した情報がきれいな結果として読み取られることはありません。
- アクセシビリティ: ラベル付きコントロール、キーボード操作可能な並べ替えとページング、テーブルのaria-sort、およびprefer-reduced-motionサポート。プロジェクトは、ゼロ違反で監査されたと述べています。ライトモードとダークモードは、システム設定に従います。
技術スタック
Next.js 16(App Router)とTypeScript、React 19、Tailwind CSS v4、shadcn/ui。Next.js APIルートと独立したNode.jsワーカー/バッファマネージャー。ストレージにはPostgreSQL、ビデオ処理にはFFmpeg、UniFi ProtectのWebhookとDVLA APIとの統合。Tailwind v4はテーマをCSSから取得するため、tailwind.config.tsはありません。デザイントークン、プレート、ステータススタイルは、src/app/globals.cssの@themeブロックにあります。
デプロイメント
文書化されたベースラインは、UVC-AI-Proカメラ(デバイスバージョン5.1.57)とUniFi Protect 9.4.19を備えたDebian 12です。他の構成も動作すると予想されています。2つの方法が説明されています。
- 手動インストール: Node.js 20+、PostgreSQL、FFmpegをインストールします。例の環境ファイルを.env.localにコピーし、POSTGRES_URLやSESSION_SECRETなどの値を入力します。ビデオキャプチャを有効にする場合は、バッファと最終キャプチャディレクトリを作成します。アプリとワーカーの両方の依存関係をインストールします。npm run db:initを実行してテーブルを作成し、最初の管理者のメールを登録します。アプリをビルドして起動し、必要に応じてPM2で永続化します。
- Docker: コンポーズファイルと環境テンプレートをダウンロードし、.env.localに名前を変更します。POSTGRES_URL、SESSION_SECRET、NEXTAUTH_URL(localhostではなくサーバーのネットワークIPを使用)を入力します。ワンオフコンテナを実行してデータベースを初期化し、最初の管理者を作成します。その後、Docker Composeでプルして起動します。Webインターフェースはポート3000、Webhookエンドポイントはポート4000で文書化されています。
UniFi Protectでは、Settings > System > Other Settings > Alarm Managerでアラームを作成し、ID > LPRで未知および既知の車両をトリガーし、LPRカメラにスコープし、サムネイルを有効にしてアプリの/webhook URLを指します。
トラブルシューティングノート(READMEより)
検出に「No clip」と表示されるのは、検出とキャプチャが別々のパスであるためです。Webhookは行を書き込みますが、ワーカーはRTSPから記録するため、検出が到着し続けてもキャプチャが失敗する可能性があります。確認すべき点は、VIDEO_FINAL_CAPTURE_PATH内の最新のファイル日付、FFmpegがまだインストールされていて期待されるパスにあるか、カメラの認証情報やRTSP URLがまだ有効か、両方のバックグラウンドプロセスが生きているか、アプリを実行しているユーザーがキャプチャディレクトリを読み取れるかです。破線の「No clip」タイルは、クリップが期待されたが欠落していることを意味し、カメラアイコンのみは、検出がそれを参照しなかったことを意味します。ビデオとサムネイルのリクエストは、ファイル名に文字、数字、ドット、ハイフン、アンダースコアのみが含まれ、.mp4または.jpg拡張子を持つ場合にのみ404を返します。正規化時に変更されるパスは拒否されるため、ディレクトリトラバーサルはキャプチャディレクトリを脱出するのではなく失敗します。車両詳細が「不明」と表示されるのは、DVLAがその登録に対して記録を持っていないか、ルックアップが失敗したことを意味します。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.