-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
155 lines (149 loc) · 5.73 KB
/
docker-compose.yml
File metadata and controls
155 lines (149 loc) · 5.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
x-ai-worker-common: &ai-worker-common
build:
context: .
dockerfile: ai_worker/Dockerfile
args:
MODEL_SOURCE: ${MODEL_SOURCE:-remote}
YOLO_MODEL_NAME: ${YOLO_MODEL_NAME:-yolo11n}
YOLO_MODEL_RELEASE: ${YOLO_MODEL_RELEASE:-v8.3.0}
YOLO_MODEL_URL: ${YOLO_MODEL_URL:-}
image: rtspanda-ai-worker:latest
environment:
MODEL_SOURCE: "${MODEL_SOURCE:-remote}"
MODEL_PATH: "${MODEL_PATH:-/model/model.onnx}"
YOLO_MODEL_PATH: "${MODEL_PATH:-/model/model.onnx}"
YOLO_MODEL_URL: "${YOLO_MODEL_URL:-}"
YOLO_CONFIDENCE: "${YOLO_CONFIDENCE:-0.25}"
YOLO_IOU: "${YOLO_IOU:-0.45}"
YOLO_MAX_DETECTIONS: "${YOLO_MAX_DETECTIONS:-100}"
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8090/health', timeout=3)"]
interval: 30s
timeout: 5s
retries: 5
start_period: 20s
restart: unless-stopped
mem_limit: 512m
deploy:
resources:
limits:
memory: 512m
x-rtspanda-common: &rtspanda-common
build:
context: .
args:
MEDIAMTX_VERSION: ${MEDIAMTX_VERSION:-v1.12.3}
image: rtspanda:latest
ports:
- "8080:8080"
environment:
DATA_DIR: /data
PORT: "8080"
MEDIAMTX_BIN: /usr/local/bin/mediamtx
FFMPEG_BIN: /usr/bin/ffmpeg
AUTH_ENABLED: "${AUTH_ENABLED:-false}"
AUTH_TOKEN: "${AUTH_TOKEN:-}"
MEDIAMTX_SOURCE_ON_DEMAND: "${MEDIAMTX_SOURCE_ON_DEMAND:-true}"
MEDIAMTX_SOURCE_ON_DEMAND_CLOSE_AFTER: "${MEDIAMTX_SOURCE_ON_DEMAND_CLOSE_AFTER:-10s}"
MEDIAMTX_HLS_ALWAYS_REMUX: "${MEDIAMTX_HLS_ALWAYS_REMUX:-false}"
MEDIAMTX_HLS_SEGMENT_COUNT: "${MEDIAMTX_HLS_SEGMENT_COUNT:-3}"
MEDIAMTX_HLS_SEGMENT_DURATION: "${MEDIAMTX_HLS_SEGMENT_DURATION:-2s}"
MEDIAMTX_HLS_PART_DURATION: "${MEDIAMTX_HLS_PART_DURATION:-200ms}"
# fmp4 = standard HLS (hls.js); lowLatency can 404 index.m3u8 for some RTSP cameras.
MEDIAMTX_HLS_VARIANT: "${MEDIAMTX_HLS_VARIANT:-fmp4}"
MEDIAMTX_LOG_LEVEL: "${MEDIAMTX_LOG_LEVEL:-warn}"
MEDIAMTX_RTSP_TRANSPORT: "${MEDIAMTX_RTSP_TRANSPORT:-tcp}"
RTSPANDA_MODE: "${RTSPANDA_MODE:-standard}"
AI_MODE: "${AI_MODE:-local}"
AI_WORKER_URL: "${AI_WORKER_URL:-}"
DETECTOR_URL: "${DETECTOR_URL:-}"
DETECTION_SAMPLE_INTERVAL_SECONDS: "${DETECTION_SAMPLE_INTERVAL_SECONDS:-30}"
DETECTION_WORKERS: "${DETECTION_WORKERS:-1}"
DETECTION_QUEUE_SIZE: "${DETECTION_QUEUE_SIZE:-32}"
GOMEMLIMIT: "${GOMEMLIMIT:-200MiB}"
volumes:
- ./data:/data
healthcheck:
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:8080/api/v1/health"]
interval: 30s
timeout: 5s
retries: 5
start_period: 20s
restart: unless-stopped
mem_limit: 512m
deploy:
resources:
limits:
memory: 512m
services:
# Default local stack. This preserves the existing `docker compose up --build -d`
# workflow for x86/GPU users and for single-machine development.
ai-worker:
<<: *ai-worker-common
container_name: rtspanda-ai-worker
expose:
- "8090"
rtspanda:
<<: *rtspanda-common
container_name: rtspanda
depends_on:
ai-worker:
condition: service_healthy
required: false
# Pi-first lightweight mode: backend + mediamtx only. Detection is disabled
# until AI_WORKER_URL (or DETECTOR_URL) points at a remote AI worker.
rtspanda-pi:
<<: *rtspanda-common
container_name: rtspanda-pi
profiles: ["pi"]
environment:
DATA_DIR: /data
PORT: "8080"
MEDIAMTX_BIN: /usr/local/bin/mediamtx
FFMPEG_BIN: /usr/bin/ffmpeg
AUTH_ENABLED: "${AUTH_ENABLED:-false}"
AUTH_TOKEN: "${AUTH_TOKEN:-}"
MEDIAMTX_SOURCE_ON_DEMAND: "${MEDIAMTX_SOURCE_ON_DEMAND:-true}"
MEDIAMTX_SOURCE_ON_DEMAND_CLOSE_AFTER: "${MEDIAMTX_SOURCE_ON_DEMAND_CLOSE_AFTER:-10s}"
MEDIAMTX_HLS_ALWAYS_REMUX: "${MEDIAMTX_HLS_ALWAYS_REMUX:-false}"
MEDIAMTX_HLS_SEGMENT_COUNT: "${MEDIAMTX_HLS_SEGMENT_COUNT:-3}"
MEDIAMTX_HLS_SEGMENT_DURATION: "${MEDIAMTX_HLS_SEGMENT_DURATION:-2s}"
MEDIAMTX_HLS_PART_DURATION: "${MEDIAMTX_HLS_PART_DURATION:-200ms}"
MEDIAMTX_HLS_VARIANT: "${MEDIAMTX_HLS_VARIANT:-fmp4}"
MEDIAMTX_LOG_LEVEL: "${MEDIAMTX_LOG_LEVEL:-warn}"
MEDIAMTX_RTSP_TRANSPORT: "${MEDIAMTX_RTSP_TRANSPORT:-tcp}"
# Pi mode: viewer + stream relay + snapshot AI only.
# Real-time YOLO inference is NOT supported on Raspberry Pi.
RTSPANDA_MODE: "pi"
AI_MODE: "remote"
AI_WORKER_URL: "${AI_WORKER_URL:-}"
DETECTOR_URL: "${DETECTOR_URL:-}"
DETECTION_SAMPLE_INTERVAL_SECONDS: "${DETECTION_SAMPLE_INTERVAL_SECONDS:-30}"
DETECTION_WORKERS: "${DETECTION_WORKERS:-1}"
DETECTION_QUEUE_SIZE: "${DETECTION_QUEUE_SIZE:-32}"
GOMEMLIMIT: "${GOMEMLIMIT:-200MiB}"
# Snapshot Intelligence Engine (Pi AI replacement)
SNAPSHOT_AI_ENABLED: "${SNAPSHOT_AI_ENABLED:-false}"
SNAPSHOT_AI_PROVIDER: "${SNAPSHOT_AI_PROVIDER:-claude}"
SNAPSHOT_AI_API_KEY: "${SNAPSHOT_AI_API_KEY:-}"
SNAPSHOT_AI_INTERVAL_SECONDS: "${SNAPSHOT_AI_INTERVAL_SECONDS:-30}"
SNAPSHOT_AI_PROMPT: "${SNAPSHOT_AI_PROMPT:-Detect people, vehicles, packages, or notable activity near a property.}"
SNAPSHOT_AI_THRESHOLD: "${SNAPSHOT_AI_THRESHOLD:-medium}"
# Standalone AI-worker profile for a second machine or dedicated inference host.
ai-worker-standalone:
<<: *ai-worker-common
container_name: rtspanda-ai-worker-standalone
profiles: ["ai-worker"]
ports:
- "8090:8090"
# Explicit full profile alias for environments that want a named profile
# without changing the default unprofiled stack behavior.
stack-full:
image: alpine:3.22
profiles: ["full"]
command: ["sh", "-c", "tail -f /dev/null"]
depends_on:
ai-worker:
condition: service_healthy
rtspanda:
condition: service_healthy