プログラミング
Show HN: CheapSecurity – Linux SBC向け軽量セルフホスト型CCTV
Show HN: CheapSecurity – Lightweight, Self-Hosted CCTV for Linux SBCs (github.com)
要約
CheapSecurityは、Linuxベースのシングルボードコンピュータ(SBC)と標準USBウェブカメラ向けの軽量なセルフホスト型CCTVソリューションです。ビデオデータを完全に管理下に置くことで、ホームモニタリングのための手頃でプライバシー重視の代替手段を提供します。このプロジェクトは、既存のハードウェアを活用し、クラウドサブスクリプションなしで、低消費電力デバイスでも効率的に動作するように設計されています。
全文翻訳
CheapSecurity
このプロジェクトは、Linuxベースのシングルボードコンピュータ(SBC)および標準USBウェブカメラ向けに設計された、軽量でセルフホスト型のCCTVソリューションを提供します。ビデオデータを完全に管理下に置くことで、ホームモニタリングのための手頃でプライバシー重視の代替手段を提供します。
プロジェクトの哲学
プライバシーファースト:すべての映像をローカルに保存することで、サードパーティのクラウドサブスクリプションの必要性をなくし、データがネットワークから離れることを保証します。
費用対効果:余っているLinuxボードやUSBウェブカメラなどの既存のハードウェアを活用して、継続的な料金なしで完全に機能する監視システムを構築します。
ミニマリストアーキテクチャ:ソフトウェアは、低消費電力デバイスで効率的に実行できるように最適化されており、エントリーレベルのハードウェアでも高いパフォーマンスを保証します。
主な機能
ハードウェア非依存:幅広い標準USBウェブカメラと高い互換性があります。
リソース効率:Linuxベースのボード(例:Raspberry Pi、Orange Pi、または類似のSBC)に特化して最適化されています。
データ主権:ストレージパス、保持ポリシー、アクセス方法を完全に制御できます。
簡単なデプロイ:迅速なセットアップと簡単なメンテナンスのために設計されています。
機能
ライブMJPEGストリーム(Webダッシュボード付き)
モーション検知(フレーム差分法)
プリモーションバッファ付き自動録画
モーション開始時のスナップショット付きメールアラート
Telegram連携:モーション検知後に自動ビデオアップロード
ボットコマンド:/snapshot、/video <秒数>、/help
ナイトモード低照度強化(ソフトウェアCLAHE + 明るさ/コントラストブースト)
録画の一括操作:すべて選択、Telegramへの送信、ZIPダウンロード、削除
期間、総サイズによるストレージクリーンアップ、および緊急低ディスク容量クリーンアップ
systemdによる自動起動準備完了
GNU AGPLv3ライセンス
要件
Python 3.10以降
V4L2サポート付きOpenCV(以下のインストールオプションを参照)
USBウェブカメラ(デフォルトは/dev/video0)
オプション:Telegram通知用のTelegramボットトークン
オプション:メールアラート用のSMTP認証情報
クイックスタート
OpenCVが利用可能か確認します:
python3 -c "import cv2; print(cv2.__version__)"
OpenCVがインストールされていない場合は、2つのオプションがあります。
オプションA — システムのOpenCVパッケージを使用する(ARMボード、例:Odroid XU4で推奨。通常、ボードに最適化されたプリビルドシステムパッケージがあります)。
オプションB — pip経由でOpenCVをインストールする(x86/amd64マシン、またはシステムパッケージがない場合に便利)。GUIは不要なため、opencv-python-headlessを使用します。
仮想環境を作成してアクティベートし、アプリをインストールします。
オプションA:システムOpenCV(ARMに推奨)
これにより、システムサイトパッケージを認識できるvenvが作成されるため、venv内でシステムcv2が利用可能になります。
cd $HOME/CheapSecurity
python3 -m venv venv --system-site-packages
source venv/bin/activate
pip install -e .
オプションB:すべてpipでインストールする
システムOpenCVがない場合、またはスタンドアロンvenvを好む場合に使用します。
cd $HOME/CheapSecurity
python3 -m venv venv
source venv/bin/activate
pip install opencv-python-headless
pip install -e .
注意:一部の古いARMボードでは、pipのopencv-python-headlessホイールが利用できないか、遅い場合があります。その場合は、代わりにディストリビューションのパッケージマネージャーからOpenCVをインストールし、オプションAを使用してください。
ウェブカメラデバイスを見つけます(通常は/dev/video0):
v4l2-ctl --list-devices
config.json.exampleをconfig.jsonにコピーして編集します。
cp config.json.example config.json
nano config.json
カメラデバイス、解像度、フレームレートを設定します。
メールアラートが必要な場合は、SMTP認証情報を入力します。
Telegramアップロードが必要な場合は、TelegramボットトークンとチャットIDを入力します。
セキュリティ:config.jsonは.gitignoreにリストされており、コミットしてはなりません。パスワードとトークンが含まれています。常にconfig.jsonを編集し、config.json.exampleは編集しないでください。新しい設定を追加する場合は、両方のファイルを更新して、例が同期したままになるようにしてください。
アプリを実行します。
./venv/bin/python -m cheapsecurity.app
ブラウザでダッシュボードを開きます。
http://<odroid-ip>:5000
設定
config.jsonを編集します。
セクション | キー | 説明
------- | -------- | --------
camera | device | V4L2デバイスインデックス(0 = /dev/video0)
camera | width, height, fps | キャプチャ解像度とフレームレート
camera | night_mode | 低照度強化を有効にする
camera | night_mode_fps | ナイトモードでのターゲットFPS(カメラが無視する場合があります)
camera | night_mode_gain | ナイトモードでのターゲットアナログゲイン(カメラが無視する場合があります)
camera | night_mode_brightness | ナイトモードでの明るさブースト
camera | night_mode_contrast | ナイトモードでのコントラストブースト
motion | threshold | ピクセル差分閾値(0-255)
motion | min_area | モーションをトリガーする最小輪郭面積(フル解像度ピクセル)
motion | cooldown_seconds | モーション停止後も録画を続ける秒数
motion | scale | モーション検知のためのダウンサンプリング係数(CPUを節約)
recording | dir | ビデオが保存されるディレクトリ
recording | max_duration_seconds | 1クリップの最大長
recording | pre_buffer_seconds | モーション前のバッファ秒数
recording | codec | 推奨FourCCコーデック(低CPUの場合はMJPG、ファイルサイズが小さい場合はmp4v)
notifications | enabled | モーション時にメールアラートを送信する
notifications | smtp | SMTPサーバー、ポート、ユーザー名、パスワード、TLS
notifications | from, to, subject | メール送信者/受信者/件名(複数の受信者の場合は["a@...", "b@..."]を使用)
notifications | min_interval_minutes | アラートメール間の最小時間
telegram | enabled | モーション録画後にTelegramにビデオを送信する
telegram | bot_token, chat_id | TelegramボットAPIトークンと宛先チャット
telegram | send_video | ビデオファイルを自動アップロードするかどうか
telegram | min_interval_minutes | Telegramアップロード間の最小時間
telegram | poll_commands | /snapshot、/video、/helpボットコマンドを有効にする
storage | max_age_days | この期間より古い録画を削除する(デフォルト3日=72時間)
storage | max_size_gb | 合計サイズがこれを超えた場合に最も古いファイルを削除する
storage | cleanup_interval_minutes | ストレージクリーンアップの実行頻度
storage | delete_old_on_startup | falseの場合、アプリ再起動時に古い録画を保持する
storage | emergency_free_space_gb | 空きディスク容量がこれより少なくなった場合、新しい録画の前に古い録画を削除する
storage | emergency_delete_count | 緊急クリーンアップで削除する最も古い録画の数
web | host, port | ダッシュボードのバインドアドレスとポート
web | stream_scale | ライブストリームのダウンサンプリング係数(帯域幅/CPUを節約)
web.auth | enabled, username, password | オプションのHTTP Basic認証
Telegramの設定
1. ボットを作成する
Telegramを開き、@BotFatherにメッセージを送信します。/newbotを送信し、表示名とユーザー名を選択するプロンプトに従います。ボットトークン(123456789:ABCdefGHIjklMNOpqrsTUVwxyzのような形式)をコピーします。このトークンは秘密にしておいてください。誰でもこのトークンであなたのボットを制御できます。
2. チャットIDを取得する
新しいボットとプライベートチャットを開始し、任意のメッセージ(例:/start)を送信します。
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
<YOUR_BOT_TOKEN>を実際のトークンに置き換えて、ブラウザでこのURLを開きます。
"chat":{"id":123456789 のような "chat":{"id":<チャットID> を探します。数字がチャットIDです。getUpdatesが空の場合は、ボットにもう一度メッセージを送信して更新してください。グループチャットを使用したい場合は、まずボットをグループに追加してメッセージを送信してください。グループの場合、チャットIDは負の値になります。チャットIDは、グループの場合はマイナス記号を含めて正確にコピーしてください。
3. アプリを設定する
config.jsonのtelegramセクションに入力します。
"telegram": {
"enabled": true,
"bot_token": "123456789:ABCdefGHIjklMNOpqrsTUVwxyz",
"chat_id": "123456789",
"send_video": true,
"min_interval_minutes": 5,
"poll_commands": true
}
その後、サービスを再起動します。
sudo systemctl restart cheapsecurity@$(whoami).service
自動アップロード
モーションクリップが保存されると、ビデオはTelegramチャットにアップロードされます。アップロードはmin_interval_minutesによってレート制限されます。
ボットコマンド
設定したチャットから以下を送信します。
/snapshot — 現在のカメラ画像を受信します
/video 10 — 10秒間のビデオを録画して送信します(1〜60秒、デフォルト10秒)
/help — コマンドリストを表示します
ボットは設定したchat_idにのみ応答します。モーションが優先されます。もしシステムが既にモーション検出のために録画中であれば、/videoリクエストはそれを中断しません。ボットはモーションビデオが進行中であり、自動的にアップロードされると返信します。
メールアラート
config.jsonのnotificationsセクションを設定します。モーション時の画像が...