¿Cómo instalar Frigate NVR con Docker en Ubuntu 24.04?

CIBERED LOGO

Frigate es un NVR open source con detección de objetos por IA que procesa vídeo localmente, sin enviar tus imágenes a la nube..

Esto lo convierte en una opción muy potente para videovigilancia doméstica y profesional, especialmente si quieres detección de personas, coches y animales, integración con Home Assistant y control total sobre tus datos.

En esta guía vas a montar Frigate 0.17 con Docker, Mosquitto MQTT, cámaras RTSP, grabación por eventos, snapshots, restream WebRTC y opciones avanzadas como zonas, aceleración por hardware, reconocimiento facial y lectura de matrículas.

1. Objetivo del sistema

La meta es crear una instalación estable y modular donde cada componente haga su trabajo: Mosquitto gestiona la mensajería MQTT, Frigate analiza vídeo y guarda eventos, y go2rtc facilita la visualización en tiempo real desde el navegador.

Todo se desplegará con Docker Compose para que puedas levantar, parar, actualizar y respaldar el sistema con facilidad. La estructura también te permitirá ampliar el número de cámaras más adelante sin rehacer la instalación completa.

Documentación de Instalación Oficial de Frigate

2. Requisitos mínimos

Necesitas Ubuntu 24.04 LTS o Debian 13, Docker y Docker Compose instalados, cámaras IP con RTSP y una red local donde servidor y cámaras puedan verse entre sí.

Para un uso básico, 4 GB de RAM pueden bastar, pero 8 GB es una recomendación más realista si quieres activaciones como reconocimiento facial o LPR.

Si puedes, usa un disco dedicado para grabaciones y, de ser posible, una GPU Intel compatible o un acelerador tipo Coral/Hailo para bajar carga de CPU.

3. Crear la estructura

Primero organiza el proyecto en una sola carpeta raíz. Esto evita archivos sueltos y hace más claro el mantenimiento. asus

sudo mkdir -p /opt/frigate/{config,media,mosquitto/{config,data,log}}

La carpeta config guardará la configuración de Frigate, media almacenará grabaciones, y mosquitto contendrá la configuración y persistencia del broker MQTT.

Si después haces copias de seguridad, bastará con respaldar esta carpeta raíz y tendrás prácticamente todo el sistema protegido.

4. Instalar Docker si aún no lo tienes

La documentación de Frigate asume que Docker y Docker Compose ya están instalados antes de empezar. Si tu sistema todavía no los tiene, instala primero Docker en Ubuntu o Debian siguiendo el método oficial o una guía confiable, y luego verifica que docker compose responde correctamente.

Sin Docker no merece la pena seguir, porque todo el despliegue de Frigate se basa en contenedores.

5. Configurar Mosquitto

Frigate usa MQTT para publicar eventos de detección, cambios de estado y estadísticas, así que Mosquitto será el punto de comunicación entre Frigate y otros sistemas como Home Assistant.

Crea el archivo:

sudo vi /opt/frigate/mosquitto/config/mosquitto.conf

Y añade esta configuración base:

persistence true
persistence_location /mosquitto/data/

log_dest stdout
log_type error
log_type warning
log_type notice

allow_anonymous true

listener 1883
protocol mqtt

listener 9001
protocol websockets

Para pruebas está bien dejar allow_anonymous true, pero en producción debes desactivarlo y usar autenticación con mosquitto_passwd. Esto es importante porque MQTT no debería quedar abierto si piensas exponer el sistema más allá de tu LAN.

6. Crear la configuración principal

Ahora viene el archivo más importante del sistema: config.yml de Frigate. Aquí defines desde qué cámaras leer, qué objetos rastrear, cómo grabar, cuánto retener y qué opciones inteligentes activar.

sudo vi /opt/frigate/config/config.yml

Pega una base como esta:

mqtt:
  enabled: true
  host: mosquitto
  port: 1883
  topic_prefix: frigate
  client_id: frigate
  stats_interval: 60

database:
  path: /config/frigate.db

birdseye:
  enabled: true
  mode: continuous

detect:
  enabled: true
  width: 1280
  height: 720
  fps: 5

