Skip to content

Instantly share code, notes, and snippets.

@brunodmt
Last active December 1, 2016 17:56
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save brunodmt/9571555 to your computer and use it in GitHub Desktop.
Save brunodmt/9571555 to your computer and use it in GitHub Desktop.
Instalando Symfony2 en OpenShift

Instalando Symfony2 en OpenShift

Esta guía explica como instalar una aplicación Symfony2 existente en OpenShift.

Punto de Partida

Se asume que:

1. Creación del Gear en OpenShift

  1. En primer lugar debes tener una cuenta, si todavía no la creaste lo haces en https://www.openshift.com
  2. Ingresar a la web e ingresar con la cuenta
  3. En Applications elegir Create your first application now
  4. Seleccionar el cartucho PHP 5.4 o PHP 5.4 with Zend Server 6.1
  5. Completar la URL deseada, dejar vacía la dirección al repositorio git y crear la aplicación (Create Application)
  6. Copiar y pegar un archivo de texto (o guardar en algún lado, para encontrarlo rápido) el link de git de la aplicación.
  7. Hacer click en Add MySQL 5.5 y aceptar eligiendo Add Cartridge

2. Instalar rhc y configurar la aplicación OpenShift

  1. Instalar las Command Line Tools siguiente la guía: https://www.openshift.com/developers/rhc-client-tools-install
  2. Configurar la herramienta instalada ejecutando rhc setup. Asegurarse de aceptar que instale la clave ssh
  3. Configurar la aplicación para que publique la branch release: rhc app-configure --deployment-branch release -a <app-name>

3. Preparación del Repositorio local

  1. Buscar el archivo app/config/config.yml e importar un nuevo archivo de configuración PHP, por ejemplo params.php, de la siguiente manera:
imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: params.php }
...
  1. Crear el archivo app/config/params.php como un archivo PHP vacío:
<?php ?>
  1. Ignorar este último archivo de git. Para ello agregar en el .gitignore del proyecto su ruta (app/config/params.php)
  2. Hacer commit de los cambios introducidos: git commit -m "Archivo de configuración php agregado"
  3. Crear un nuevo branch en el que se guardarán los cambios específicos para OpenShift, en este caso release: git checkout -b release

4. Prepración para utilizar OpenShift

  1. Agregar como remoto el repositorio de Openshift, con nombre openshift: git remote add openshift -f <dirección> donde dirección es la copiada en el paso 1.6
  2. Para poder subir el repo actual, primero hay que combinarlo con el de OpenShift, para ello ejecutar: git merge openshift/master -s recursive -X ours. Este comando combina recursivamente la rama actual (release) con la rama master de OpenShift y, en cualquier caso de conflicto, se queda con la versión local del archivo.
  3. En la raíz del repositorio local ahora debe haber una carpeta .openshift. Dentro de la carpeta .openshift/action_hooks crear un archivo deploy con el contenido de https://gist.github.com/brunodmt/9567047 reemplazando <app-name> por el nombre de la carpeta en que está el proyecto Symfony dentro del repositorio. Si los archivos del proyecto están en la raíz del repo simplemente borrar todos los <app-name>/
  4. Marcar como ejecutable el archivo deploy recién creado. En Windows los permisos de ejecución se pierden al hacer push, por lo que debe ejecutarse el comando git update-index --chmod=+x .openshift/action_hooks/deploy
  5. Crear el archivo app/config/params.php para utilizar los parámetros de OpenShift:
<?php
  # app/config/params.php
  $container->setParameter('database_host', getEnv("OPENSHIFT_MYSQL_DB_HOST"));
  $container->setParameter('database_port', getEnv("OPENSHIFT_MYSQL_DB_PORT"));
  $container->setParameter('database_name', getEnv("OPENSHIFT_APP_NAME"));
  $container->setParameter('database_user', getEnv("OPENSHIFT_MYSQL_DB_USERNAME"));
  $container->setParameter('database_password', getEnv("OPENSHIFT_MYSQL_DB_PASSWORD"));
?>
  1. Si se quiere acceder en modo Dev a la aplicación remota, para verificar las excepciones y demás, se debe modificar el archivo web/app_dev.php comentando las siguientes líneas:
<?php
...

if (isset($_SERVER['HTTP_CLIENT_IP'])
    || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
    || !in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1'))
) {
    header('HTTP/1.0 403 Forbidden');
    exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}

