リアルタイムで流星を検出し、記録するシステムです。MP4動画とRTSPストリームの両方に対応しています。
- MP4動画からの流星検出 - 録画した動画ファイルから流星を検出
- RTSPストリームのリアルタイム検出 - ライブカメラストリームから流星を自動検出
- Webプレビュー - ブラウザで検出状況をリアルタイム確認
- ダッシュボード - 複数カメラの検出状況を一画面で表示
- YouTube Live配信 - ダッシュボードからワンクリックでカメラ映像をYouTube Liveに配信
- Docker対応 - 複数カメラを並列監視可能
- 多地点三角測量 - 複数拠点の同時観測から流星の3D軌道(高度・緯度経度・速度)を算出
複数の観測拠点から同一流星を同時検出し、スキューライン最近接点アルゴリズムで3D空間上の軌道を算出します。結果はDeck.gl + MapLibre GLによるインタラクティブな3Dマップで可視化されます。SonotaCo Network / Global Meteor Network と同じ三角測量原理を採用しています。
- 3D軌道可視化 - 流星の始点・終点を高度付きで3D表示、地表面への投影線も描画
- 高度スケール調整 - スライダーで高度方向の倍率を1×〜100×に変更可能
- 観測拠点FOV表示 - 各カメラの視野角(FOV)を地図上にポリゴン表示
- 信頼度フィルター - 三角測量の信頼度(missdistance)でフィルタリング
- 速度・高度表示 - 流星の飛行速度(km/s)、高度(km)を一覧表示
- クリックで飛行 - 一覧の流星をクリックするとカメラがその軌道にフライト
拠点A (既存Docker環境) 拠点B (既存Docker環境)
├─ camera1..N (既存) ├─ camera1..N (既存)
└─ station_reporter (新) └─ station_reporter (新)
│ HTTP POST │ HTTP POST
└──────► triangulation_server ◄┘
│
├─ イベントマッチング(時刻・角度相関)
├─ 3D三角測量(スキューライン最近接点)
└─ Deck.gl + MapLibre 3Dマップ表示
# 仮想環境で依存ライブラリをインストール
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# デモサーバーを起動(合成データ3拠点・5流星入り)
python demo_triangulation.py
# ブラウザで確認
# http://localhost:8090/{
"station_id": "fuji-north",
"station_name": "富士北麓観測所",
"latitude": 35.3606,
"longitude": 138.7274,
"altitude": 2400.0,
"triangulation_server_url": "https://tri.example.com",
"api_key": "secret-key",
"cameras": {
"camera1": {
"azimuth": 90.0, "elevation": 45.0, "roll": 0.0,
"fov_horizontal": 90.0, "fov_vertical": 60.0,
"resolution": [960, 540]
}
}
}詳細は documents/TRIANGULATION.md を参照してください。
このシステムの内部しきい値は px(ピクセル)と px/s で定義されていますが、
ATOM Cam 2 を 水平画角120度、配信解像度を 1920x1080 として見ると、
次のように読み替えられます(現在の標準設定: medium)。
- 最小軌跡長
20pxは、距離300kmの流星で 約6.5km の見かけ移動に相当 - 最小速度
50px/sは、距離300kmの流星で 約16.4km/s の見かけ速度に相当 - 距離
100kmなら同じ条件は 約2.2km、約5.5km/s
つまり直感的には、medium は「数km以上の見かけ移動」かつ「数km/s以上の速い発光体」を
主に検出する設定です。
補足:
- 流星までの距離は仰角で大きく変わるため、同じ
pxでも km換算値は変わります SCALE=0.5でも、検出座標は元解像度に戻して判定しているため、この換算で問題ありません
.
├── meteor_detector.py # MP4動画からの流星検出
├── meteor_detector_rtsp.py # RTSPストリームのリアルタイム検出(CLI版)
├── meteor_detector_rtsp_web.py # RTSPストリームのリアルタイム検出(Webプレビュー付き)
├── meteor_detector_realtime.py # RTSP検出の共通コンポーネント
├── meteor_detector_common.py # 検出共通ユーティリティ
├── detection_state.py # 検出ループのグローバル状態 (v3.6.2+)
├── detection_filters.py # 感度プリセット・鳥フィルタ・薄明パラメータ (v3.6.2+)
├── recording_manager.py # 手動録画の ffmpeg ジョブ管理 (v3.6.2+)
├── http_handlers.py # MJPEGHandler / ThreadedHTTPServer (v3.6.2+)
├── astro_utils.py # 検出ウィンドウ(日没〜日出)判定
├── astro_twilight_utils.py # 薄明期間判定(civil / nautical / astronomical)(v3.5.0+)
├── dashboard.py # 複数カメラのダッシュボード
├── dashboard_routes.py # 検出一覧・削除・統計・設定のルート実装
├── dashboard_camera_handlers.py # スナップショット・マスク更新・録画・YouTube 配信
├── dashboard_config.py # バージョン・設定定数
├── dashboard_templates.py # HTML テンプレート
├── dashboard_templates_settings.py # 設定画面テンプレート
├── detection_store.py # SQLite CRUD + JSONL 増分同期 (v3.6.0+)
├── generate_compose.py # streamersからdocker-compose.yml/go2rtc.yamlを自動生成
├── migrate_camera_dirs.py # v3.11.0 カメラ名インデックス化マイグレーション
├── convert_detections_mp4_to_mov.py # 検出クリップのMP4/MOV変換
├── scripts/ # 運用スクリプト群(SCRIPTS_REFERENCE.md 参照)
├── streamers # RTSPカメラURL一覧
├── docker-compose.yml # Docker Compose設定
├── Dockerfile # 検出コンテナ用Dockerfile
├── Dockerfile.dashboard # ダッシュボード用Dockerfile
├── meteor-docker.sh # Docker管理スクリプト
├── requirements.txt # Python依存ライブラリ
├── requirements-docker.txt # Docker用依存ライブラリ
├── documents/ # 詳細ドキュメント一式(GitHub Pages 公開)
└── README.md # このファイル
documents/ 配下のリファレンスは GitHub Pages でも公開されています。
- ARCHITECTURE.md - システム構成・コンポーネント依存・処理フロー
- API_REFERENCE.md - 全 HTTP エンドポイント仕様
- CONFIGURATION_GUIDE.md - 環境変数・設定チューニング
- SETUP_GUIDE.md - 初回セットアップ手順
- OPERATIONS_GUIDE.md - 運用手順・バージョン別マイグレーション
- SECURITY.md - セキュリティ方針・パストラバーサル対策
- DETECTION_TUNING.md - 検出感度チューニング
- DETECTOR_COMPONENTS.md - 検出エンジン内部モジュール仕様
- DETECTION_STORE.md - SQLite 検出結果ストレージ仕様(v3.6.0+)
- DOCKER_ARCHITECTURE.md - Docker コンテナ構成
- ASTRO_UTILS.md - 天文計算モジュール
- SCRIPTS_REFERENCE.md - 運用スクリプトリファレンス
- TRIANGULATION.md - 多地点三角測量システム
- Python 3.11以上
- OpenCV 4.5以上
- NumPy 1.20以上
# 仮想環境の作成(推奨)
python -m venv .venv
source .venv/bin/activate # macOS/Linux
# .venv\Scripts\activate # Windows
# 依存ライブラリのインストール
pip install opencv-python numpy
# Dockerを使う場合は不要です# 基本的な使い方
python meteor_detector.py input.mp4
# 出力動画を生成
python meteor_detector.py input.mp4 --output detected.mp4
# プレビュー表示しながら検出
python meteor_detector.py input.mp4 --preview
# 検出感度を調整
python meteor_detector.py input.mp4 --sensitivity high
# 取りこぼし低減モード(短く暗い流星向け)
python meteor_detector.py input.mp4 --sensitivity faint
# 火球検出モード(長時間・長距離・明るい流星)
python meteor_detector.py input.mp4 --sensitivity fireballlow- 誤検出を減らす(明るい流星のみ)medium- バランス(デフォルト)high- 暗い流星も検出faint- 取りこぼし低減(短く暗い流星向け、diff_threshold=16/min_brightness=150/min_area=5/max_distance=90、誤検出は増えやすい)fireball- 火球検出(長時間・長距離・明滅対応)
# 高速モード(解像度半分 + 1フレームおき)
python meteor_detector.py input.mp4 --fast
# 処理解像度を半分に(約4倍速)
python meteor_detector.py input.mp4 --scale 0.5
# 1フレームおきに処理(約2倍速)
python meteor_detector.py input.mp4 --skip 2# RTSPストリームを監視(Webプレビュー付き)
python meteor_detector_rtsp_web.py rtsp://192.0.2.100:554/stream --web-port 8080
# ブラウザでプレビューを確認
# http://localhost:8080/単体カメラのWebプレビューでは、マスクの表示/更新、スナップショット取得、再起動要求、ストリーム・検出・マスク状態の確認ができます(/stats に実効FPS runtime_fps を含む)。
python meteor_detector_rtsp_web.py \
rtsp://192.0.2.100:554/stream \
--output ./detections \
--sensitivity medium \
--scale 0.5 \
--buffer 15 \
--web-port 8080 \
--camera-name "camera1" \
--extract-clips # クリップ動画を保存(デフォルト)RTSP Web版では --buffer は上限値として扱われ、検出前後1秒 + 最大検出時間(デフォルト12秒)に合わせて自動調整されます。
検出した流星のクリップ動画(MOV/H.264)を保存するかどうかを制御できます:
# クリップ動画を保存(デフォルト)
python meteor_detector_rtsp_web.py rtsp://... --extract-clips
# クリップ動画を保存しない(コンポジット画像のみ)
python meteor_detector_rtsp_web.py rtsp://... --no-clipsストレージ容量を節約したい場合は --no-clips を使用してください。
ダッシュボード上部の「全カメラ設定」から /settings を開くと、
複数カメラに対して設定を一括反映できます。
GET /settings: 設定UIページGET /camera_settings/current: 現在値を取得POST /camera_settings/apply_all: 全カメラへ一括適用
一括適用はカメラ側 POST /apply_settings を呼び出して反映します。
- 即時反映(再起動不要):
diff_threshold,min_brightness,min_linearityなど検出ロジックのしきい値nuisance_*,min_track_points,max_stationary_ratioなど誤検出抑制パラメータ- マスク更新系(
mask_dilate,nuisance_dilate,mask_*/nuisance_*の画像パス)
- 自動再起動で反映(再ビルド不要):
sensitivity,scale,buffer,extract_clips
起動時に効く設定は output/runtime_settings/<camera>.json に保存され、
コンテナ再起動後も維持されます。
この <camera> には内部名が使われ、CAMERA_NAME_DISPLAY で表示名を付けても
ディレクトリ名・マスク保存名・ランタイム設定ファイル名は内部名のままです。
python meteor_detector.py input.mp4 --realtime--realtime を付けると Web版と同じ検出ロジックを使って再検出します。
マスクを使う場合は --mask-image / --mask-from-day / --mask-dilate / --mask-save が利用できます。
検出結果のクリップを一括変換したい場合は convert_detections_mp4_to_mov.py を使います。
ffmpeg が必要です。
# detections/ 配下の MP4 を MOV に変換
python convert_detections_mp4_to_mov.py --mov
# 出力先を指定(ディレクトリ構成は維持)
python convert_detections_mp4_to_mov.py --mov --output ./output
# 再エンコードせずにコンテナだけ変換
python convert_detections_mp4_to_mov.py --mov --copy
# 既存ファイルを上書き
python convert_detections_mp4_to_mov.py --mov --overwritestreamers ファイルにRTSP URLを1行1カメラで記載:
# コメント行(#で始まる)
rtsp://user:pass@192.0.2.25/live
rtsp://user:pass@192.0.2.3/live
rtsp://user:pass@192.0.2.11/live
| 区切りでマスク画像、表示名、YouTube配信キーを指定できます。
rtsp://user:pass@192.0.2.25/live | camera1.jpg | 東側
rtsp://user:pass@192.0.2.3/live | camera2.jpg | 南側
rtsp://user:pass@192.0.2.11/live || 西側 | youtube:xxxx-xxxx-xxxx-xxxx
- 表示名はダッシュボードや単体カメラUIの表示専用です
- 保存先ディレクトリ、
output/runtime_settings/<camera>.json、マスク画像名は内部名を使います youtube:KEYを指定したカメラはダッシュボードに「YouTube配信」ボタンが表示されます
昼間画像による自動マスク(任意)
RTSP URLの末尾に | 昼間画像パス を付けると、generate_compose.py 実行時に
除外マスクを生成してコンテナに同梱します(他PCへの展開が簡単になります)。
なるべく雲のない青空の画像を使ってください。
マスクを使うと、木の枝や電柱・建物の輪郭、地上の常灯(街灯など)、車のヘッドライトの建物への反射による誤検出を軽減できます。
rtsp://user:pass@192.0.2.25/live | camera1.jpg
rtsp://user:pass@192.0.2.3/live | camera2.jpg
rtsp://user:pass@192.0.2.11/live
- 右側の画像は相対パスでOK(
streamersと同じフォルダ基準) - マスク生成には OpenCV が必要です(ローカル実行時)
generate_compose.py は streamers ファイルから docker-compose.yml を自動生成するツールです。
# streamersファイルからdocker-compose.ymlを生成(基本)
python3 generate_compose.py
# WebRTCライブ表示込みで生成(go2rtc も生成)
python3 generate_compose.py --streaming-mode webrtc
# 全オプション指定の例
python3 generate_compose.py \
--sensitivity fireball \ # 火球検出モード
--scale 0.5 \ # 処理解像度スケール
--buffer 15 \ # バッファ秒数
--exclude-bottom 0.0625 \ # 下部除外範囲
--extract-clips true \ # クリップ動画保存
--streaming-mode webrtc \ # ダッシュボードのライブ表示をWebRTC化
--latitude 35.3606 \ # 観測地点の緯度(デフォルト: 富士山頂)
--longitude 138.7274 \ # 観測地点の経度(デフォルト: 富士山頂)
--enable-time-window true \ # 天文薄暮期間のみ検出
--mask-output-dir masks \ # 生成マスクの保存先
--base-port 8080 # ベースポート番号補足: streamers に | 昼間画像パス を付けた場合、generate_compose.py 実行時に
マスクを自動生成して --mask-output-dir に保存します。OpenCV がない環境では警告を表示してマスク生成のみスキップし、Compose 生成自体は継続します。
--streaming-mode webrtc を使うと、dashboard + camera1..N に加えて go2rtc サービスと go2rtc.yaml も生成されます。go2rtc の webrtc.candidates は既定でローカル IP を自動検出して設定し、必要な場合だけ --go2rtc-candidate-host <host-ip> で上書きできます。
--enable-time-window true を指定すると、前日の日の入りから翌日の日の出までの期間のみ検出処理を実行します。
それ以外の時間帯はストリーム表示のみで、検出処理は行いません。
# 東京の座標で天文薄暮期間のみ検出
python3 generate_compose.py \
--latitude 35.6762 \
--longitude 139.6503 \
--enable-time-window true
# デフォルト(富士山頂)で天文薄暮期間のみ検出
python3 generate_compose.py --enable-time-window trueダッシュボード(http://localhost:8080/)に検出時間帯が表示されます。
検出時間の計算には、サーバー設定(LATITUDE / LONGITUDE)の座標を使用します。
Dockerシステムの起動・管理には3つの方法があります:
最も簡単な方法です。日常的な操作はこのスクリプトを使用してください。
./meteor-docker.sh start # 起動
./meteor-docker.sh stop # 停止
./meteor-docker.sh status # 状態確認(検出件数も表示)
./meteor-docker.sh logs # ログ確認
./meteor-docker.sh logs camera1 # 特定カメラのログ
./meteor-docker.sh restart # 再起動
./meteor-docker.sh build # 再ビルド
./meteor-docker.sh rebuild # ビルドして再起動
./meteor-docker.sh generate # docker-compose.ymlを再生成
./meteor-docker.sh clean # 古い検出結果を削除(7日以上前)
./meteor-docker.sh cleanup # 未使用のDockerイメージ・コンテナを削除generate コマンドはオプションも渡せます:
./meteor-docker.sh generate --enable-time-window true --latitude 35.6762 --longitude 139.6503より細かい制御が必要な場合や、Docker Composeの全機能を使いたい場合:
# ビルドと起動
docker compose build
docker compose up -d
# 個別サービスの操作
docker compose restart camera1 # camera1のみ再起動
docker compose logs -f dashboard # ダッシュボードのログ
docker compose stop camera2 # camera2のみ停止
# 完全な停止とクリーンアップ
docker compose down # コンテナ削除
docker compose down -v # ボリュームも削除設定を変更して docker-compose.yml を再生成する場合:
# 設定を変更して再生成
python3 generate_compose.py --enable-time-window true --sensitivity fireball
# 再起動して反映
docker compose up -d- 日常操作:
meteor-docker.shを使用(簡潔で分かりやすい) - 設定変更:
generate_compose.pyまたはmeteor-docker.sh generateで再生成 - 個別制御:
docker composeコマンドを直接使用 - トラブル時:
docker composeでより詳細な情報を取得
基本的には meteor-docker.sh だけで全ての操作が可能です。
Dockerイメージは再ビルドの度に蓄積されるため、定期的なクリーンアップを推奨します。
# このプロジェクトの未使用イメージ・コンテナを削除
./meteor-docker.sh cleanup安全性の保証:
meteor-docker.shの全てのコマンドは他のDockerプロジェクトに一切影響を与えません。
- 全てのコマンドが
docker compose経由で実行され、カレントディレクトリのdocker-compose.ymlのみを参照します cleanupコマンドはdocker compose config --imagesで取得したイメージ名のみを処理対象とします- グローバルなDockerコマンド(
docker system prune等)は使用していません - ファイル操作も全て
./detectionsディレクトリ内のみです
注意事項:
cleanupコマンドはこのプロジェクトのみを対象としますdocker-compose.ymlで定義されているイメージ名のみを処理対象とします- 現在使用中のイメージは削除されません
buildコマンド実行後にcleanupを実行することを推奨します
全てのDockerリソースをクリーンアップしたい場合:
# 警告: 他のプロジェクトにも影響します
docker system prune -a # 全未使用リソースを削除- ダッシュボード(全カメラ一覧): http://localhost:8080/
- カメラ1: http://localhost:8081/
- カメラ2: http://localhost:8082/
- カメラ3: http://localhost:8083/
検出結果は ./detections/ に保存されます。
meteor_detector.py と meteor_detector_rtsp_web.py の両方で、以下のパラメータを調整可能です。
@dataclass
class DetectionParams:
diff_threshold: int = 30 # フレーム差分の閾値
min_brightness: int = 200 # 最小輝度
min_length: int = 20 # 最小長さ(ピクセル)
max_length: int = 5000 # 最大長さ
min_duration: int = 2 # 最小継続フレーム数
max_duration: int = 300 # 最大継続フレーム数
min_speed: float = 3.0 # 最小速度(ピクセル/フレーム)
min_linearity: float = 0.7 # 最小直線性(0-1)
min_area: int = 5 # 最小面積
max_area: int = 10000 # 最大面積
exclude_bottom_ratio: float = 1/16 # 下部の除外範囲(0-1)コマンドラインから一部パラメータを変更できます:
python meteor_detector.py input.mp4 \
--diff-threshold 40 \
--min-brightness 220 \
--min-length 30 \
--min-speed 8.0 \
--exclude-bottom 0.1input_meteors/
├── meteor_001_frame012345.jpg # 流星検出フレーム(マーク付き)
├── meteor_001_frame012345_original.jpg # 元画像
├── meteor_001_composite.jpg # 比較明合成(マーク付き)
├── meteor_001_composite_original.jpg # 比較明合成(元画像)
├── meteor_002_frame023456.jpg
└── ...
input.meteors.json # 検出結果のJSON
detections/camera1/
├── meteor_20240101_123456.mp4 # 流星イベントの動画クリップ(--extract-clips時)
├── meteor_20240101_123456_composite.jpg # 比較明合成(マーク付き)
├── meteor_20240101_123456_composite_original.jpg
└── detections.jsonl # 検出ログ(JSONL形式)
--extract-clips 有効時の標準出力は H.264 / avc1 の .mp4 です。--no-clips を指定した場合、クリップ動画は生成されません(コンポジット画像とログのみ)。
- マスク適用 - 除外マスクで木や建物などの固定物体を検出対象から外す
- フレーム差分 - 前フレームとの差分から移動物体を検出
- 輝度フィルタ - 明るい物体のみを抽出
- 物体追跡 - 時間的に近い物体を追跡
- 特徴判定 - 長さ、速度、直線性から流星を判定
- 信頼度計算 - 各特徴をスコア化して総合信頼度を算出
pytest -qバージョン別のマイグレーション手順は documents/OPERATIONS_GUIDE.md に一覧があります。以下は代表的な項目です。
v3.6.0 から検出データの正本は SQLite (detections.db) に移行しました。既存の JSONL データを移行するため、アップグレード後に以下を実行してください。
# 1. コンテナを停止
./meteor-docker.sh stop
# 2. 移行スクリプトを実行(既存 JSONL → detections.db)
source .venv/bin/activate
DETECTIONS_DIR=./detections python scripts/migrate_jsonl_to_sqlite.py
# 3. コンテナを再起動
./meteor-docker.sh start- 既存の
detections.jsonlとdetection_labels.jsonは削除されません(ロールバック用に保持) - ロールバックする場合は
detections.dbを削除してコンテナを再起動するだけです - 詳細は documents/DETECTION_STORE.md を参照
v3.6.2 で meteor_detector_rtsp_web.py からモジュールグローバル状態・フィルタ・録画・HTTP ハンドラが分離され、以下のモジュールに責務分割されました。機能挙動に変更はありません。
detection_state.py/detection_filters.py/recording_manager.py/http_handlers.py
ダッシュボードから手動更新したマスクを、次回 generate_compose.py 再実行時に上書きしないようになりました。masks/.generated_hashes.json に SHA256 ハッシュが記録されます。強制上書きは python generate_compose.py --force-overwrite-masks。詳細は documents/CONFIGURATION_GUIDE.md の「generate_compose.py 再実行時のマスク保護」節を参照。
v3.11.0 で generate_compose.py は内部名(CAMERA{i}_NAME)を camera1 / camera2 / ... に固定で書き出すようになりました。旧 IP 含みの内部名(例: camera1_10_0_1_25)が残っている場合は、プロジェクトルートの migrate_camera_dirs.py で移行します。
!!! warning
このスクリプトは --dry-run を明示しない限り本実行します(他の scripts/ 配下と挙動が逆)。最初の実行は必ず --dry-run を付けてください。
# 1. コンテナを停止し、detections/ をバックアップ
./meteor-docker.sh stop
cp -a detections detections.bak_$(date +%Y%m%d_%H%M%S)
# 2. まず dry-run で内容確認
python migrate_camera_dirs.py --dry-run
# 3. 本実行(対話確認あり)
python migrate_camera_dirs.py詳細は documents/OPERATIONS_GUIDE.md と documents/SCRIPTS_REFERENCE.md を参照してください。
--sensitivity lowで感度を下げる--min-brightnessを上げる(デフォルト200)--exclude-bottomを増やして除外範囲を広げる
--sensitivity highで感度を上げる--min-brightnessを下げる(180など)--min-speedを下げる(3.0など)- 詳細は
documents/DETECTION_TUNING.mdを参照
--fastで高速モードを使う--scale 0.5で処理解像度を下げる--skip 2でフレームスキップを増やす
- RTSP URLが正しいか確認
- ネットワーク接続を確認
- カメラの認証情報が正しいか確認(
rtsp://user:pass@host:port/path)
設定を変更する場合は、generate_compose.py で docker-compose.yml を再生成するのが推奨です:
python3 generate_compose.py \
--sensitivity fireball \
--scale 0.5 \
--buffer 15 \
--latitude 35.3606 \
--longitude 138.7274 \
--enable-time-window true各カメラの設定を個別に変更したい場合は、docker-compose.yml を直接編集できます:
camera1:
environment:
- TZ=Asia/Tokyo
- RTSP_URL=rtsp://user:pass@192.0.2.25/live # RFC5737 TEST-NET の例示
- CAMERA_NAME=camera1 # v3.11.0+ は camera{i} に固定
- CAMERA_NAME_DISPLAY=東側 # ダッシュボード UI の表示名
- SENSITIVITY=medium # low/medium/high/faint/fireball
- SCALE=0.5 # 処理解像度スケール
- BUFFER=15 # バッファ秒数
- EXCLUDE_BOTTOM=0.0625 # 下部除外範囲(1/16)
- EXTRACT_CLIPS=true # クリップ動画を保存(true/false)
- LATITUDE=35.3606 # 観測地点の緯度
- LONGITUDE=138.7274 # 観測地点の経度
- TIMEZONE=Asia/Tokyo # タイムゾーン
- ENABLE_TIME_WINDOW=false # 天文薄暮期間制限(true/false)
- WEB_PORT=8080
ports:
- "8081:8080" # ホスト:コンテナ注意: 手動編集した場合、次回 generate_compose.py を実行すると上書きされます。
本システムを別のサーバーやマシンにデプロイする手順です。
デプロイ先のサーバーに以下がインストールされている必要があります:
- Docker 20.10以上
- Docker Compose V2以上
- git(リポジトリからクローンする場合)
# サーバーにSSH接続
ssh user@server-ip
# リポジトリをクローン
git clone <repository-url> meteo
cd meteo# streamersファイルを作成・編集
vim streamers
# RTSP URLを1行1カメラで記載
# rtsp://user:pass@192.0.2.25/live
# rtsp://user:pass@192.0.2.3/live
# rtsp://user:pass@192.0.2.11/live
# 昼間画像による自動マスク(任意)
# rtsp://user:pass@192.0.2.25/live | camera1.jpg# 基本設定で生成
python3 generate_compose.py
# または、カスタム設定で生成
python3 generate_compose.py \
--sensitivity fireball \
--scale 0.5 \
--buffer 15 \
--latitude 35.6762 \
--longitude 139.6503 \
--enable-time-window true \
--base-port 8080# イメージをビルド
docker compose build
# バックグラウンドで起動
docker compose up -d
# 状態確認
docker compose ps# ログを確認
docker compose logs -f
# ブラウザでアクセス
# http://server-ip:8080/ (ダッシュボード)
# http://server-ip:8081/ (カメラ1)外部からアクセスする場合、ファイアウォールでポートを開放する必要があります:
# UFWの場合
sudo ufw allow 8080/tcp # ダッシュボード
sudo ufw allow 8081/tcp # カメラ1
sudo ufw allow 8082/tcp # カメラ2
sudo ufw allow 8083/tcp # カメラ3
# firewalldの場合
sudo firewall-cmd --add-port=8080-8083/tcp --permanent
sudo firewall-cmd --reloadサーバー再起動時に自動起動させる場合:
# systemdサービスファイルを作成
sudo vim /etc/systemd/system/meteor-detection.service[Unit]
Description=Meteor Detection System
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/path/to/meteo
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
User=your-user
[Install]
WantedBy=multi-user.target# サービスを有効化
sudo systemctl enable meteor-detection.service
sudo systemctl start meteor-detection.service
# 状態確認
sudo systemctl status meteor-detection.service既存の環境からデプロイ先にデータを移行する場合:
# 移行元でバックアップを作成
tar -czf meteor-backup.tar.gz detections/ streamers docker-compose.yml
# デプロイ先にコピー
scp meteor-backup.tar.gz user@server-ip:/path/to/meteo/
# デプロイ先で展開
ssh user@server-ip
cd /path/to/meteo
tar -xzf meteor-backup.tar.gz
# システムを起動
docker compose up -dHTTPSでアクセスさせたい場合や、ドメイン名でアクセスさせたい場合:
# /etc/nginx/sites-available/meteor
server {
listen 80;
server_name meteor.example.com;
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}# 有効化
sudo ln -s /etc/nginx/sites-available/meteor /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
# Let's EncryptでSSL化(オプション)
sudo certbot --nginx -d meteor.example.com# ログ確認
docker compose logs -f
# 状態確認
docker compose ps
# 再起動
docker compose restart
# 更新(新しいコードを取得)
git pull
docker compose build
docker compose up -d
# 古いファイルの削除
find ./detections -type f -mtime +7 -deleteこのプロジェクトはMITライセンスです。
- 流星検出アルゴリズム: OpenCVベースの差分検出+物体追跡
- Webプレビュー: MJPEGストリーミング
- Docker化: マルチコンテナ構成
Copyright (c) 2026 Masanori Sakai All rights reserved.
- 2026-04-18: v3.11.0 カメラ名インデックス化(
CAMERA{i}_NAME = camera{i}固定)。移行スクリプトmigrate_camera_dirs.pyを追加 - 2026-04-13: v3.10.0 ダッシュボードから手動更新したマスクを
generate_compose.py再実行時に保護 - 2026-04-12: v3.6.0 検出データストアを SQLite に移行(パフォーマンス改善・クロスカメラ管理)。v3.6.2 で検出エンジンをモジュール分割
- 2026-04-02: 多地点流星三角測量システム追加(
triangulation/,triangulation_server.py,station_reporter.py) - 2026-03-31: YouTube Live配信機能追加(ダッシュボードからカメラ単位で配信開始/停止)
- 2026-03-20: v3.5.0 薄明(twilight)動作モード・鳥シルエットフィルタを追加
- 2024-02-02: --extract-clips / --no-clips オプション追加
- 2024-02-01: RTSP検出、Webプレビュー、Dockerサポート追加
- 2024-01-31: MP4動画検出、火球モード、高速化オプション追加




