<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Go2rtc on inetshell</title><link>https://inet.sh/es/tags/go2rtc/</link><description>Recent content in Go2rtc on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Mon, 31 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/go2rtc/index.xml" rel="self" type="application/rss+xml"/><item><title>Frigate con Docker Compose para tus cámaras</title><link>https://inet.sh/es/posts/frigate/docker-compose/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/frigate/docker-compose/</guid><description>Levantar Frigate (NVR con detección de objetos) en Docker Compose: compose, config.yml con go2rtc restream, aceleración por hardware y detector. Trampas de shm_size y del puerto interno.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mkdir -p /opt/frigate/config /opt/frigate/media
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /opt/frigate
</span></span><span class="line"><span class="cl"><span class="c1"># escribe docker-compose.yml y config/config.yml (abajo)</span>
</span></span><span class="line"><span class="cl">docker compose up -d
</span></span><span class="line"><span class="cl">docker compose logs -f frigate
</span></span></code></pre></td></tr></table>
</div>
</div><p>UI con autenticación en <code>https://&lt;host&gt;:8971</code>. La primera vez genera la contraseña del usuario <code>admin</code> en el log.</p>
<p>Frigate es un NVR con <strong>detección de objetos en tiempo real</strong> (persona, coche, animal…) para cámaras IP. Corre bien en un contenedor: le das un <code>docker-compose.yml</code>, un <code>config.yml</code> y las URLs RTSP de tus cámaras. Lo demás es afinar memoria compartida y aceleración por hardware.</p>
<h2 id="docker-composeyml">docker-compose.yml</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">frigate</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">frigate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ghcr.io/blakeblackshear/frigate:stable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">stop_grace_period</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">shm_size</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;256mb&#34;</span><span class="w">            </span><span class="c"># súbelo según nº de cámaras y resolución</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">devices</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/dev/dri/renderD128     </span><span class="w"> </span><span class="c"># iGPU (VAAPI) para decodificar; opcional</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># - /dev/bus/usb:/dev/bus/usb   # Coral USB</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># - /dev/apex_0:/dev/apex_0     # Coral PCIe</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/etc/localtime:/etc/localtime:ro</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./config:/config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./media:/media/frigate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">tmpfs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l">/tmp/cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">tmpfs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">size</span><span class="p">:</span><span class="w"> </span><span class="m">1000000000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8971:8971&#34;</span><span class="w">     </span><span class="c"># UI con autenticación (úsala)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8554:8554&#34;</span><span class="w">     </span><span class="c"># restream RTSP (go2rtc)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8555:8555/tcp&#34;</span><span class="w"> </span><span class="c"># WebRTC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8555:8555/udp&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">FRIGATE_RTSP_USER</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;${FRIGATE_RTSP_USER}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">FRIGATE_RTSP_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;${FRIGATE_RTSP_PASSWORD}&#34;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Las credenciales de las cámaras van en un <code>.env</code> al lado del compose (nunca en git):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># /opt/frigate/.env</span>
</span></span><span class="line"><span class="cl"><span class="nv">FRIGATE_RTSP_USER</span><span class="o">=</span>viewer
</span></span><span class="line"><span class="cl"><span class="nv">FRIGATE_RTSP_PASSWORD</span><span class="o">=</span>change-me
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="configconfigyml">config/config.yml</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">mqtt</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">        </span><span class="c"># o apunta a un broker mosquitto para Home Assistant</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">detectors</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">cpu1</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">cpu          </span><span class="w"> </span><span class="c"># cámbialo a edgetpu (Coral) o tensorrt (NVIDIA)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">ffmpeg</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hwaccel_args: preset-vaapi   # iGPU Intel/AMD; NVIDIA</span><span class="p">:</span><span class="w"> </span><span class="l">preset-nvidia</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">go2rtc</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">streams</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">door1</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;rtsp://{FRIGATE_RTSP_USER}:{FRIGATE_RTSP_PASSWORD}@camera-ip:554/stream1&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cameras</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">door1</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ffmpeg</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">inputs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">rtsp://127.0.0.1:8554/door1  </span><span class="w"> </span><span class="c"># una sola conexión vía go2rtc</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">roles</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">detect, record]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">detect</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">width</span><span class="p">:</span><span class="w"> </span><span class="m">1280</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">height</span><span class="p">:</span><span class="w"> </span><span class="m">720</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">fps</span><span class="p">:</span><span class="w"> </span><span class="m">5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">objects</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">track</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">person, car, dog]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">record</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">retain</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">days</span><span class="p">:</span><span class="w"> </span><span class="m">7</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">snapshots</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Añade más cámaras repitiendo el bloque <code>go2rtc.streams</code> + <code>cameras</code>. Recarga con <code>docker compose restart frigate</code>.</p>
<h2 id="qué-hace-cada-pieza">Qué hace cada pieza</h2>
<table>
  <thead>
      <tr>
          <th>Pieza</th>
          <th>Para qué</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>shm_size</code></td>
          <td>Buffers de frames en <code>/dev/shm</code>. Insuficiente = las cámaras crashean.</td>
      </tr>
      <tr>
          <td><code>go2rtc</code></td>
          <td>Reempaqueta el RTSP de la cámara y lo sirve en <code>:8554</code>. Frigate consume de ahí para <strong>detectar y grabar con una sola conexión</strong> a la cámara.</td>
      </tr>
      <tr>
          <td><code>hwaccel_args</code></td>
          <td>Descarga el decode de vídeo a la GPU/iGPU. Sin esto la CPU se derrite.</td>
      </tr>
      <tr>
          <td><code>detectors</code></td>
          <td>Dónde corre la inferencia: <code>cpu</code> (lento), <code>edgetpu</code> (Coral) o <code>tensorrt</code> (NVIDIA).</td>
      </tr>
      <tr>
          <td>Puerto <code>8971</code></td>
          <td>UI con login. Es la que expones.</td>
      </tr>
      <tr>
          <td><code>record</code> / <code>snapshots</code></td>
          <td>Escriben en <code>./media</code>. La retención define cuánto disco comes.</td>
      </tr>
  </tbody>
