Deployar proyecto Symfony 1.4 en hosting público

Hay muy poca documentación sobre la instalación de un proyecto Symfony en un hosting público para ponerlo en producción y ya son varias personas que me lo han preguntado así que lo voy a documentar aquí para quién lo este necesitando.

En primer lugar es bueno recordar que de todas las carpetas del proyecto, la única pública debería ser la carpeta web/ ya que cualquier request llegará directamente a los controladores frontales que existen dentro de la misma.

Un hosting por lo general tiene una carpeta que corresponde al usuario y dentro de la misma una carpeta pública que suelen llamarla public_html, web, www, etc. Es aquí donde siempre estamos acostumbrados a cargar nuestros proyectos, lo que sería igual a nuestro localhost por ejemplo la carpeta www del wampserver o la carpeta /var/www.

Supongamos, a los efectos de este manual, que nuestro proyecto se llamará “sftest” y dentro tenemos creada una aplicación con un módulo de prueba.

La manera NO recomendada

Podríamos subir la carpeta de nuestro proyecto directamente dentro de esta carpeta pública y accederíamos a nuestra aplicación siempre desde el controlador frontal por ejemplo: http://www.dominio.com/sftest/web/index.php/modulo/action pero el problema es que la gente tendría acceso a las demás carpetas del proyecto por ejemplo con las siguientes direcciones URLs:

  • www.dominio.com/sftest/config/databases.yml
  • www.dominio.com/sftest/apps/
  • www.dominio.com/sftest/logs/frontend_prod.log

Esto es un problema de seguridad que quizá lo podamos resolver creando un archivo con el nombre .htaccess dentro de cada carpeta del proyecto que contenga el texto “deny from all”. De esta manera no permitiremos el acceso desde el navegador al contenido de esa carpeta, pero estar creando el archivo .htaccess dentro de cada carpeta no es tan agradable.

La manera recomendada

Sería mejor dejar solo la carpeta web/ dentro de nuestra carpeta public_html/ en el hosting, y el resto de los archivos del proyecto dejarlos dentro de la misma que contiene la carpeta public_html, totalmente fuera del alcance público.

Para esto lo que hacemos es:

  1. subir nuestro proyecto al servidor de hosting,

  2. mover la carpeta web/ contenida en nuestro proyecto al public_html/ directamente con el nombre que queramos; para el ejemplo como sería la primera versión del sitio la voy a nombrar v1/.

  3. El resto del proyecto, la carpeta sftest la dejo como una carpeta hermana de public_html, y
    por último nos faltará conectar los controladores frontales contenidos dentro de public_html/v1/ con nuestro proyecto. Para esto editaremos el archivo index.php y

  4. los demás controladores frontables de produccion, ya que los de desarrollo no deberían ser accedidos desde otra maquina que no sea localhost. Modificaremos la siguiente línea:

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

por esta otra:

require_once(dirname(__FILE__).'/../../sftest/config/ProjectConfiguration.class.php');

De esta manera le estoy diciendo que el archivo ProjectConfiguration.class.php ahora se encuentra un nivel más abajo del public_html y dentro de la carpeta sftest/config/

Con esto ya tenemos conectados los controladores frontales y podríamos acceder a nuestro proyecto con la dirección: http://www.dominio.com/v1 o lo que sería lo mismo http://www.dominio.com/v1/index.php para la aplicación principal.

Carpeta web/sf/ y Links simbólicos

Debemos tener en cuenta que algunos servidores de hosting no nos permiten crear links simbólicos por ejemplo para resolver el problema de la carpeta web/sf/.

Si recordamos en el manual oficial de Symfony nos dice que, como el framework usa ciertos archivos de imágenes, css y javascript que vienen dentro de la carpeta lib/vendor/symfony/data/web/sf deberíamos tenerla como si fuera dentro de web/sf/.

Cuando trabajamos en el entorno de desarrollo, en nuestras máquinas locales, lo resolvemos usando un Alias dentro de nuestra configuración del VirtualHost del Apache, pero aquí no tenemos acceso generalmente a esta configuración por lo tanto podemos copiar la carpeta lib/vendor/symfony/data/web/sf a web/sf/ o, para no duplicarla por motivos de espacio, podríamos crear un link simbólico dentro de la carpeta web con el nombre sf que apunte a la carpeta arriba mencionada.

Si el servidor de hosting no nos da la posibilidad de crear un link simbólico desde el cpanel, podríamos crear una página PHP dentro de la carpeta web/ con la siguiente línea:

<?php symlink('../../mdw/lib/vendor/symfony/data/web/sf', 'sf'); ?>

Y accederla desde el navegador para que nos cree el link.

También deberíamos tener esto en cuenta a la hora de usar plugins ya que el task symfony plugin:publish-assets suele crear links simbólicos dentro de la carpeta web/ por el mismo motivo y al subir los archivos podríamos tener que crearlos nuevamente.

Por último también se debe recordar que las carpetas cache/ y log/ deben tener permiso de escritura.

Consultas o comentarios pueden enviarlos abajo.

4 comentarios en “Deployar proyecto Symfony 1.4 en hosting público”

    1. Carlos, hacer deploy de Symfony2 es más sencillo que la rama 1.x ya simplemente copias tu carpeta del proyecto en el hosting o server que tengas.
      Aquí la carpeta publica es la web/ por lo que puedes hacer que tu public_html o www sea esa y permitir que sólo se ingrese a esos archivos o crear un subdominio que apunte a la carpeta web/

  1. Muy buenos comentario gracias. Tengo un problema Alguien Sabe porque al subir mi sitio creado en symfony 1.4, a un hosting mis grids aparecen vacíos, si tengo datos en mi BD, ya intente hacer consultas fuera de mi sitio desde el hosting y si arroja datos pero ya en el sistema no alguien podría ayudarme? gracias

Comenta este artículo