さくらのレンタルサーバでLaravelアプリをデプロイしてみた

### 記事作成時の背景
Laravelの学習のために作成していた日記アプリがある程度形になったので、一般公開のためにはじめてのデプロイに挑戦した。
デプロイ作業をはじめてから、きちんと動作するまでに2日間くらいかかった。
その中で色々学びがあったので、その備忘録と、次回同じ作業がスムーズにできるように記録する。

### 参考記事
以下の記事を参考に作業を進めた。

- [Qiita - Laravelを本番サーバーにデプロイしてみた](https://qiita.com/sskmy1024y/items/c2e434941400bd4ee82c)
- [Qiita - Laravelのさくらサーバへのデプロイやってみました](https://qiita.com/Riooon/items/5b36eb94129568b008f5)
- [Qiita -【メモ】さくらのレンタルサーバで、Laravelで作成したプロジェクトを動かす](https://qiita.com/kyoruni/items/fc604a005116d6abf061)
- [Laravelをさくらインターネットのレンタルサーバにデプロイ・アップロードする方法をまとめてみた](https://arrown-blog.com/laravel-sakura-deploy/)


なお、各項目でさらに追加で参考にした記事はその都度記載している。

### 環境
Windows10
ローカル環境:Xampp上で構築
git bash
DB:MySQL
PHP 7.x
Laravel 7.x
エディタ：VS Code
さくらのレンタルサーバー：スタンダードプラン

### さくらのレンタルサーバでの作業
#### SSLの取得
各ドメイン毎にSSLを取得しておく。
その際に、以下のリダイレクト設定を忘れないように。

サーバのコントロールパネル→ドメイン/SSL→各ドメイン→リダイレクト(転送)設定で、「HTTPSに転送」にチェックをつけること。

はじめこれを忘れて、httpsにならなかったので。

#### データベースの作成
Laravelアプリで使用するデータベースをさくらのコントロールパネル → phpMyAdminで作成する。
DBの基本情報は.envファイルの修正時に使用するので、確認しておく。

### git hubにリモートリポジトリを作る
すでに、git hubにリモートがあれば、この項は省略できる。

日記アプリをローカルで作成していたときには、gitで管理していなかったので、この行程が必要だった。

#### おおまかな手順
ローカルにリポジトリを作成 → ~~giboで.gitignoreを設定する→~~ git hub上にリモートリポジトリを作り、pushする
リモートリポジトリは、publicでもprivateでもどちらでもお好きなほうで。

※追記　.gitignoreはLaravelではデフォルトで設定されているみたい。giboを実施する必要はなさそう。（2020/08/26追記）

~~#### .gitignoreでのつまづき~~
~~.gitignoreのところでつまづいて結構時間がかかった。~~
~~詳細はこちらの記事。[Qiita - .gitignoreが認識されなかったのはUTF-16のせいみたい
](https://qiita.com/kohboh/items/02ccd993f7ba1e8e582b)~~


### サーバにSSH接続する
#### 参考記事
ssh接続したのは初めてなので、以下の記事を参考に接続した。
-  [Qiita - さくらレンタルサーバーにSSHで公開鍵ログインする](https://qiita.com/pugiemonn/items/1597939003ca83208e0d)
- [sshの鍵認証でパスワード無しでログインする・ssh-copy-id](https://qiita.com/sakanashi/items/542ae428d9de9c7c59dc)


#### Windows上ではchmodによるパーミッションの変更ができないので注意。
参考記事を見ると、公開鍵のパーミッションを変更することが必要とのこと。ローカルで変更している記事を見たが、Windows上ではchmodによるパーミッションの変更ができないので注意すること。

#### 公開鍵認証時のパスフレーズの省略
参考記事：[SSH で毎回パスフレーズを入れるのが面倒だと思ったときには(Qiita)](https://qiita.com/evakichi/items/abb6dde9df78f049b913)
```bash
% ssh-agent
% eval `ssh-agent`
% ssh-add ~/.ssh/id_rsa
```

### リモートリポジトリからサーバー上にクローンを作成

sshでさくらサーバに接続して、以下コマンドを実行する。

```bash
% cd {任意のディレクトリ}
% git clone　[リモートリポジトリURL]
```

今回は、ホームディレクトリ直下にlaravelディレクトリを作成し、そこにgitで管理されたアプリのクローンを作成することにした。

```bash:example
% cd ~/laravel
% git clone [リモートリポジトリURL]
```

### composerの導入
さくらのレンタルサーバーにcomposerを導入する。参考記事を参考に実施。

#### 参考記事
[Qiita - さくらのレンタルサーバで Laravel を使うメモ (2020/04)](https://qiita.com/mml/items/ce1eb54d73fea1cf17b8)

### composer install
git cloneされたプロジェクトは.gitignoreの設定により、vendorディレクトリや.envが入っていない。
Laravelのパッケージが収められたvendorディレクトリがないとLaravelは動かないので、composerで導入する。
以下コマンドを実行する。
`% composer install`

新たにvendorディレクトリができていればオッケー。

### .env作成
`% cp .env.example .env`で.envファイルを作成。
.envファイルを以下のように編集。

```php:.env
APP_NAME={Appname}
APP_ENV=production
APP_KEY= //空白
APP_DEBUG=false
APP_URL=[アプリのURL]

DB_HOST=[WebアプリのURL]
DB_PORT=[DBポート番号]
DB_DATABASE=[データベース名]
DB_USERNAME=[DBユーザ名]
DB_PASSWORD=[DBパスワード]
```

DBの情報は、さくらサーバーにログインアクセスして、確認すること。もしくは、自分の過去のWebアプリを参照する。

私はviを使いこなせないので、ローカルのVS codeで作って、scpコマンドでサーバーからダウンロードし、編集後にアップロードした。

```cmd:local_download
$ scp [アカウント名]@[アカウント名].sakura.ne.jp:laravel/diary/.env ~/desktop/
```

```cmd:local_upload
$ scp ~/desktop/.env [アカウント名]@[アカウント名].sakura.ne.jp:laravel/diary/
```

`~/.ssh/config`にHost名（例えば、ホスト名をsakura_serverなどに設定）を設定している場合は、

```cmd:local_download
$ scp sakura_server:laravel/diary/.env ~/desktop/
```

```cmd:local_upload
$ scp ~/desktop/.env sakura_server:laravel/diary/
```

### アプリケーションキーの作成、マイグレート
#### コマンド実行

```
% php artisan key:generate
% php artisan migrate
```

### キャッシュクリア
#### 参考記事
[Qiita - Laravel キャッシュクリア系コマンドなど
](https://qiita.com/Ping/items/10ada8d069e13d729701)

#### コマンド実行
設定を変更したりしているので、キャッシュクリアをしておく。しなくても、うまく起動するかもしれないが、念の為。

```
% php artisan cache:clear
% php artisan config:clear
% php artisan config:cache
% php artisan route:clear
% php artisan view:clear
% composer dump-autoload
```

### シンボリックリンクの貼り付け

#### 参考記事
- [Laravel学習帳 - シンボリックリンクについて ( さくらサーバの注意点 )](https://laraweb.net/environment/1332/)

#### www/下にシンボリックリンクを貼る
- [【Laravel】デプロイ時の公開フォルダの設定（さくらのレンタルサーバー使用）（Qiita）](https://qiita.com/kohboh/items/f3b4964099207b49f23a)を参考に、公開フォルダとシンボリックリンクの関係を適切に設定すること。
- www/目的のドメイン/に{project_root}/publicのシンボリックリンクを貼る。


```bash:command
% mkdir ~/www/{プロジェクトを配置したいパス（ディレクトリ）}
% cd ~/www/{プロジェクトを配置したいパス（ディレクトリ）}
# ln -sはシンボリックリンクを貼るコマンド
% ln -s ~/laravel/{プロジェクト名}/public {プロジェクト名} 
```

### ブラウザで確認する
ローカルと同じように動けばオッケー。お疲れ様。

### プロジェクトの更新作業
#### ローカルで変更する
VS codeで変更作業する。

#### リモートにpush
変更をコミットした後、git hubにpushする。

#### リモートからpullする
SSHでさくらのサーバにログインして、

```
% cd {project_root}
% git pull
```

を実施する。
これで差分がアップデートされた。