...
?>
  1. Hacer commit de las modificaciones: git commit -m "Proyecto adaptado a OpenShift"
  2. Enviar los cambios al repositorio en OpenShift, para hace hacer push contra el origen agregado en el paso 4.1: git push openshift HEAD
  3. La consola mostrará los pasos de instalación y ejecutará el archivo deploy creado anteriormente. El mismo bajará los archivos de terceros (vendors) necesarios, ajustará los permisos, limpiará la caché y creará el esquema del a DB. En caso de no ser necesario este último paso (o de utilizar otro ORM distinto de Doctrine) eliminarlo o cambiarlo por el comando necesario.
  4. Volver a la branch master o de desarrollo, para ello: git checkout master

5. Acceso SSH

Este es un paso opcional. Si se necesita acceder por ssh al servidor ejecutar el comando rhc ssh -a <app-name>. Para utilizar la consola Symfony, una vez conectado por SSH ejecutar cd $OPENSHIFT_REPO_DIR/<app-name>/ y desde allí se podrán ejecutar los comandos regularmente, como: php app/console cache:clear

6. Como continuar el desarrollo

  1. Asegurarse de estar en la branch de desarrollo, por ejemplo si se utiliza master: git checkout master
  2. Llevar a cabo todos los cambios deseados
  3. Pasarse a la branch release: git checkout release
  4. Recuperar los cambios de la branch master: git merge master. En el caso de haber un conflicto resolverlo, pero no debería si el archivo params.php está correctamente ignorado
  5. Enviar los cambios a OpenShift: git push openshift HEAD
  6. Volver a la branch de desarrollo: git checkout master
@andresmdo
Copy link

Gracias por el tuto! Muy util y bien explicado.

Lo unico que tuve que hacer extra es quitar el params.php del .gitignore del branch release ya que este archivo es necesario en openshift.

Y otra cosa, ya que no me funcionaba, es agregar en el push el branch destino:

git push openshift HEAD:master

Sin esto no me aparecian los cambios en el server ya que estaria creando un repo release que no es el que copia en el directorio $OPENSHIFT_REPO_DIR

@KhanMaytok
Copy link

Y para actualizar el proyecto, funciona?
Me refiero a actualizar los vendors con el comando
compose update

@andresmdo
Copy link

Si, funciona. Accede por ssh y corre composer update.

@KhanMaytok
Copy link

Quisiera aportar algo. Solo deberíamos hacer un if en params.php. Asi nos evitamos todo el proceso de ignorarlo
setParameter('database_host', getEnv("OPENSHIFT_MYSQL_DB_HOST")); $container->setParameter('database_port', getEnv("OPENSHIFT_MYSQL_DB_PORT")); $container->setParameter('database_name', getEnv("OPENSHIFT_APP_NAME")); $container->setParameter('database_user', getEnv("OPENSHIFT_MYSQL_DB_USERNAME")); $container->setParameter('database_password', getEnv("OPENSHIFT_MYSQL_DB_PASSWORD")); } ?>

Con eso debería de bastar

@SergioEnrique
Copy link

Funciona casi excelente, sin embargo estuve batallando por dos motivos que logré solucionar:

  1. El archivo ejecutable "deploy" se le tienen que cambiar los permisos justo antes de hacer el push, cualquier otra cosa le regresa los permisos a no ejecutable. Después de hacer "git update-index --chmod=+x .openshift/action_hooks/deploy" se tiene que hacer commit y luego va el push. (En las instrucciones que pones no dices que hay que hacer commit en ese momento) [Tal vez sea así por mi máquina Windows, tal vez en otro SO funcione sin tanto lío]
  2. Luego, siguiendo tus instrucciones el archivo "params.php" queda en .gitignore antes de subirlo a openshift, lo cual causa un error en consola diciendo que no encuentra ese archivo, por lo que se tiene que quitar de .gitignore, hacer commit, push a openshift y luego regresarlo a .gitignore, conservando el archivo vacío.

Por lo demás, las instrucciones son bastante explícitas, me sirvieron muchísimo, aparte de estar escritas en español.
Saludos

Edito: No había visto los comentarios que proponen otras soluciones, habrá que probarlas.

@KhanMaytok
Copy link

También pueden ahorrarse en trabajo de futuros deploys y logearse por SSH, Borrar todo lo del directorio repo, hacer un git clone y cada vez que quieran hacer un nuevo despliegue, un git pull. Claro, necesitaran un repo remto, puede ser github 😃

@mprizmic
Copy link

Excelente!! Gracias

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment