Laravel Homestead

Wer in der Web-Entwicklung unterwegs ist, der benötigt früher oder später einen lokalen Entwicklungsserver der einfach zu installieren und möglichst flexibel ist. Die Möglichkeiten der Standard-Installationen von XAMPP & Co. sind dabei oft begrenzt und nicht leicht auf andere Systeme und Projektanforderungen übertragbar.

Mit Laravel Homestead gibt es einen vielversprechenden Ansatz projektbezogene virtuelle Maschinen anzulegen, für die nur wenig Konfiguration notwendig ist und die alles beinhalten, was für die meisten Web-Projekte benötigt wird. Da es mit Vagrant schon eine einfache Lösung gibt, um virtuelle Maschinen zu konfigurieren und zu verwalten, setzt Homestead auf diesem etablierten System auf.

Homestead ist eine vorkonfigurierte Vagrant Box, die einem das Installieren von PHP, MySQL, Webserver und Co. im lokalen System erspart und die Möglichkeit bietet unabhängig vom Host-System jederzeit neue virtuelle Maschinen anzulegen. Vagrant Boxen lassen sich auch jederzeit leicht und unkompliziert löschen, so dass man keinen Müll im System behält, wenn man sie nicht mehr benötigt.

Homestead läuft auf jedem Windows, Mac oder Linux System und enthält PHP 7, MySQL, PostgresSQL, Redis, Memcached, NodeJS, Beanstalk und viele weitere nützliche Entwicklungswerkzeuge.

Installation

Erste Schritte

Bevor wir mit Homestead eine virtuelle Maschine erstellen können, müssen VMWare oder VirtualBox sowie Vagrant auf deinem System installiert sein. VMWare hat eine bessere Performance bei den sogenannten „Shared Folders“, also dem Einbinden von Verzeichnissen in virtuellen Maschinen, ist jedoch kostenpflichtig.

Zum Zeitpunkt dieses Artikels ist VirtualBox 5.0.2 aktuell und wird für alle Beispiele verwendet.

Installation der Homestead Vagrant Box

Wenn VirtualBox oder VMWare und Vagrant installiert sind, must du die Homestead-Box zur Vagrant-Installation hinzufügen.

Dazu gibst du den folgenden Befehle auf der Kommandozeile ein:

vagrant box add laravel/homestead

Die Ausgabe sollte in etwa so aussehen:

control:~ demo$ vagrant box add laravel/homestead
==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://atlas.hashicorp.com/laravel/homestead
==> box: Adding box 'laravel/homestead' (v0.5.0) for provider: virtualbox
    box: Downloading: https://atlas.hashicorp.com/laravel/boxes/homestead/versions/0.5.0/providers/virtualbox.box
==> box: Successfully added box 'laravel/homestead' (v0.5.0) for 'virtualbox'!
control:~ demo$

Sollte es Probleme geben, die Box hinzuzufügen, prüfe am Besten ob deine Vagrant-Installation auf dem neuesten Stand ist.

Installation eines Demo-Projektes

Um den kompletten Ablauf anhand eines praktischen Beispiels zeigen zu können, benötigen wir ein Demo-Projekt. Wenn du jedoch schon weißt, was dich am Ende erwartet, kannst du diesen Schritt auch überspringen.

Für alle, die neu in das Thema virtuelle Entwicklungs-Maschine einsteigen, starten wir mit dem Anlegen eines neuen Laravel-Projektes. Larvel lässt sich, wie auch Homestead, bequem mit composer installieren.

control:~ demo$ composer create-project --prefer-dist laravel/laravel homestead-demo

Die Ausgabe sollte in etwa so aussehen:

composer create-project --prefer-dist laravel/laravel homestead-demo
Installing laravel/laravel (v5.2.31)
  - Installing laravel/laravel (v5.2.31)
    Downloading: 100%

Created project in homestead-demo
> php -r "copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing vlucas/phpdotenv (v2.4.0)
    Downloading: 100%

  - Installing symfony/polyfill-mbstring (v1.2.0)
    Downloading: 100%

... many more packages ...

Writing lock file
Generating autoload files
> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader
> php artisan key:generate
Application key [base64:SY8brKnXmo5kNvWn2E0BdD1yp4jxReqgSpvqRbJoboI=] set successfully.
control:~ demo$

Das war es auch schon und am Ende dieses Artikels kannst du das soeben erstellte Demo-Projekt dann über deinen Webbrowser aufrufen.

Installation von Homestead im Projekt

Homestead lässt sich bequem und einfach über composer für dein Projekt installieren.

cd {dein-projektverzeichnis}
composer require laravel/homestead --dev

