Despliegue de PrestaShop en entorno desarrollo Vagrant y entorno de producción OpenShift
Para aquellos que no lo conozcan, PrestaShop es un CMS enfocado a la creación de tiendas online o plataformas eCommerce. Está desarrollado en PHP, con licencia Open Software y traducido a 63 idiomas.
Su fecha de lanzamiento fue en agosto de 2008 y hoy en día es uno de los CMS más utilizado en el mundo del comercio electrónico junto a otras alternativas como Magento, OpenCart o el plugin para WordPress WooCommerce.
Tiene una gran comunidad de desarrollo de módulos o themes que luego son compartidos gratuitamente o vendidos mediante plataformas como su propia tienda de addons, Envato o ThemeForest. Sin embargo, algunas empresas optan por desarrollar y poner a disposición de los usuarios módulos y themes gratuitos para ganabr en imagen y captar posibles clientes en otros servicios de PrestaShop.
Como la mayoría de los CMS, su instalación y despliegue es fácil mediante un asistente de instalación. Aún así, requiere de una compleja configuración si se quiere implementar una tienda online que cumpla correctamente con los objetivos de un cliente cualquiera.
La metodología de trabajo común en los desarrolladores web es tener, al menos, dos entornos: el entorno de desarrollo y el entorno de pruebas.
En el entorno de desarrollo se realizan las pruebas antes de implementarlas en el entorno de producción. Éste debe ser lo más parecido posible al entorno de producción en cuanto a versiones de Apache, PHP, MySQL, librerías, módulos…
Mientras que, cuando se habla del entorno de producción, se habla del entorno que ejecuta la aplicación de la cual hacen uso los usuarios finales. Éste tiene asociada a él la base de datos con datos reales.
Nuestro entorno de desarrollo es una máquina Vagrant con Debian Jessie, mientras que nuestro entorno de producción es una aplicación gratuita de OpenShift.
Vagrant es una herramienta para crear entornos de desarrollo basados en máquinas virtuales, OpenShift un cloud categorizado como PaaS con planes gratuitos.
Configuración de los entornos Vagrant y OpenShift
Comenzamos con la creación de la máquina Vagrant, actualización de repositorios y sistema antes de pasar a la instalación de la pila LAMP.
En ella instalamos rhc, una aplicación escrita en Ruby que permite la gestión de las aplicaciones de OpenShift desde la línea de comandos. En nuestro caso, debemos instalar antes ruby y rubygems, pues rhc es una gema de Ruby. Además de Git para que rhc autoclone el repositorio de nuestra aplicación.
Si este proceso te resulta complicado, puedes hacerlo fácilmente desde el panel de administración de OpenShift.
Ejecutamos apt-get install ruby rubygems git
y luego gem install rhc
A continuación, utilizamos rhc para crear nuestro gear que contendrá PrestaShop 1.6. Para ello nos identificamos con rhc setup
, dejamos el servidor por defecto (|openshift.redhat.com|). Nos pedirá confirmación para añadir la clave ssh de nuestra máquina Vagrant a OpenShift, por lo que tecleamos yes.
El siguiente paso es crear una aplicación en OpenShift desde la línea de comandos. Las aplicaciones se componen de cartridges y estos pueden ser Python, PHP, Node.js, MySQL, PostgreSQL… podemos ver una lista de ellos ejecutando rhc cartridge-list
. En nuestro caso utilizaremos PHP 5.4 así que lanzamos la creación de la aplicación con rhc create-app prestashop php-5.4
. Pasados unos segundos rhc nos creará un directorio con el nombre de la aplicación, el cual es un repositorio git.
Tras este proceso es necesario añadir un cartucho/cartridge de MySQL con rhc cartridge-add mysql-5.5 --app prestashop
. Automáticamente nos generará una base de datos con el nombre de nuestra aplicación y unas credenciales de acceso root. Si gestionamos varias aplicaciones podemos especificar cuál de ellas con el parámetro --app nombre
Finalizamos comprobando con rhc app-show -v prestashop
la configuración de nuestra aplicación en el servicio de Red Hat, en la que podemos ver la información de los cartridges y debe ser similar a esta:
Puedes consultar más sobre la gestión de rhc en la terminal con rhc --help
o en la documentación para desarrolladores de OpenShift.
Instalación de PrestaShop en una máquina local (Vagrant)
Para comenzar con la instalación de PrestaShop en nuestro entorno de desarrollo descargamos la versión de PrestaShop a implementar, en nuestro caso la 1.6.1.4 lanzada el 7 de enero de 2016. Desde la máquina anfitriona descargamos el paquete zip disponible en la página oficial de PrestaShop y lo copiamos con scp prestashop_1.6.1.4.zip vagrant@192.168.1.226:
y unzip prestashop_1.6.1.4.zip
para descomprimir.
Ahora, con usuario root, nos ubicamos en el directorio /var/www/ y eliminamos el directorio html para crear un enlace simbólico en él (también podemos modificar el DocumentRoot). De esta manera evitamos tener que acceder a un subdirectorio y podemos acceder a nuestra instalación de PrestaShop tecleando únicamente la dirección IP. Así pues, ejecutamos:
1 2 3 4 5 6 |
root@prestashop:/var/www# rm -r html/ root@prestashop:/var/www# ln -s /home/vagrant/prestashop html root@prestashop:/var/www# ls -l total 0 lrwxrwxrwx 1 root root 24 Jan 14 20:43 html -> /home/vagrant/prestashop root@prestashop:/var/www# chmod 755 html/ |
Es importante que los archivos y subdirectorios de /var/www/html tengan como propietario el usuario y grupo www-data, por lo tanto, cambiamos recursivamente con chown -R www-data:www-data *
dentro del directorio.
Accedemos a la dirección IP de nuestra máquina Vagrant para comenzar con el asistente de instalación de PrestaShop.
Llegados al paso número tres, en el que se comprueba la compatibilidad del sistema nos aparecen los siguientes errores relacionados con librerías y extensiones de PHP:
- La librería GD no está instalada. Esta librería, de las siglas Graphics Draw es la encargada de tratar las imágenes en formatos como JPG/JPEG, PNG o GIF. Se instala con
apt-get install php5-gd
- El soporte para MySQL no está activado. Falta el módulo de PHP que permite conectar MySQL con PHP. La instalación se realiza con
apt-get install php5-mysql
- La extensión Mcrypt no está habilitada. Comunica la falta de la extensión criptográfica Mcrypt, que permite cifrar con una gran lista de algoritmos.
- La extensión PDO MySQL no se ha cargado. Se solventa con la instalación de php5-mysql.
Reiniciamos el servicio de apache con /etc/init.d/apache2 restart
y cliqueamos en el botón que dice Actualizar esta información.
En la siguiente pantalla Configura tu base de datos rellenando los siguientes campos debemos introducir los parámetros de la base de datos que crearemos a continuación en nuestra máquina Vagrant. Podemos utilizar otros distintos a los creados por defecto por OpenShift, aunque en mi caso utilizaré los mismos.
Ingresamos en la terminal de comandos de MySQL y creamos base de datos y credenciales de acceso, las cuales introduciremos en el paso número cinco.
1 2 3 4 5 6 7 |
vagrant@prestashop:~$ mysql -u root -p mysql> create database prestashop; Query OK, 1 row affected (0.00 sec) mysql> CREATE USER 'adminxBB48nZ'@'localhost' IDENTIFIED BY 'tttqpHpJSgEu'; Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL PRIVILEGES ON prestashop.* TO 'adminxBB48nZ'@'localhost'; Query OK, 0 rows affected (0.00 sec) |
Las configuraciones a introducir en el paso llamado Configuración del sistema son las que se muestran por defecto a excepción del nombre, usuario y contraseña de la base de datos.
En el último paso, PrestaShop llevará a cabo una serie de tareas como crear ficheros, tablas en la base de datos, tienda por defecto e idiomas, insertar datos de prueba, plantillas y módulos…
Accedemos al panel de administración de PrestaShop a través de http://192.168.1.226/admin. Para poder loguearnos, antes debemos de eliminar el directorio install y renombrar el directorio admin. En nuestro caso, lo hemos renombrado por panel, siendo ahora http://192.168.1.226/panel la dirección URL para acceder al backoffice.
Migración de PrestaShop al entorno de producción OpenShift
Realizamos nuestro primer commit y primer push para sincronizar el repositorio local con el entorno de producción ubicado en OpenShift.
1 2 3 |
vagrant@prestashop:~/prestashop$ git add --all vagrant@prestashop:~/prestashop$ git commit -am "Instalación y configuraciones por defecto" vagrant@prestashop:~/prestashop$ git push |
Fichero settings.inc.php dinámico con variables de entorno de OpenShift
Si intentamos acceder a la aplicación alojada en OpenShift bajo la dirección URL http://prestashop-evgarciaz.rhcloud.com/ nos mostrará un error de conexión con la base de datos como este: Link to database cannot be established: SQLSTATE[HY000] [2002] No such file or directory.
El problema es que PrestaShop no puede conectarse con MySQL, aunque ahora mismo no exista base de datos en el sistema. Por ello, es necesario programar un código que sea capaz de detectar en qué entorno nos encontramos para aplicar unos parámetros de conexión con la base de datos u otros.
Esto lo realizamos con un if en PHP y la ayuda de las variables de entorno de OpenShift, que podemos consultar con el comando rhc env-list
o bien en la documentación Usando variables de entorno de OpenShift.
El fichero donde se encuentran las configuraciones con la base de datos de PrestaShop es el settings.inc.php ubicado en el directorio config. Accedemos como root, duplicamos el contenido referente a la base de datos y cambiamos algunos campos por las variables de entorno correspondientes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php if (isset($_ENV["OPENSHIFT_MYSQL_DB_HOST"])) { define('_DB_SERVER_', $_ENV['OPENSHIFT_MYSQL_DB_HOST']); define('_DB_NAME_', 'prestashop'); define('_DB_USER_', $_ENV['OPENSHIFT_MYSQL_DB_USERNAME']); define('_DB_PASSWD_', $_ENV['OPENSHIFT_MYSQL_DB_PASSWORD']); define('_DB_PREFIX_', 'ps_'); } else { define('_DB_SERVER_', 'localhost'); define('_DB_NAME_', 'prestashop'); define('_DB_USER_', 'admin'); define('_DB_PASSWD_', 'contraseña'); define('_DB_PREFIX_', 'ps_'); } define('_MYSQL_ENGINE_', 'InnoDB'); define('_PS_CACHING_SYSTEM_', 'CacheMemcache'); define('_PS_CACHE_ENABLED_', '0'); define('_COOKIE_KEY_', 'xb8epzvNROUdi5d6tQ7jhC9hssROsbQBh1FjSAE0HwFQj1RCfoVSw6uS'); define('_COOKIE_IV_', 'VsV71nrQ'); define('_PS_CREATION_DATE_', '2016-01-15'); if (!defined('_PS_VERSION_')) define('_PS_VERSION_', '1.6.1.4'); define('_RIJNDAEL_KEY_', 'N6LzUEcNvRgbYfOkriNG8ox8DQkLCPy9'); define('_RIJNDAEL_IV_', 'MZbqIsRBRbkB3FPW+jFmWQ=='); |
Sincronizamos los cambios con git commit -am "Cambios en el fichero settings.inc.php con variables de entorno"
y git push
. Tras realizar un push, el servidor que contiene la aplicación se reiniciará automáticamente y, con él, sus servicios.
Ahora, si accedemos nuevamente a la dirección URL de nuestra aplicación nos mostrará un error 500 que dice: 500 Server Error. Oops, something went wrong. Try to refresh this page or feel free to contact us if the problem persists.
Así que, exportamos la base de datos con mysqldump (mysqldump -u root -p prestashop > prestashop.sql
) y la copiamos al servidor mediante scp, para ello debemos conocer la ruta ssh la cual podemos consultarla accediendo al panel de administración de OpenShift o tecleando rhc app-show -v
Para transferir este fichero es necesario tener permisos de escritura en el directorio, como por ejemplo /app-root/data. El comando a ejecutar en este caso es scp /home/vagrant/prestashop.sql 5697f2672d5271bfbc00010e@prestashop-evgarciaz.rhcloud.com:app-root/data
Accedemos mediante ssh y ejecutamos el volcado con mysql -u admin -p prestashop < ~/app-root/data/prestashop.sql
Cambiar la dirección URL de nuestra tienda PrestaShop
Una vez tenemos desplegada la tienda online en OpenShift y accedemos a su index, este nos redirige a la dirección IP de nuestra máquina local, en la que se realizó la instalación.Aunque la primera reacción sería reemplazar nuestra dirección IP por la URL de rhcloud directamente en la base de datos, podemos acceder a http://prestashop-evgarciaz.rhcloud.com/panel sin problemas de redireccionamiento.
En la pantalla principal del backend PrestaShop nos advertirá de que la dirección URL configurada no corresponde con la configurada en la sección Preferencias>SEO + URLs. Por ello accedemos a ella y en el apartado Establecer enlace de la tienda, cambiamos los campos Dominio de la tienda y Dominio SSL. Así pues, eliminaríamos la dirección IP 192.168.1.226 reemplazándola por http://prestashop-evgarciaz.rhcloud.com
Crear un action hooks
La traducción literal de action hooks al español es gancho de acción. Se trata de un código aplicado bien a frameworks, child themes o aplicaciones que hacen que ciertas modificaciones resistan a actualizaciones. OpenShift dispone del directorio /app-root/data (identificado con la variable OPENSHIFT_DATA_DIR) destinado a guardar los directorios dinámicos de nuestra instalación, de esta manera los datos de dicho directorio no se pierdan ante cualquier nuevo despliegue o modificación como puede ser un git push.
En este directorio se alojan todos los directorios y ficheros que pueden ser propensos a cambios desde el entorno de producción, los cuales varían según la aplicación web o CMS desplegado. En el caso de PrestaShop, he optado por los directorios cache, download, img, log, modules, panel, themes, translations y upload aunque es posible que se realicen cambios en otros directorios que desconozco.
Por ello, primeramente nos conectamos mediante SSH al gear de OpenShift y movemos dichos directorios de ~/app-root/repo a ~/app-root/data.
1 2 3 4 5 6 7 8 9 |
mv ~/app-root/repo/cache ~/app-root/data/cache mv ~/app-root/repo/download ~/app-root/data/download mv ~/app-root/repo/img ~/app-root/data/img mv ~/app-root/repo/log ~/app-root/data/log mv ~/app-root/repo/modules ~/app-root/data/modules mv ~/app-root/repo/panel ~/app-root/data/panel mv ~/app-root/repo/themes ~/app-root/data/themes mv ~/app-root/repo/translations ~/app-root/data/translations mv ~/app-root/repo/upload ~/app-root/data/upload |
Creamos el fichero build en el directorio .openshift/action_hooks del repositorio de nuestro entorno de desarrollo/pruebas. Este se cargará tras cada git push realizando un enlace simbólico de cada directorio.
1 2 3 4 5 6 7 8 9 |
ln -sf $OPENSHIFT_DATA_DIR/cache $OPENSHIFT_REPO_DIR/cache ln -sf $OPENSHIFT_DATA_DIR/download $OPENSHIFT_REPO_DIR/download ln -sf $OPENSHIFT_DATA_DIR/img $OPENSHIFT_REPO_DIR/img ln -sf $OPENSHIFT_DATA_DIR/log $OPENSHIFT_REPO_DIR/log ln -sf $OPENSHIFT_DATA_DIR/modules $OPENSHIFT_REPO_DIR/modules ln -sf $OPENSHIFT_DATA_DIR/panel $OPENSHIFT_REPO_DIR/panel ln -sf $OPENSHIFT_DATA_DIR/themes $OPENSHIFT_REPO_DIR/themes ln -sf $OPENSHIFT_DATA_DIR/translations $OPENSHIFT_REPO_DIR/translations ln -sf $OPENSHIFT_DATA_DIR/upload $OPENSHIFT_REPO_DIR/upload |
Asignamos permisos de ejecución con chmod +x .openshift/action_hooks/build
e igualmente añadimos los cambios al repositorio git con git add .openshift/action_hooks/build
y git commit -m "Añadido fichero para action hook"
para subir los cambios con git push
.
De esta manera, podemos realizar cambios tanto en el entorno de pruebas como en el entorno de producción, no machacándose los cambios del entorno de producción cuando se produzca un nuevo commit. Aún así, es importante recordar que aunque realicemos git push, algunos cambios pueden verse reflejados en la base de datos.
Referencias:
- Migrando Pledin. De hosting tradicional a PaaS OpenShift: WordPress
- Action Hooks | OpenShift Developers