Cuando trabajamos con Laravel Homestead, la mayor parte del tiempo accedemos a los proyectos sólo mediante nuestra PC modificando el archivo de hosts y así cuando escribimos en el navegador la URL definida en dicho archivo (virtualhost), Nginx nos muestre nuestro proyecto desde la máquina virtual.

Sin embargo, en ocasiones, queremos mostrar nuestro proyecto a otras personas que forman parte del equipo, ya sean diseñadores, otros programadores, líderes de proyecto o incluso a los clientes que desean ver algunos avances. Por lo que en este tutorial veremos cómo podemos configurar Homestead para compartir el acceso de nuestros proyectos a quiénes se encuentren dentro de la misma red local (LAN).

Acceso mediante modificación del archivo Hosts de otra PC

Es la forma más básica y fácil si queremos que solo una o dos computadoras puedan acceder a nuestro proyecto en Homestead.

Si iniciamos Homestead y ejecutamos $ ifconfig, nos aparecerán las siguientes interfaces de red:

interfaces 1

Ninguna de estas interfaces son accesibles mediante LAN, por lo que hay que configurar vagrant para que inicie una interfaz abierta a nuestra LAN.

Primero, buscáremos el archivo homestead.rb que se encuentra en la carpeta Homestead/scripts. Si instalaste Homestead siguiendo la documentación de Laravel, esta carpeta debe estar en tu directorio Home en OSX, Linux o en tu carpeta de Usuario de Windows. Si instalaste con composer el archivo está ubicado en .composer/vendor/laravel/homestead/scripts/homestead.rb

Carpeta Homestead en Windows

Carpeta de scripts

homestead.rb

Tendremos dos formas de configurar el acceso desde LAN, dependiendo del archivo homestead.rb.  Entonces al abrirlo, buscáremos la configuración de red.

En la primera forma puede estar de la siguiente manera:

# Configure A Private Network IP
config.vm.network :private_network, ip: settings["ip"] ||= "192.168.10.10"

# Configure Additional Networks
if settings.has_key?("networks")
  settings["networks"].each do |network|
    config.vm.network network["type"], ip: network["ip"], bridge: network["bridge"] ||= nil
  end
end

Ésta es la configuración usual de Homestead para acceder e ingresar mediante SSH. Lo que haremos será agregar una nueva interfaz en modo puente para que la máquina virtual pueda acceder a nuestra LAN.

Si tu archivo si contiene # Configure Additional Networks,  no hay que modificar nada en ese archivo.  En vez de ello, hay que modificar el archivo Homestead.yaml. Puedes ejecutar $homestead edit o abrir el archivo directamente de ./homestead/Homestead.yaml, que se encuentra en tu carpeta de Usuario o Home.

---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

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

sites:
    - map: superproyecto.app
      to: /home/vagrant/Code/superproyecto/public

databases:
    - homestead

variables:
    - key: APP_ENV
      value: local

#Acceso a LAN
networks:
    - type: "public_network"
      ip: "192.168.1.200"

# blackfire:
#     - id: foo
#       token: bar
#       client-id: foo
#       client-token: bar

# ports:
#     - send: 93000
#       to: 9300
#     - send: 7777
#       to: 777
#       protocol: udp

Agregamos la sección que dice #Acceso a LAN para que cuando ejecutemos homestead up configure una nueva interfaz con la IP asignada.

Por otro lado, la segunda forma, si tu archivo homestead.rb no contiene la línea # Configure Additional Networks, hay que agregar manualmente la interfaz de la siguiente manera:

# Configure A Private Network IP
config.vm.network :private_network, ip: settings["ip"] ||= "192.168.10.10"
config.vm.network :public_network, :adapter=>3, ip: "192.168.1.200"

Así, al cargar la máquina virtual se inicie la interfaz número 3 con nuestra IP. En este ejemplo, la IP de nuestra interfaz es 192.168.1.200; debe ser una IP estática para que cuando modifiquemos los archivos de Host, no cambie la IP y tengamos que volver a modificar el archivo, por lo que hay que configurar nuestro DHCP para que nos de una IP estática.