objects:
  track:
    - person
    - car
    - dog
    - cat

record:
  enabled: true
  retain:
    days: 7
    mode: motion

snapshots:
  enabled: true
  timestamp: true
  bounding_box: true
  retain:
    default: 7

go2rtc:
  streams:
    front_door: rtsp://admin:password123@192.168.1.50:554/Streaming/Channels/101
    backyard: rtsp://admin:password123@192.168.1.51:554/Streaming/Channels/101
  webrtc:
    candidates:
      - 192.168.1.100:8555

cameras:
  front_door:
    enabled: true
    ffmpeg:
      inputs:
        - path: rtsp://admin:password123@192.168.1.50:554/Streaming/Channels/101
          input_args: preset-rtsp-restream
          roles:
            - detect
            - record
      hwaccel_args: preset-vaapi
    detect:
      enabled: true
      width: 1280
      height: 720
      fps: 5
    record:
      enabled: true
      retain:
        days: 7
        mode: motion
    snapshots:
      enabled: true
      timestamp: true
      bounding_box: true
    ui:
      order: 1

  backyard:
    enabled: true
    ffmpeg:
      inputs:
        - path: rtsp://admin:password123@192.168.1.51:554/Streaming/Channels/101
          input_args: preset-rtsp-restream
          roles:
            - detect
            - record
      hwaccel_args: preset-vaapi
    detect:
      enabled: true
      width: 1280
      height: 720
      fps: 5
    record:
      enabled: true
      retain:
        days: 7
        mode: motion
    snapshots:
      enabled: true
      bounding_box: true
    ui:
      order: 2

ui:
  timezone: Europe/Madrid

version: 0.16-0

Los nombres dentro de go2rtc.streams deben coincidir con los nombres de las cámaras para evitar confusión y hacer que la integración sea más limpia:

  • preset-rtsp-restream es útil porque Frigate recomienda usar el stream restreamed para optimizar el acceso a vídeo.
  • preset-vaapi activa aceleración Intel VAAPI; si no tienes Intel GPU, elimínalo.

7. Entender el YAML

La parte mqtt conecta Frigate con el broker que levantaste antes.

  • birdseye activa una vista combinada de varias cámaras, útil para vigilancia rápida.
  • detect define resolución y FPS del análisis, y aquí conviene usar una configuración moderada para no sobrecargar el equipo.
    record controla qué se guarda, y mode: motion ahorra mucho almacenamiento frente a grabar todo el día.
  • snapshots permite guardar capturas con hora y caja delimitadora alrededor del objeto detectado.

8. Añadir más cámaras

Cada cámara se define dentro de cameras: con su nombre, su stream RTSP y sus opciones. Si quieres añadir una tercera cámara, repites el mismo patrón con su IP y su ruta RTSP correspondiente.

En entornos reales suele ser buena idea empezar por una sola cámara, confirmar que todo funciona, y luego ir sumando el resto una por una.

9. Crear el Docker Compose

El docker-compose.yml es el archivo que realmente levanta los servicios y los une en una red compartida. Frigate suele ir acompañado de Mosquitto en el mismo stack para que MQTT funcione sin complicaciones.

sudo vi /opt/frigate/docker-compose.yml

Contenido:

networks:
  frigate-net:
    driver: bridge

services:
  mosquitto:
    container_name: mosquitto
    image: eclipse-mosquitto:latest
    restart: unless-stopped
    networks:
      - frigate-net
    ports:
      - "1883:1883"
      - "9001:9001"
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
      - ./mosquitto/log:/mosquitto/log

  frigate:
    container_name: frigate
    image: ghcr.io/blakeblackshear/frigate:stable
    restart: unless-stopped
    privileged: true
    networks:
      - frigate-net
    ports:
      - "5000:5000"
      - "8554:8554"
      - "8555:8555/tcp"
      - "8555:8555/udp"
    volumes:
      - ./config:/config
      - ./media:/media/frigate
      - type: tmpfs
        target: /tmp/cache
        tmpfs:
          size: 1000000000
    shm_size: "256mb"
    devices:
      - /dev/dri/renderD128
    environment:
      - TZ=Europe/Madrid
    depends_on:
      - mosquitto

