/
/
/
1---
2# Runner Services - Frigate CCTV System
3
4- name: Create Frigate configuration directory structure
5 file:
6 path: "{{ item }}"
7 state: directory
8 owner: "{{ runner_user }}"
9 group: "{{ runner_group }}"
10 mode: '0775'
11 loop:
12 - "{{ frigate_config_dir }}"
13 - "{{ frigate_config_dir }}/config"
14 - "{{ frigate_config_dir }}/config/models"
15
16- name: Set group sticky bit on Frigate directories for permission inheritance
17 file:
18 path: "{{ item }}"
19 state: directory
20 mode: "g+s"
21 loop:
22 - "{{ frigate_config_dir }}"
23 - "{{ frigate_config_dir }}/config"
24 - "{{ frigate_config_dir }}/config/models"
25
26- name: Create COCO labels file for GPU model
27 copy:
28 dest: "{{ frigate_config_dir }}/config/models/coco_labels.txt"
29 content: |
30 person
31 bicycle
32 car
33 motorcycle
34 airplane
35 bus
36 train
37 truck
38 boat
39 traffic light
40 fire hydrant
41 stop sign
42 parking meter
43 bench
44 bird
45 cat
46 dog
47 horse
48 sheep
49 cow
50 elephant
51 bear
52 zebra
53 giraffe
54 backpack
55 umbrella
56 handbag
57 tie
58 suitcase
59 frisbee
60 skis
61 snowboard
62 sports ball
63 kite
64 baseball bat
65 baseball glove
66 skateboard
67 surfboard
68 tennis racket
69 bottle
70 wine glass
71 cup
72 fork
73 knife
74 spoon
75 bowl
76 banana
77 apple
78 sandwich
79 orange
80 broccoli
81 carrot
82 hot dog
83 pizza
84 donut
85 cake
86 chair
87 couch
88 potted plant
89 bed
90 dining table
91 toilet
92 tv
93 laptop
94 mouse
95 remote
96 keyboard
97 cell phone
98 microwave
99 oven
100 toaster
101 sink
102 refrigerator
103 book
104 clock
105 vase
106 scissors
107 teddy bear
108 hair drier
109 toothbrush
110 owner: "{{ runner_user }}"
111 group: "{{ runner_group }}"
112 mode: '0664'
113 when: frigate_hardware_acceleration == 'nvenc'
114
115- name: Download yolov5s.onnx model for GPU acceleration
116 get_url:
117 url: https://huggingface.co/amd/yolov5s/resolve/main/yolov5s.onnx
118 dest: "{{ frigate_config_dir }}/config/models/yolov5s.onnx"
119 owner: "{{ runner_user }}"
120 group: "{{ runner_group }}"
121 mode: '0664'
122 timeout: 300
123 when: frigate_hardware_acceleration == 'nvenc'
124 register: model_download
125 retries: 3
126 delay: 10
127
128- name: Generate Frigate configuration file
129 template:
130 src: frigate-config.yml.j2
131 dest: "{{ frigate_config_dir }}/config/config.yml"
132 owner: "{{ runner_user }}"
133 group: "{{ runner_group }}"
134 mode: '0777'
135 backup: yes
136 notify: restart frigate
137
138- name: Create Frigate environment file
139 template:
140 src: frigate.env.j2
141 dest: "{{ frigate_config_dir }}/frigate.env"
142 owner: "{{ runner_user }}"
143 group: "{{ runner_group }}"
144 mode: '0664'
145 notify: restart frigate
146
147# GPU configuration is handled directly in service templates - no need for separate config file
148
149- name: Check GPU availability and warn if configuration mismatch
150 debug:
151 msg: |
152 WARNING: Frigate hardware acceleration setting '{{ frigate_hardware_acceleration }}' may not be available.
153 {% if frigate_hardware_acceleration in ['nvdec', 'nvenc'] and not ansible_facts.get('gpu_info', {}).get('nvidia_gpu_detected', false) %}
154 NVIDIA GPU not detected. Falling back to CPU-only processing.
155 {% elif frigate_hardware_acceleration == 'qsv' and not ansible_facts.get('intel_gpu_detected', false) %}
156 Intel GPU not detected. Falling back to CPU-only processing.
157 {% elif frigate_hardware_acceleration == 'vaapi' and ansible_facts.get('vaapi_devices', []) | length == 0 %}
158 VAAPI devices not found. Falling back to CPU-only processing.
159 {% endif %}
160 Consider setting frigate_hardware_acceleration to "none" for CPU-only processing.
161 when: >
162 (frigate_hardware_acceleration in ['nvdec', 'nvenc'] and not ansible_facts.get('gpu_info', {}).get('nvidia_gpu_detected', false)) or
163 (frigate_hardware_acceleration == 'qsv' and not ansible_facts.get('intel_gpu_detected', false)) or
164 (frigate_hardware_acceleration == 'vaapi' and ansible_facts.get('vaapi_devices', []) | length == 0)
165
166- name: Create Frigate Docker Compose file
167 template:
168 src: frigate-compose.yml.j2
169 dest: "{{ frigate_config_dir }}/docker-compose.yml"
170 owner: "{{ runner_user }}"
171 group: "{{ runner_group }}"
172 mode: '0664'
173 notify: restart frigate
174
175- name: Start Frigate service
176 community.docker.docker_compose_v2:
177 project_src: "{{ frigate_config_dir }}"
178 state: present
179 register: frigate_start_result
180
181- name: Wait for Frigate to be healthy
182 uri:
183 url: "http://localhost:{{ frigate_port }}/api/config"
184 method: GET
185 status_code: 200
186 register: frigate_health
187 until: frigate_health.status == 200
188 retries: 30
189 delay: 10
190 when: frigate_start_result is changed
191
192- name: Display Frigate deployment summary
193 debug:
194 msg: |
195 Frigate CCTV System Deployment:
196 - Status: {{ 'Started' if frigate_start_result is changed else 'Already running' }}
197 - Web UI: http://{{ ansible_default_ipv4.address }}:{{ frigate_port }}
198 - RTMP Stream: rtmp://{{ ansible_default_ipv4.address }}:{{ frigate_rtmp_port }}
199 - RTSP Re-stream: rtsp://{{ ansible_default_ipv4.address }}:{{ frigate_rtsp_port }}
200 - Configuration: {{ frigate_config_dir }}/config/config.yml
201 - Data Storage: {{ frigate_data_dir }}
202 - Cameras Configured: {{ frigate_cameras | length }}
203 - MQTT: {{ 'Enabled' if frigate_mqtt_enabled else 'Disabled' }}
204 - Hardware Acceleration: {{ frigate_hardware_acceleration }}
205 - GPU Detection: {{ 'Available' if ansible_facts.get('gpu_info', {}).get('nvidia_gpu_detected', false) or ansible_facts.get('intel_gpu_detected', false) or ansible_facts.get('vaapi_devices', []) | length > 0 else 'No GPU detected' }}
206
207 Management Commands:
208 - frigate-logs.sh - View service logs
209 - frigate-restart.sh - Restart service
210 - frigate-status.sh - Check service status
211