laravel/homestead
Laravel Homestead is an official, pre-packaged Vagrant box that provides a complete local development environment for Laravel and PHP. It includes common tools and services, supports multiple projects, and runs consistently across macOS, Windows, and Linux.
Install Vagrant & VirtualBox Ensure Vagrant and VirtualBox are installed. Verify via CLI:
vagrant --version
VBoxManage --version
Clone Homestead
git clone https://github.com/laravel/homestead.git Homestead
cd Homestead
Install Homestead Box
Run the installer (creates Homestead.json and after.sh):
bash init.sh
Configure Homestead.json
Edit the file to define sites, folders, and services (e.g., databases, queues). Example:
{
"sites": [
{
"map": "myapp.test",
"to": "/home/vagrant/code/myapp/public"
}
],
"folders": [
{
"map": "~/code/myapp",
"to": "/home/vagrant/code/myapp"
}
]
}
Start the VM
vagrant up
vagrant ssh
First Use Case: Local Development
folders mapping.http://myapp.test (add to /etc/hosts if needed).php artisan migrate
Project Bootstrapping
vagrant directory to your project repo with a custom Homestead.json:
myproject/
├── vagrant/
│ ├── Homestead.json
│ └── after.sh
└── ...
vagrant up --provision to initialize the VM with project-specific configs.Environment Synchronization
Homestead.json to match production:
"databases": [
{ "name": "homestead", "driver": "mysql" }
],
"variables": [
{ "key": "APP_ENV", "value": "local" }
]
after.sh to run custom setup scripts:
php artisan db:seed --class=UsersTableSeeder
CI/CD Previews
- name: Test in Homestead
run: |
vagrant up --provision
vagrant ssh -c "php artisan test"
Multi-Project Management
vagrant up project1
vagrant up project2
Homestead.json files per project and switch contexts with vagrant global-status.Database Management
after.sh to wipe and recreate databases:
mysql -e "DROP DATABASE homestead; CREATE DATABASE homestead;"
php artisan migrate:fresh --seed
mysqldump inside the VM for local backups:
vagrant ssh -c "mysqldump -u homestead -p homestead > backup.sql"
Queue Workers
vagrant ssh -c "php artisan queue:work --daemon"
tmux or screen to manage long-running processes.Hosts File Configuration
myapp.test fails to resolve.192.168.10.10 myapp.test to /etc/hosts (Linux/macOS) or C:\Windows\System32\drivers\etc\hosts (Windows).after.sh):
echo "192.168.10.10 $(grep 'map.*test' Homestead.json | awk '{print $2}' | sed 's/"//g')" | sudo tee -a /etc/hosts
Folder Permissions
config.vm.synced_folder "~/code/myapp", "/home/vagrant/code/myapp", type: "rsync", rsync__args: ["--verbose", "--archive", "--delete", "-z"]
sudo chown -R vagrant:vagrant /home/vagrant/code/myapp
Port Conflicts
Homestead.json:
"ports": [
{ "send": 8000, "to": 80 },
{ "send": 44300, "to": 443 }
]
http://myapp.test:8000.PHP/Composer Updates
after.sh:
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php8.2
Homestead.json:
"php": "8.2"
Slow Performance
Vagrantfile:
config.vm.provider "virtualbox" do |vb|
vb.customize ["setextradata", :id, "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct", "Homestead"]
vb.memory = "4096"
vb.cpus = 2
end
Database Connection Errors
database.php bindings:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '192.168.10.10'),
],
mysql -u homestead -p -h 192.168.10.10
SSH Debugging
vagrant ssh -c "tail -f /var/log/nginx/error.log"
Network Issues
vagrant ssh -c "ip addr show eth1"
vagrant ssh -c "netstat -tulnp | grep 80"
Custom Scripts
after.sh for one-time setup:
#!/usr/bin/env bash
composer install --prefer-dist --no-interaction
php artisan key:generate
Custom Provisioning
after.sh to install additional tools (e.g., Node.js, Docker):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
nvm install --lts
Docker Integration
sudo apt-get install docker.io
sudo service docker start
docker run -d --name redis redis
Laravel Valet Alternative
"nginx": {
"server": {
"root": "/home/vagrant/code/myapp/public",
"index": "index.php",
"server_name": "myapp.test"
}
}
Multi-Tenancy
vagrant up tenant1
vagrant up
How can I help you explore Laravel packages today?