Si no usas GPU Intel, elimina devices: y deja Frigate con CPU. Si tu instalación es pequeña, esto puede ir perfectamente; si son muchas cámaras, la aceleración por hardware marcará una diferencia enorme.

Aquí tienes el contenido con todas las referencias eliminadas y el resto mantenido igual:

10. Arrancar los servicios

Entra en la carpeta del proyecto y arranca los contenedores.

cd /opt/frigate
sudo docker compose pull
sudo docker compose up -d
`

Después comprueba el estado:

sudo docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Image}}"

Si todo va bien, verás Frigate y Mosquitto en ejecución. Cuando Frigate termina de inicializar, suele quedar en estado saludable y empieza a exponer la interfaz web.

11. Revisar logs

Si algo falla, mira los logs antes de tocar nada más.

sudo docker logs frigate 2>&1 | tail -20

Los errores más comunes suelen ser rutas RTSP mal escritas, YAML mal indentado, IP incorrecta o problemas con el acceso al dispositivo de vídeo. Si el arranque es correcto, verás mensajes relacionados con go2rtc, RTSP, WebRTC y la app FastAPI.

12. Entrar al panel

Abre en tu navegador:

http://IP_DEL_SERVIDOR:5000

Frigate suele generar una contraseña de administrador automática en el primer arranque, y normalmente puedes verla en los logs. Una vez dentro, tendrás acceso a la vista en vivo, revisión de eventos, búsqueda y ajustes del sistema.

13. Encontrar cámaras RTSP

Antes de configurar una cámara, necesitas conocer su URL RTSP exacta. Aunque muchas usan el puerto 554, la ruta cambia según la marca, así que no basta con la IP.

13.1 Escanear la red

sudo apt install -y nmap
nmap -p 554 192.168.1.0/24 --open

Eso te mostrará qué equipos tienen RTSP abierto. Luego puedes probar cada IP candidata con ffprobe.

13.2 Probar el stream

ffprobe -rtsp_transport tcp rtsp://admin:password@192.168.1.50:554/Streaming/Channels/101

Si la conexión funciona, ffprobe te mostrará codec, resolución y FPS. Si no funciona, prueba otra ruta RTSP de la misma marca.

13.3 Descubrimiento ONVIF

Si la cámara soporta ONVIF, puedes sacar la URI de stream automáticamente con herramientas como onvif-zeep. Esto es útil porque evita adivinar rutas, especialmente en marcas que no documentan bien sus URLs.

14. Formatos RTSP comunes

Hikvision y muchos clones OEM usan este patrón: .../Streaming/Channels/101 para stream principal y .../Streaming/Channels/102 para substream.

Dahua y Amcrest suelen usar .../cam/realmonitor?channel=1&subtype=0 para principal y subtype=1 para substream.

Reolink, Tapo, UniFi Protect y Axis tienen estructuras distintas, pero el principio es el mismo: un stream de alta calidad y otro más ligero para detección.

La recomendación práctica es usar el substream para detectar y el principal para grabar, así ahorras recursos.

15. Ajustar aceleración

Frigate funciona mejor si la decodificación de vídeo se hace con GPU cuando existe soporte, puedes comprobar si existe dispositivo de vídeo con:

ls -la /dev/dri/

Si ves renderD128, normalmente tienes una ruta válida para VAAPI en Intel. Si quieres verificar el driver usa:

sudo apt install -y vainfo
vainfo

Si no tienes GPU, simplemente usa CPU y reduce la carga con menos FPS, menor resolución o menos cámaras.

16. Zonas y máscaras

Las zonas sirven para decirle a Frigate dónde tiene sentido detectar objetos. Por ejemplo, puedes detectar solo en la entrada y excluir la calle o la acera.

cameras:
  front_door:
    zones:
      driveway:
        coordinates: 0.2,0.4,0.8,0.4,0.8,1.0,0.2,1.0
        objects:
          - person
          - car
      porch:
        coordinates: 0.0,0.0,0.3,0.0,0.3,0.5,0.0,0.5
        objects:
          - person
          - dog

Las máscaras de movimiento se usan para ignorar zonas con ruido constante, como árboles o tráfico. Eso reduce falsas alarmas y mejora la calidad de los eventos.

17. Modos de grabación

Frigate puede grabar todo, grabar solo movimiento o grabar solo objetos activos. En una casa normal, motion suele ser la opción más equilibrada.

  • all: graba continuamente.
  • motion: graba cuando detecta movimiento.
  • active_objects: graba solo cuando hay objetos rastreados.

Si tienes varias cámaras, motion suele ser suficiente y ahorra muchísimo espacio.

18. Reconocimiento facial

Frigate incorpora reconocimiento facial local en versiones recientes, y permite identificar personas conocidas. La función exige más RAM y una CPU decente, idealmente con soporte AVX2.

Ejemplo básico:

face_recognition:
  enabled: true
  model_size: small
  min_area: 500

El entrenamiento se hace desde la interfaz web, asociando nombres a rostros detectados y subiendo varias fotos por persona. Cuanto mejor sea la calidad de esas imágenes, mejor será el resultado.

19. Lectura de matrículas

La lectura de matrículas también funciona localmente y combina detección con OCR. Para que tenga sentido, la placa debe ocupar suficiente espacio en la imagen y estar bien iluminada.

Ejemplo:

lpr:
  enabled: true

Si quieres obtener resultados decentes, coloca la cámara con un ángulo adecuado y evita reflejos excesivos. Si la distancia es muy grande, la precisión bajará mucho.

20. Integración con Home Assistant

Frigate se integra muy bien con Home Assistant mediante la integración oficial. Eso te permite recibir cámaras, eventos y automatizaciones dentro de tu domótica.

Si necesitas HACS, lo instalas primero en Home Assistant y después añades la integración de Frigate. Una vez conectado, cada cámara puede aparecer como entidad de Home Assistant y disparar automatizaciones por MQTT.

Ejemplo de automatización:

automation:
  - alias: "Front Door Person Alert"
    trigger:
      - platform: mqtt
        topic: frigate/events
    condition:
      - condition: template
        value_template: "{{ trigger.payload_json.after.label == 'person' }}"
      - condition: template
        value_template: "{{ trigger.payload_json.after.camera == 'front_door' }}"
    action:
      - service: notify.mobile_app_phone
        data:
          title: "Person Detected"
          message: "Someone is at the front door"
          data:
            image: "https://YOUR-SERVER:5000/api/events/{{ trigger.payload_json.after.id }}/snapshot.jpg"

21. Abrir puertos en firewall

Si usas UFW, abre estos puertos:

sudo ufw allow 5000/tcp
sudo ufw allow 8554/tcp
sudo ufw allow 8555/tcp
sudo ufw allow 8555/udp
sudo ufw allow 1883/tcp
sudo ufw reload

5000 es la interfaz web, 8554 es el restream RTSP, 8555 se usa para WebRTC y 1883 para MQTT. Si usas firewalld, el concepto es el mismo.

22. Dimensionamiento del servidor

  • Para 1 a 4 cámaras básicas, un CPU moderno de 4 núcleos y 4 GB de RAM pueden valer.
  • Para 4 a 8 cámaras con funciones extra, 8 GB de RAM y un procesador más capaz ya son más sensatos.
  • Para 8 a 16 cámaras con reconocimiento facial, LPR y otras funciones IA, es mejor un equipo bastante más potente y con almacenamiento serio.

23. Problemas habituales

  • Si Frigate no arranca, revisa la indentación del YAML antes de pensar que el problema es Docker.
  • Si no ves cámaras, revisa la URL RTSP, usuario, contraseña, IP y puerto.
  • Si el uso de CPU se dispara, baja FPS, usa substream o activa hardware acceleration.
  • Si Home Assistant no recibe eventos, revisa MQTT y la conectividad entre contenedores.

24. Recomendaciones finales

Para un despliegue serio, usa un disco de videovigilancia, un SAI/UPS y, si vas a acceder remotamente, un reverse proxy con SSL.

No actives reconocimiento facial ni LPR hasta confirmar que tu hardware lo soporta bien, y si tienes varias cámaras empieza por una sola, deja todo fino y luego escala.

Vistas: 3