IBM CloudにLaravelをデプロイする方法

# IBM Cloudの良さ
Bluemixが[IBM Cloud](https://www.ibm.com/cloud-computing/jp/ja/)として生まれ変わったそうです。
さらに、クレジットカード不要で様々な機能を試すことのできる[ライトアカウント](https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/)というものも誕生しました。

これによって、「分からずに使ったら、課金されるかも…」という不安からも解消されてより手軽に試せるようになったのではないでしょうか。
無料による制限付きといえども、IBM Cloudの様々な機能が使えるのも魅力ですね:bangbang:

# 本題
ここからが本題です。
IBM Cloudを使ってlaraveのサンプルモジュールをデプロイする手順を書いていきます。内容は[公式のブログ](https://www.ibm.com/blogs/bluemix/2014/06/getting-started-laravel-bluemix/)を参考にしています。

## 前提
+ IBM CloudのユーザーIDを持っていて、下記の様なダッシュボードが表示出来ている事。![dashuboad.png](https://qiita-image-store.s3.amazonaws.com/0/154110/bf56b80c-c646-ed79-aac0-5a9f174f33a7.png)
+ IBM Cloud CLIがインストールされている事。(インストーラは[こちら](https://console.bluemix.net/docs/cli/reference/bluemix_cli/get_started.html#getting-started)
+ composer等の環境などは既にあり、laravelの初期構築は問題なく出来る事。

## IBM Cloud上でPHPが稼働する環境を構築する。
カタログより`PHP`と検索すると、Cloud Foundry アプリとしてPHPを選択できます。
![phpcatlog.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/0ca030ac-290c-fb19-06d5-fd85cc8fb7d6.png)

必要な情報を入力して「作成」しましょう。
![uploading-0]()![app.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/43905d60-0909-2aae-0735-dd4ba76d1539.png)

下記の画面に遷移すれば成功です。
![uploading-0]()![app2.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/093b197f-504a-acbf-0ebc-a5481c62d296.png)

## laravel側の準備
laravelプロジェクトであればなんでも良いのですが、今回は新しく`demoForBlueMix`というサンプルを作りました。
コマンドはおなじみですが、
```
laravel new demoForBlueMix
```
ですね。念の為にローカル環境で問題なく画面が表示されるかどうか確認しておきましょう。
`php artisan key:generate`もお忘れなく！
![app3.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/33a87724-1413-4f0b-7503-6a44f2ff571d.png)

## デプロイの準備
次にBluemix用にローカル側のディレクトリ構成を変更していきます。
まずは、デプロイ用のフォルダを作りましょう。(ここでは`deploy`とします。)

### manifest.ymlの作成
この`deploy`フォルダの配下に`manifest.yml`というファイルを作成して下さい。
これはIBM Cloud上にデプロイを行う為に必要な情報を定義しているものです。
下記がサンプルとなります。

```yaml
applications:
- path: .
  name: testLaravel
  memory: 128M
  domain: mybluemix.net
  buildpack: https://github.com/cloudfoundry/php-buildpack
env:
    APP_DEBUG: false
    CF_STAGING_TIMEOUT: 15
    CF_STARTUP_TIMEOUT: 15
```
nameには、先ほど作成したIBM Cloudのアプリ名を入れましょう。memoryは、デプロイ後に起動したときに割り当てるメモリです。
ちなみに、ライトアカウントでは上限が256MBとなっています。
domainについても、IBM Cloud上での環境作成時のdomainと合致させましょう。
:exclamation:buildpackはこのままコピーして大丈夫ですが、指定しないとlaravelは動きません。
オプションの詳細な内容を知りたい場合は、[こちら](http://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html)を参照してみてください。

### laravelディレクトリからのファイル移動
次に下記のファイルをlaravelのディレクトリから`deploy`ディレクトリ直下に移動して下さい。

+ .gitignore
+ composer.json
+ composer.lock

### .cfignoreの作成
`deploy`フォルダ配下に`.cfignore`という名前のファイルを作成して下さい。
記述内容例は下記の通りです。

```
composer.lock
vendor
node_modules
htdocs/vendor/
htdocs/bootstrap/cache
```
名前から推測できる通り、これはデプロイ時にアップロードしないフォルダやファイルを指定しています。

### htdocsフォルダの作成とlaravelプロジェクトの移動
`deploy`フォルダ配下に`htdocs`という名前のフォルダを作成して下さい。
このフォルダの配下にlaravelプロジェクトを移動させて下さい。

### composer.jsonの更新
上記の作業でプロジェクトディレクトリが`htdocs`配下に移動となったので、それに伴って`composer.json`のディレクトリ指定も変更しましょう。(autoload等の指定時に、htdocsが付与されている事が確認できると思います。)
サンプル

```json
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=7.0.1",
        "laravel/framework": "5.5.*",
        "fideloper/proxy": "~3.3",
        "laravel/tinker": "~1.0",
        "ext-mysqli": "*"
    },
    "require-dev": {
        "fzaninotto/faker": "~1.4",
        "mockery/mockery": "0.9.*",
        "phpunit/phpunit": "~5.0",
        "symfony/css-selector": "3.1.*",
        "symfony/dom-crawler": "3.1.*"
    },
    "autoload": {
        "classmap": [
            "htdocs/database"
        ],
        "psr-4": {
            "App\\": "htdocs/app/"
        }
    },
    "autoload-dev": {
        "classmap": [
            "tests/TestCase.php"
        ]
    },
    "scripts": {
        "post-root-package-install": [
            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php htdocs/artisan key:generate"
        ],
        "post-install-cmd": [
            "mkdir -p /tmp/app/htdocs/bootstrap/cache",
            "mkdir -p /tmp/app/htdocs/storage/framework/sessions",
            "mkdir -p /tmp/app/htdocs/storage/framework/views",
            "mkdir -p /tmp/app/htdocs/storage/framework/cache",
            "Illuminate\\Foundation\\ComposerScripts::postInstall",
            "php htdocs/artisan key:generate"
        ],
        "post-update-cmd": [
            "mkdir -p /tmp/app/htdocs/bootstrap/cache",
            "mkdir -p /tmp/app/htdocs/storage/framework/sessions",
            "mkdir -p /tmp/app/htdocs/storage/framework/views",
            "mkdir -p /tmp/app/htdocs/storage/framework/cache",
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "cp /tmp/app/htdocs/.env.example /tmp/app/htdocs/.env",
            "php htdocs/artisan key:generate"
        ]
    },
    "config": {
        "preferred-install": "dist"
    }
}
```

### .bp-configディレクトリの作成
`deploy`フォルダの配下に`.bp-config`という名前のフォルダを作成して下さい。さらにこのディレクトリの下に`options.json`というファイルを作成して下さい。この指定は、php拡張(MySQLを使用する場合など)に必要となる指定です。他にも、PHPのバージョンや`vendor`フォルダの場所の指定などがありますが、見たままですね。:sweat_smile:
サンプル

```json
{
    "PHP_VERSION": "{PHP_70_LATEST}",
    "COMPOSER_VENDOR_DIR": "htdocs/vendor",
    "WEBDIR": "htdocs/public",
    "PHP_EXTENSIONS": ["bz2", "pdo", "zlib", "curl", "mcrypt", "mbstring", "mysqli", "gd", "zip", "pdo_mysql", "pdo_sqlite" ]
}
```

結果としてディレクトリ構成は下記の様になると思います。
`deploy`配下
![app4.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/343ea937-db98-3d61-5de1-e2808948cee1.png)

`htdocs`配下
![app5.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/8543a1ca-b8b5-cb15-6982-ff4b2a536453.png)

ここまでで、ローカル側の設定は完了です。

## IBM Cloudにデプロイしてみる。
デプロイの方法については、ダッシュボード→上記の手順で作成したIBM Cloudのアプリ→開始で表示される画面の手順そのままです。
簡単に転記しておきます。
### コードが置かれているディレクトリーに移動します。

```
cd your_new_directory
```

### IBM Cloud に接続し、ログインします。

```
bluemix login -u userID -o org_name -s space_name
```

### bluemix app push コマンドを使用して、your_new_directory からアプリを IBM Cloud に再デプロイします。 

```
bluemix app push testLaravel
```

これにより、無事にデプロイが完了したかと思います。ワークスペース上の「アプリ URL にアクセス」よりアクセスしてみてください。
laravelの初期画面が表示されればOKです。

今回のQiitaでの説明で作成したソースは、[github](https://github.com/motuo1201/demoLaravelIbmCloud)に上げてあります。
こちらも併せて参照してみてください。