Laravel9.1 Sailを使ってDocker開発環境を構築～Herokuへデプロイする(Windows)

Laravel Sailを使ってDocker開発環境を構築＆Herokuへのデプロイをしていきます。
Sailを使うとかなり簡単にLaravel + Docker + MySQLなどが揃った開発環境を一気にそろえる事ができます。

Dockerは使いこなせたら非常に強力なんですが、取っ付き辛いですし初学者がいきなり触るとくじける事も多いんじゃないかな・・・とりあえずLaravel触ってみて何かを作ってみたい！ってんならSailは最高のツールだと思います。

ついでにHerokuへのデプロイも。せっかく作ったアプリなので公開しないともったいない。
Herokuへのデプロイもそんなに難しくなかったです。
ちなみにHerokuとは、ざっくり言うとWEBアプリを動かせるサーバ環境を提供しているサービス。
他にもAmazonのAWSとか。

## やってみた感想
いくつか上手くいかないポイントがありましたが大抵打ち間違いだったり、ちょっと調べれば解決する事ばかりでした。

## 環境
Win10+VSC@1.68
Laravel@9.1+PHP@8.1(Sail)
Ubuntu@20.04

事前準備として下記をやっておく必要があります。

**Laravel Sail(以下Sail)環境構築用**
- WSL2有効化
- Docker for desktopインストール
- Ubuntuインストール
- (必要かも)Composerインストール+PHPのダウンロードと配置

**Herokuアップロード用**
- Gitインストール
- Heroku CLIインストール

## やろうとしたこと
- Sailを使ってLaravel+Docker環境の構築＆Laravelの初期ページ表示
- 上記のものをHerokuへデプロイ＆Laravelの初期ページ表示

## Sail環境構築 事前準備
### WSL2+Ubuntuの導入
WSL2環境を導入します。WSLとはWindows上で利用できるLinux実行環境のこと。
既定の動作バージョンをWSL1からWSL2にするのを忘れずに。
WSL2の有効化と一緒にLinuxディストリビューションのUbuntuも導入しておきます。
下記を参考にやっていきました。

https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/

### Docker for Windows環境の導入
Dockerとは、自分とこのマシン上に「コンテナ」と呼ばれる仮想環境を構築できるツールです。
作ったコンテナの中でOSやミドルウェアやアプリケーションを動かす事ができる、というもの。
詳細は割愛(自身も勉強中…)

Docker公式からインストーラをダウンロードしてインストールするだけなので簡単。
…なんですが、起動しなかったり起動してもすぐ落ちちゃったりしました。
PCの再起動や再インストールを試したところ通常起動するように。原因は不明。
こちらは下記を参考に進めていきました。

https://chigusa-web.com/blog/windows%E3%81%ABdocker%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6python%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89/

### PHPのダウンロード＆配置とComposerの導入
こちらに関しては以前より環境が揃っていたので必須かどうかはわかりません。
多分必要なんじゃないかなーと思います。
PHPは公式からダウンロードと配置をした後パスを通しておきましょう。


Composerはパッケージ管理ツール。こちらも公式からダウンロードしてインストールするだけ。

https://reffect.co.jp/php/package_management_of_composer

## GitインストールとHerokuインストール
いわずもがなのバージョン管理ツールGitのインストールと、WEBアプリをローカルからHerokuへデプロイする為に必要になるコマンドラインインターフェースのHeroku CLIをインストールしていきます。
これらも公式からダウンロードしてインストールするだけ。
合わせてGitHubへの登録とHerokuへの登録もしておきましょう。

https://git-scm.com/download/win

https://devcenter.heroku.com/ja/articles/heroku-cli

## WSL既定ディストリビューションの確認
WSLの既定ディストリビューションがUbuntuになっていなかったらここで変更しておきます。
VSCを起動してターミナルで確認していきます。
ターミナルについてはpowershell、Ubuntu(wsl)、gitBashを使い分けていくのでお間違えなく。
画像右上の赤線を引いてあるところをクリックすれば各種ターミナルを選択できます。

```:powershell
wsl -l -v
```
![wsl.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707014/0ba45a47-ca8c-4b9a-4d10-4430af89f7f4.jpeg)

画像ではUbuntuに*印が入っていますが、こちらの環境では当初docker-desktop-dataになっていました。
`wsl --set-default Ubuntu` のコマンドを叩いてWSL既定ディストリビューションを変更しておきます。