Die Ausgabe sollte in etwa so aussehen:

control:~ demo$ cd homestead-demo/
control:homestead-demo demo$ composer require laravel/homestead --dev && composer update
Using version ^3.0 for laravel/homestead
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing laravel/homestead (v3.0.2)
    Downloading: 100%

Writing lock file
Generating autoload files
> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader
control:~ demo$

Sobald die Installation abgeschlossen ist, nutzen wir den make Befehl um das benötigte Vagrantfile und die Konfigurationsdatei Homestead.yaml im Projektverzeichnis zu erstellen. Der make Befehl wird dabei automatisch die Einträge für sites und folders in der Homestead.yaml generieren.

Mac / Linux:

php vendor/bin/homestead make

Windows:

vendor\\bin\\homestead make

Wenn der Befehl erfolgreich war, müsste folgende Ausgabe zu sehen sein:

control:homestead-demo demo$ php vendor/bin/homestead make
Homestead Installed!
control:homestead-demo demo$

Konfiguration der virtuellen Maschine

Bevor wir die virtuelle Maschine durch Vagrant bauen lassen, sollten wir noch ein paar kleinere Anpassungen vornehmen, so dass die Einstellungen zu den Anforderungen des Projektes passen. Öffne dazu die Datei Homestead.yaml in deinem Projektverzeichnis.

Beispiel-Konfiguration

Die Konfiguration der virtuellen Maschine für diesen Artikel ieht wie folgt aus:

---
ip: "192.168.10.10"
memory: 2048
cpus: 1
hostname: homestead-demo
name: homestead-demo
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: "/Users/demo/homestead-demo"
      to: "/home/vagrant/homestead-demo"

sites:
    - map: homestead.app
      to: "/home/vagrant/homestead-demo/public"

databases:
    - homestead

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

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp

ip

Wenn du mehrere Projekte hast und möglicher Weise auch verschiedene virtuelle Maschinen parallel laufen lassen möchtest, solltest du für jede Homestead-Installation eine eigene IP-Adresse festlegen, da es sonst zu Konflikten kommt.

memory

Beim Festlegen des Arbeitsspeichers solltest du es nicht zu gut meinen, da du sonst riskierst dein lokales System zum Stillstand zu bringen. Wenn du z.B. 8 GB RAM hast, dann kannst du ruhig 2 GB für die virtuelle Maschine vergeben, bei nur 4 GB im System würde ich jedoch eher nur zu 1 GB für die VM raten.

cpus

Für die meisten Anwendungsfälle sollte hier 1 CPU reichen. Bei einem QuadCore System kann man aber auch mal 2 einsetzen, um größere Projekte schneller virtuell laufen zu lassen.

hostname

Den Namen den die Maschine im Netzwerk hat, solltest du pro Projekt einzigartig wählen, um Konflikte zu vermeiden. Den hier eingetragenen Hostnamen musst du auch mit der entsprechenden IP in deine Host-Datei eintragen (siehe unten).

name

Der Name der virtuellen Maschine beim Provider (VirtualBox / VMWare), sollte dir mit einem Blick verraten für welches Projekt du die Maschine angelegt hast.

folders

Du kannst beliebig viele Verzeichnisse auf deinem lokalen System angeben, die in der virtuellen Maschine verfübar sein sollen. Der Wert „map“ enthält dabei immer das lokale Verzeichnis und mit „to“ legst du fest wo es im Gastsystem eingehangen werden soll.

sites

Hier werden die nginx-Hosts eingetragen, so dass du verschiedene Verzeichnisse über unterschiedliche Hostnamen verfügbar machen kannst.

Das Anlegen beliebig vieler Hosts kann nützlich sein, wenn ein Projekt mehrere Einträge benötigt, da z.B. ein separater Hostname für eine API verwendet werden soll. Natürlich ist es so auch leicht möglich mehrere Projekte auf einer einzigen virtuellen Maschine zu betreiben.

databases

Jede Zeile steht für eine Datenbank, die beim ersten Starten der virtuellen Maschine automatisch vom Ssystem angelegt wird.

Start und Nutzung der virtuellen Maschine

Der erste Start

Nachdem die Konfiguration passend eingestellt ist, lassen wir die virtuelle Maschine über Vagrant bauen und hochfahren.

vagrant up

Es kann vorkommen, dass ein Teil der durchlaufenden Zeilen rot dargestellt wird und es nach einem Fehler aussieht, das ist jedoch nicht immer ein Grund zur Sorge.

So kann man die Warnung, dass Passwörter auf der Kommandozeile unsicher sind, z.B. einfach ignorieren, da diese von den ausgeführten Befehlen zum Anlegen der Datenbanken stammen und normal sind. Auch ein Update vom composer ist kein Grund zur Panik.

