go2rtc + ffmpeg + Django + PostgreSQL を Docker で構成したシンプルなNVR。 RTSPカメラを1分セグメントで録画し、ブラウザからカレンダー検索・WebRTCライブ映像・タイムラプス生成を利用できます。
Features
余計なエージェントも検知AIも不要。録画して、探して、再生する。
ffmpegが再エンコードなし(-c copy)でRTSPストリームを1分ごとにMP4ファイルへ切り出します。Pi 5のCPUを最小限しか使いません。
録画がある日付を青くハイライト。カレンダーをクリックするだけで、その日の録画一覧を秒単位のタイムスタンプ付きで表示します。
go2rtcがRTSPをWebRTCに変換。プラグインなしのブラウザから、カメラの映像を低遅延で視聴できます。
カメラの台数に制限なし。Web UIからカメラを追加・削除すると、go2rtcの設定ファイルが自動更新されます。
カメラ断・ネットワーク不調・上流のフレーム停止を多段の鮮度チェックで検知し、再接続して録画を継続します。カメラ実機がダウンしている間もバックオフしながらリトライし、復帰すれば自動で録画を再開。1台の不調が他カメラに波及しない独立プロセス設計です。
セグメント完了を名前付きパイプ(FIFO)で即時にDB登録。プロセス強制終了などで通知が漏れた分も、ディスク上のファイルを定期走査して事後回収します。DBと録画ファイルの整合を保ち、二重登録は構造的に防止します。
recorder / go2rtc のログをホスト側へ日次・サイズローテーションで永続化。コンテナを再作成しても障害解析用のログが残り続けます。録画欠損の原因レイヤを切り分ける運用手順もドキュメント化しています。
カメラ・日時範囲・fps・サンプリング間隔を指定するだけでMP4を自動生成。専用workerが非同期処理するので録画や視聴を妨げません。
カメラごとに設定した保存日数(retain_days)を過ぎたセグメントは、Djangoの管理コマンドで一括削除できます。
postgres / django / recorder / timelapse-worker / go2rtc / nginx の6サービスをdocker compose up一発で起動。環境は.envだけで管理します。
Architecture
各コンポーネントは疎結合。カメラの追加もDB操作だけで完結します。
Quickstart
Docker と Git があれば動きます。
git clone https://github.com/Masakai/argus-nvr.git
cd argus-nvr
.env.example をコピーして編集します。
cp .env.example .env # .env の主な設定項目 DJANGO_SECRET_KEY=your-random-secret-key POSTGRES_PASSWORD=change-this-password RECORDER_API_KEY=random-32-char-string WEBRTC_CANDIDATE=192.168.1.100:8555 # PiのLAN IP CSRF_TRUSTED_ORIGINS=http://192.168.1.100:9000 ALLOWED_HOSTS=localhost,192.168.1.100
sudo mkdir -p /data/recordings
sudo chown $USER /data/recordings
docker compose up -d
http://<Pi_IP>:9000 にアクセス → 「カメラを追加」からRTSP URLを登録するだけです。録画が自動的に始まります。
Tech Stack
実績のある OSS のみで構成。特定クラウドへの依存なし。