El Problema De Los Permisos En Symfony

Sobre los permisos en symfony y cuál es mi solución

Hola amiguetes!!

Hoy os traigo mi solución al problema de los permisos en Symfony. Todos los desarrolladores que hemos trabajado con este maravilloso framework conoceremos al dedillo que symfony no sabe gestionar muy bien sus propios permisos cuando se encuentra desplegado en el servidor y creo que todos nos hemos tirado bastante de los pelos cuando empezábamos en el mundo de este framework y no sabíamos porque pasaba. Tengo que aclarar que sobre lo que estoy hablando y cómo yo lo soluciono es bajo un Elementary OS, distribución que mama de Ubuntu, con esto quiero decir que no sé que tal se portarán los permisos en otros sistemas operativos (Windows ejem ejem….)

El origen del problema de los permisos en symfony

Todo esto comienza con dos directorios muy importantes para el framework. Estos directorios son app/cache y app/logs. Estas son las carpetas responsables tanto de guardar los logs de lo que va pasando en el framework, como de guardar una copia del proyecto en cache para así reducir tiempos de carga. Estos dos directorios se suelen subdividir en otros tres directorios diferentes, a saber, /dev , /prod y /test que es la estructura lógica para las tres etapas en el ciclo de vida de un proyecto symfony.

Pues bien, el problema del que hablo viene cuando desplegamos el proyecto, me da igual si es en /dev o /prod, en nuestro servidor. Al acceder a nuestra primera vista, symfony nos arroja un error de que no puede escribir bajo las carpetas de app/cache y app/log y eso esta causado por el usuario que ejecuta el proyecto en /var/www.

Directorios del infierno

Directorios del infierno

Cuando tenemos el proyecto en nuestra carpeta de usuario o en cualquier otro directorio que cuelgue de nuestro $HOME no hay problema porque se ejecutará a través de nuestro usuario que pertenece a un grupo de usuarios que tiene los permisos de lectura y escritura para $HOME y subdirectorios, pero lo que pasa bajo el directorio /var/www es que nuestro usuario actual intenta acceder a zonas en las que no tiene permisos ya que el directorio /var/www unicamente esta gestionado por el usuario www-data y entonces es cuando el proyecto peta y nos avisa que no puede escribir bajo el directorio cache y log.

En la documentación oficial te explican muy bien como solucionar el problemas de los permisos en symfony que pasa por borrar lo que hay en estos directorios en nuestro servidor y volver a darle permisos de escritura al usuario mediante el siguientes comando.

$ sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

Pero según mi experiencia, se tiene que estar ejecutando este comando de cuando en cuando porque en cada despliegue limpio al servidor que se hace, el sistema decide olvidarse de quien tiene permiso y quien no, así que yo utilizo una técnica totalmente diferente para olvidarme de los permisos y centrarme en seguir programando.

Cómo soluciono yo los errores de permisos en symfony

Ojo, que no digo que mi técnica sea la definitiva ni la mejor de todas, de hecho puede que hasta vaya en contra de las buenas practicas del saber hacer informático pero repito que como a mi me funciona y me siento muy a gusto y cómodo con ella pues sigo adelante y creo que así es cómo debería ser. La cosa es que jamás monto un proyecto symfony, por muy pequeño que sea, sin hacer uso de phing.

Para el que no conozca phing, es una herramienta automatizadora de tareas que se escribe en XML. Con phing puedes hacer cualquier cosa ya que permite ejecutar comandos del sistema y así olvidarte de tareas como mover directorios, borrar ficheros o hacer transferencias entre servidores FTP por ejemplo. El primer artículo que escribí en el blog hablaba de phing y os dejaba la configuración que utilizaba yo por aquel entonces para desplegar un proyecto symfony con tan solo darle a un botón. Os recomiendo que le echéis un vistazo antes para ver de lo que es capaz esta herramienta y la de cosas que podeis hacer teniendo un poquito de imaginación.

Así pues, con phing he conseguido automatizar la tarea de borrar los subdirectorios de app/cache y app/logs y darles permisos 777 en cada despliegue. ¿Que no será la mejor solución? Puede. ¿Que es más fácil darle permisos al usuario y olvidarnos? Posiblemente. ¿Que estos directorios únicamente deberían tener permisos 777 en desarrollo? Pues si.

¿Entonces porque lo hago así? Pues no sé xD es mi manera de trabajar y os la quería enseñar. Pero tal vez es mejor que vosotros acudáis a la documentación oficial y seguir los senderos de la rectitud de lo que nos dice symfony. Y con este chorrazo, os dejo con mi solución.

<target name="dar_permisos_chmod">
<echo msg="Borrando directorios en /var/www/proyecto"/>
<exec command="rm -rf /var/www/proyecto/app/cache/ /var/www/proyecto/app/logs/"/>
<echo msg="Dando permisos chmod de escritura a /var/www/proyecto/app/cache y /var/www/proyecto/app/log"/>
<exec command="chmod -R 777 /var/www/proyecto/app/cache /var/www/proyecto/app/logs"/>
</target>

¡Hasta que volvamos a olernos!

Gorka Muñoz Andrés

Me llamo Gorka Muñoz y soy un desarrollador melómano. Combino a la perfección la búsqueda de nuevos grupos con la pasión por la tecnología. Desde chiquitito me ha gustado la programación, ahora que soy mayor estoy metido en el mundo del SEO sin olvidarme del /Dev.

Deja un comentario

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