RUIN.MEDIA: Procesamiento de medios con PHP y FFmpeg en contenedores

Publicado por


Docker

RUIN.MEDIA: Procesamiento de medios con PHP y FFmpeg en contenedores

Una aplicación web ligera para manipulación de archivos multimedia usando PHP 8.2, FFmpeg y Nginx en Alpine Linux

Vídeo tutorial en YouTube

Mira el vídeo completo sobre cómo instalar y usar RUIN.MEDIA: Procesamiento de medios con PHP y FFmpeg en contenedores en el canal GENBYTE:

¿Qué es RUIN.MEDIA: Procesamiento de medios con PHP y FFmpeg en contenedores?

RUIN.MEDIA es un proyecto open source desarrollado por Korosys que permite el procesamiento de archivos multimedia a través de una interfaz web. La aplicación está construida sobre PHP 8.2 (variante Hack) y utiliza FFmpeg para la manipulación de vídeo y audio, servida mediante Nginx y PHP-FPM en un contenedor Alpine Linux. El proyecto se distribuye como imagen Docker lista para producción, con límites de subida configurados a 50 MB y gestión de procesos mediante Supervisor.

Stack completo en un solo contenedor: PHP 8.2 FPM, Nginx, FFmpeg y Supervisor sobre Alpine Linux, con despliegue inmediato vía Docker Compose.

Características principales

Entorno PHP 8.2 FPM optimizado

Utiliza la imagen oficial php:8.2-fpm-alpine como base, con configuración de upload_max_filesize y post_max_size establecidos en 50 MB para manejar archivos multimedia de tamaño considerable.

Procesamiento multimedia con FFmpeg

Incluye FFmpeg instalado en el contenedor, permitiendo transcodificación, corte, conversión y manipulación de formatos de vídeo y audio directamente desde la aplicación.

Servidor web Nginx integrado

Nginx actúa como servidor frontal y proxy inverso para PHP-FPM, con configuración personalizada mediante nginx-main.conf y nginx.conf copiados al contenedor.

Gestión de procesos con Supervisor

Supervisor orquesta Nginx, PHP-FPM y procesos de limpieza mediante supervisor.conf, asegurando que todos los servicios permanezcan activos y se reinicien ante fallos.

Despliegue simplificado con Docker Compose

El archivo docker-compose.yml define el servicio ruin.media usando la imagen korosys/ruin.media:latest, mapeando el puerto 8080 del host al 80 del contenedor con política de reinicio unless-stopped.

Base Alpine Linux minimalista

La imagen final se construye sobre Alpine Linux, reduciendo la superficie de ataque y el tamaño del contenedor, instalando únicamente dependencias necesarias mediante apk.

Requisitos del sistema

  • Docker Engine 20.10 o superior
  • Docker Compose v2 (plugin compose) o docker-compose standalone
  • Puerto 8080 disponible en el host
  • Arquitectura compatible con imágenes linux/amd64 (imagen base php:8.2-fpm-alpine)

Instalación con Docker Compose

Clonar el repositorio

Obtén el código fuente y los archivos de configuración Docker desde GitHub.

git clone https://github.com/Korosys/RUIN.MEDIA.git
cd RUIN.MEDIA

Levantar la pila con Docker Compose

Inicia el contenedor en segundo plano. La imagen korosys/ruin.media:latest se descargará automáticamente si no existe localmente.

docker compose up -d

Verificar estado del contenedor

Comprueba que el servicio está corriendo y expone el puerto 8080.

docker compose ps
docker logs ruin.media

Acceder al proyecto

Interfaz web

Accede a la aplicación abriendo http://localhost:8080 en el navegador. El contenedor expone internamente el puerto 80, mapeado al 8080 del host según docker-compose.yml.

Casos de uso

  • Conversión y transcodificación de archivos de vídeo y audio mediante FFmpeg expuesto vía web
  • Subida y procesamiento de archivos multimedia hasta 50 MB
  • Entorno de pruebas para pipelines de procesamiento de medios basados en PHP
  • Demostración de arquitectura multi-servicio (Nginx + PHP-FPM + FFmpeg) en un solo contenedor gestionado por Supervisor

Configuración avanzada

Personalizar límites de subida PHP

Modifica los valores upload_max_filesize y post_max_size en el Dockerfile o crea un archivo de configuración PHP adicional montado como volumen.

# En Dockerfile, antes de COPY app/
RUN echo "upload_max_filesize = 100M" >> /usr/local/etc/php/conf.d/uploads.ini && \
echo "post_max_size = 100M" >> /usr/local/etc/php/conf.d/uploads.ini

Ajustar configuración de Nginx

Los archivos docker/nginx-main.conf y docker/nginx.conf se copian al contenedor. Para sobrescribirlos sin reconstruir la imagen, móntalos como volúmenes en docker-compose.yml.

services:
ruin.media:
image: korosys/ruin.media:latest
container_name: "ruin.media"
ports:
– "8080:80"
volumes:
– ./docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro
– ./docker/nginx-main.conf:/etc/nginx/nginx.conf:ro
restart: unless-stopped

Configurar Supervisor para tareas adicionales

Edita docker/supervisor.conf para añadir programas personalizados (workers, colas, limpieza periódica) y vuelve a construir la imagen.

# Ejemplo de entrada en supervisor.conf
[program:custom-worker]
command=php /var/www/html/worker.php
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/worker.log

Gestión y mantenimiento

Actualizar a la última versión de la imagen

Descarga la imagen más reciente y recrea el contenedor.

docker compose pull
docker compose up -d

Inspeccionar logs de la aplicación y servicios internos

Supervisor redirige la salida de Nginx, PHP-FPM y procesos propios. Usa docker logs para ver la salida combinada.

docker logs -f ruin.media

Reiniciar servicios internos sin detener el contenedor

Ejecuta supervisorctl dentro del contenedor para gestionar procesos individuales.

docker exec -it ruin.media supervisorctl status
# Reiniciar nginx o php-fpm
# docker exec -it ruin.media supervisorctl restart nginx
# docker exec -it ruin.media supervisorctl restart php-fpm

Eliminar la pila completa

Detiene y elimina el contenedor, red y volúmenes anónimos asociados.

docker compose down

Stack técnico

  • PHP 8.2 (Hack)
  • FFmpeg
  • Nginx
  • Supervisor
  • Alpine Linux
  • Docker
  • Docker Compose

Referencias oficiales

Apoya el canal GENBYTE

Sígueme en mis redes sociales

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *