LaradockでLaravel-adminを立ち上げるまで 2018年12月版

# はじめに

個人的にはPHPのWebアプリケーションFrameworkの中では[CakePHP](https://cakephp.org/) が一番得意なんだけど最近若いヤングに大人気らしい [Laravel](https://laravel.com/) も使えるようになっておいたほうがよさそうな気がしたので使ってみることにした。

で、実用的なScafforldっぽいものの構築はどういうふうにするのかしらといろいろ調べてみてこれが良さそうだなと思ったのが [Laradock](https://laradock.io/) で [Laravel-admin](https://github.com/z-song/laravel-admin) 。Laravel 5.7から [Laravel Nova](https://nova.laravel.com/) という管理パッケージが公式になったが有料なので Laravel-admin にしといた。

# Laradockを設定してコンテナを起動する

```bash
$ git clone https://github.com/Laradock/laradock.git
$ cd laradock
```

`env-example`をコピーして`.env`としてテキストエディタで開く

```bash
$ cp env-example .env
$ vi .env
```

`DATA_PATH_HOST`はmysqlなどのストレージのデータファイルの格納場所を示す。
デフォルトは `~/.laradock/data` となっているが今回はあとで削除することを想定してLaradockのレポジトリ下に変更しておく

```conf:.env
# Choose storage path on your machine. For all storage systems
# DATA_PATH_HOST=~/.laradock/data
DATA_PATH_HOST=[YOUR WORKNG DIRECTORY]/laradock/.laradock/data
```

`.env` 内の `MYSQL_VERSION`を`5.7とする。latestだと現状MySQL8が入るがPDOをはじめいろいろなものが8に追従できてない現状なので、無難に5.7を使うことにする

```conf:.env
# MYSQL_VERSION=latest
MYSQL_VERSION=5.7
```

さらに `.env` の末尾に以下の記述を追加して保存する

```conf:.env
DB_CONNECTION=mysql
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```

# コンテナを起動する

```bash
$ docker-compose up -d nginx mysql phpmyadmin redis beanstalkd
```

各コンテナが正常に起動した

```bash
...
Creating laradock_redis_1            ... done
Creating laradock_mysql_1            ... done
Creating laradock_docker-in-docker_1 ... done
Creating laradock_workspace_1        ... done
Creating laradock_phpmyadmin_1       ... done
Creating laradock_php-fpm_1          ... done
Creating laradock_beanstalkd_1       ... done
Creating laradock_nginx_1            ... done
```

この時点で [http://localhost](http://localhost) にアクセスすると 404 Not Foundとなる。まだLaravelをセットアップしていないため

![スクリーンショット 2018-12-29 23.29.06.png](https://qiita-image-store.s3.amazonaws.com/0/61995/5c4712bc-4283-6ef0-e610-8364d77b2dd7.png)

[http://localhost:8080](http://localhost:8080) にアクセスすると phpmyadmin が起動している。サーバ`mysql` 、ユーザ名 `root`、 パスワード `root`でログインできる

![スクリーンショット 2018-12-29 23.30.46.png](https://qiita-image-store.s3.amazonaws.com/0/61995/55543f49-4cba-1bff-479b-ad3d4be93831.png)


ログインすると `default` というスキーマが作成されている。これがLaravelが使うDBとなる

![スクリーンショット 2018-12-29 23.32.33.png](https://qiita-image-store.s3.amazonaws.com/0/61995/4500fe74-3686-519c-8949-d3085e8d3690.png)

ちなみにmysqlを直接コマンド操作したい場合はmysqlコンテナにログオンして操作すればよい

```bash
$ docker exec -it laradock_mysql_1 bash
$ mysql -u root -p
Password: root
```

# Laravelをセットアップする

Laravelのワークスペースとなるコンテナに、ユーザ`laradock`でログオンする。

```bash
$ docker exec -u laradock -it laradock_workspace_1 bash
```

ログオンディレクトリは `/var/www` でWebサーバのドキュメントルートになっている。ここにLaravelのプロジェクトを作成する。今回はプロジェクトを `MyProject` とする

```bash
$ composer create-project laravel/laravel MyProject
```

プロジェクトが作成できたことを確認する

```bash
$ cd MyProject
$ ls
app        composer.json  database      public     routes      tests
artisan    composer.lock  package.json  readme.md  server.php  vendor
bootstrap  config         phpunit.xml   resources  storage     webpack.mix.js
```

ストレージとキャッシュのディレクトリを書き込み可能にする

```bash
$ chmod 766 storage
$ chmod 766 bootstrap/cache
```

いったんコンテナからログオフする

```bash
$ exit
```

コンテナを停止させる

```bash
$ docker-compose stop
```

`.env`を開く

```bash
$ vi .env
```

`APP_CODE_PATH_HOST`を `../MyProject` としてドキュメントルートが MyProjectを指すようにする

```conf:.env
# Point to the path of your applications code on your host
# APP_CODE_PATH_HOST=../
APP_CODE_PATH_HOST=../MyProject
```

コンテナを起動する

```bash
$ docker-compose up -d nginx mysql phpmyadmin redis beanstalkd
```

[http://localhost](http://localhost)にアクセスするとLaravelの初期画面が表示される

![スクリーンショット 2018-12-30 0.00.47.png](https://qiita-image-store.s3.amazonaws.com/0/61995/0dcbdb6c-ac03-7b5f-bcdc-c49164121873.png)


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

[公式](https://laravel-admin.org/docs/#/en/installation) を参考にしながらやってみる

ワークスペースのコンテナにログオンする

```bash
$ docker exec -u laradock -it laradock_workspace_1 bash
```

以下を実行する

```bash
$ composer require encore/laravel-admin
$ artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
```

プロジェクト内の `.env` を開く

```bash
$ vi .env
```

`DB_HOST=mysql` 、`DB_DATABASE=default`、`DB_USERNAME=root`、`DB_PASSWORD=root`にそれぞれ変更する

```conf:.env
DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
DB_HOST=mysql
DB_PORT=3306
# DB_DATABASE=homestead
DB_DATABASE=default
# DB_USERNAME=homestead
DB_USERNAME=root
DB_PASSWORD=root
```

インストールを実行する

```bash
$ artisan admin:install
```

`config/filesystems.php` を開く

```bash
$ vi config/filesystems.php
```

`disks`配列に下記の`admin`の設定を追加する。Adminダッシュボードでアップロードした画像等をパブリックアクセスできるようにするため。
https://github.com/z-song/laravel-admin/issues/1327#issuecomment-336821532

```php:filesystems.php
    'disks' => [

        ...

	'admin' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],


    ],
```

`storage`へのシンボリックリンクを作成する

```bash
$ artisan storage:link
```

[http://localhost/admin/](http://localhost/admin/) にアクセスすると管理画面へのログイン画面となる。
Username: `admin`、Password: `admin` でログインする

![スクリーンショット 2018-12-30 14.37.44.png](https://qiita-image-store.s3.amazonaws.com/0/61995/74f1f606-7b4a-7676-d4c7-a463c12d27c8.png)


ダッシュボードが表示される

![スクリーンショット 2018-12-30 14.39.36.png](https://qiita-image-store.s3.amazonaws.com/0/61995/4edbdb36-d39c-bf6e-e06b-68ba5cfba4ca.png)

# 感想

どちらもドキュメントみるかぎりでは簡単にできそうだったんだけど、意外とハマりどころが多かったので手順を記載しておいた。特にMySQL周りは最初latestでやっていていろんなエラーに悩まされた。まあ各コンテナの更新状況によっていろいろ動かないことが出てくるのはあるあるだし、Laravelも開発が活発なのでこのセットアップログもいつまで保つかわからない。なので2018年12月版としておいた。