Servidor Linux que lee video de una o varias cámaras IP por RTSP y lo re-publica por HTTP MJPEG en un puerto distinto por cámara, compatible con consumidores como OctoPrint, dashboards web o integraciones LAN.
- GUI web para registrar, editar, pausar y eliminar cámaras.
- Stream MJPEG por cámara (
/video_feed,?action=stream,stream.mjpg). - Snapshot JPG por cámara (
/snapshot,?action=snapshot,snapshot.jpg). - Captura periódica de snapshots a disco.
- Janitor automático que purga capturas antiguas cuando el disco supera un umbral configurable.
- Servicio
systemdpara operar 24/7.
- Una máquina Linux con
systemd. - Python 3.11 o superior.
ffmpeginstalado y accesible enPATH.- Acceso de red desde el servidor hacia las cámaras RTSP.
- Puertos libres:
8080para la GUI y API.- Un puerto HTTP distinto por cada cámara, por ejemplo
8001,8002, etc.
sudo apt update
sudo apt install -y git ffmpeg python3 python3-venv python3-pip- El servidor debe poder leer el repositorio
git@github.com:iskael/rstp-server.git. - Las llaves SSH del servidor deben estar autorizadas en GitHub.
- Código fuente:
/opt/rstp-server - Entorno virtual:
/opt/rstp-server/.venv - Base de datos SQLite:
/opt/rstp-server/data/cameras.db - Capturas:
/opt/rstp-server/data/captures - Servicio:
rstp-server.service
data/ y .venv/ viven en el servidor y no forman parte del repositorio.
git clone https://github.com/iskael/rstp-server.git
cd rstp-server
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8080Abrir http://localhost:8080.
sudo apt update
sudo apt install -y git ffmpeg python3 python3-venv python3-pipDesde el servidor:
ssh -T git@github.comSi GitHub reconoce la llave, continúa.
Clona el repo, crea el usuario de servicio, crea el venv, instala
dependencias y habilita el servicio:
git clone https://github.com/iskael/rstp-server.git
cd rstp-server
sudo bash scripts/bootstrap_server.shEsto deja el servicio instalado en /opt/rstp-server.
systemctl status rstp-server
journalctl -u rstp-server -fPor defecto:
http://IP_DEL_SERVIDOR:8080
El despliegue ya no necesita copiar archivos desde tu máquina local. El flujo correcto es:
- Hacer cambios localmente.
- Commit y push a
mainen GitHub. - Entrar al servidor y ejecutar:
sudo bash /opt/rstp-server/scripts/update_server.shEse script hace:
git fetchygit pull --ff-only- reinstalación de dependencias desde
requirements.txt - ajuste de permisos a
rstp:rstp - reinicio del servicio
Si ya existe /opt/rstp-server corriendo pero fue copiado manualmente,
convierte ese árbol a checkout Git en el propio servidor:
cd /opt/rstp-server
sudo git init
sudo git remote add origin git@github.com:iskael/rstp-server.git
sudo git fetch origin
sudo git checkout -B main origin/main
sudo chown -R rstp:rstp /opt/rstp-server
sudo systemctl restart rstp-serverNotas:
.venv/ydata/quedan como contenido local del servidor.- A partir de ahí, las siguientes actualizaciones deben hacerse con
scripts/update_server.sh.
- Abre la GUI.
- En Añadir cámara, ingresa:
- nombre descriptivo
- URL RTSP completa
- puerto HTTP libre para exponerla
- FPS y calidad JPEG
- Guarda la cámara.
- Prueba los endpoints publicados.
Ejemplos:
- Stream:
http://SERVIDOR:8001/?action=stream - Snapshot:
http://SERVIDOR:8001/?action=snapshot - Stream alternativo:
http://SERVIDOR:8001/video_feed
- Stream URL:
http://SERVIDOR:8001/?action=stream - Snapshot URL:
http://SERVIDOR:8001/?action=snapshot
- Las capturas se guardan en:
data/captures/<camera_id>/<YYYY-MM-DD>/<HH MM SS>.jpg - El janitor corre cada 5 minutos por defecto.
- Cuando el filesystem supera el umbral alto, purga JPG antiguos hasta volver al umbral bajo.
- Los umbrales y el intervalo se editan en la sección Almacenamiento de la GUI.
- También se puede ejecutar manualmente desde la GUI o por API.
Comandos útiles:
systemctl status rstp-server
journalctl -u rstp-server -f
systemctl restart rstp-server
systemctl stop rstp-server
systemctl start rstp-serverEl servicio actual usa:
- usuario/grupo:
rstp - directorio de trabajo:
/opt/rstp-server - base de datos:
/opt/rstp-server/data/cameras.db - web UI/API: puerto
8080
GET /api/cameras— listado JSON de cámaras y estado.GET /api/disk— uso del disco y último reporte del janitor.POST /janitor/run— ejecuta una pasada del janitor inmediatamente.
- No incluye autenticación; está pensado para LAN privada.
- Si vas a exponerlo fuera de tu red, ponlo detrás de un reverse proxy con TLS y autenticación.
- Hay un proceso
ffmpegpor cámara, independientemente del número de clientes HTTP conectados. - Solo se guardan snapshots JPG en disco; no hay grabación de video continua.