Laravel AWS デプロイ

# 参考にした記事
* [AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)
* [AWS EC2 に Nginx + PHP8 で Laravel8 環境を構築する](https://knmts.com/become-engineer-30/)
* [【デプロイマスター#1】LaravelアプリをAWSのEC2にインストール](https://www.youtube.com/watch?v=npUakPK61CM)
* [【AWS入門】EC2+NGINX+MySQL環境へLaravelをデプロイする手順](https://brainlog.jp/server/aws/post-2808/)
## 手順(重要なところ抜粋）

結果これで行けた : [【AWS入門】EC2+NGINX+MySQL環境へLaravelをデプロイする手順](https://brainlog.jp/server/aws/post-2808/)
1. Laravelのプロジェクトをgithubへpush
（一番初期の公式からinstallしたLaravelプロジェクトだと今回のデプロイはいけた）
2. EC2インスタンス作成→SSH接続→Elastic IPアドレス設定はUdemyにて
3. EC2インスタンスにnginx or apatch と php、 composer、Laravel、mysqlを入れる
4. nginxの設定ファイルの「root」パスにEC2のルートディレクトリ「/var/www/public」を指定する
5. publicディレクトリ内でgit cloneでgithubのLaravelプロジェクトをcloneする
    
    ※この時、**git clone git@github.com:ユーザー名/プロジェクト名.git .**
    
    　上記のように末尾に「.」を入れる。
    
    　それにより、githubのトップディクトリ以下のファイルがカレントディレクトリの直下にcloneされる。
    

## 詰まったところ

### 上記URLだけでは詰まるのでそのあたりを以下で説明する

#### phpインストール

このサイトはphp7.3だが、8以上を指定してOK

```html
sudo amazon-linux-extras install -y php8.0
```

****[AWS EC2 に Nginx + PHP8 で Laravel8 環境を構築する](https://knmts.com/become-engineer-30/)****

この場合、上記記事が参考になる

### **php-fpm**

**/var/www/public直下にlaravelアプリをgithubからクローンするなら、記事の方法でOK**

別の記事ではnginxのルート指定を/var/www/自分のアプリ名/publicにしているものがあった。

しかし自分のアプリ名をルートに指定する方法ではLaravelをクローンしてもURL入れても表示されなかった。

### Nginx

`$ sudo vi /etc/nginx/nginx.conf`

上記コマンドでnginxの設定ファイルを修正する。

基本参考記事の通りコピペで動いた。

注意点は

```html
server {
    listen 80;
    server_name _;
    root /var/www/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

上記のうち

`root /var/www/public;`

この部分で表示させるファイルのドキュメントルートを指定している。

上記の場合public直下にindex.htmlがあればEC2のURLにその記述が表示できるといったもの。

そのため、LaravelをGithubからクローンする際はこのroot /var/www/publicのディレクトリ内で行う！（この時上述の末尾に「.」を入れるクローンにする）

### **Githubにパブリックキー登録**

この部分は[AWS EC2 に Nginx + PHP8 で Laravel8 環境を構築する](https://knmts.com/become-engineer-30/)
上記、記事の方がわかりやすいのでこちらの方法で行う

>Laravel のデプロイ（GitHub から Pull）

ブラウザでの表示確認用に作成したファイルとディレクトリは削除しておく。

`sudo rm -rf /var/www/your_project_name/`

Git をインストールする。

`sudo yum install -y git`

インストールされたことを確認。

`git --version`

GitHub に登録する鍵を作成。

`ssh-keygen -t rsa`

~/.ssh 配下に以下の２ファイルが作成される。

- id_rsa
- id_rsa.pub

id_rsa.pub の内容を GitHub に登録する。

`cat ~/.ssh/id_rsa.pub`

上記で表示された内容を GitHub のリポジトリの、Settings > **SSH keys** > Add deploy key より登録。

**※記事では「Deploy keys」となっているがSSH keysが正しい。**

www フォルダのオーナーを変更する。

`sudo chown ec2-user:ec2-user /var/www/`

GitHub からプロジェクトをroot /var/www/publicディレクトリに移動してから Clone する。


**.envファイル作成**

[AWS EC2 に Nginx + PHP8 で Laravel8 環境を構築する](https://knmts.com/become-engineer-30/)のやり方で進める。

`cp .env.example .env`

このコマンドで.envファイルを作成する。

```
vi /var/www/.env
```

> .envの内容はアプリによって違うと思いますので、適宜設定してください。

```
APP_NAME=”アプリ名”
APP_ENV=production
APP_KEY=この後生成
APP_DEBUG=false
APP_URL=”アプリURL”

中略

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=”DB作成時の名前”
DB_USERNAME=root
DB_PASSWORD=”MySQL設定時のパスワード”

中略
```

上記にて.envファイルの項目を記入する

```DB_PASSWORD=”MySQL設定時のパスワード”```

これについてはmysqlインストール時に指定したものを使用する。



**パッケージインストール**

`$ composer install`
アプリケーションキー(APP_KEY)生成

`$ php artisan key:generate`
DBテーブル作成

`$ php artisan migrate`
確認
先程確認したパブリックIPアドレスを開いて確認してみましょう。
ここまでの手順が問題なくできていれば、Laravelが表示される。

### EC2でnpm(Node.js)を使える様にする
#### ⑴ インストール可能な Node.js のバージョン一覧を表示

```$ nvm ls-remote```

すると
```
 v0.1.14
 v0.1.15
 v0.1.16
 ...
 v5.0.0
 ...
```

というように、インストール可能なNodeの一覧が表示

最新の安定版(LTS)バージョンの確認は[Node.js公式のDownloadページ](https://nodejs.org/en/download/)から行える。

#### ⑵ Node.js のインストール

```$ nvm install 5.0.0```

#### ⑶ 使用するバージョンの指定

インストールしたバージョンをnvmで指定します

```$ nvm use v5.0.0```

確認のため、以下のコマンドを打ち、

```
$ node -v
v5.0.0
```

と表示されたら成功。

## TODOアプリ作成
[参考記事:Laravel8 x Todoリスト　チュートリアル](https://taroosg.io/laravel8-tutorial)
上記記事を参考に作成できた。

## ２回目以降のデプロイ時のコマンド
### 失敗例

```git pull origin main```
上記git pull ではマージ作業が必要になりうまくいかなかった。

### 成功例
[[VSCode] Remote-SSH でサーバ上のファイルを直接編集する方法](https://webbibouroku.com/Blog/Article/vscode-remote-ssh)

この記事のVSCode拡張機能を使用して、直接EC2のコードで実装を進める。

この時、githubからクローンしているので、gitも使える！