Die Ausgabe sollte in etwa so aussehen:

vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'laravel/homestead'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'laravel/homestead' is up to date...
==> default: Setting the name of the VM: homestead-demo
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 80 (guest) => 8000 (host) (adapter 1)
    default: 443 (guest) => 44300 (host) (adapter 1)
    default: 3306 (guest) => 33060 (host) (adapter 1)
    default: 5432 (guest) => 54320 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/demo/homestead-demo
    default: /home/vagrant/homestead-demo => /Users/demo/homestead-demo
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDD2DBl5fKh4ilyjMbNI3n2SDMdUxN/4CE5x3YHNngWEchxtrMkjDgobgxlq1mmMdF5xnu8vNMUdBUZpGNPbtk9nPlKWbq5RtKD2Cg3Fat95qfeePymELK+VS5BEsOj.......
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: Running provisioner: shell...
    default: Running: /var/folders/z3/25fkxpps36938vqt2t5tp5rc0000gp/T/vagrant-shell20160927-12387-i5uk4e.sh
==> default: Running provisioner: shell...
    default: Running: /var/folders/z3/25fkxpps36938vqt2t5tp5rc0000gp/T/vagrant-shell20160927-12387-4fwskc.sh
==> default: Running provisioner: shell...
    default: Running: /var/folders/z3/25fkxpps36938vqt2t5tp5rc0000gp/T/vagrant-shell20160927-12387-1oeyju5.sh
==> default: mysql:
==> default: [Warning] Using a password on the command line interface can be insecure.
==> default: Running provisioner: shell...
    default: Running: /var/folders/z3/25fkxpps36938vqt2t5tp5rc0000gp/T/vagrant-shell20160927-12387-u53thm.sh
==> default: createdb: database creation failed: ERROR:  database "homestead" already exists
==> default: Running provisioner: shell...
    default: Running: /var/folders/z3/25fkxpps36938vqt2t5tp5rc0000gp/T/vagrant-shell20160927-12387-1mkegwg.sh
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: Updating to version 1.2.1 (stable channel).
==> default:     Downloading: Connecting...
==> default:
==> default:     Downloading: 100%
==> default:
==> default: Use composer self-update --rollback to return to version 1.1.3

Wenn alles fertig ist, solltest du in Virtualbox eine laufende Maschine mit dem von dir vergebenen Namen sehen können.

Virtualbox mit neuer VM

Login über SSH

Wenn möglich, wird beim Bau der Maschine automatisch dein Private Key hinterlegt, so dass du dich ohne Benutzername und Passwort in die virtuelle Maschine einloggen kannst. Sollte dies nicht der Fall sein, helfen die folgenden Benutzerdaten weiter, die für Homestead als Standard hinterlegt sind. Die Datenbank ist mit den gleichen Benutzerdaten für den Root-Zugriff konfiguriert.

Username:

homestead

Passwort:

secret

Um dich per SSH mit der Maschine zu verbinden, kannst du im Projektverzeichnis einfach den folgenden Befehl in der Kommandozeile eingeben:

vagrant ssh

Wenn alles klappt, bist du in kürzester Zeit auf der virtuellen Maschine eingeloggt:

control:homestead-demo demo$ vagrant ssh
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-22-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
vagrant@homestead-demo:~$

Die Maschine stoppen / löschen

Wenn du die virtuelle Maschine anhalten willst, dann führe folgenden Befehl in der Kommandozeile deines lokalen Systems (ergo nicht in der VM) aus:

vagrant suspend

Die Maschine wird dann herunter gefahren und es sollte folgende Ausgabe sichtbar sein:

control:homestead-demo demo$ vagrant suspend
==> default: Saving VM state and suspending execution...
control:homestead-demo demo$

Um die virtuelle zu löschen nutzt du:

vagrant destroy

Die Hosts-Datei anpassen

Bevor du den Hostnamen / die Domain des Projektes verwenden kannst, den du in der Datei Homestead.yaml festgelegt hast, musst du diesen noch in deine lokale Konfigurationsdatei von Windows / Mac Os eintragen.

Auf Mac- und Linux-Systemen liegt die Datei unter

/etc/hosts

Auf Windows-Systemen findest du sie in

C:\Windows\System32\drivers\etc\hosts

Dort musst du, im Falle unserer Beispiel-VM, nun folgende Zeile hinzufügen:

192.168.10.10   homestead.app

Das Projekt aufrufen

Nun kannst du dein Projekt im Browser, über den von dir vergebenen Hostnamen, abrufen.

Unser Beispielprojekt:
» http://homestead.app