Implantação do Go2RTC via Docker
1. Iniciando a impantação
# 📹 Painel de Monitoramento CFTV - CTIC (IFPE)
## 📌 Visão Geral
Este projeto reestrutura o acesso às câmeras IP da instituição. Para aumentar a segurança e reduzir
a latência, removemos a exposição direta de portas RTSP no firewall (MikroTik).
O tráfego agora é centralizado na DMZ através de um proxy reverso (Caddy), que exige autenticação e
roteia o acesso para um contêiner Docker (go2rtc). O go2rtc converte os fluxos RTSP internos em
WebRTC (latência ultrabaixa) e os exibe em um painel HTML em formato de mosaico.
## 🏗️ Arquitetura
* **Firewall:** MikroTik (Redirecionamento da porta 554 bloqueado para a internet; porta 1984
liberada internamente entre DMZ e Docker).
* **Proxy Reverso & Web Server:** Caddy (Garante o HTTPS, exige usuário/senha e
hospeda a página HTML do painel).
* **Motor de Vídeo:** go2rtc via Docker (Busca o RTSP nas câmeras via IP interno e
converte para WebRTC).
## 📂 Estrutura de Diretórios
* `/opt/go2rtc/` ➔ Arquivos do Docker (`docker-compose.yml` e `go2rtc.yaml`)
* `/var/www/html/cameras/` ➔ Página web do mosaico (`painel.html`)
* `/etc/caddy/` ➔ Configuração do proxy (`Caddyfile`)
---
## 🛠️ 1. Configuração do Docker (go2rtc)
**IP do Servidor Docker:** `10.36.254.115`
**Arquivo: `/opt/go2rtc/docker-compose.yml`**
```yaml
version: '3.8'
services:
go2rtc:
image: alexxit/go2rtc:latest
container_name: go2rtc_panel
restart: unless-stopped
network_mode: host
volumes:
- /opt/go2rtc/go2rtc.yaml:/config/go2rtc.yaml
Arquivo: /opt/go2rtc/go2rtc.yaml
streams:
camera_01_lab04: rtsp://[USUARIO]:[SENHA]@10.36.254.26:554/[CAMINHO_RTSP]
camera_02_lab04: rtsp://[USUARIO]:[SENHA]@10.36.254.27:554/[CAMINHO_RTSP]
camera_lab07: rtsp://[USUARIO]:[SENHA]@10.36.254.29:554/[CAMINHO_RTSP]
camera_lab08: rtsp://[USUARIO]:[SENHA]@10.36.254.30:554/[CAMINHO_RTSP]
camera_lab09: rtsp://[USUARIO]:[SENHA]@10.36.254.31:554/[CAMINHO_RTSP]
Comandos Úteis (Docker):
-
Subir o serviço:
sudo docker compose up -d -
Reiniciar após adicionar câmeras:
sudo docker restart go2rtc_panel -
Ver logs de erro:
sudo docker logs go2rtc_panel --tail 50
2. Configuração do Caddy (DMZ)
Domínio: cameras.palmares.ifpe.edu.br
Arquivo: /etc/caddy/Caddyfile
cameras.palmares.ifpe.edu.br {
# Camada de Segurança (Usuário/Senha)
basicauth /* {
admin [HASH_DA_SENHA_AQUI]
}
# Rota para o Mosaico HTML
handle /painel.html {
root * /var/www/html/cameras
file_server
}
# Proxy reverso para o go2rtc
handle {
reverse_proxy 10.36.254.115:1984
}
}
Comandos Úteis (Caddy):
-
Gerar hash de nova senha:
caddy hash-password --plaintext "NovaSenha" -
Validar sintaxe:
caddy validate --config /etc/caddy/Caddyfile -
Aplicar alterações sem derrubar o serviço:
sudo systemctl reload caddy
3. O Painel Mosaico (HTML)
Arquivo: /var/www/html/cameras/painel.html
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Monitoramento - Laboratórios</title>
<style>
body {
background-color: #121212;
color: #ffffff;
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
}
h2 {
text-align: center;
margin-bottom: 20px;
color: #4CAF50;
}
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
gap: 15px;
}
.camera-card {
background-color: #1e1e1e;
padding: 10px;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0,0,0,0.3);
}
.camera-title {
text-align: center;
margin: 0 0 10px 0;
font-size: 16px;
}
iframe {
width: 100%;
height: 250px;
border: none;
border-radius: 4px;
background-color: #000;
overflow: hidden;
}
</style>
</head>
<body>
<h2>Monitoramento CFTV - CTIC</h2>
<div class="grid-container">
<div class="camera-card">
<h3 class="camera-title">Lab 04 - Câmera 01</h3>
<iframe src="/webrtc.html?src=camera_01_lab04" allow="autoplay; fullscreen" scrolling="no"></iframe>
</div>
<div class="camera-card">
<h3 class="camera-title">Lab 04 - Câmera 02</h3>
<iframe src="/webrtc.html?src=camera_02_lab04" allow="autoplay; fullscreen" scrolling="no"></iframe>
</div>
<div class="camera-card">
<h3 class="camera-title">Lab 07</h3>
<iframe src="/webrtc.html?src=camera_lab07" allow="autoplay; fullscreen" scrolling="no"></iframe>
</div>
<div class="camera-card">
<h3 class="camera-title">Lab 08</h3>
<iframe src="/webrtc.html?src=camera_lab08" allow="autoplay; fullscreen" scrolling="no"></iframe>
</div>
<div class="camera-card">
<h3 class="camera-title">Lab 09</h3>
<iframe src="/webrtc.html?src=camera_lab09" allow="autoplay; fullscreen" scrolling="no"></iframe>
</div>
</div>
</body>
</html>
Para adicionar novas câmeras, adicione a configuração no go2rtc.yaml e crie um novo bloco <div class="camera-card"> no HTML seguindo o mesmo padrão.
No Comments