Introduction
Laravel strives to make the entire PHP development experience delightful, including your local development environment. Laravel Homestead is an official, pre-packaged Vagrant box that provides you a wonderful development environment without requiring you to install PHP, a web server, or any other server software on your local machine.
Vagrant provides a simple, elegant way to manage and provision Virtual Machines. Vagrant boxes are completely disposable. If something goes wrong, you can destroy and re-create the box in minutes!
Homestead runs on any Windows, macOS, or Linux system and includes Nginx, PHP, MySQL, PostgreSQL, Redis, Memcached, Node, and all of the other software you need to develop amazing Laravel applications.
Warning!
If you are using Windows, you may need to enable hardware virtualization (VT-x). It can usually be enabled via your BIOS. If you are using Hyper-V on a UEFI system you may additionally need to disable Hyper-V in order to access VT-x.
Included Software
- Ubuntu 22.04
- Git
- PHP 8.3
- PHP 8.2
- PHP 8.1
- PHP 8.0
- PHP 7.4
- PHP 7.3
- PHP 7.2
- PHP 7.1
- PHP 7.0
- PHP 5.6
- Nginx
- MySQL 8.0
- lmm
- Sqlite3
- PostgreSQL 15
- Composer
- Docker
- Node (With Yarn, Bower, Grunt, and Gulp)
- Redis
- Memcached
- Beanstalkd
- Mailpit
- avahi
- ngrok
- Xdebug
- XHProf / Tideways / XHGui
- wp-cli
Optional Software
- Apache
- Blackfire
- Cassandra
- Chronograf
- CouchDB
- Crystal & Lucky Framework
- Elasticsearch
- EventStoreDB
- Flyway
- Gearman
- Go
- Grafana
- InfluxDB
- Logstash
- MariaDB
- Meilisearch
- MinIO
- MongoDB
- Neo4j
- Oh My Zsh
- Open Resty
- PM2
- Python
- R
- RabbitMQ
- Rust
- RVM (Ruby Version Manager)
- Solr
- TimescaleDB
- Trader (PHP extension)
- Webdriver & Laravel Dusk Utilities
Installation and Setup
First Steps
Before launching your Homestead environment, you must install Vagrant as well as one of the following supported providers:
All of these software packages provide easy-to-use visual installers for all popular operating systems.
To use the Parallels provider, you will need to install Parallels Vagrant plug-in. It is free of charge.
Installing Homestead
You may install Homestead by cloning the Homestead
repository onto your host machine. Consider cloning the
repository into a Homestead
folder within
your "home" directory, as the Homestead
virtual machine will serve as the host to all of your
Laravel applications. Throughout this documentation, we
will refer to this directory as your "Homestead
directory":
git clone https://github.com/laravel/homestead.git ~/Homestead
After cloning the Laravel Homestead repository, you
should checkout the release
branch. This
branch always contains the latest stable release of
Homestead:
cd ~/Homestead
git checkout release
Next, execute the bash init.sh
command from
the Homestead directory to create the
Homestead.yaml
configuration file. The
Homestead.yaml
file is where you will
configure all of the settings for your Homestead
installation. This file will be placed in the Homestead
directory:
# macOS / Linux...
bash init.sh
# Windows...
init.bat
Configuring Homestead
Setting Your Provider
The provider
key in your
Homestead.yaml
file indicates which Vagrant
provider should be used: virtualbox
or
parallels
:
provider: virtualbox
Warning!
If you are using Apple Silicon the Parallels provider is required.
Configuring Shared Folders
The folders
property of the
Homestead.yaml
file lists all of the
folders you wish to share with your Homestead
environment. As files within these folders are changed,
they will be kept in sync between your local machine and
the Homestead virtual environment. You may configure as
many shared folders as necessary:
folders:
- map: ~/code/project1
to: /home/vagrant/project1
Warning!
Windows users should not use the~/
path syntax and instead should use the full path to their project, such asC:\Users\user\Code\project1
.
You should always map individual applications to their own folder mapping instead of mapping a single large directory that contains all of your applications. When you map a folder, the virtual machine must keep track of all disk IO for every file in the folder. You may experience reduced performance if you have a large number of files in a folder:
folders:
- map: ~/code/project1
to: /home/vagrant/project1
- map: ~/code/project2
to: /home/vagrant/project2
Warning!
You should never mount.
(the current directory) when using Homestead. This causes Vagrant to not map the current folder to/vagrant
and will break optional features and cause unexpected results while provisioning.
To enable NFS,
you may add a type
option to your folder
mapping:
folders:
- map: ~/code/project1
to: /home/vagrant/project1
type: "nfs"
Warning!
When using NFS on Windows, you should consider installing the vagrant-winnfsd plug-in. This plug-in will maintain the correct user / group permissions for files and directories within the Homestead virtual machine.
You may also pass any options supported by Vagrant's Synced
Folders by listing them under the
options
key:
folders:
- map: ~/code/project1
to: /home/vagrant/project1
type: "rsync"
options:
rsync__args: ["--verbose", "--archive", "--delete", "-zz"]
rsync__exclude: ["node_modules"]
Configuring Nginx Sites
Not familiar with Nginx? No problem. Your
Homestead.yaml
file's sites
property allows you to easily map a "domain"
to a folder on your Homestead environment. A sample site
configuration is included in the
Homestead.yaml
file. Again, you may add as
many sites to your Homestead environment as necessary.
Homestead can serve as a convenient, virtualized
environment for every Laravel application you are
working on:
sites:
- map: homestead.test
to: /home/vagrant/project1/public
If you change the sites
property after
provisioning the Homestead virtual machine, you should
execute the vagrant reload --provision
command in your terminal to update the Nginx
configuration on the virtual machine.
Warning!
Homestead scripts are built to be as idempotent as possible. However, if you are experiencing issues while provisioning you should destroy and rebuild the machine by executing thevagrant destroy && vagrant up
command.
Hostname Resolution
Homestead publishes hostnames using mDNS
for
automatic host resolution. If you set hostname:
homestead
in your Homestead.yaml
file, the host will be available at
homestead.local
. macOS, iOS, and Linux
desktop distributions include mDNS
support
by default. If you are using Windows, you must install
Bonjour
Print Services for Windows.
Using automatic hostnames works best for per project
installations of Homestead. If you host multiple
sites on a single Homestead instance, you may add the
"domains" for your web sites to the
hosts
file on your machine. The
hosts
file will redirect requests for your
Homestead sites into your Homestead virtual machine. On
macOS and Linux, this file is located at
/etc/hosts
. On Windows, it is located at
C:\Windows\System32\drivers\etc\hosts
. The
lines you add to this file will look like the
following:
192.168.56.56 homestead.test
Make sure the IP address listed is the one set in your
Homestead.yaml
file. Once you have added
the domain to your hosts
file and launched
the Vagrant box you will be able to access the site via
your web browser:
http://homestead.test
Configuring Services
Homestead starts several services by default; however,
you may customize which services are enabled or disabled
during provisioning. For example, you may enable
PostgreSQL and disable MySQL by modifying the
services
option within your
Homestead.yaml
file:
services:
- enabled:
- "postgresql"
- disabled:
- "mysql"
The specified services will be started or stopped based
on their order in the enabled
and
disabled
directives.
Launching the Vagrant Box
Once you have edited the Homestead.yaml
to
your liking, run the vagrant up
command
from your Homestead directory. Vagrant will boot the
virtual machine and automatically configure your shared
folders and Nginx sites.
To destroy the machine, you may use the vagrant
destroy
command.
Per Project Installation
Instead of installing Homestead globally and sharing the
same Homestead virtual machine across all of your
projects, you may instead configure a Homestead instance
for each project you manage. Installing Homestead per
project may be beneficial if you wish to ship a
Vagrantfile
with your project, allowing
others working on the project to vagrant up
immediately after cloning the project's repository.
You may install Homestead into your project using the Composer package manager:
composer require laravel/homestead --dev
Once Homestead has been installed, invoke Homestead's
make
command to generate the
Vagrantfile
and Homestead.yaml
file for your project. These files will be placed in the
root of your project. The make
command will
automatically configure the sites
and
folders
directives in the
Homestead.yaml
file:
# macOS / Linux...
php vendor/bin/homestead make
# Windows...
vendor\\bin\\homestead make
Next, run the vagrant up
command in your
terminal and access your project at
http://homestead.test
in your browser.
Remember, you will still need to add an
/etc/hosts
file entry for
homestead.test
or the domain of your choice
if you are not using automatic hostname
resolution.
Installing Optional Features
Optional software is installed using the
features
option within your
Homestead.yaml
file. Most features can be
enabled or disabled with a boolean value, while some
features allow multiple configuration options:
features:
- blackfire:
server_id: "server_id"
server_token: "server_value"
client_id: "client_id"
client_token: "client_value"
- cassandra: true
- chronograf: true
- couchdb: true
- crystal: true
- dragonflydb: true
- elasticsearch:
version: 7.9.0
- eventstore: true
version: 21.2.0
- flyway: true
- gearman: true
- golang: true
- grafana: true
- influxdb: true
- logstash: true
- mariadb: true
- meilisearch: true
- minio: true
- mongodb: true
- neo4j: true
- ohmyzsh: true
- openresty: true
- pm2: true
- python: true
- r-base: true
- rabbitmq: true
- rustc: true
- rvm: true
- solr: true
- timescaledb: true
- trader: true
- webdriver: true
Elasticsearch
You may specify a supported version of Elasticsearch, which must be an exact version number (major.minor.patch). The default installation will create a cluster named 'homestead'. You should never give Elasticsearch more than half of the operating system's memory, so make sure your Homestead virtual machine has at least twice the Elasticsearch allocation.
Note:
Check out the Elasticsearch documentation to learn how to customize your configuration.
MariaDB
Enabling MariaDB will remove MySQL and install MariaDB.
MariaDB typically serves as a drop-in replacement for
MySQL, so you should still use the mysql
database driver in your application's database
configuration.
MongoDB
The default MongoDB installation will set the database
username to homestead
and the corresponding
password to secret
.
Neo4j
The default Neo4j installation will set the database
username to homestead
and the corresponding
password to secret
. To access the Neo4j
browser, visit http://homestead.test:7474
via your web browser. The ports 7687
(Bolt), 7474
(HTTP), and 7473
(HTTPS) are ready to serve requests from the Neo4j
client.
Aliases
You may add Bash aliases to your Homestead virtual
machine by modifying the aliases
file
within your Homestead directory:
alias c='clear'
alias ..='cd ..'
After you have updated the aliases
file, you
should re-provision the Homestead virtual machine using
the vagrant reload --provision
command.
This will ensure that your new aliases are available on
the machine.
Updating Homestead
Before you begin updating Homestead you should ensure you have removed your current virtual machine by running the following command in your Homestead directory:
vagrant destroy
Next, you need to update the Homestead source code. If you cloned the repository, you can execute the following commands at the location you originally cloned the repository:
git fetch
git pull origin release
These commands pull the latest Homestead code from the GitHub repository, fetch the latest tags, and then check out the latest tagged release. You can find the latest stable release version on Homestead's GitHub releases page.
If you have installed Homestead via your project's
composer.json
file, you should ensure your
composer.json
file contains
"laravel/homestead":
"^12"
and update your
dependencies:
composer update
Next, you should update the Vagrant box using the
vagrant box update
command:
vagrant box update
After updating the Vagrant box, you should run the
bash init.sh
command from the Homestead
directory in order to update Homestead's additional
configuration files. You will be asked whether you wish
to overwrite your existing Homestead.yaml
,
after.sh
, and aliases
files:
# macOS / Linux...
bash init.sh
# Windows...
init.bat
Finally, you will need to regenerate your Homestead virtual machine to utilize the latest Vagrant installation:
vagrant up
Daily Usage
Connecting via SSH
You can SSH into your virtual machine by executing the
vagrant ssh
terminal command from your
Homestead directory.
Adding Additional Sites
Once your Homestead environment is provisioned and
running, you may want to add additional Nginx sites for
your other Laravel projects. You can run as many Laravel
projects as you wish on a single Homestead environment.
To add an additional site, add the site to your
Homestead.yaml
file.
sites:
- map: homestead.test
to: /home/vagrant/project1/public
- map: another.test
to: /home/vagrant/project2/public
Warning!
You should ensure that you have configured a folder mapping for the project's directory before adding the site.
If Vagrant is not automatically managing your
"hosts" file, you may need to add the new site
to that file as well. On macOS and Linux, this file is
located at /etc/hosts
. On Windows, it is
located at
C:\Windows\System32\drivers\etc\hosts
:
192.168.56.56 homestead.test
192.168.56.56 another.test
Once the site has been added, execute the vagrant
reload --provision
terminal command from your
Homestead directory.
Site Types
Homestead supports several "types" of sites
which allow you to easily run projects that are not
based on Laravel. For example, we may easily add a
Statamic application to Homestead using the
statamic
site type:
sites:
- map: statamic.test
to: /home/vagrant/my-symfony-project/web
type: "statamic"
The available site types are: apache
,
apache-proxy
, apigility
,
expressive
, laravel
(the
default), proxy
(for nginx),
silverstripe
, statamic
,
symfony2
, symfony4
, and
zf
.
Site Parameters
You may add additional Nginx fastcgi_param
values to your site via the params
site
directive:
sites:
- map: homestead.test
to: /home/vagrant/project1/public
params:
- key: FOO
value: BAR
Environment Variables
You can define global environment variables by adding
them to your Homestead.yaml
file:
variables:
- key: APP_ENV
value: local
- key: FOO
value: bar
After updating the Homestead.yaml
file, be
sure to re-provision the machine by executing the
vagrant reload --provision
command. This
will update the PHP-FPM configuration for all of the
installed PHP versions and also update the environment
for the vagrant
user.
Ports
By default, the following ports are forwarded to your Homestead environment:
- HTTP: 8000 → Forwards To 80
- HTTPS: 44300 → Forwards To 443
Forwarding Additional Ports
If you wish, you may forward additional ports to the
Vagrant box by defining a ports
configuration entry within your
Homestead.yaml
file. After updating the
Homestead.yaml
file, be sure to
re-provision the machine by executing the vagrant
reload --provision
command:
ports:
- send: 50000
to: 5000
- send: 7777
to: 777
protocol: udp
Below is a list of additional Homestead service ports that you may wish to map from your host machine to your Vagrant box:
- SSH: 2222 → To 22
- ngrok UI: 4040 → To 4040
- MySQL: 33060 → To 3306
- PostgreSQL: 54320 → To 5432
- MongoDB: 27017 → To 27017
- Mailpit: 8025 → To 8025
- Minio: 9600 → To 9600
PHP Versions
Homestead supports running multiple versions of PHP on
the same virtual machine. You may specify which version
of PHP to use for a given site within your
Homestead.yaml
file. The available PHP
versions are: "5.6", "7.0",
"7.1", "7.2", "7.3",
"7.4", "8.0", "8.1",
"8.2", and "8.3", (the default):
sites:
- map: homestead.test
to: /home/vagrant/project1/public
php: "7.1"
Within your Homestead virtual machine, you may use any of the supported PHP versions via the CLI:
php5.6 artisan list
php7.0 artisan list
php7.1 artisan list
php7.2 artisan list
php7.3 artisan list
php7.4 artisan list
php8.0 artisan list
php8.1 artisan list
php8.2 artisan list
php8.3 artisan list
You may change the default version of PHP used by the CLI by issuing the following commands from within your Homestead virtual machine:
php56
php70
php71
php72
php73
php74
php80
php81
php82
php83
Connecting to Databases
A homestead
database is configured for both
MySQL and PostgreSQL out of the box. To connect to your
MySQL or PostgreSQL database from your host machine's
database client, you should connect to
127.0.0.1
on port 33060
(MySQL) or 54320
(PostgreSQL). The username
and password for both databases is
homestead
/ secret
.
Warning!
You should only use these non-standard ports when connecting to the databases from your host machine. You will use the default 3306 and 5432 ports in your Laravel application'sdatabase
configuration file since Laravel is running within the virtual machine.
Database Backups
Homestead can automatically backup your database when
your Homestead virtual machine is destroyed. To utilize
this feature, you must be using Vagrant 2.1.0 or
greater. Or, if you are using an older version of
Vagrant, you must install the
vagrant-triggers
plug-in. To enable
automatic database backups, add the following line to
your Homestead.yaml
file:
backup: true
Once configured, Homestead will export your databases to
.backup/mysql_backup
and
.backup/postgres_backup
directories when
the vagrant destroy
command is executed.
These directories can be found in the folder where you
installed Homestead or in the root of your project if
you are using the per project
installation method.
Configuring Cron Schedules
Laravel provides a convenient way to schedule cron jobs by
scheduling a single schedule:run
Artisan
command to run every minute. The
schedule:run
command will examine the job
schedule defined in your App\Console\Kernel
class to determine which scheduled tasks to run.
If you would like the schedule:run
command
to be run for a Homestead site, you may set the
schedule
option to true
when
defining the site:
sites:
- map: homestead.test
to: /home/vagrant/project1/public
schedule: true
The cron job for the site will be defined in the
/etc/cron.d
directory of the Homestead
virtual machine.
Configuring Mailpit
Mailpit
allows you to intercept your outgoing email and examine
it without actually sending the mail to its recipients.
To get started, update your application's
.env
file to use the following mail
settings:
MAIL_MAILER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
Once Mailpit has been configured, you may access the
Mailpit dashboard at
http://localhost:8025
.
Configuring Minio
Minio is an
open source object storage server with an Amazon S3
compatible API. To install Minio, update your
Homestead.yaml
file with the following
configuration option in the features
section:
minio: true
By default, Minio is available on port 9600. You may
access the Minio control panel by visiting
http://localhost:9600
. The default access
key is homestead
, while the default secret
key is secretkey
. When accessing Minio, you
should always use region us-east-1
.
In order to use Minio, you will need to adjust the S3
disk configuration in your application's
config/filesystems.php
configuration file.
You will need to add the
use_path_style_endpoint
option to the disk
configuration as well as change the url
key
to endpoint
:
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'endpoint' => env('AWS_URL'),
'use_path_style_endpoint' => true,
]
Finally, ensure your .env
file has the
following options:
AWS_ACCESS_KEY_ID=homestead
AWS_SECRET_ACCESS_KEY=secretkey
AWS_DEFAULT_REGION=us-east-1
AWS_URL=http://localhost:9600
To provision Minio powered "S3" buckets, add a
buckets
directive to your
Homestead.yaml
file. After defining your
buckets, you should execute the vagrant reload
--provision
command in your terminal:
buckets:
- name: your-bucket
policy: public
- name: your-private-bucket
policy: none
Supported policy
values include:
none
, download
,
upload
, and public
.
Laravel Dusk
In order to run Laravel Dusk
tests within Homestead, you should enable the webdriver
feature in your Homestead configuration:
features:
- webdriver: true
After enabling the webdriver
feature, you
should execute the vagrant reload
--provision
command in your terminal.
Sharing Your Environment
Sometimes you may wish to share what you're currently
working on with coworkers or a client. Vagrant has
built-in support for this via the vagrant
share
command; however, this will not work if
you have multiple sites configured in your
Homestead.yaml
file.
To solve this problem, Homestead includes its own
share
command. To get started, SSH into your Homestead
virtual machine via vagrant ssh
and
execute the share homestead.test
command.
This command will share the homestead.test
site from your Homestead.yaml
configuration
file. You may substitute any of your other configured
sites for homestead.test
:
share homestead.test
After running the command, you will see an Ngrok screen
appear which contains the activity log and the publicly
accessible URLs for the shared site. If you would like
to specify a custom region, subdomain, or other Ngrok
runtime option, you may add them to your
share
command:
share homestead.test -region=eu -subdomain=laravel
If you need to share content over HTTPS rather than HTTP,
using the sshare
command instead of
share
will enable you to do so.
Warning!
Remember, Vagrant is inherently insecure and you are exposing your virtual machine to the Internet when running theshare
command.
Debugging and Profiling
Debugging Web Requests With Xdebug
Homestead includes support for step debugging using Xdebug. For example, you can access a page in your browser and PHP will connect to your IDE to allow inspection and modification of the running code.
By default, Xdebug is already running and ready to accept
connections. If you need to enable Xdebug on the CLI,
execute the sudo phpenmod xdebug
command
within your Homestead virtual machine. Next, follow your
IDE's instructions to enable debugging. Finally,
configure your browser to trigger Xdebug with an
extension or bookmarklet.
Warning!
Xdebug causes PHP to run significantly slower. To disable Xdebug, runsudo phpdismod xdebug
within your Homestead virtual machine and restart the FPM service.
Autostarting Xdebug
When debugging functional tests that make requests to the
web server, it is easier to autostart debugging rather
than modifying tests to pass through a custom header or
cookie to trigger debugging. To force Xdebug to start
automatically, modify the
/etc/php/7.x/fpm/conf.d/20-xdebug.ini
file
inside your Homestead virtual machine and add the
following configuration:
; If Homestead.yaml contains a different subnet for the IP address, this address may be different...
xdebug.client_host = 192.168.10.1
xdebug.mode = debug
xdebug.start_with_request = yes
Debugging CLI Applications
To debug a PHP CLI application, use the xphp
shell alias inside your Homestead virtual machine:
xphp /path/to/script
Profiling Applications With Blackfire
Blackfire
is a service for profiling web requests and CLI
applications. It offers an interactive user interface
which displays profile data in call-graphs and
timelines. It is built for use in development, staging,
and production, with no overhead for end users. In
addition, Blackfire provides performance, quality, and
security checks on code and php.ini
configuration settings.
The Blackfire Player is an open-source Web Crawling, Web Testing, and Web Scraping application which can work jointly with Blackfire in order to script profiling scenarios.
To enable Blackfire, use the "features" setting in your Homestead configuration file:
features:
- blackfire:
server_id: "server_id"
server_token: "server_value"
client_id: "client_id"
client_token: "client_value"
Blackfire server credentials and client credentials require a Blackfire account. Blackfire offers various options to profile an application, including a CLI tool and browser extension. Please review the Blackfire documentation for more details.
Network Interfaces
The networks
property of the
Homestead.yaml
file configures network
interfaces for your Homestead virtual machine. You may
configure as many interfaces as necessary:
networks:
- type: "private_network"
ip: "192.168.10.20"
To enable a bridged
interface, configure a bridge
setting for
the network and change the network type to
public_network
:
networks:
- type: "public_network"
ip: "192.168.10.20"
bridge: "en1: Wi-Fi (AirPort)"
To enable DHCP,
just remove the ip
option from your
configuration:
networks:
- type: "public_network"
bridge: "en1: Wi-Fi (AirPort)"
To update what device the network is using, you may add a
dev
option to the network's configuration.
The default dev
value is
eth0
:
networks:
- type: "public_network"
ip: "192.168.10.20"
bridge: "en1: Wi-Fi (AirPort)"
dev: "enp2s0"
Extending Homestead
You may extend Homestead using the after.sh
script in the root of your Homestead directory. Within
this file, you may add any shell commands that are
necessary to properly configure and customize your
virtual machine.
When customizing Homestead, Ubuntu may ask you if you would like to keep a package's original configuration or overwrite it with a new configuration file. To avoid this, you should use the following command when installing packages in order to avoid overwriting any configuration previously written by Homestead:
sudo apt-get -y \
-o Dpkg::Options::="--force-confdef" \
-o Dpkg::Options::="--force-confold" \
install package-name
User Customizations
When using Homestead with your team, you may want to
tweak Homestead to better fit your personal development
style. To accomplish this, you may create a
user-customizations.sh
file in the root of
your Homestead directory (the same directory containing
your Homestead.yaml
file). Within this
file, you may make any customization you would like;
however, the user-customizations.sh
should
not be version controlled.
Provider Specific Settings
VirtualBox
natdnshostresolver
By default, Homestead configures the
natdnshostresolver
setting to
on
. This allows Homestead to use your host
operating system's DNS settings. If you would like to
override this behavior, add the following configuration
options to your Homestead.yaml
file:
provider: virtualbox
natdnshostresolver: 'off'