Raspberry Pi 5 対応 · 完全OSS · Docker Compose

ラズパイで動く
軽量NVRシステム

go2rtc + ffmpeg + Django + PostgreSQL を Docker で構成したシンプルなNVR。 RTSPカメラを1分セグメントで録画し、ブラウザからカレンダー検索・WebRTCライブ映像・タイムラプス生成を利用できます。

クイックスタート GitHub で見る

Features

必要な機能を、シンプルに

余計なエージェントも検知AIも不要。録画して、探して、再生する。

🎥

1分セグメント録画

ffmpegが再エンコードなし(-c copy)でRTSPストリームを1分ごとにMP4ファイルへ切り出します。Pi 5のCPUを最小限しか使いません。

📅

カレンダー検索

録画がある日付を青くハイライト。カレンダーをクリックするだけで、その日の録画一覧を秒単位のタイムスタンプ付きで表示します。

📡

WebRTCライブ映像

go2rtcがRTSPをWebRTCに変換。プラグインなしのブラウザから、カメラの映像を低遅延で視聴できます。

🔌

マルチカメラ対応

カメラの台数に制限なし。Web UIからカメラを追加・削除すると、go2rtcの設定ファイルが自動更新されます。

🔁

セルフヒーリング録画

カメラ断・ネットワーク不調・上流のフレーム停止を多段の鮮度チェックで検知し、再接続して録画を継続します。カメラ実機がダウンしている間もバックオフしながらリトライし、復帰すれば自動で録画を再開。1台の不調が他カメラに波及しない独立プロセス設計です。

💾

録画の取りこぼし防止

セグメント完了を名前付きパイプ(FIFO)で即時にDB登録。プロセス強制終了などで通知が漏れた分も、ディスク上のファイルを定期走査して事後回収します。DBと録画ファイルの整合を保ち、二重登録は構造的に防止します。

📋

ログのホスト永続化

recorder / go2rtc のログをホスト側へ日次・サイズローテーションで永続化。コンテナを再作成しても障害解析用のログが残り続けます。録画欠損の原因レイヤを切り分ける運用手順もドキュメント化しています。

タイムラプス生成

カメラ・日時範囲・fps・サンプリング間隔を指定するだけでMP4を自動生成。専用workerが非同期処理するので録画や視聴を妨げません。

🗑️

自動クリーンアップ

カメラごとに設定した保存日数(retain_days)を過ぎたセグメントは、Djangoの管理コマンドで一括削除できます。

🐳

Docker Compose一発起動

postgres / django / recorder / timelapse-worker / go2rtc / nginx の6サービスをdocker compose up一発で起動。環境は.envだけで管理します。

Architecture

シンプルな6サービス構成

各コンポーネントは疎結合。カメラの追加もDB操作だけで完結します。

flowchart TD subgraph CAM["📷 RTSPカメラ"] C1["camera1\n192.168.1.101"] C2["camera2\n192.168.1.102"] C3["camera3 ..."] end subgraph G2["go2rtc"] G["RTSP受信 → WebRTC / RTSP再配信"] end subgraph REC["recorder"] R["ffmpeg -c copy\n1分セグメント録画"] end subgraph TLW["timelapse-worker"] T["ffmpeg\nタイムラプスMP4生成"] end subgraph NGX["nginx :9000"] N["リバースプロキシ\n/ → django\n/recordings/ → 録画MP4\n/hls/ → HLS\n/go2rtc/ → go2rtc"] end subgraph DJ["django + PostgreSQL"] D["カメラ管理 / セグメントDB\nWeb UI / 内部API"] end BROWSER["🌐 ブラウザ"] C1 & C2 & C3 -->|RTSP| G G -->|RTSP再配信 :8554| R G -->|WebRTC :8555| N R -->|POST /api/segments/| D T -->|DBポーリング / ジョブ取得| D D --- N N <-->|HTTP| BROWSER

Quickstart

5ステップで起動

Docker と Git があれば動きます。

1

リポジトリをクローン

git clone https://github.com/Masakai/argus-nvr.git
cd argus-nvr
2

環境変数を設定

.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
3

録画ディレクトリを作成

sudo mkdir -p /data/recordings
sudo chown $USER /data/recordings
4

起動

docker compose up -d
5

カメラを追加

http://<Pi_IP>:9000 にアクセス → 「カメラを追加」からRTSP URLを登録するだけです。録画が自動的に始まります。

動作確認済みハードウェア

  • Raspberry Pi 5 (4GB / 8GB)
  • x86_64 (Debian / Ubuntu)
  • atomcam2(RTSP有効化済み)
  • 一般的なIPカメラ(RTSP対応)

ソフトウェア要件

  • Docker Engine 24+
  • Docker Compose v2
  • 空きポート: 9000, 8555
  • 録画ストレージ(外付けUSB等)

ネットワーク要件

  • カメラとPiが同一LAN内
  • RTSPポート(554 or 8554)
  • インターネット接続不要
  • mDNSよりIPアドレス推奨

Tech Stack

技術スタック

実績のある OSS のみで構成。特定クラウドへの依存なし。

go2rtc
RTSP → WebRTC 変換
Go
ffmpeg
セグメント録画
C
Django
Web UI / API
Python
PostgreSQL
録画メタデータDB
SQL
timelapse-worker
タイムラプス生成
Python + ffmpeg
nginx
リバースプロキシ
C
Docker
コンテナ管理
Go