Aquest article fa referència Laravel Homestead. Vegeu abans Laravel
NOTA: Recomanem l'ús de NFS per a les carpetes compartides fet que augmenta molt el rendiment de la màquina! A les noves versions de Homestead això es pot activar simplement tenint activat el servidor de NFS nfs-kernel-server i posant type: nfs a les carpetes compartides homestead al fitxer homestead.yaml
Abans de res cal que tingueu instal·lat Virtual Box i Vagrant (si pot ser versions actualitzades). Baixeu els paquets Debian de les respectives webs de Virtual Box i Vagrant i i executeu:
$ sudo dpkg -i vagrant_1.7.2_x86_64.deb $ sudo dpkg -i virtualbox-4.3_4.3.24-98716~Ubuntu~raring_amd64.deb
També cal tenir claus SSH RSA creades:
$ ssh-keygen -t rsa
.NOTA: El codi és un exemple. Tingueu en compte que heu d'adaptar les comandes als noms dels fitxers que pertoquin. Si ja teniu instal·lat VirtualBox o Vagrant no cal que feu aquests passos però si els teniu antics us recomana actualitzeu desinstal·lat els paquets existents amb apt-get remove i executant els dpgk -iindicats
El primer pas un cop instal·lat Vagrant és instal·lar la màquina virtual amb:
$ vagrant box add laravel/homestead
Escolliu la opció 1 per a VirtualBox (com podeu veure també està disponible per a VMWARE).
IMPORTANT: Es baixa d'Internet i per tant depenent de la velocitat de la vostra connexió pot tardar una bona estona
Ara cal instal·lar homestead utilitzant Composer:
$ composer global require "laravel/homestead=~2.0"
Per poder tenir la comanda homestead disponible cal tenir al path la carpeta bin de composer. Per exemple tenint el fitxer ~/.bashrc amb la línia:
$ cat ~/.bashrc | grep composer/vendor export PATH=${PATH}:~/.composer/vendor/bin
Executeu:
$ homestead init
Això crea un fitxer bàsic de configuració de Homestead a:
~/.homestead/Homestead.yaml
I el podeu editar amb:
$ homestead edit
NOTA: Instal·leu el servidor de NFS a la vostra màquina si voleu utilitzar aquest tipus de carpeta compartida. També per augmentar el rendiment tingueu en compte la possibilitat d'augmentar els valors de memory i cpus
El fitxer de configuració ha de quedar quelcom similar a:
--- ip: "192.168.10.10" memory: 2048 cpus: 1 provider: virtualbox authorize: ~/.ssh/id_dsa.pub keys: - ~/.ssh/id_dsa folders: - map: ~/github to: /home/vagrant/github type: nfs sites: - map: laravelapp.dev to: /home/vagrant/github/laravelapp/public databases: - homestead variables: - key: APP_ENV value: local # blackfire: # - id: foo # token: bar
La màquina per defecte tindrà la adreça IP:
192.168.10.10
Tingueu en compte que VirtualBox us crearà una interfície virtual amb la IP 192.168.10.1:
vboxnet1 Link encap:Ethernet direcciónHW 0a:00:27:00:00:01 Direc. inet:192.168.10.1 Difus.:192.168.10.255 Másc:255.255.255.0 Dirección inet6: fe80::800:27ff:fe00:1/64 Alcance:Enlace ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1 Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0 Paquetes TX:113 errores:0 perdidos:0 overruns:0 carrier:0 colisiones:0 long.colaTX:1000 Bytes RX:0 (0.0 B) TX bytes:17351 (17.3 KB)
Fixeu-vos que cal tenir una clau SSH a ~/.ssh. La podeu crear amb:
$ ssh-keygen -t dsa
Després cal indicar una carpeta on guardem els nostres projectes Laravel. En el meu cas he escollit:
~/github
L'apartat de la configuració anomenat folders:
- map: ~/github to: /home/vagrant/Code
Indica amb map un mapping entre la màquina física i la virtual. El que fa Vagrant és fer que la carpeta ~/github estigui disponible dins de la màquina virtual a la carpeta que per defecte és on ho té preparat.
L'apartat sites:
sites: - map: laravelapp.dev to: /home/vagrant/githublaravelapp/public
Defineix els noms dels dominis de les nostres aplicacions i la carpeta dins la màquina virtual on estarà disponible. Podeu indicar més d'un mapa per treballar amb múltiples aplicacions. Un pas extra que heu de fer es configurar el fitxer hosts per tal de mapejar els noms de domini a adreces IP:
$ sudo joe /etc/hosts # LARAVEL 192.168.10.10 laravelapp.dev
Un cop tot preparat ja podeu executar la màquina virtual homestead:
$ homestead up
Ja podeu provar la web a la URL:
http://laravelapp.dev
Si executeu:
$ homestead
Veureu la típica comanda PHP creada amb Symfony Console i les opcions i comandes disponibles. Alguns exemples:
$ homestead ssh
Per connectar-se directament a la màquina virtual utilitzant els claus SSH.
Aturar/suspendre la màquina:
$ homestead halt $ homestead supend -> homestead resume
Per actualitzar la imatge:
$ homestead update
Recursos:
Cal tenir en compte que podem voler actualitzar la comanda homestead o la màquina virtual o totes dues coses. Per actualitzar la comanda recordeu que la hem instal·lat com un paquet global de composer i per tant:
$ composer global update
Pot ser una forma d'actualitzar la comanda homestead però compte consulteu abans a Packagist quine versió és la més actual de la comanda a Packagist:
https://packagist.org/packages/laravel/homestead
I consulteu dos coses, quina versió teniu:
$ homestead --version Laravel Homestead version 2.1.8
I quines versions heu dit a composer que ha d'instal·lar/actualitzar:
$ cat ~/.composer/composer.json { "require": { "laravel/homestead": "~2.0", "laravel/installer": "^1.2", "phpunit/phpunit": "~4.0", "kherge/box": "^2.6" }, "require-dev": { "apigen/apigen": "^4.1" } }
Per exemple al fitxer que he posat podeu observar que he demanat les versions 2 o superiors però sense passar a la tres i ja hi ha disponible una tercera versió. Canvieu el fitxer composer.json a:
$ cat ~/.composer/composer.json { "require": { "laravel/homestead": "~3.0", "laravel/installer": "^1.2", "phpunit/phpunit": "~4.0", "kherge/box": "^2.6" }, "require-dev": { "apigen/apigen": "^4.1" } }
i executeu:
$ composer global update Changed current directory to /home/sergi/.composer Loading composer repositories with package information Updating dependencies (including require-dev) - Removing laravel/homestead (v2.1.8) - Installing laravel/homestead (v3.0.1) Downloading: 100% Writing lock file Generating autoload files
Comproveu la comanda s'ha actualitzar correctament:
$ homestead --version Laravel Homestead version 3.0.1
Ara actualitzem la màquina virtual. Us recomano però que abans actualitzeu Virtual Box a la última versió i el mateix pel que fa aVagrant. Podeu veure les màquines virtuals de vagrant amb:
$ vagrant box list laravel/homestead (virtualbox, 0.2.7) laravel/homestead (virtualbox, 0.3.0) laravel/homestead (virtualbox, 0.3.3)
Per exemple en aquest cas puc veure que em falta la última versió de la màquina homestead instal·leu-la amb:
$ vagrant box add laravel/homestead
Tardarà una estona en descarregar-la. L'últim pas però no el menys important és configurar un Alias a bashrc per tal de poder accedir a la comanda homestead des de tot arreu. La línia que heu d'afegir a .bashrc és:
alias homestead='function __homestead() { (cd ~/.composer/vendor/laravel/homestead && vagrant $*); unset -f __homestead; }; __homestead'
La comanda:
$ homestead up
Arranca la màquina i si és el primer cop que és arrancada també l'aprovisiona seguint les indicacions del fitxer de configuració homestead.yaml
La comanda:
$ homestead ssh
es connecta via SSH a la màquina virtual. Si heu definit correctament i existeixen les claus SSH la connexió serà directa a la màquina.
La comanda:
$ homestead halt
Atura la màquina virtual. Amb l'opció suspend la podeu aturar temporalment
Tal i com podeu veure al fitxer .env o .env.sample de Laravel:
$ cat .env ... DB_HOST=localhost DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret ...
L'usuari per defecte és homestead la base de dades és diu igual i la paraula de pas és secret.
IMPORTANT: En desenvolupament no passa res per deixar aquestes creadencials per defecte però en explotació evidentment las heu de canviar!
Per accedir a la base de dades:
$ homestead ssh $ mysql -uhomestead -psecret
o com a root:
$ sudo mysql -psecret
IMPORTANT: per alguna raó mysql -p i mysql -uhomestead -p no funciona!
Editeu la configuració amb:
$ homestead edit
Per aplicar els canvis a la màquina virtual (inclòs sense apagar-la) cal fer un reaprovisionament. Primer trobem l'identificador de la màquina amb:
$ vagrant global-status id name provider state directory ------------------------------------------------------------------------------------ 5e3258a default virtualbox poweroff /home/sergi/Homestead b916503 default virtualbox running /home/sergi/.composer/vendor/laravel/homestead The above shows information about all known Vagrant environments on this machine. This data is cached and may not be completely up-to-date. To interact with any of the machines, you can go to that directory and run Vagrant, or you can use the ID directly with Vagrant commands from any directory. For example: "vagrant destroy 1a2b3c4d"
Ara prodem reaprovisionar amb:
$ vagrant provision b916503
on b916503 en el meu cas és el id de la màquina.
Podeu editar la configuració de homestead:
$ homestead edit
Afegiu una nova base de dades a la secció databases:
databases: - homestead - new database
Obteniu el id de la VM:
$ vagrant global-status id name provider state directory ... b916503 default virtualbox running /home/sergi/.composer/vendor/laravel/homestead ...
Ara prodem reaprovisionar amb:
$ vagrant provision b916503
on b916503 en el meu cas és el id de la màquina. Ja teniu la base de dades nova.
Dos opcions:
1) modifiqueu la configuració de homestead
Podeu editar la configuració de homestead:
$ homestead edit
Afegiu un nou site a la secció sites:
sites: - map: laravel.app to: /home/vagrant/Code/laravel_base_app/public - map: laravelnotificationsapp.app to: /home/vagrant/Code/laravelnotificationsapp/public
Obteniu el id de la VM:
$ vagrant global-status id name provider state directory ... b916503 default virtualbox running /home/sergi/.composer/vendor/laravel/homestead ...
Ara prodem reaprovisionar amb:
$ vagrant provision b916503
on b916503 en el meu cas és el id de la màquina. Ja teniu la base de dades nova.
Executeu Mysql Workbench:
$ mysql-workbench
Les dades són:
Vegeu Mysql Workbench i Laravel Homestead
Recursos:
$ homestead ssh $ sudo apt-get install phpmyadmin
no seleccioneu cap opció només continueu amb enter quan us pregunti pel servidor web.
$ sudo ln -s /usr/share/phpmyadmin/ /home/vagrant/Code/phpmyadmin $ cd ~/Code && serve phpmyadmin.app /home/vagrant/Code/phpmyadmin
Si us dona un error al reiniciar nginx podeu consultar el fitxer de log:
$ sudo tail -f /var/log/nginx/error.log 2015/03/18 11:54:16 [emerg] 3671#0: invalid number of arguments in "listen" directive in /etc/nginx/sites-enabled/phpmyadmin.app:2
Editeu el fitxer:
$ sudo editor /etc/nginx/sites-enabled/phpmyadmin.app
I afegiu 80 a la directiva Listen! Ara apliqueu el canvi a nginx:
$ sudo service nginx reload
Editeu fitxer /etc/hosts:
192.168.10.10 phpmyadmin.app
Utlitzeu la URL per accedir:
http.//phpmyadmin.app
Recursos:
Xdebug is not installed I've followed (with some changes) the steps at:
http://xdebug.org/wizard.php
In my case:
$ wget http://xdebug.org/files/xdebug-2.4.0rc3.tgz $ tar xvzf xdebug-2.4.0rc3.tgz $ cd xdebug-2.4.0RC3/ $ phpize $ ./configure $ make $ sudo cp modules/xdebug.so /usr/lib/php/20151012/ $ cd /etc/php/7.0/fpm/conf.d/
Creat file /etc/php/7.0/fpm/conf.d/20-xdebug.ini with following content:
; configuration for php xdebug module ; priority=20 zend_extension=/usr/lib/php/20151012/xdebug.so xdebug.idekey = "phpstorm" xdebug.remote_enable = 1 xdebug.remote_connect_back = 1 xdebug.remote_port = 9000 xdebug.max_nesting_level = 300 xdebug.scream = 0 xdebug.cli_color = 1 xdebug.show_local_vars = 1
Now restart:
$ sudo service php7.0-fpm restart
Per a versions anteriors a 4.0 podeu seguir les instruccions de:
https://www.paolodavila.com/mediawiki/index.php/VirtualBox#Copiar_a_Proxmox
Afegir a ~/.bashrc:
function vm() { cd ~/homestead command="$1" if [ "$command" = "edit" ]; then open ~/.homestead/homestead.yaml else if [ -z "$command" ]; then command="ssh" fi eval "vagrant ${command}" fi #switch back to directory where command was performed in cd - }
From:
http://www.sitepoint.com/set-automatic-virtual-hosts-nginx-apache/
Entreu a la màquina homestead
$ homestead ssh
I creeu el fitxer:
$ sudo editor /etc/nginx/sites-available/wildcard.conf
server { listen 80; server_name ~^(www\.)?(?<sname>.+?).app$; root /home/vagrant/Code/Laravels/$sname/public; index index.html index.htm index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log off; error_log /var/log/nginx/$sname.app-error.log error; sendfile off; client_max_body_size 100m; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors off; fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; } location ~ /\.ht { deny all; } }
Now activate site:
$ sudo ln -s /etc/nginx/sites-available/wildcard.conf /etc/nginx/sites-enabled/wildcard.conf $ sudo service nginx restart
See next section to configure wilcard in dns resolution using Ubuntu and dnsmasq.
It's easy in Ubuntu because dnsmasq-base is installed by default so create file:
$ sudo editor /etc/NetworkManager/dnsmasq.d/laravel_homestead.conf
Add the following lines:
# General sites (Apache) address=/.dev/127.0.0.1 # Laravel Homestead (Vagrant) address=/.app/192.168.10.10
Dnsmasq have to be killed ( see this):
$ ps aux | grep dnsmasq
Take note of dnsmasq PID and execute:
$ sudo kill -9 PID_DNSMASQ
Then restart network-manager:
$ sudo service network-manager restart
Now wilcards are activated:
$ ping whatever.app
resolves to 192.168.10.10
and
$ ping whatever.dev
resolves to 127.0.0.1
Sembla que homestead no arranca supervisor al inicia. Per evitar tenir que fer:
$ sudo service restart supervisor
cada cop arranquem homestead, he afegit les següents línies a /home/sergi/.composer/vendor/laravel/homestead/scripts/homestead.rb:
... # Run supervisor on every provision config.vm.provision "shell" do |s| s.inline = "/usr/sbin/service supervisor restart" end ...
Després de:
# Update Composer On Every Provision config.vm.provision "shell" do |s| s.inline = "/usr/local/bin/composer self-update" end
Vegeu PHP_Debug#Homestead
La primera recomanació per augmentar el rendiment de Homestead és que tingueu tot actualitzat:
- Actualitzeu Virtual Box a la última versió. Baixeu el paquet de la web de Virtual Box i executeu dpkg -i - Actualitzeu Vagrant a la última versió. Baixeu el paquet de la web de VAgrant i executeu dpkg -i
També cal actualitzar homestead. Si ja teniu una màquina virtual Homestead atureu-la (millor destrui-la):
$ homestead destroy
També aneu a virtual box assegureu-vos que no existeix la màquina homestead!
Actualitzeu la maquina Virtual Homestead (se la descarrega integra de Internet això pot tardar una bona estona):
$ homestead update
A data d'aquest escrit (--acacha (discussió) 14:36, 8 oct 2015 (CEST)) la versió és la 0.3.0
Podeu mirar les màquines amb:
$ vagrant box list laravel/homestead (virtualbox, 0.2.7) laravel/homestead (virtualbox, 0.3.0)
Instal·leu servidor NFS:
$ sudo apt-get install nfs-kernel-server
Assegure-vos de tenir l'última versió dels script de Homestead:
$ composer global update laravel/homestead
Podeu veure que teniu amb:
$ composer global show laravel/homestead
A data d'aquest escrit (--acacha (discussió) 14:36, 8 oct 2015 (CEST)) la versió és la 2.1.8
Ara al fitxer homestead.yaml al qual podeu accedir amb un:d
$ homestead edit
o si és el primer cop
$ homestead init $ homestead edit
Arregureu-vos de posar la opció type:nfs al fitxer:
folders: - map: ~/Code to: /home/vagrant/Code type: nfs
Ara ja podeu crear la màquina de nou amb
$ homestead up
Observeu que es carrega NFS (mirant com arrenca la màquina a Virtual Box) i al log de l'arrancada. També podeu mirar a la màquina host:
$ cat /etc/exports # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # # VAGRANT-BEGIN: 1000 b5299afb-ff07-4441-9f34-24e5f6c82080 "/home/sergi/Code" 192.168.10.10(rw,no_subtree_check,all_squash,anonuid=1000,anongid=1000,fsid=4282222475) # VAGRANT-END: 1000 b5299afb-ff07-4441-9f34-24e5f6c82080
Recursos:
Error:
$ homestead up /home/sergi/.composer/vendor/laravel/homestead/scripts/homestead.rb:76:in `read': No such file or directory - /home/sergi/.ssh/id_rsa.pub (Errno::ENOENT) from /home/sergi/.composer/vendor/laravel/homestead/scripts/homestead.rb:76:in `block in configure' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/plugins/kernel_v2/config/vm_provisioner.rb:72:in `call' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/plugins/kernel_v2/config/vm_provisioner.rb:72:in `add_config' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/plugins/kernel_v2/config/vm.rb:317:in `provision' from /home/sergi/.composer/vendor/laravel/homestead/scripts/homestead.rb:74:in `configure' from /home/sergi/.composer/vendor/laravel/homestead/Vagrantfile:18:in `block in <top (required)>' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/config/v2/loader.rb:37:in `call' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/config/v2/loader.rb:37:in `load' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/config/loader.rb:103:in `block (2 levels) in load' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/config/loader.rb:97:in `each' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/config/loader.rb:97:in `block in load' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/config/loader.rb:94:in `each' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/config/loader.rb:94:in `load' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/vagrantfile.rb:28:in `initialize' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/environment.rb:689:in `new' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/environment.rb:689:in `vagrantfile' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/environment.rb:441:in `host' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/environment.rb:207:in `block in action_runner' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/action/runner.rb:33:in `call' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/action/runner.rb:33:in `run' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/environment.rb:428:in `hook' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/environment.rb:671:in `unload' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/bin/vagrant:177:in `ensure in <main>' from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/bin/vagrant:177:in `<main>'
Solution:
$ ssh-keygen -t rsa
Executeu la màquina virtual directament des de Virtual Box i aixi podeu veure quin problema hi ha al arrancar la màquina. En el meu cas estava aturada al menú de grub.
NOTA: No longer needed in version 2.1.5 https://twitter.com/stauffermatt/status/624232790658125824
Change file ~/.composer/vendor/laravel/homestead/scripts/create-mysql.sh to:
#!/usr/bin/env bash DB=$1; #mysql -uhomestead -psecret -e "DROP DATABASE IF EXISTS \`$DB\`"; mysql -uhomestead -psecret -e "CREATE DATABASE IF NOT EXISTS \`$DB\` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci";