Search code examples
phplaravelvagrantphpstormhomestead

Configure Homestead for Laravel


I am trying to configure a Homestead environment for a Laravel server, but I can't get it to work. I followed the documentation to install and configure Homestead and Vagrant. This is my Homestead.yaml

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

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: C:\\Users\\meadi\\PhpstormProjects
      to: /home/vagrant/code

sites:
    - map: blog.test
      to: /home/vagrant/code/blog/public

databases:
    - homestead

features:
    - mariadb: false
    - ohmyzsh: false
    - webdriver: false

Where PhpstormProjects is the folder with all my php projects, and blog is the folder of the project that I am trying to make the set up for. Running vagrant up in the project root resulted in this Vagrantfile (used the Vagrant tool in PhpStorm so I assume this is a template provided by PhpStorm):

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "laravel/homestead"

  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
  # `vagrant box outdated`. This is not recommended.
  # config.vm.box_check_update = false

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine and only allow access
  # via 127.0.0.1 to disable public access
  # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  # config.vm.network "public_network"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Enable provisioning with a shell script. Additional provisioners such as
  # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end

I see that most of the file is commented out, but I don't know if I should enable any of this configurations. After running vagrant provision I expected to be able to connect to the server in a browser. I set up hosts mapping from 192.168.10.10 to blog.test, and I also tried connecting straight to 192.168.10.10 and localhost:8000, but with no success, Chrome telling me the site can't be reached.

Browsing the remote in PhpStorm shows me this folder structure: Vagrant brows remote

I see that there is no '/home/vagrant/code' directory, even though that is the mapping in Homestead.yaml, and when running vagrant up I get this printed in the console:

==> default: Mounting shared folders...
    default: /vagrant => C:/Users/meadi/PhpstormProjects/blog

I assume that I misconfigured something that resulted in the code folder not being mounted in the VM thus resulting in no public folder to be served. Can anyone help me out? I followed multiple tutorials and I can't seem to find out what I missed. Thanks in advance!

Also, here is my Remote configuration in PhpStorm. I assume that if I misconfigured that, the folder structure I see in the Remote won't be accurate.

PhpStorm remote PhpStorm remote


Solution

  • The problem may hide in this part of your Homestead.yaml:

    folders:
    - map: C:\\Users\\meadi\\PhpstormProjects
      to: /home/vagrant/code
    

    At first, you don't have to use double backslashes in your path, you're enough to write like this:

    C:\Users\meadi\PhpstormProjects
    

    Second, your project folder is mapped to /home/vagrant/code, but you want to set your project in "blog" folder, so you need to change your mapping like this:

    /home/vagrant/code/blog
    

    Also, you should put your concrete blog project in "blog" directory on your host machine:

    C:\Users\meadi\PhpstormProjects\blog
    

    And define this path in your Homestead.yaml

    The final variant is:

    folders:
    - map: C:\Users\meadi\PhpstormProjects\blog
      to: /home/vagrant/code/blog
    

    If you want to create another project (e.g., shop), you must add another mapping:

    folders:
    - map: C:\Users\meadi\PhpstormProjects\blog
      to: /home/vagrant/code/blog
    - map: C:\Users\meadi\PhpstormProjects\shop
      to: /home/vagrant/code/shop
    

    EDIT

    Check, if you have followed all these installation steps:

    1. After installation vagrant and virtualbox, run vagrant box add laravel/homestead from any location in your cmd
    2. Go to empty folder for your projects and run git clone https://github.com/laravel/homestead.git Homestead
    3. After cloning this package, run init.bat script inside it
    4. It will generate Homestead.yaml that you need to edit
    5. vagrant up from the folder where your Homestead.yaml locates