Vagrant + VirtualBox でLaravel5.8環境構築メモ

2019.8.14 [複数プロジェクトを作る手順](#おまけ１複数プロジェクトを作りたい)を追加し、ディレクトリ構成を複数プロジェクトで使えるように修正しました。

## Vagrantのインストール

[https://www.vagrantup.com/downloads.html](https://www.vagrantup.com/downloads.html)

## VirtualBoxのインストール

[https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads)

## VagrantのBoxを準備する

参考サイト

[https://qiita.com/Fendo181/items/a6b9017f6ef490995aba](https://qiita.com/Fendo181/items/a6b9017f6ef490995aba)

VirtualBoxとVagrantがインストールされた状態から、以下の手順で進める

## ホストOSディレクトリ構成の確認
ディレクトリはこんな感じを想定します。

```shell
    └──Homestead    # vmの起動はここから。任意のディレクトリに入れてもOK
    └──vm-test      # お好みで。ホーム直下にcodeディレクトリでもOK    
      └──code       # VM内と繋げるディレクトリ
        └──laravel  # プロジェクトのディレクトリ
```

## Homesteadのインストール
```shell
    # 後から使うので先に作っておきます
    $ mkdir vm-test
    $ cd vm-test
    $ mkdir code
    # ホームにもどってhomesteadをインストールしていきます
    $ cd  
    $ vagrant box add laravel/homestead
    $ git clone https://github.com/laravel/homestead.git Homestead
    $ cd Homestead
    $ bash init.sh
    Homestead initialized!
    # 上記のメッセージが出たらOK
```

## Homesteadとは

- [Laravel Homestead公式](https://laravel.com/docs/5.2/homesteadl)

> Laravel Homestead（入植農地、「ホームステード」）はパッケージを事前に済ませた、Laravel公式の"box"で、PHPやHHVM、Webサーバー、その他のサーバーソフトウェアをローカルマシンにインストールする必要なく、素晴らしい開発環境を準備できます。オペレーティングシステムでごちゃごちゃになる心配はもうありません！　Vagrantのboxは完全に使い捨てできます。何かの調子が悪くなれば壊して、数分のうちにそのboxを再生成できます！

Laravel Homesteadに含まれるソフトウェアは以下になります。

> Ubuntu 16.04
Git
PHP 7.1
Nginx
MySQL
MariaDB
Sqlite3
Postgres
Composer
Node (With Yarn, Bower, Grunt, and Gulp)
RedisMemcached
Beanstalkd
Mailhog
ngrok

Homesteadとは、Laravel公式による仮想環境(VM)用のパッケージ。PHP、Laravelによる開発のために必要なあれこれがひとまとめになっています。

## ssh鍵の作成
Homesteadの設定では、id_rsaがデフォルトで指定されるので、すでに鍵が存在する場合はこの項目を飛ばしてもOKです。
鍵が存在するかどうかは、下記コマンドで確認できます。

```shell
    $ cd ~/.ssh
    $ ls | grep "id_rsa"
      id_rsa
      id_rsa.pub
```
上記のように`id_rsa`と`id_rsa.pub`があればOKです。ない場合は下記の手順にしたがって`id_rsa_homestead`を設定して進むことができます。

ちなみにデフォルトの`id_rsa`の鍵を作成したい場合は、`id_rsa_homestead`の箇所を全て`id_rsa`に置き換えて読めば`id_rsa`で鍵が作れます。


```shell
    $ cd ~/.ssh
    # 鍵を作る id_rsa_homestead というファイル名にする
    $ ssh-keygen -t rsa -C メールアドレス -f id_rsa_homestead
    # password聞かれるので任意に。エンター押してスキップもOK
    # 鍵の確認
    $ ls | grep "id_rsa_homestead"
    id_rsa_homestead
    id_rsa_homestead.pub
    # 上記のようにファイルが検索できたらOK
```

## Homestead.ymlの設定（設定ファイル）

デフォルトは以下のような感じ。コメントアウトで説明を記入しています。

```Homestead.yaml

    # ipアドレスとメモリの割り当て、使用するプロバイダ
    -- ip: "192.168.10.10"
    memory: 2048
    cpus: 2
    provider: virtualbox
    
    # 公開鍵の参照場所
    authorize: ~/.ssh/id_rsa.pub
    
    # 秘密鍵の参照場所
    keys:
    - ~/.ssh/id_rsa
    
    folders:
    # ホスト側OSの参照ディレクトリ
    - map: ~/code
    # ゲスト側OSのディレクトリ
      to: /home/vagrant/code
    
    sites:
    # ブラウザアクセス時の開発用ドメインと参照先の設定
    - map: homestead.test
      to: /home/vagrant/code/public
   
    # 使用するDB名
    databases:
      - homestead
    
    features:
        - mariadb: false
        - ohmyzsh: false
        - webdriver: false
    
    # blackfire:
    # - id: foo
    # token: bar
    # client-id: foo
    # client-token: bar
    
    # ports:
    # - send: 50000
    # to: 5000
    # - send: 7777
    # to: 777
    # protocol: udp
```

これを書き換えていきます。Homestead直下のyamlファイルを下記コマンドで編集します。

```shell
    $ cd tests/vm-test/Homestead
    $ vi Homestead.yaml
```

以下、書き換える場所だけ抜粋。

```Homestead.yaml
    # 私の環境ではこのipアドレスをすでに使っていたので変更します
    - ip: "192.168.30.10"
    
    # 鍵の設定　今回は先ほど新たに作った鍵を使います
    authorize: ~/.ssh/id_rsa_homestead.pub
    keys:
    - ~/.ssh/id_rsa_homestead
    
    # 参照するディレクトリの指定
    folders:
    - map: ~/vm-test/code
      to: /home/vagrant/code
```
全て設定したあとは、こんな感じ。
[おまけ](#おまけ１複数プロジェクトを作りたい)の方に、複数プロジェクトを作る場合の設定例も記載しておきます。

```Homestead.yaml
    ip: "192.168.30.10"
    memory: 2048
    cpus: 2
    provider: virtualbox

    authorize: ~/.ssh/id_rsa_homestead.pub

    keys:
        - ~/.ssh/id_rsa_homestead

    folders:
        - map: ~/vm-test/code
          to: /home/vagrant/code

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

    databases:
        - homestead

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

    # ports:
    #     - send: 50000
    #       to: 5000
    #     - send: 7777
    #       to: 777
    #       protocol: udp
```
## hostsファイルの編集

開発用ドメインにローカルからアクセスできるように、Macのhostsファイルを編集します。

```shell
    $ sudo vi /etc/hosts
```

```text
    # ファイルを開いたら、先ほど設定ファイルで使ったipアドレスを追記する
    192.168.30.10 homestead.test
```

## Vagrantを起動してSSH接続


```shell
    # HomesteadディレクトリからVagrant起動
    $ cd ~/Homestead
    $ vagrant up
    $ vagrant ssh
```




`vagrant up`で起動できたらパスワードを聞かれるので、Mac本体のPWを入力します。

接続できたら、`/home/vagrant/`の中に`code`というディレクトリがあるか確認。（ここがホストOSと接続されるディレクトリになります）

```shell
    # vagrant@homesteadに接続した状態
    $  ls | grep "code"
                          code
```

上記のようにcodeが検索されたらOK!

## Laravelをインストールする

```shell

    # 5.8系のLaravelをインストールします
    # vagrant@homesteadに接続した状態 
    $  cd code
    # 今回はプロジェクト名＝laravelで進めます
    $  composer create-project laravel/laravel laravel --prefer-dist

    # インストールの確認。`code`の下に`laravel`ディレクトリが生成されている。
    $ ls
      laravel
```

インストールコマンドは`composer create-project laravel/laravel プロジェクト名 --prefer-dist`となっていますので、任意のプロジェクト名に適宜変更してください。

この時点でMac側の`vm-test/code` の中にも`laravel`ディレクトリができているはず。（画像は若干ディレクトリ構成異なってますが）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273745/6746bbf8-2961-2380-5d68-1fc2176ca0f0.png)


## Homesteadの再設定

このまま [http://homestead.test](http://homestead.test) にアクセスしてもいつものLaravelの画面は出てこないので、homestead.yamlを再設定する。

```shell

    # ssh接続を切断
    $ exit
    # Vagrantを停止
    $ vagrant halt
    
    # homestead.yamlを開く
    $ vi ~/tests/vm-test/Homestead/Homestead.yaml
```

開発用ドメインの参照先を下記のように訂正

```Homestead.yaml

    sites:
        - map: homestead.test
          to: /home/vagrant/code/laravel/public
```

Vagrantを再起動


```shell

    $ vagrant up
```

ここまでやって、[http://homestead.test](http://homestead.test) にアクセスすると、無事表示されるはずです。いつものLaravelの画面でた↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273745/01a57ac3-ba88-2789-46d1-843b05834664.png)

以上で環境構築完了です！！

## MySQLのrootパスワードを変更
こちらは必要に応じて設定してください。

```shell

    # vagrantを起動して接続
    $ cd ~/tests/vm-test/Homestead
    $ vagrant up
    $ vagrant ssh
    
    # mysqlにログイン（初期パスワードはsecret）
    $ cd code
    $ mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 5.7.26-0ubuntu0.18.04.1 (Ubuntu)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    # rootユーザーのパスワードを任意のものに変更する（今回はrootに設定）
    mysql> set password for root@localhost=password('root');
```

## おまけ１：複数プロジェクトを作りたい！
個人的に、もう一個プロジェクトを作りたくなったので設定ファイルの記述例を置いておきます。
色々やり方があるかと思いますが、一番シンプルに、接続するディレクトリは共有し、開発用ドメインの参照先を分けて作るやり方です。

Laravelのインストールは[laravelをインストールする](#Laravelをインストールする)と同じ手順で行ってください。

- Homestead.yamlを編集

今回はproject01というLaravelプロジェクトを新たに追加します

```Homestead.yaml
ip: "192.168.30.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa_homestead.pub

keys:
    - ~/.ssh/id_rsa_homestead

# 2つのプロジェクトで参照先を共有するので変更なし
folders:
    - map: ~/tests/code
      to: /home/vagrant/code

sites:
    - map: homestead.test
      to: /home/vagrant/code/laravel/public
    # 2つ目のプロジェクトの開発用ドメインと参照先を設定
    - map: project01.test
      to: /home/vagrant/code/project01/public

databases:
    - homestead
    # 2つ目のプロジェクトのDB名を設定
    - project01

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

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


```

## おまけ２：MySQLの接続設定を変更する
もしプロジェクト作成後にDBの設定を変更する場合は、.envを書き換えてからそれに合わせてmysqlの設定を再度行うこともできます。

例えば.envの中身をこういう設定にした場合。。。

```.env

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=project
    DB_USERNAME=user
    DB_PASSWORD=hogehoge
```

以下の手順で新たにdatabaseとuserを設定できます。

```shell

    # sshで接続後にrootユーザーでmysqlに再度ログイン
    $ cd プロジェクトのディレクトリ
    $ mesql -u root -p
    Enter password:    # 先ほど変更したPW(=root)でログイン
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    ・・・
    
    # projectという名前のDBを作成
    mysql> CREATE DATABASE project;
    Query OK, 1 row affected (0.01 sec)
    
    # ユーザー(=user)を作成してPW(=hogehoge)でログインできるようにする
    mysql> CREATE USER 'user'@'%' IDENTIFIED BY 'hogehoge';
    Query OK, 0 rows affected (0.00 sec)
    　　
    # 権限を制限する 作成したユーザーは、projectデータベース以外に権限を与えない
    mysql> GRANT ALL PRIVILEGES ON project.* TO 'user'@'%';
    Query OK, 0 rows affected (0.00 sec)
    
    # 変更を反映させる
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> exit;

```

一度ログアウトして作成したユーザー名で再度ログイン

```shell

    $ mysql -u user -p
    Enter password:    # 先ほど設定したPW(=hogehoge)でログイン
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    ・・・
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | project            |
    +--------------------+
    2 rows in set (0.00 sec)
    
    mysql> exit;
```

先ほどと違い、表示されるdatabaseが２つしかありませんが権限を一部しか与えていないので、これで大丈夫です。
ユーザーとデータベースの作成は上手くいったので、あとは`php artisan migrate`してちゃんと接続できているか確認します。（mysqlは一旦ログアウトして、ssh接続後の/code下でコマンド打ちます）

```shell

    vagrant@homestead:~/プロジェクトのディレクトリ$ php artisan migrate
    Migration table created successfully.
    Migrating: 2014_10_12_000000_create_users_table
    Migrated:  2014_10_12_000000_create_users_table (0.08 seconds)
    Migrating: 2014_10_12_100000_create_password_resets_table
    Migrated:  2014_10_12_100000_create_password_resets_table (0.1 seconds)
```

エラーが出ていないので大丈夫ですが、一応確認しておきます。

``` 

    $ mysql -u user -p
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    ・・・
    
    mysql> use project;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +-------------------+
    | Tables_in_project |
    +-------------------+
    | migrations        |
    | password_resets   |
    | users             |
    +-------------------+
    3 rows in set (0.00 sec)
    
    mysql>
```

無事にmigrateできているのでOK。あとは必要に応じてrollbackしておきます。

```shell

    vagrant@homestead:~/プロジェクトのディレクトリ$ php artisan migrate:rollback
    Rolling back: 2014_10_12_100000_create_password_resets_table
    Rolled back:  2014_10_12_100000_create_password_resets_table (0.22 seconds)
    Rolling back: 2014_10_12_000000_create_users_table
    Rolled back:  2014_10_12_000000_create_users_table (0.02 seconds)
    vagrant@homestead:~/プロジェクトのディレクトリ$
```

## おまけ３：ローカルの環境を整える(VSCode拡張機能)

以下、mac + Visual Sutudio Codeでローカル開発の際に使っている拡張機能をさらっと紹介。

### PHP以外でも使える有名どころの拡張機能

- [Bracket Pair Colorizer](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)
- [Bracket Pair Colorizer 2](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer-2)
[](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)カッコの対応を見やすくしてくれる
- [EvilInspector](https://marketplace.visualstudio.com/items?itemName=saikou9901.evilinspector)
全角スペースをハイライト
- [Trailing Spaces](https://marketplace.visualstudio.com/items?itemName=shardulm94.trailing-spaces)
行の後ろにあるスペースをハイライト表示
- [VSCode Icons](https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons)
ファイルのアイコンが見やすくなる

### VSCode上でGitをいい感じに使う

- [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
変更履歴がわかりやすい
- [Git Graph](https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph)
ブランチの管理が楽

### Laravel開発でいい感じに使える拡張機能を入れる

- [DotENV](https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv)
.envファイルの中身をシンタックスハイライト
- [PHP Debug](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug)
PHPのデバッガー
- [PHP IntelliSense](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-intellisense) PHPファイルの整形
- [PHP Intelephense](https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client)
 PHPファイルの整形



以上です。ツッコミあったら教えてください。。。

## 参考サイト

[https://nori-life.com/mac-laravel-homestead-vagrant/](https://nori-life.com/mac-laravel-homestead-vagrant/)

[Homebrew公式](https://laravel.com/docs/5.2/homesteadl)