</table>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong><code>shm_size</code> corto → cámaras que se reinician solas.</strong> Regla aproximada por cámara: <code>(ancho*alto*1.5*9 + 270480) / 1048576</code> MB; suma todas y deja base. Con varias cámaras 1080p te quedas corto en 64–128 MB.</li>
<li><strong>No expongas el puerto 5000.</strong> Es la API <strong>interna sin autenticación</strong>. La UI pública es <code>8971</code> (con login). Deja <code>5000</code> solo en loopback / red interna.</li>
<li><strong>Usa el restream de go2rtc.</strong> Si pones el RTSP de la cámara directo en <code>detect</code> <em>y</em> <code>record</code>, abres dos conexiones al sensor; muchas cámaras baratas no lo aguantan. Detecta y graba desde <code>rtsp://127.0.0.1:8554/&lt;cam&gt;</code>.</li>
<li><strong>Detecta en baja resolución.</strong> <code>detect</code> a 1280×720 y 5 fps basta; graba en el stream alto aparte si tu cámara tiene dos.</li>
<li><strong>Aceleración por hardware o CPU al 100%.</strong> <code>preset-vaapi</code> (Intel/AMD) o <code>preset-nvidia</code>; el device <code>/dev/dri</code> (o el runtime de NVIDIA) tiene que estar mapeado.</li>
<li><strong>Un detector no es opcional en la práctica.</strong> El detector <code>cpu</code> sirve para probar, pero con más de una o dos cámaras quieres Coral o TensorRT.</li>
</ul>
<h2 id="ver-también">Ver también</h2>
<ul>
<li>Documentación oficial: <a href="https://docs.frigate.video/">https://docs.frigate.video/</a></li>
</ul>
]]></content:encoded></item></channel></rss>