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
laravelgeneraba conflictos de permisos conwww-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/emiCaracterí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.confPHP-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.conf4. 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 /runDockerfile 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
storageycache - ✅ 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.confConsideraciones para el stack ELK
Con la configuración del usuario EMI (UID 2000):
- Volúmenes compartidos: Los archivos creados en volúmenes compartidos tendrán el propietario correcto
- Logs centralizados: Los logs generados por Laravel serán accesibles por servicios ELK con el mismo UID
- Compatibilidad: Otros servicios del stack que usen UID 2000 podrán interactuar sin conflictos de permisos
- 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.