## Laravel Sailのインストール
事前準備お疲れ様でした。ここまでくれば後はカンタン。
Ubuntu(wsl)ターミナルを起動してカレントディレクトリをプロジェクトディレクトリを作りたい場所にして下記コマンドを実行します。プロジェクト名は任意で。
```:Ubuntu(WSL)
curl -s https://laravel.build/[プロジェクト名] | bash
```
※最初Ubuntuインストールをしてなくて上記コマンドをpowershellで打っていてウンともスンとも言わなかったのでもしダメな場合はUbuntu(WSL)ターミナルでコマンドを打っているか確認してみて下さい。

インストールが完了したらカレントディレクトリを作成したプロジェクトの位置にします。
そこで
```:Ubuntu(WSL)
./vendor/bin/sail up
```
コマンドを打つとDockerコンテナが起動します。

最初はちょっと時間がかかりますが、Dockerコンテナが立ち上がります。
画像のsail-pj01が今回作ったsailプロジェクト。
この状態で[http://localhost](http://localhost)に接続したらLaravelのスタートページが表示されます。

![docker.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707014/e841f075-b1f6-04fb-ea65-eb270b328fa3.jpeg)

![Laravel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707014/16bf11f6-787d-2780-c16e-18a86f90deb2.png)


## HerokuへSailプロジェクトをデプロイする

### GitHubと連携する
ローカル環境でLaravel Sailプロジェクトを動かす事ができたので、次にHerokuへのデプロイを行っていきます。
カレントディレクトリはプロジェクトのルートフォルダにしておきます。

Herokuをデプロイする時に必要になるProcfileを作成します。
ファイルの配置場所はルート直下。package.jsonとかと同じ位置。
拡張子とかは必要なく「Procfile」この名前。ちゃんと Pを大文字にすること。
```:Procfile
web: vendor/bin/heroku-php-apache2 public/
```

GitBashかpowershellターミナルでgit init。
GitHubの方でリモートリポジトリを作っておきプッシュしておきます。

まずローカルでgit init
```:git bash
git init
```
GitHubのほうでリポジトリを作ったのち
```:git bash
git remote add origin https://github.com/hogehoge/[リポジトリ名].git
git branch -M main
git push -u origin main
```
これでGitHub上のリモートリポジトリと同期できました。

### Herokuアプリを作成する
次にGitBashかpowershellターミナルを使ってHerokuにログインします。
```:git bash
heroku login
```

続けて空のHerokuアプリを作成します。
```:git bash
heroku create [アプリ名]
```
アプリ名を空欄にしておくと勝手に命名してくれます。
その次に今回作ったプロジェクトのAPP_KEYをHerokuアプリの環境変数に登録しておきます。
プロジェクトのDockerコンテナが立ち上がった状態(立ち上がってなかったらsail up -dで立ち上げて下さい)でUbuntuターミナルから下記コマンドを打ちます。
```:Ubuntu(WSL)
./vendor/bin/sail artisan key:generate --show
```

`base64:hogehogefugafugahannyaka`という文字列が出力されます。これがプロジェクトのAPP_KEYになります。
ちなこのAPP_KEYはLaravelのセキュリティ上重要な部分の暗号化に使われているとかなんとか。

https://qiita.com/yk2220s/items/dcbf54c6d1f33a0cb06f

生成されたAPP_KEYをHerokuアプリに登録します。
```:git bash
heroku config:set APP_KEY=base64:[生成されたAPP_KEY]
```
登録が正常にできていればHerokuのダッシュボードのSettingタブ>Config Varsから値を見る事ができます。

![heroku.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707014/e7f4680c-6202-69bc-a97d-92f87e32e0bd.jpeg)

次にHerokuのGitリモートリポジトリにpushします。
```:git bash
git push heroku [ブランチ名(本記事の通りにやってたらmainのはず)]
```

これでHerokuへのデプロイが完了しました。
サイトが表示されるかチェックします。
```:git bash
heroku open
```
![Lara2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707014/b1e72867-4a9b-2b7b-d510-0960ca715099.png)

しっかりLaravelの初期ページが表示されました。
お疲れ様でした。

※ローカルで作ったProcfileをコミット→リモートへpushをし忘れて403エラーが出て一瞬焦りました。
Herokuへのデプロイはこちらを参考にさせてもらいました。

https://chigusa-web.com/blog/heroku-laravel/

## まとめ
Laravel Sailで環境構築～Herokuへのデプロイを行いました。
ややこしいDockerの設定をせずにLaravel開発環境が手に入るのはとてもいいですね。
次はMySQLとの連携に挑戦したいです。