Vigilancia local o nube propietaria: por qué alojar tu propio NVR
Las soluciones de videovigilancia SaaS — Reolink Cloud, Synology Surveillance Station conectada a relés propietarios, Amazon Ring — graban tus flujos en servidores de terceros. A cambio de una suscripción mensual, obtienes una app móvil, almacenamiento remoto y detección de eventos. Lo que cedes es el control sobre lo que ocurre frente a tus cámaras.
Autoalojar tu NVR en un VPS invierte la lógica: tus flujos nunca abandonan tu infraestructura, la detección de objetos (personas, vehículos, animales) se ejecuta localmente sin enviar ninguna imagen a terceros, y las grabaciones se almacenan en tus propios volúmenes.
Frigate NVR es la referencia de código abierto en esta categoría. Recibe flujos RTSP de tus cámaras IP, recorta clips en eventos detectados, conserva instantáneas y expone una API REST compatible con Home Assistant. La versión 0.18, publicada en septiembre de 2026, sustituye el archivo config.yml obligatorio por una interfaz gráfica completa: configura cámaras, zonas de detección y umbrales desde un navegador, sin tocar YAML si no lo deseas.
Beneficios concretos de Frigate autoalojado en un VPS
- Flujos de vídeo y grabaciones 100% locales: ningún tercero accede a tus imágenes.
- Detección de objetos IA (personas, vehículos, animales) en tu propio CPU, sin cuotas ni límites de API.
- Sin suscripción recurrente: pagas tu VPS, no una licencia de detección.
- Integración nativa con Home Assistant vía MQTT y la API REST de Frigate.
- Clips de eventos, instantáneas y línea de tiempo consultables desde la interfaz web.
- Compatible con prácticamente todas las cámaras IP del mercado vía el protocolo RTSP estándar.
- Zonas de detección configurables por cámara para filtrar falsas alertas (calle, vecino, árbol).
- Configuración completa en GUI desde la v0.18 — YAML sigue siendo posible pero ya no es obligatorio.
Requisitos en cifras: dimensionar tu VPS para Frigate
Frigate es una aplicación intensiva en CPU en modo software puro. La detección de objetos se apoya en un modelo TensorFlow Lite que se ejecuta en cada fotograma analizado.
Para 1 o 2 cámaras a 1080p: 2 vCPU y 2 GB de RAM es el mínimo funcional. Tasa de análisis recomendada: máximo 5 fotogramas por segundo.
Para 3 a 5 cámaras a 1080p: 4 vCPU y 4 GB de RAM proporcionan margen suficiente. El plan VPS Power (4 vCPU / 8 GB GB RAM) es un punto de partida realista para este caso de uso.
Para más de 5 cámaras: 6 a 8 vCPU y 8 GB de RAM o más. La aceleración hardware vía Coral TPU o GPU reduce drásticamente la carga en CPU pero no está disponible en VPS alojado estándar.
Almacenamiento: cada cámara 1080p genera entre 1 y 3 GB por hora en modo grabación continua. En modo eventos, presupuesta 5 a 15 GB por cámara al día según la frecuencia de movimiento.
Red: cada flujo RTSP entrante consume entre 1 y 4 Mbit/s según resolución y códec. Una cámara H.264 a 1080p consume típicamente entre 1,5 y 2,5 Mbit/s.
Software requerido: Docker Engine 24+ y Docker Compose v2, acceso root al VPS, un subdominio DNS apuntando a la IP del servidor, y un proxy inverso (Nginx, Caddy o Traefik) para la terminación TLS.
Desplegar Frigate NVR con Docker Compose
Crear la estructura de directorios
Conéctate al VPS por SSH y crea la estructura que Frigate usará para su configuración, grabaciones e instantáneas:
mkdir -p /opt/frigate/{config,storage/recordings,storage/clips,storage/exports} cd /opt/frigateFrigate espera su archivo de configuración en
/opt/frigate/config/config.yml. Con la v0.18, este archivo puede quedar mínimo al inicio — la GUI completa la configuración después.Crear una configuración de inicio mínima
Crea
/opt/frigate/config/config.ymlcon el siguiente contenido:mqtt: enabled: false record: enabled: true retain: days: 7 mode: motion snapshots: enabled: true retain: default: 10 detectors: cpu1: type: cpu num_threads: 3La clave
detectorsdeclara un detector por software en CPU.num_threads: 3es un buen equilibrio para 2 a 4 cámaras.Redactar el archivo Docker Compose
Crea
/opt/frigate/docker-compose.ymlcon la siguiente configuración:services: frigate: container_name: frigate image: ghcr.io/blakeblackshear/frigate:stable restart: unless-stopped shm_size: "256mb" volumes: - /opt/frigate/config:/config - /opt/frigate/storage:/media/frigate - /etc/localtime:/etc/localtime:ro ports: - "5000:5000" - "8554:8554" - "8555:8555/tcp" - "8555:8555/udp" environment: FRIGATE_RTSP_PASSWORD: "changeme" devices: - /dev/dri:/dev/driPuertos expuestos: 5000 para la interfaz web y la API REST, 8554 para el servidor RTSP interno, 8555 TCP y UDP para WebRTC.
Iniciar Frigate y revisar los registros
Desde el directorio
/opt/frigate, lanza el contenedor y monitoriza los registros de inicio:docker compose up -d docker compose logs -f frigateEn el primer inicio, Frigate descarga el modelo TensorFlow Lite (~6 MB) e inicializa su base de datos SQLite. La operación tarda entre 30 y 90 segundos. El log debe mostrar
Frigate is running.Accede a la interfaz en
http://<ip-de-tu-vps>:5000para la verificación inicial.Configurar un proxy inverso para acceso HTTPS
Frigate no gestiona TLS de forma nativa. Configura Nginx como proxy inverso. Crea
/etc/nginx/sites-available/frigate:server { listen 443 ssl; server_name frigate.yourdomain.com; ssl_certificate /etc/letsencrypt/live/frigate.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/frigate.yourdomain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 86400; } }Obtén un certificado Let's Encrypt con
certbot --nginx -d frigate.yourdomain.com.Añadir cámaras desde la GUI de Frigate v0.18
Abre la interfaz de Frigate en el navegador. La v0.18 ofrece un asistente de adición de cámaras en Configuration → Cameras → Add Camera. Rellena:
- Nombre de la cámara (sin espacios ni caracteres especiales).
- URL RTSP del flujo principal, por ejemplortsp://admin:contraseñ[email protected]:554/stream1.
- Resolución detectada automáticamente o especificada manualmente.
- Perfil de detección: *Standard* para equilibrio entre precisión y carga CPU, *Lightweight* para VPS más modestos.La GUI genera y valida el bloque YAML correspondiente antes de aplicarlo — puedes cambiar al modo YAML bruto desde la pestaña Advanced cuando quieras.
Verificar que las grabaciones y la detección funcionan
Desde el panel de Frigate, navega a Events para confirmar que se generan eventos de detección. Comprueba la pestaña Recordings para validar que los archivos mp4 se escriben en
/opt/frigate/storage/recordings/.En el VPS, monitoriza la carga CPU en tiempo real:
docker stats frigateEn modo solo CPU con 2 cámaras a 1080p y análisis a 5 fps, espera entre el 60 y el 90% de un vCPU. Ajusta el parámetro
fpsen la configuración de cada cámara si la carga es demasiado alta.
Configurar cámaras y zonas de detección desde la GUI
La novedad central de Frigate v0.18 es su editor visual de zonas de detección. Hasta la v0.14, definir una zona requería calcular manualmente las coordenadas de polígono en el archivo YAML.
Desde la v0.18, la pestaña Zones de cada cámara muestra la imagen en directo y permite dibujar polígonos directamente con el ratón. Cada zona recibe un nombre (ej.: entrada, jardín, calle) y filtros de objetos — puedes indicar que la zona calle ignore personas pero alerte sobre vehículos, o que la zona entrada dispare una notificación cuando una persona entre en el perímetro.
Máscaras de movimiento: la misma interfaz permite dibujar máscaras sobre zonas que generan demasiadas falsas alertas — un árbol moviéndose con el viento, una luz parpadeante. La máscara impide que Frigate analice esos píxeles para la detección, sin afectar a la grabación.
Umbrales de confianza: cada objeto detectable (persona, coche, perro, gato, pájaro...) tiene un umbral ajustable entre 0 y 1. El valor por defecto de 0,5 es razonable; bajarlo a 0,35 aumenta la sensibilidad a costa de más falsas alertas.
Configuración de notificaciones: Frigate se integra con Home Assistant vía MQTT o su API REST. Sin Home Assistant, puedes enviar alertas a cualquier webhook vía notify.webhook o usar directamente los clips de eventos desde la interfaz.
Reforzar el acceso a la interfaz web de Frigate
La interfaz de Frigate no incluye sistema de autenticación en su versión estable. Expuesta directamente a Internet, es accesible sin contraseña. Tres medidas complementarias antes de hacer público el subdominio:
Autenticación HTTP Basic vía Nginx: añade auth_basic y auth_basic_user_file en el bloque location del virtual host. Genera el archivo de contraseñas con htpasswd -c /etc/nginx/.htpasswd tu_usuario.
Restricción por IP: si accedes a Frigate desde una IP fija (oficina, VPN), añade allow 203.0.113.x; deny all; en el bloque location de Nginx.
Acceso solo por VPN: la solución más robusta. Despliega WireGuard en el mismo VPS y haz que el puerto 5000 solo sea accesible localmente o a través del túnel VPN. La interfaz nunca queda expuesta directamente a Internet.
Resolución de errores: los más frecuentes
Failed to connect to camera: Connection refused o timeout en el arranque
Frigate no puede alcanzar el flujo RTSP. Verifica primero que la URL RTSP es correcta con ffprobe desde el VPS: ffprobe -v quiet -print_format json -show_streams rtsp://.... Si la cámara está en una red privada separada del VPS, no es alcanzable directamente — necesitas un túnel o un relé RTSP.
ffmpeg process crashed en bucle en los logs
Códec no compatible (H.265/HEVC) o resolución demasiado alta para el ancho de banda disponible. Solución: fuerza la transcodificación en entrada añadiendo input_args: preset-rtsp-restream en la configuración de la cámara, o reduce la resolución de la cámara a 1280×720.
Insufficient shared memory al arrancar el contenedor
Significa que shm_size es demasiado pequeño. Regla general: 256 MB para 2 cámaras, 512 MB para 4, 1 GB para 8 o más. Ajusta shm_size en docker-compose.yml.
Database is locked o cuelgues aleatorios
Frigate usa SQLite, que gestiona mal los volúmenes de red (NFS, CIFS). Si montas /opt/frigate/storage desde almacenamiento en red, mueve solo la base SQLite a un volumen local: db_path: /tmp/frigate.db en la configuración.
La detección no se dispara pese a movimiento visible
Verifica primero que la zona de detección cubre el área de interés en el editor visual. Luego consulta la pestaña Debug de la cámara en la GUI: superpone rectángulos de detección en tiempo real sobre el flujo. Si no aparecen rectángulos, el modelo está ejecutándose pero no encuentra nada — el umbral de confianza puede ser demasiado alto o los objetos demasiado pequeños en el campo de la cámara.
Para ir más lejos
Frigate NVR convierte un VPS estándar en una estación de vigilancia soberana. La detección de objetos se ejecuta localmente, tus grabaciones permanecen en tus volúmenes, y la v0.18 hace la instalación accesible sin experiencia en YAML.
Si amplías tu stack autoalojado, los artículos siguientes cubren servicios complementarios que se integran bien con Frigate desde un panel centralizado: Jellyfin para tu biblioteca multimedia, Pi-hole para el filtrado DNS y Homepage como panel para todos tus servicios. un VPS Power cubre la mayoría de configuraciones de 3 a 5 cámaras en modo solo CPU, con margen para otros contenedores de la stack.