Problemática inicial

El contenedor Laravel presentaba problemas de permisos de grupo que impedían el correcto funcionamiento de la aplicación, específicamente:

  • El usuario laravel generaba conflictos de permisos con www-data
  • PHP-FPM no podía escribir en el archivo database.sqlite
  • Inconsistencia entre usuarios que ejecutan diferentes servicios

Solución implementada

1. Eliminación del usuario Laravel original

Se removió la configuración del usuario laravel que utilizaba UID 1000 y se implementó una solución más robusta.

2. Creación del usuario EMI con ID 2000

# Crear grupo y usuario emi
RUN groupadd -g 2000 emi && \
    useradd -u 2000 -g 2000 -d /home/emi -m -s /bin/bash emi && \
    mkdir -p /home/emi/.composer && \
    chown -R emi:emi /home/emi

Características del usuario EMI:

  • UID: 2000
  • GID: 2000
  • Home directory: /home/emi
  • Shell: /bin/bash

3. Configuración de servicios para ejecutar como usuario EMI

Nginx

# Configurar Nginx para ejecutar como usuario emi
RUN sed -i 's/user www-data;/user emi;/' /etc/nginx/nginx.conf

PHP-FPM

# Configurar PHP-FPM para ejecutar como usuario emi
RUN sed -i 's/user = www-data/user = emi/' /usr/local/etc/php-fpm.d/www.conf && \
    sed -i 's/group = www-data/group = emi/' /usr/local/etc/php-fpm.d/www.conf

4. Gestión de permisos

# Asegurar permisos correctos para emi
RUN chown -R emi:emi /var/www \
    && chmod -R 775 /var/www/storage /var/www/bootstrap/cache \
    && chmod -R 775 /var/www/database
 
# Asegurar que emi tenga permisos en directorios de Nginx
RUN chown -R emi:emi /var/log/nginx /var/lib/nginx /run

Dockerfile final optimizado

Etapa 1: Construcción

  • Instalación de dependencias del sistema
  • Creación del usuario EMI (UID 2000)
  • Instalación de Composer y dependencias Laravel
  • Ejecución como usuario EMI para operaciones de Composer

Etapa 2: Imagen final

  • Instalación de Nginx y Supervisor
  • Recreación del usuario EMI
  • Configuración de servicios para ejecutar como EMI
  • Ajuste de permisos del sistema

Beneficios de la implementación

1. Consistencia de usuarios

  • Nginx ejecuta como emi
  • PHP-FPM ejecuta como emi
  • Todos los archivos pertenecen a emi:emi

2. Compatibilidad con volúmenes compartidos

  • UID fijo 2000 facilita el mapeo con el host
  • Compatible con stacks ELK que usen el mismo UID
  • Evita conflictos de permisos en volúmenes compartidos

3. Seguridad mejorada

  • Usuario no privilegiado con UID específico
  • Permisos granulares en directorios críticos
  • Separación clara entre usuario del sistema y de aplicación

4. Resolución de problemas específicos

  • ✅ PHP-FPM puede escribir en database.sqlite
  • ✅ Laravel puede crear archivos en storage y cache
  • ✅ Nginx puede servir archivos sin problemas de permisos

Comandos de verificación

Para verificar la configuración en el contenedor:

# Verificar usuario y grupo de procesos
ps aux | grep -E "(nginx|php-fpm)"
 
# Verificar permisos de archivos críticos
ls -la /var/www/database/database.sqlite
ls -la /var/www/storage/
 
# Verificar configuración de servicios
grep "user.*emi" /etc/nginx/nginx.conf
grep "user.*emi" /usr/local/etc/php-fpm.d/www.conf

Consideraciones para el stack ELK

Con la configuración del usuario EMI (UID 2000):

  1. Volúmenes compartidos: Los archivos creados en volúmenes compartidos tendrán el propietario correcto
  2. Logs centralizados: Los logs generados por Laravel serán accesibles por servicios ELK con el mismo UID
  3. Compatibilidad: Otros servicios del stack que usen UID 2000 podrán interactuar sin conflictos de permisos
  4. Monitoreo: Los archivos de log y datos estarán disponibles para herramientas de monitoreo

Esta implementación garantiza un entorno robusto y escalable para la integración con stacks de monitoreo y logging.