コンテンツにスキップ

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.ymlgenerate_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ファイルのサンプル