Docker コンテナ構成ドキュメント
バージョン: v3.2.1
Copyright (c) 2026 Masanori Sakai
Licensed under the MIT License
システム概要
流星検出システムは、Docker Compose で管理される複数コンテナで構成されます。現行の WebRTC ライブ表示構成では dashboard + camera1..N + go2rtc の組み合わせが基本です。Docker 内の go2rtc で WebRTC を安定動作させるには、webrtc.candidates へホスト側の到達可能アドレスを明示する必要があります。generate_compose.py は既定でこの候補アドレスを自動検出し、必要に応じて --go2rtc-candidate-host で上書きできます。
- 1つのダッシュボードコンテナ: 全カメラの統合管理画面と go2rtc 埋め込みページ配信
- 複数の検出コンテナ: 各カメラごとの流星検出エンジンと MJPEG / ステータス提供
- 1つの WebRTC 中継コンテナ:
go2rtcによる WebRTC / MSE / HLS 配信
コンテナ構成図
graph TB
subgraph "ホストマシン"
Detections["./detections/<br/>共有ボリューム"]
Go2RTCConf["./go2rtc.yaml<br/>設定ファイル"]
subgraph "Docker Network: meteor-net (bridge)"
Dashboard["dashboard<br/>meteor-dashboard<br/>:8080→8080"]
Go2RTC["go2rtc<br/>meteor-go2rtc<br/>:1984→1984<br/>:8555→8555"]
Camera1["camera1<br/>meteor-camera1<br/>:8081→8080"]
Camera2["camera2<br/>meteor-camera2<br/>:8082→8080"]
Camera3["camera3<br/>meteor-camera3<br/>:8083→8080"]
end
Browser["ブラウザ<br/>localhost:8080"]
end
subgraph "外部ネットワーク"
RTSP1["RTSP Camera<br/>10.0.1.25:554"]
RTSP2["RTSP Camera<br/>10.0.1.3:554"]
RTSP3["RTSP Camera<br/>10.0.1.11:554"]
end
Browser -->|"HTTP UI"| Dashboard
Browser -->|"WebRTC / MSE"| Go2RTC
Dashboard -->|"HTTP"| Camera1
Dashboard -->|"HTTP"| Camera2
Dashboard -->|"HTTP"| Camera3
Dashboard -->|"埋め込みHTML / asset取得"| Go2RTC
Camera1 -->|"RTSP"| RTSP1
Camera2 -->|"RTSP"| RTSP2
Camera3 -->|"RTSP"| RTSP3
Go2RTC -->|"RTSP"| RTSP1
Go2RTC -->|"RTSP"| RTSP2
Go2RTC -->|"RTSP"| RTSP3
Dashboard -->|"読み込み"| Detections
Camera1 -->|"書き込み"| Detections
Camera2 -->|"書き込み"| Detections
Camera3 -->|"書き込み"| Detections
Go2RTCConf -->|"読み込み"| Go2RTC
style Dashboard fill:#dbe7f6
style Go2RTC fill:#d7eef2
style Camera1 fill:#e2eafc
style Camera2 fill:#e2eafc
style Camera3 fill:#e2eafc
style Detections fill:#dce6ff
コンテナ詳細
1. Dashboard コンテナ
役割: 全カメラの統合ダッシュボードを提供
graph LR
subgraph "meteor-dashboard コンテナ"
Dashboard["dashboard.py<br/>HTTPサーバー"]
Embed["/camera_embed/*<br/>埋め込みHTML生成"]
Proxy["/go2rtc_asset/*<br/>go2rtc asset プロキシ"]
AstroUtils["astro_utils.py<br/>天文計算"]
Files["/output/<br/>マウント"]
end
Dashboard --> AstroUtils
Dashboard --> Files
Dashboard --> Embed
Dashboard --> Proxy
style Dashboard fill:#dbe7f6
コンテナ情報
| 項目 | 値 |
|---|---|
| イメージ | Dockerfile.dashboard (python:3.11-slim ベース) |
| コンテナ名 | meteor-dashboard |
| ポートマッピング | 8080:8080 (ホスト:コンテナ) |
| 再起動ポリシー | unless-stopped |
| 依存関係 | camera1, camera2, camera3, go2rtc(WebRTC構成時) |
| ボリューム | ./detections:/output (読み込み専用的使用) |
| ネットワーク | meteor-net (bridge) |
環境変数
| 変数名 | デフォルト値 | 説明 |
|---|---|---|
TZ |
Asia/Tokyo |
タイムゾーン |
PORT |
8080 |
HTTPサーバーポート |
LATITUDE |
35.6762 |
観測地の緯度(東京) |
LONGITUDE |
139.6503 |
観測地の経度(東京) |
TIMEZONE |
Asia/Tokyo |
タイムゾーン名 |
ENABLE_TIME_WINDOW |
true |
天文薄暮時間帯制限 |
CAMERA1_NAME |
camera1_10_0_1_25 |
カメラ1の内部名(ディレクトリ名・識別子) |
CAMERA1_NAME_DISPLAY |
東側 |
カメラ1のWeb表示名 |
CAMERA1_URL |
http://localhost:8081 |
カメラ1のURL |
CAMERA1_STREAM_KIND |
webrtc |
ライブ表示方式 (mjpeg / webrtc) |
CAMERA1_STREAM_URL |
http://localhost:1984/stream.html?src=camera1&mode=webrtc&mode=mse&mode=hls&mode=mjpeg&background=false |
ライブ表示用URL |
CAMERA2_NAME |
camera2_10_0_1_3 |
カメラ2の内部名(ディレクトリ名・識別子) |
CAMERA2_NAME_DISPLAY |
南側 |
カメラ2のWeb表示名 |
CAMERA2_URL |
http://localhost:8082 |
カメラ2のURL |
CAMERA2_STREAM_KIND |
webrtc |
ライブ表示方式 (mjpeg / webrtc) |
CAMERA2_STREAM_URL |
http://localhost:1984/stream.html?src=camera2&mode=webrtc&mode=mse&mode=hls&mode=mjpeg&background=false |
ライブ表示用URL |
CAMERA3_NAME |
camera3_10_0_1_11 |
カメラ3の内部名(ディレクトリ名・識別子) |
CAMERA3_NAME_DISPLAY |
西側 |
カメラ3のWeb表示名 |
CAMERA3_URL |
http://localhost:8083 |
カメラ3のURL |
CAMERA3_STREAM_KIND |
webrtc |
ライブ表示方式 (mjpeg / webrtc) |
CAMERA3_STREAM_URL |
http://localhost:1984/stream.html?src=camera3&mode=webrtc&mode=mse&mode=hls&mode=mjpeg&background=false |
ライブ表示用URL |
Dockerfile.dashboard
FROM python:3.11-slim
WORKDIR /app
COPY requirements-docker.txt .
RUN pip install --no-cache-dir -r requirements-docker.txt
COPY dashboard*.py .
COPY astro_utils.py .
COPY documents/assets/meteo-logotype.svg ./documents/assets/meteo-logotype.svg
ENV TZ=Asia/Tokyo
ENV PORT=8080
EXPOSE 8080
CMD ["python", "dashboard.py"]
主な依存ライブラリ: flask, astral
2. Camera コンテナ (×3)
役割: 個別カメラの流星検出とWebプレビュー提供
graph TB
subgraph "meteor-camera1 コンテナ"
Detector["meteor_detector_rtsp_web.py"]
Astro["astro_utils.py"]
Output["/output/camera1_10_0_1_25/"]
subgraph "内部スレッド"
RTSP["RTSPReader"]
Detection["detection_thread_worker"]
Web["MJPEGHandler"]
end
Detector --> RTSP
Detector --> Detection
Detector --> Web
Detector --> Astro
Detection --> Output
end
style Detector fill:#e2eafc
style Output fill:#dce6ff
コンテナ情報(camera1の例)
| 項目 | 値 |
|---|---|
| イメージ | Dockerfile (python:3.11-slim + OpenCV) |
| コンテナ名 | meteor-camera1 / meteor-camera2 / meteor-camera3 |
| ポートマッピング | 8081:8080 / 8082:8080 / 8083:8080 |
| 再起動ポリシー | unless-stopped |
| ボリューム | ./detections:/output (読み書き) |
| ネットワーク | meteor-net (bridge) |
環境変数(camera1の例)
| 変数名 | 値 | 説明 |
|---|---|---|
TZ |
Asia/Tokyo |
タイムゾーン |
RTSP_URL |
rtsp://6199:4003@10.0.1.25/live |
RTSPストリームURL |
CAMERA_NAME |
camera1_10_0_1_25 |
カメラ識別名(ディレクトリ名) |
SENSITIVITY |
medium |
感度 (low/medium/high/faint/fireball) |
SCALE |
0.5 |
処理スケール (0.0-1.0) |
BUFFER |
15 |
リングバッファ秒数 |
EXCLUDE_BOTTOM |
0.0625 |
画面下部除外率 (1/16) |
EXTRACT_CLIPS |
true |
クリップ動画保存の有効化 |
LATITUDE |
35.6762 |
観測地の緯度 |
LONGITUDE |
139.6503 |
観測地の経度 |
TIMEZONE |
Asia/Tokyo |
タイムゾーン名 |
ENABLE_TIME_WINDOW |
true |
天文薄暮時間帯制限 |
WEB_PORT |
8080 |
内部HTTPポート |
Dockerfile
FROM python:3.11-slim
WORKDIR /app
# Python依存ライブラリ
COPY requirements-docker.txt .
RUN pip install --no-cache-dir -r requirements-docker.txt
# OpenCV・ffmpeg 用システムライブラリ(手動録画に ffmpeg が必要)
RUN apt-get update --allow-releaseinfo-change && \
apt-get install -y --no-install-recommends \
ffmpeg \
libxcb1 \
libglib2.0-0 \
libgomp1 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*.deb
# アプリケーションコード
COPY meteor_detector_rtsp_web.py .
COPY meteor_detector_realtime.py .
COPY meteor_detector_common.py .
COPY meteor_mask_utils.py .
COPY astro_utils.py .
# マスク画像(デフォルトは空ファイル)
ARG MASK_FROM_DAY=mask_none.jpg
ARG MASK_IMAGE=mask_none.jpg
COPY ${MASK_FROM_DAY} /app/mask_from_day.jpg
COPY ${MASK_IMAGE} /app/mask_image.png
# 出力ディレクトリ
RUN mkdir -p /output
# タイムゾーン設定
ENV TZ=Asia/Tokyo
# 環境変数のデフォルト値
ENV RTSP_URL=""
ENV SENSITIVITY="medium"
ENV SCALE="0.5"
ENV BUFFER="15"
ENV EXCLUDE_BOTTOM="0.125"
ENV CAMERA_NAME="camera"
ENV CAMERA_NAME_DISPLAY=""
ENV WEB_PORT="8080"
ENV EXTRACT_CLIPS="true"
ENV MASK_IMAGE=""
ENV MASK_DILATE="20"
ENV MASK_SAVE=""
EXPOSE 8080
CMD ["/bin/sh", "-c", "exec python meteor_detector_rtsp_web.py \
\"${RTSP_URL}\" \
-o \"/output/${CAMERA_NAME}\" \
--sensitivity \"${SENSITIVITY}\" \
--scale \"${SCALE}\" \
--buffer \"${BUFFER}\" \
--exclude-bottom \"${EXCLUDE_BOTTOM}\" \
--mask-image \"${MASK_IMAGE}\" \
--mask-from-day \"${MASK_FROM_DAY}\" \
--mask-dilate \"${MASK_DILATE}\" \
--mask-save \"${MASK_SAVE}\" \
--web-port \"${WEB_PORT}\" \
--camera-name \"${CAMERA_NAME}\""]
3. go2rtc コンテナ
役割: ブラウザ向けの WebRTC / MSE / HLS ライブ配信
graph TB
subgraph "meteor-go2rtc コンテナ"
Config["/config/go2rtc.yaml"]
API["1984/tcp<br/>HTTP / WS API"]
Media["8555/tcp,udp<br/>WebRTC メディア"]
Streams["camera1 / camera2 / camera3<br/>RTSP source"]
end
Config --> API
API --> Streams
Streams --> Media
style Config fill:#ffe7cc
style API fill:#d7eef2
style Media fill:#dff3e2
コンテナ情報
| 項目 | 値 |
|---|---|
| イメージ | alexxit/go2rtc:latest |
| コンテナ名 | meteor-go2rtc |
| ポートマッピング | 1984:1984, 8555:8555/tcp, 8555:8555/udp |
| 再起動ポリシー | unless-stopped |
| ボリューム | ./go2rtc.yaml:/config/go2rtc.yaml:ro |
| ネットワーク | meteor-net (bridge) |
go2rtc.yaml の役割
api:
origin: "*"
webrtc:
candidates:
- 10.0.1.59:8555
streams:
camera1:
- rtsp://...
camera2:
- rtsp://...
camera3:
- rtsp://...
api.originはダッシュボードからの埋め込みアクセスを許可します。webrtc.candidatesはブラウザが接続するホスト側候補アドレスです。streams.*は各カメラの RTSP ソース定義です。
ネットワーク構成
meteor-net (bridge)
Docker Composeで自動作成されるブリッジネットワーク
graph TB
subgraph "Docker Network: meteor-net"
subgraph "IPアドレス自動割り当て"
Dashboard["dashboard<br/>172.x.x.2"]
Go2RTC["go2rtc<br/>172.x.x.3"]
Camera1["camera1<br/>172.x.x.4"]
Camera2["camera2<br/>172.x.x.5"]
Camera3["camera3<br/>172.x.x.6"]
end
end
Host["ホストマシン<br/>docker0インターフェース"]
Dashboard -.->|"内部通信"| Camera1
Dashboard -.->|"内部通信"| Camera2
Dashboard -.->|"内部通信"| Camera3
Dashboard -.->|"内部通信"| Go2RTC
Host -->|"ポート転送"| Dashboard
Host -->|"ポート転送"| Go2RTC
Host -->|"ポート転送"| Camera1
Host -->|"ポート転送"| Camera2
Host -->|"ポート転送"| Camera3
style Dashboard fill:#dbe7f6
style Go2RTC fill:#d7eef2
style Camera1 fill:#e2eafc
style Camera2 fill:#e2eafc
style Camera3 fill:#e2eafc
ポートマッピング
| コンテナ | ホストポート | コンテナポート | プロトコル | 用途 |
|---|---|---|---|---|
| dashboard | 8080 | 8080 | HTTP | ダッシュボードWeb UI |
| go2rtc | 1984 | 1984 | HTTP / WS | WebRTC / MSE シグナリング、フロント資産 |
| go2rtc | 8555 | 8555 | TCP / UDP | WebRTC メディア転送 |
| camera1 | 8081 | 8080 | HTTP | カメラ1プレビュー |
| camera2 | 8082 | 8080 | HTTP | カメラ2プレビュー |
| camera3 | 8083 | 8080 | HTTP | カメラ3プレビュー |
ボリューム構成
共有ボリューム: ./detections
graph TB
Host["ホストマシン<br/>./detections/"]
subgraph "マウント (読み書き)"
Camera1["/output/ in camera1"]
Camera2["/output/ in camera2"]
Camera3["/output/ in camera3"]
end
subgraph "マウント (読み込み)"
Dashboard["/output/ in dashboard"]
end
Host --> Camera1
Host --> Camera2
Host --> Camera3
Host --> Dashboard
style Host fill:#dce6ff
style Camera1 fill:#e2eafc
style Camera2 fill:#e2eafc
style Camera3 fill:#e2eafc
style Dashboard fill:#dbe7f6
ディレクトリ構造
./detections/
├── camera1_10_0_1_25/
│ ├── detections.jsonl
│ ├── meteor_20260202_065533.mp4
│ ├── meteor_20260202_065533_composite.jpg
│ ├── meteor_20260202_065533_composite_original.jpg
│ └── manual_recordings/ # 手動録画保存先 (v3.2.0+)
│ └── camera1_10_0_1_25/ # カメラ名サブディレクトリ
│ ├── manual_camera1_20260319_213000_90s.mp4
│ └── manual_camera1_20260319_213000_90s.jpg # サムネイル (v3.2.1+)
├── camera2_10_0_1_3/
│ └── ...
└── camera3_10_0_1_11/
└── ...
ボリューム使用パターン
| コンテナ | パス | モード | 操作 |
|---|---|---|---|
| camera1 | /output |
rw | 検出結果・手動録画 MP4/JPEG の書き込み |
| camera2 | /output |
rw | 検出結果・手動録画 MP4/JPEG の書き込み |
| camera3 | /output |
rw | 検出結果・手動録画 MP4/JPEG の書き込み |
| dashboard | /output |
rw | 検出結果・手動録画ファイルの読み込みおよび削除 |
設定ファイル: ./go2rtc.yaml
| コンテナ | パス | モード | 操作 |
|---|---|---|---|
| go2rtc | /config/go2rtc.yaml |
ro | WebRTC candidate とストリーム定義の読み込み |
ロギング設定
各カメラコンテナのログローテーション設定:
logging:
driver: "json-file"
options:
max-size: "10m" # ログファイル最大サイズ
max-file: "3" # 保持するログファイル数
合計ログ容量: 各カメラ 30MB (10MB × 3ファイル)
起動シーケンス
sequenceDiagram
participant User
participant DockerCompose
participant Network
participant Camera1
participant Camera2
participant Camera3
participant Dashboard
participant Go2RTC
User->>DockerCompose: docker compose up -d
DockerCompose->>Network: meteor-netを作成
par コンテナ起動(並列)
DockerCompose->>Go2RTC: コンテナ起動
Go2RTC->>Go2RTC: go2rtc.yaml 読み込み
Go2RTC->>Go2RTC: API待受開始 (1984/8555)
DockerCompose->>Camera1: コンテナ起動
Camera1->>Camera1: meteor_detector_rtsp_web.py起動
Camera1->>Camera1: RTSP接続開始
DockerCompose->>Camera2: コンテナ起動
Camera2->>Camera2: meteor_detector_rtsp_web.py起動
Camera2->>Camera2: RTSP接続開始
DockerCompose->>Camera3: コンテナ起動
Camera3->>Camera3: meteor_detector_rtsp_web.py起動
Camera3->>Camera3: RTSP接続開始
end
Note over Go2RTC,Camera3: depends_on により dashboard は各依存サービス起動後に開始
DockerCompose->>Dashboard: コンテナ起動
Dashboard->>Dashboard: dashboard.py起動
Dashboard->>Dashboard: HTTPサーバー起動 (0.0.0.0:8080)
Dashboard->>Go2RTC: asset 取得先を解決
Dashboard->>Camera1: /stats, /stream 参照準備
Dashboard-->>User: http://localhost:8080/ アクセス可能
依存関係グラフ
graph TD
Compose["docker-compose.yml"]
Compose --> Dashboard
Compose --> Go2RTC
Compose --> Camera1
Compose --> Camera2
Compose --> Camera3
Dashboard -.->|"depends_on"| Go2RTC
Dashboard -.->|"depends_on"| Camera1
Dashboard -.->|"depends_on"| Camera2
Dashboard -.->|"depends_on"| Camera3
Go2RTC --> Go2RTCConfig["go2rtc.yaml"]
Camera1 --> Dockerfile
Camera2 --> Dockerfile
Camera3 --> Dockerfile
Dashboard --> DockerfileDashboard["Dockerfile.dashboard"]
Dockerfile --> Requirements["requirements-docker.txt"]
style Compose fill:#dbe7f6
style Dashboard fill:#e2eafc
style Go2RTC fill:#d7eef2
style Camera1 fill:#dce6ff
style Camera2 fill:#dce6ff
style Camera3 fill:#dce6ff
リソース要件
メモリ使用量(推定値)
| コンテナ | ベースイメージ | アプリメモリ | 合計(推定) |
|---|---|---|---|
| dashboard | ~50MB | ~30MB | ~80MB |
| go2rtc | ~30MB | ~40MB | ~70MB |
| camera1 | ~120MB | ~200MB (リングバッファ含む) | ~320MB |
| camera2 | ~120MB | ~200MB | ~320MB |
| camera3 | ~120MB | ~200MB | ~320MB |
| 合計 | ~1110MB (約1.1GB) |
ディスク使用量
| 項目 | サイズ(推定) |
|---|---|
| Dockerイメージ (dashboard) | ~200MB |
| Dockerイメージ (go2rtc) | ~60MB |
| Dockerイメージ (camera) × 3 | ~600MB |
| 検出結果 (1時間あたり) | ~100MB-1GB (検出数依存) |
CPU使用率
- camera1-3: 各コンテナ 30-50% (1コア)
- go2rtc: 数% - 15% 程度(接続数と配信方式依存)
- dashboard: 5-10% (1コア)
docker-compose.yml コマンド
基本操作
# 起動(バックグラウンド)
docker compose up -d
# 停止
docker compose down
# 再起動
docker compose restart
# ログ確認(全コンテナ)
docker compose logs -f
# 特定コンテナのログ
docker compose logs -f camera1
docker compose logs -f go2rtc
# 状態確認
docker compose ps
# リソース使用状況
docker stats
イメージ管理
# イメージのビルド
docker compose build
# キャッシュなしでビルド
docker compose build --no-cache
# イメージ削除
docker compose down --rmi all
# 未使用イメージの削除
docker image prune -a
コンテナ管理
# 特定コンテナの再起動
docker compose restart camera1
docker compose restart go2rtc
# 特定コンテナに入る
docker compose exec camera1 /bin/bash
docker compose exec go2rtc sh
# 特定コンテナを停止
docker compose stop camera1
# 特定コンテナを起動
docker compose start camera1
トラブルシューティング
コンテナが起動しない
# ログを確認
docker compose logs camera1
# コンテナの状態を確認
docker compose ps
# ネットワークを確認
docker network ls
docker network inspect meteor-net
RTSP接続エラー
# カメラコンテナ内でRTSP接続をテスト
docker compose exec camera1 /bin/bash
# コンテナ内で
apt-get update && apt-get install -y ffmpeg
ffmpeg -i "${RTSP_URL}" -frames:v 1 test.jpg
ディスク容量不足
# 検出結果のクリーンアップ
rm -rf ./detections/*/meteor_*.mp4 # 動画のみ削除
# Dockerのクリーンアップ
docker system prune -a --volumes
ポート競合
# ポート使用状況を確認
lsof -i :8080
lsof -i :8081
# docker-compose.ymlのポート番号を変更
# ports:
# - "18080:8080" # ホストポートを変更
セキュリティ考慮事項
1. RTSP認証情報
⚠️ 注意: docker-compose.ymlにRTSP URLの認証情報が平文で含まれています
推奨対策:
# .envファイルを使用
echo 'RTSP_URL_CAMERA1=rtsp://user:pass@10.0.1.25/live' > .env
chmod 600 .env
docker-compose.ymlで参照:
environment:
- RTSP_URL=${RTSP_URL_CAMERA1}
2. ネットワークアクセス制限
# 内部ネットワークのみ許可(外部アクセス不要な場合)
services:
camera1:
networks:
meteor-net:
internal: true # 外部アクセス遮断
3. ファイルシステムパーミッション
# 検出結果ディレクトリの権限設定
chmod 755 ./detections
chown -R 1000:1000 ./detections # コンテナ内のユーザーIDに合わせる
カメラの追加・削除(スケーリング)
generate_compose.py による自動生成
docker-compose.ymlはgenerate_compose.pyスクリプトで自動生成されます。
処理フロー
flowchart LR
Streamers["streamers ファイル<br/>RTSP URLリスト"]
Script["generate_compose.py"]
Compose["docker-compose.yml"]
Streamers -->|"読み込み"| Script
Script -->|"生成"| Compose
style Script fill:#dce6ff
style Compose fill:#e2eafc
カメラ追加手順
1. streamers ファイルを編集
# streamers ファイルに新しいカメラのRTSP URLを追加
echo "rtsp://user:pass@10.0.1.20/live" >> streamers
streamers ファイル形式:
rtsp://username:password@192.168.1.100/live
rtsp://username:password@192.168.1.101/live
rtsp://username:password@192.168.1.102/live
# コメント行は無視されます
rtsp://192.168.1.103:554/stream # 認証なしも可能
昼間画像を指定してマスクを自動生成する場合:
rtsp://username:password@192.168.1.100/live | camera1.jpg
rtsp://username:password@192.168.1.101/live | camera2.jpg
rtsp://192.168.1.103:554/stream
|右側は昼間画像パス(相対パス可)- マスク生成には OpenCV が必要
2. docker-compose.yml を再生成
# 基本的な使い方
python generate_compose.py
# オプション指定
python generate_compose.py \
--streamers streamers \
--output docker-compose.yml \
--sensitivity medium \
--scale 0.5 \
--buffer 15 \
--base-port 8080 \
--latitude 35.6762 \
--longitude 139.6503 \
--enable-time-window true \
--mask-output-dir masks
3. コンテナを再起動
# イメージをビルド(初回のみ)
docker compose build
# コンテナを起動
docker compose up -d
# 新しいカメラが追加されたことを確認
docker compose ps
generate_compose.py のオプション
| オプション | デフォルト値 | 説明 |
|---|---|---|
-s, --streamers |
streamers |
RTSP URLリストファイル |
-o, --output |
docker-compose.yml |
出力ファイル名 |
--sensitivity |
medium |
検出感度 (low/medium/high/faint/fireball) |
--scale |
0.5 |
処理スケール (0.0-1.0) |
--buffer |
15 |
リングバッファ秒数 |
--exclude-bottom |
0.0625 |
画面下部除外率 (1/16) |
--extract-clips |
true |
クリップ動画保存 |
--base-port |
8080 |
ベースポート番号 |
--latitude |
35.3606 |
観測地の緯度(富士山頂) |
--longitude |
138.7274 |
観測地の経度(富士山頂) |
--enable-time-window |
false |
天文薄暮時間帯制限 |
--mask-output-dir |
masks |
生成マスクの保存先 |
--mask-dilate |
20 |
マスク拡張ピクセル数 |
自動生成される構成
sequenceDiagram
participant User
participant Script as generate_compose.py
participant Streamers as streamers
participant Compose as docker-compose.yml
User->>Script: python generate_compose.py
Script->>Streamers: ファイル読み込み
Streamers-->>Script: RTSP URLリスト (N行)
loop 各RTSP URL
Script->>Script: parse_rtsp_url()<br/>URL解析
Script->>Script: generate_service()<br/>サービス定義生成
end
Script->>Script: generate_dashboard()<br/>ダッシュボード生成
Script->>Compose: docker-compose.yml出力
Compose-->>User: 生成完了<br/>カメラ数: N<br/>ポート: 8080-808N
生成例
入力 (streamers):
rtsp://6199:4003@10.0.1.25/live
rtsp://6199:4003@10.0.1.3/live
※ 昼間画像を指定する場合は | camera1.jpg のように行末に追加します。
出力 (docker-compose.yml):
- ダッシュボード: localhost:8080
- カメラ1 (10.0.1.25): localhost:8081
- カメラ2 (10.0.1.3): localhost:8082
カメラ削除手順
1. streamers から該当行を削除
# 例: 2行目のカメラを削除
sed -i '2d' streamers
2. docker-compose.yml を再生成
python generate_compose.py
3. 古いコンテナを停止して再起動
# 全コンテナを停止・削除
docker compose down
# 新しい構成で起動
docker compose up -d
カメラ数の制限
技術的制限: なし(ホストマシンのリソース次第)
推奨値: - メモリ: 1カメラあたり約320MB → 8GBメモリで約20カメラ - CPU: 1カメラあたり1コア30-50% → 4コアCPUで約8カメラ - ネットワーク: 1カメラあたり約5-10Mbps → 100Mbpsで約10カメラ
関連ファイル
docker-compose.yml: Docker Compose設定ファイル(自動生成)Dockerfile: カメラコンテナ用Dockerイメージ定義Dockerfile.dashboard: ダッシュボードコンテナ用Dockerイメージ定義requirements-docker.txt: Python依存パッケージgenerate_compose.py: docker-compose.yml生成スクリプトstreamers: RTSP URLリスト(カメラ設定ファイル)streamers.sample: streamersファイルのサンプル