Realizamos homestead provision y volvemos a ejecutar $ ifconfig. El resultado debe ser el siguiente:

Interfaces 2

Copiaremos la dirección MAC de la interfaz para configurar nuestro router.

MAC

En mi caso, me pide el nombre para identificar la IP estática, la MAC de la interfaz y la IP que quiero que tenga. La configuración varía dependiendo del router y firmware.

router

Una vez listo, modificaremos el archivo host de otro dispositivo, ya sea Linux, OSX o Windows y agregaremos la siguiente entrada:

super

Finalmente, accedemos a la URL de nuestro proyecto.

Proyecto

Como se puede ver, nuestro sitio es accesible desde otro dispositivo, en este caso, OSX. Mientras que la máquina virtual de Homestead está siendo ejecutada sobre Windows.

Acceso mediante un servidor DNS

Otra forma de poder acceder a nuestros sitios en Homestead es configurándolo para que trabaje como un servidor DNS, en este caso, podemos crear una máquina virtual con Ubuntu 14.04 descargando el ISO y utilizando virtuabox, o podemos usar un box de vagrant. La elección es tuya.

Iniciamos nuestra máquina y procedemos a actualizar los paquetes instalados.

$ sudo apt-get update
$ sudo apt-get upgrade

Utilizaremos BIND (Berkley Internet Naming Daemon) para que funcione en nuestra VM como servidor DNS.

$ sudo apt-get install bind9
$ sudo apt-get install dnsutils

Una vez instalados, iremos a /etc/bind y editaremos:

sudo nano named.conf.local

Agregaremos la información de los dominios para el servidor:

//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

//Dominio forward
zone "superproyecto.app" {
    type master;
    file "/etc/bind/db.superproyecto";
};

//Dominio reverse
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.192";
};

La primer «zone» define nuestro dominio de búsqueda para cuando ingresemos la URL de nuestro proyecto. La segunda es para cuando realicemos una búsqueda inversa.
Guardamos el archivo y ahora copiaremos el archivo db.local:

cp db.local db.superproyecto

Abriremos db.superproyecto e ingresaremos la información de donde se localiza este dominio.

;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     superproyecto.app. root.superproyecto.app. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      superproyecto.app.
@       IN      A       192.168.1.200

En vez de localhost, lo reemplazaremos con nuestra URL, en este caso superproyecto.app. En el registro NS pondremos nuevamente la URL y en el registro A la IP de nuestra máquina Homestead.

Ahora modificaremos el archivo resolv:

sudo nano /etc/resolv.conf

De forma que quede una sola línea con la IP de nuestro servidor.

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 192.168.1.201

Para realizar la búsqueda inversa, copiaremos el archivo db.127 para actualizarlo con la información inversa:

cp db.127 db.192

El resultado será el siguiente:

;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@       IN      SOA     superproyecto.app. root.superproyecto.app. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      superproyecto.app.
1.0.0   IN      PTR     superproyecto.app.

Una vez terminado, tenemos que reiniciar el servidor DNS. Por lo que ejecutamos:

sudo service bind9 restart

Ahora, solo tenemos que modificar en nuestros dispositivos o en nuestro router la IP del servidor DNS que resolverá las URLs que ingresemos.

En windows:
dns

En OSX:
DNS 2

Antes de acceder a nuestro sitio, tenemos que borrar el caché DNS de nuestra PC. En Windows podemos ejecutar ipconfig /flushdns, en caso de no funcionar, podemos reiniciar nuestra interfaz de red.

sitio

Existen otros métodos como http://xip.io/ o https://ngrok.com/ pero estos están más enfocados a acceso desde fuera de la LAN (internet) a Homestead. También es posible utilizar vagrant share para compartir nuestros sitios web.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Como hacer "debug" usando Xdebug, PhpStorm y Homestead