IBM Cloud で始める Laravelアプリケーション開発


## $ whoami
境川　章一郎
（さかいがわ　しょういちろう）

twitter: [l_s_s_l](http://twitter.com/l_s_s_l)
Qiita: @ssakaigawa 

時々インフラ屋。時々開発。

---
## おしごと
Pumpkin Heads株式会社

## コミュニティ活動
- Blumix User Group (ibmcloudユーザー会)
- 2018 IBM Cloud Champion
  
(MS MVPとか、AWS Blackbeltのような制度のIBM版です）

---
## 著書

Docker+Kubernetesの本
コンテナ・オーケストレーション（黄色いコンテナ本）の７章でIBM Cloud Kubernetes Serviceの章を担当しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/126158/e290e35e-2e36-63dc-0ea4-edf384c3e92c.png" width="100">

---
## Laravel と私
* 時々開発で利用します。
* （ほしいと思ったら自分で作ってみるタイプ

Call for Code　ハッカソン参加中
自然災害へ技術で立ち向かおう

Laravelでアプ鋭意開発中

----
## IBM Cloud PaaS on PHP
IBM Cloudで動くPaaS環境でPHPが動きます。
Cloud Foundryベース。

DevOps ToolChainと組み合わせることでCI/CDが可能

---
## なぜ、PaaSなの？
- PHP環境のメンテナンス、いつまで続けますか？
VPSなどのインスタンスを複数毎回インストール・アップデートをおこなっていた。

---
##PaaS運用後
- 高負荷サービスなどで、サーバーを増やしたいときにすばやくリソースが投入できる
- PHPなどのミドルウェアの導入コストがほぼゼロ
- OSの運用保守も不要
- CI/CD環境を設計・運用せずに既製の環境が利用可能

---
# 今日やること
LaravelアプリをIBM Cloud PaaSで動かしたい。

- [ ] laravelプロジェクトの作成
- [ ] IBM Cloud用に設定を修正
- [ ] IBM Cloudの設定
- [ ] デプロイ


---
## 必要なもの

* ローカルでLaravelアプリが開発できる環境

-> laradockはじめました。

* IBM Cloud ライトアカウント(無料)

((MySQLなどDBはPay-As-You-Goアカウントが必要))

---
### [TIPS] Pay-As-You-Goアカウント
- クレジットカード登録が必要だが、無料枠の利用できるプラン。
- アプリを１ヶ月試す程度の枠は無料でついてくる。


---
### laradockの準備

```bash
mkdir laravel-test0908 && cd laravel-test0908
git clone https://github.com/laradock/laradock.git
cd laradock
cp env-example .env
```
---
### laradockを使ってworkspaceを作成

dockerイメージの取得(初回)と起動

```bash
docker-compose up -d nginx mysql workspace phpmyadmin
```

workspace(Laravel実行環境のCLI部分のイメージ)の実行

```bash
docker-compose exec workspace bash
```

---
### Laravelのインストール

(workspace)内で実施。

```bash
w$ composer create-project laravel/laravel {PJ名}
```

`w$`は便宜上workspaceコンテナでの作業を示します。作業完了後、exitで抜ける。

```bash
w$ exit
```

---
### laradock　.envの修正
laradockを必ず停止

```bash
docker-compose stop
```

```:laradock/.env
APPLICATION=../
```
```:laradock/.env(編集後)
APPLICATION=../{PJ名}
```
---
### laradock動作確認
```bash
docker-compose up -d nginx mysql phpmyadmin
```

http://localhost:8080
へアクセスしておなじみの画面が出ることを確認する

---
#IBM Cloud PaaSへのデプロイ

- [x] laravelプロジェクトの作成
- [ ] IBM Cloud用に設定を修正
- [ ] IBM Cloudの設定
- [ ] デプロイ

---
##必要なファイル

|path|filename|description|
|:--|:--|:--|
|PJ/|manifest.yml|CFアプリのデプロイ設定|
|PJ/|.cfignore|.gitignoreと同じ|
|PJ/.bp-config/|options.json|PHP導入パラメータ|

---
###デプロイ時に変更したほうが良いもの
|path|filename|description|
|:--|:--|:--|
|PJ/|composer.json|post-instまわり|
|PJ/config|database.php|DBまわり|

---
##実際のファイル
---
### manifest.yml
IBM Cloud PaaSのデプロイに必要な情報、domainとnameはセットアップ時のアプリURLをベースに都度変更しておく

```YAML
applications:
- path: .
  name: laravel-test123
  memory: 128M
  domain: mybluemix.net
  buildpack: https://github.com/cloudfoundry/php-buildpack
env:
    APP_DEBUG: false
    CF_STAGING_TIMEOUT: 30
    CF_STARTUP_TIMEOUT: 30
```

---
###.cfignore
.gitignoreと同じ内容を入れる。
IBM Cloud側でcomposer installが自動で行われるので、vendor含め他は不要。

```
composer.lock
vendor
node_modules
public/hot
public/storage
storage/*.key
.idea
.vscode
.vagrant
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.env
```

---
### composer.json
説明は後ほど。

```JSON:composer.json
"post-install-cmd": [
    "mkdir -p /tmp/app/bootstrap/cache",
    "mkdir -p /tmp/app/storage/framework/sessions",
    "mkdir -p /tmp/app/storage/framework/views",
    "mkdir -p /tmp/app/storage/framework/cache",
    "Illuminate\\Foundation\\ComposerScripts::postInstall",
    "@php artisan key:generate",
    "@php artisan migrate"
],
```
---

```JSON:composer.json
"post-update-cmd": [
    "mkdir -p /tmp/app/bootstrap/cache",
    "mkdir -p /tmp/app/storage/framework/sessions",
    "mkdir -p /tmp/app/storage/framework/views",
    "mkdir -p /tmp/app/storage/framework/cache",
    "Illuminate\\Foundation\\ComposerScripts::postUpdate",
    "@php artisan key:generate",
    "@php artisan migrate"
],
```

---
#IBM Cloud PaaSへのデプロイ

- [x] laravelプロジェクトの作成
- [x] IBM Cloud用に設定を修正
- [ ] IBM Cloudの設定
- [ ] デプロイ

---

#IBM Cloud PaaS PHP + Laravelでこんな事に困った・こうして解決したを紹介します。

---

## あるある その1
デプロイ後、HTTP500 エラーでアクセスできない

```
AH01071: Got error 'PHP message: PHP Fatal error: Uncaught InvalidArgumentException: Please provide a valid cache path.
```
-> cacheなどのフォルダが作成されていない
composer.jsonを書き換えてpost-install-cmd / post-update-cmdなどで対応する

---
### 解決編
```JSON:composer.json
"post-install-cmd": [
    "mkdir -p /tmp/app/bootstrap/cache",
    "mkdir -p /tmp/app/storage/framework/sessions",
    "mkdir -p /tmp/app/storage/framework/views",
    "mkdir -p /tmp/app/storage/framework/cache",
    "Illuminate\\Foundation\\ComposerScripts::postInstall",
    "@php artisan key:generate",
    "@php artisan migrate"
],
```

---

```JSON:composer.json
"post-update-cmd": [
    "mkdir -p /tmp/app/bootstrap/cache",
    "mkdir -p /tmp/app/storage/framework/sessions",
    "mkdir -p /tmp/app/storage/framework/views",
    "mkdir -p /tmp/app/storage/framework/cache",
    "Illuminate\\Foundation\\ComposerScripts::postUpdate",
    "@php artisan key:generate",
    "@php artisan migrate"
],
```

---
##あるある その２
DB認証情報を書き込まず渡したいけど・・・

VCAP_SERVICES内にjson形式で他サービスへの接続情報が入っている。
MySQLサービスをはじめとした、Compose for〜で始まるDBサービスの接続情報はURI形式で提供される。

```
["uri"]=>
string(80) "mysql://{user}:{pass}@{hostname}:{port}/compose"
```

---
### 解決編
環境変数からjsonデコードして配列として取得、
envではなく毎回情報を取得

```PHP:config/database.php
$services = json_decode($_ENV['VCAP_SERVICES'], true);

$uri = $services['compose-for-mysql'][0]['credentials']['uri'];

$db_creds = parse_url($uri);
```

---

```PHP:config/database.php
'connections' => [
〜(略)〜
'mysql' => [
            'driver' => 'mysql',
            'host' => $db_creds['host'],
            'port' => $db_creds['port'],
            'database' => 'compose',
            'username' => $db_creds['user'],
            'password' => $db_creds['pass'],
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
〜(略)〜
```

---
#IBM Cloud PaaSへのデプロイ

- [x] laravelプロジェクトの作成
- [x] IBM Cloud用に設定を修正
- [ ] IBM Cloudの設定
- [ ] デプロイ

---
#IBM Cloudの設定

---
## PaaSのセットアップ
- IBM Cloudコンソールへログイン
- Catalog
<img width="108" alt="スクリーンショット 2018-09-08 10.52.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/774a0bff-3df5-183d-fd9a-b0c251213b42.png">

- PHPを選択
<img width="300" alt="スクリーンショット 2018-09-08 10.53.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/372c4646-8b30-703a-9b44-93bb45419eda.png">

---
### PaaSのデプロイ
App Name: アプリ名
Host Name: ホスト名
Domain: mybluemix.net (※デフォルト、他独自ドメインも設定可能)
Plan: 128G
<img width="1017" alt="スクリーンショット 2018-09-08 10.54.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/2fd47096-61a9-3a69-8dd5-ccc0b901a400.png" width=500>

---
### DB(Compose for MySQL)のデプロイ
ライトプラン上ではカタログ表示がなかった
-> Pay-As-You-Goアカウント以上で利用可能
DB容量 1GBバイトの無料枠が付属し、1GB以上単位でスケールし料金が発生します。

---
### DB(Compose for MySQL)のデプロイ

デフォルトのままで可能。
データーベースのバージョンが現在5.7.20と5.7.22から選べる

<img width="988" alt="スクリーンショット 2018-09-08 12.07.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/1c2e249e-a2f1-cf5f-a0c4-2bdaf20df0ae.png">

---
### DBとPaaS(PHP)との接続

PaaSダッシュボードから、`connect`をクリックし、
Compose for MySQLを選択し、`connect`

service-bindという機能でIBM CloudのさまざまなサービスをPaaSから利用する事ができるように接続が可能となる。

※日本語UIの場合は`接続`となります。

---
## ibmcloudへのログイン
ibmcloudコマンドでデプロイを実施

```bash
ibmcloud login
```

CloudFoundryのアプリ配置先情報の読み込み

```bash
ibmcloud target --cf
```

---
## ibmcloudへのデプロイ

```bash
cd ~/work/laravel-test0908/{PJ名}
ibmcloud app push {App名}
```

<img width="610" alt="スクリーンショット 2018-09-08 10.50.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/e2ed34a2-06f6-c15d-ec6e-d8309dce3dd8.png">

アプリURLにアクセスをクリックして開く

---
###できなかったこと
- vue.jsを入門したいのでlaravel mixのnpm installしたい

cloudfoundryのbuildpackでは、nodejsがセットアップされていない。composer経由でnodejsをインストールするものがあるが現時点でPaaS側にnodejs導入できずうまくいかない

---
# 今日やったこと
* macbook上にコンテナのlaravel開発環境 "laradock"を初めて使う
* IBM cloud のPaaS Service Cloud Foundry PHPへプロジェクトを公開してみる

---
## 参考にしたところ(　ありがとうございます。)

* Qiita @akokubu さん [Laradockを使ったlaravel開発環境](https://qiita.com/akokubu/items/c79bb7128d7b16a20a22#mysql_version%E3%82%92latest%E3%81%AE%E3%81%BE%E3%81%BE%E3%82%84%E3%81%A3%E3%81%9F%E3%82%89)

* Qiita @rock619 さん [Laradockを使ってLaravel 5.5環境を構築する](https://qiita.com/rock619/items/62c2ab2252c405e26479)

* Qiita @fruitriin さん [LaravelからVue.jsを使う最短レシピ](https://qiita.com/fruitriin/items/e0f2c9aa035c3ff2c874)

* Qiita @motuo さん [IBM CloudにLaravelをデプロイする方法](https://qiita.com/motuo/items/b7d1fdf297349daca9fd)

---
#ありがとうございました