jueves, 26 de febrero de 2015

Laravel 5 con vagrant en ubuntu

Las siguientes instrucciones fueron probadas y funcionan para Ubuntu 14.10.

Recientemente inicié a trabajar en un sitio web que usará Laravel 5 y decidimos usar vagrant para hacer el proceso de creación y configuración de nuestros ambientes de trabajo locales algo más simples.

A continuación les dejo las herramientas que estaremos utilizando:

Laravel: su eslogan lo dice todo "The PHP Framework For Web Artisans" que se puede traducir mas o menos así: El marco de trabajo en PHP para los artesanos de la web. Laravel busca ser simple y robusto, pero orientado a objetos, utiliza composer para manejo de las dependencias lo que le permite reutilizar código de otros proyectos (en especial symfony).

Vagrant: es una herramienta que permite crear ambientes de trabajo simples de configurar, reproducibles y portátiles, que emplean tecnología estándar y que son controlados en un flujo de trabajo único y constante, para ayudar a maximizar la productividad y flexibilidad de su equipo de trabajo. Por ejemplo: al iniciar un proyecto, en lugar de hacer circular un documento con los pasos que todos los desarrolladores tienen que seguir para hacer que la aplicación funcione en su máquinas (ambiente local), les pasamos una máquina virtual ya configurada y lista para usar, la principal ventaja de esto, aparte de facilitar el trabajo, es que todo el mundo tiene la misma configuración y no importa cuantos nuevos miembros se unan al equipo, todos usaran las mismas herramientas. Cabe mencionar que incluso podemos jugar con las configuraciones del servidor creando máquinas virtuales adicionales

VirtualBox: es un programa (software) de virtualización, es decir que nos permite crear máquinas virtuales a las cuales les asignamos recursos del sistema físico (nuestro computador). Vagrant usará virtualbox como proveedor para ejecutar las máquinas virtuales.

Composer: es un manejador de dependencias para PHP.

Requerimientos

Debemos tener instalado todo lo que sigue, los pormenores de cada programa pueden ser encontrados en el sitio web respectivo, por lo que no entraremos en detalles:

  1. composer, de preferencia globalmente, ver detalles
  2. virtualbox 4.3.22, que se puede descargar desde aquí
  3. vagrant 1.7.2, que se puede descargar desde aquí

Crear un proyecto de pruebas:

Como mencioné antes, vamos a usar Laravel, por lo que ahora crearemos un proyecto nuevo, usaré composer para esto pero existe una alternativa:

cd ~/Projects
composer create-project laravel/laravel my-project --prefer-dist


La salida del comando anterior debería ser algo como lo siguiente (texto acortado por brevedad):
Installing laravel/laravel (v5.0.1)
  - Installing laravel/laravel (v5.0.1)
    Downloading: 100%         

Created project in my-project
Loading composer repositories with package information
Installing dependencies (including require-dev)
...
Writing lock file
Generating autoload files
Generating optimized class loader
Compiling common classes
Compiling views
Application key [********MySuperSecretKey*********] set successfully.

Instalar y configurar laravel/homestead

Laravel Homestead es una "caja" oficial de Vagrant (Vagrant box), pre-empacada y lista para usar en tu ambiente local. No hay que preocuparse con dañar algo, pues si algo sale mal podemos ¡destruir y recrear el ambiente de desarrollo en minutos!

El siguiente comando descargará la caja laravel/homestead, esto puede tardar algún tiempo:

vagrant box add laravel/homestead

Instalamos homestead en nuestro sistema globalmente:
composer global require "laravel/homestead=~2.0"

Inicializamos los archivos de configuración de homestead:
homestead init

Editamos el contenido del archivo ~/.homestead/Homestead.yml
homestead edit

Para más detalles sobre las configuraciones pueden consultar aquí
Aquí dejo un ejemplo de mi configuración para my-project en el archivo ~/.homestead/Homestead.yml:
---
ip: "192.168.10.10"
memory: 4096
cpus: 1

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/Projects/
      to: /home/vagrant/Projects

sites:
    - map: myproject.app
      to: /home/vagrant/Projects/myproject/public

databases:
    - homestead

variables:
    - key: APP_ENV
      value: local

# blackfire:
#     - id: foo
#       token: bar
Vale la pena mencionar que el archivo Homestead.yml es global así que al añadir nuevos proyectos, se debe modificar ya sea para agregar dichos proyectos o reemplazar los anteriores

Antes de poder acceder a nuestra máquina virtual tenemos que modificar el archivo hosts, para añadir una línea (192.168.10.10 myproject.app)y que nuestro sistema operativo sepa la forma de resolver el dominio myproject.app a una dirección ip, esto normalmente se haría en un servidor de nombres DNS, pero para nuestro ambiente local no hace falta.
sudo nano /etc/hosts

A continuación un ejemplo de mi archivo /etc/hosts:
127.0.0.1        localhost
127.0.0.1        myhost

192.168.10.10    myproject.app

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Ahora lo que resta es ir al directorio donde está instalado Homestead y ejecutar vagrant up:
cd ~/.composer/vendor/laravel/homestead/
vagrant up


Asumiendo que todo a salido bien, la máquina virtual con su aplicación debería estar funcionando y debemos poder acceder en nuestro navegador preferido a la dirección http://myproject.app, sino pueden revisar la sección de problemas conocidos
.

Problemas conocidos:

  • He escuchado comentarios de las versiones de Vagrant (1.7.2) y VirtualBox (4.3.22) afectan en gran medida, por lo que es recomendable mantener ambos actualizados
  • En Ubuntu, tuve el problema de que algunos módulos del kernel no cargan correctamente, la solución, editar el archivo /etc/modules y añadir los módulos siguientes uno por línea: vboxdrv, vboxnetadp y vboxnetflt, por ejemplo:
    #virtual box module
    vboxdrv
    vboxnetadp
    vboxnetflt
    

    Además para no tener que reiniciar cargamos los módulos mencionados:
    sudo service vbxdrv start
    sudo modprove vboxnetadp
    sudo modprobe vboxnetflt