VSCode の Remote - SSH機能を使ってConoha VPS上でLaravelの開発環境を用意する

### はじめに

この記事では[ConoHa VPS](https://www.conoha.jp/vps/)への[Laravel](https://laravel.com/)の導入から、Visual Studio Code（以下、VSCode）のRemote-SSH機能を使った開発環境構築について説明していきます。

執筆時点での自分の環境を載せておきます。

|  |version  |
|---|---|
|macOS | Mojave 10.14.16 |
|VSCode|1.43.2  |

### ConoHa VPS上でLaravelの環境を用意する

※ConoHa VPSに既にログインしている前提で説明します。

#### サーバー構成を選択する画面でLaravelを選択して追加する

ConoHa VPSにはOSの他にもアプリケーションテンプレートなど、利用したい環境に応じた便利なテンプレートが多数用意されております。
Laravelテンプレートも用意されており、選択して追加をクリックするだけで必要なパッケージのインストールも同時に行ってくれるため、簡単に環境を構築する事ができます。

![badf1d00-74dd-11ea-820c-d4f51f3edf40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/688dceab-2180-a150-44bb-b15e1fd8f484.png)

追加する際に`root`パスワードを設定しますが、**こちらのパスワードは一度設定すると変更ができないので必ずどこかにメモをしてください。**
また、紛失した際は確認する術がないため注意してください。

>Q.VPSの管理者パスワードはどこで分かりますか？
>A.ConoHaではメールなどでお伝えしておりません。VPS作成時に設定したrootパスワードは紛失しないようお客様ご自身での管理をお願いいたします。

ref:[仕様について｜ConoHa VPSサポート](https://support.conoha.jp/vps/faq/vps-q/overview-q/)

追加が終わるとConoHa VPSの管理画面に遷移します。

![b74b9600-74dd-11ea-80d7-47de0a57a8fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/fabe517b-154b-707f-852e-410cd06607db.png)

#### ConoHa VPSのコンソールパネルからLaravelがインストールされている場所を確認する

ネームタグをクリックして、サーバー情報のページに遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/31cd76c0-5d61-41be-418a-17b72742628d.png)

「コンソール」と書かれているボタンをクリックしてコンソールパネルを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/e3b06f8c-a92e-d148-bc2a-8ad5fe2c71cb.png)


`login`には`root`を指定してください。
`Password`には先ほど設定したrootパスワードを入力してください。

※rootパスワードに@を含めている方はご注意ください。
キーボードによってはコンソール内で「@」を入力すると「\`」が入力されることがあります。
この場合、コンソール内で「\`」を入力すると「@」が入力されます。
US配列のキーボードだと上記の問題が起きたため注意書きとして残しておきます。

ログインに成功すると、以下のような画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/1b71a7bb-a4d9-1043-51e3-d2d6ace3ecfb.png)

MySQLのパスワードは後ほどマイグレーションの所で使うのでメモしておきます。

ここまで出来たら、Laravelがあるディレクトリに移動してインストールされているLaravelのバージョンを確認してみましょう。
以下のコマンドを実行してConoHa VPSに入っているLaravelのバージョンを確認します。

```sh:[ConoHaVPS]
cd /var/www/html/laravel/
php artisan -V
```

これでConoHa VPS上でLaravelの環境を作成して確認する事ができました。
次はVSCodeのRemote–SSH機能を使って、VPS上のファイルを編集する作業を行いましょう。

### VSCodeにRemote-SSHを入れて、ConoHa VPS上のファイルを編集する

#### リモート接続するための設定ファイルを生成する

まず最初に`Remote-SSH`で必要となるパブリックキーとシークレットキーを設定していきます。
両者ともにConoHaのWebコンソールから作成します。
パブリックキーは作成後自動で登録されますが、シークレットキーはローカルにダウンロードして利用します。

最初にシークレットキーを置いておくディレクトリと、リモートサーバーへ接続する際に利用される設定ファイルも生成しておきます。
(※既にある場合はここはスキップして大丈夫です)

```sh:[local]
mkdir ~/.ssh
touch ~/.ssh/config #設定ファイル
```

`.ssh/config`がどんな設定ファイルかについてはこの記事では省略しますが、興味があればこちらの記事をご覧ください。

ref:[~/.ssh/configについて](https://qiita.com/passol78/items/2ad123e39efeb1a5286b)

#### ConoHa VPSの管理画面でパブリックキーを登録する

ConoHa VPSの管理画面に戻り「セキュリティ」から「SSH Key」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/bd83a4da-f50c-1d91-1bec-df5462c48fd1.png)

「パブリックキー」をクリックして登録します。
登録されるとシークレットキーをダウンロードするようポップアップが出るので、ダウンロードします。

![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/d1c951d0-84f8-042c-5c03-3b4c3b7c5a76.png)

シークレットキーをダウンロードしたら、`~/.ssh/`に移動させてください。
後ほど`config`の設定で説明が出てきますが、`~/.ssh/`でシークレットキーが置いてある場所のパスを指定できれば問題ないです。
ただ、後で設定のパスを指定する際に設定が容易になるため、`.ssh`ディレクトリ配下に移しておくのを推奨します。

#### VSCodeにRemote-SSHをインストールする

VSCodeの拡張機能の検索画面から`Remote-SSH`を検索してインストールします。
![スクリーンショット 2020-05-11 20.19.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165355/5a04f6b5-8d02-ce34-7ed7-c9fb36cbf30a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/8e18ddf8-eb19-1567-1e13-7e6eaeeae334.png)

インストールが完了するとVSCodeの左のアイコン一覧にRemote-SSHのアイコンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/f8939130-8211-d5c9-5949-d40d532fa4c8.png)

#### `.ssh/config`にConoHa VPSの設定を記述する

Remote-SSHを開くと`config`ファイルを編集する画面が表示されると思いますので、以下の内容を追記してください。
編集画面が開かない場合、以下の手順を参考にしてください。
![スクリーンショット 2020-05-11 20.26.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165355/7a4849d8-38eb-ecc4-2e0f-0efcfbd992e9.png)

`{}`で囲っている箇所は自分の環境に合わせて変更してください。

```config:[local]~/.ssh/config
Host {名前}
HostName {IPアドレス}
User root
Port 22
IdentityFile ~/.ssh/{シークレットキーの名前} # 秘密鍵が置いてあるパスを指定する
```

`Host`は自由に設定してください。
`HostName`にはConoHa VPSで作成したサーバーの`IPアドレス`を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/23a847f7-735f-2ffa-56f7-45a05060148b.png)

`IdentityFile`はダウンロードしたシークレットキーのパスを指定します。
`.ssh`ディレクトリ配下に置いている場合はシークレットキー（`yyyymmddhhiiss.pem`）の部分を変更してください。

これで`.ssh/config`の設定は完了です。

#### VSCodeからConoHa VPSに接続する

完了後にRemote-SSHのアイコンを更新すると、`Host`に指定した名前が表示されているはずです。
右クリック後、新規ウィンドウで開くもしくは既存ウィンドウで開くを選択し、ConoHa VPSへのリモート接続を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/c77426f7-6c19-930f-b075-a3bded5aceac.png)

なお、Windows環境では以下の警告が出ることがありますので適宜許可してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165355/3bca028e-b8f3-08d6-8264-102707968167.png)

接続の途中でrootパスワードを聞かれるので、先ほど設定したパスワードを入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/caa62034-9ecc-5b93-0ee8-a52ad68d8c65.png)


認証に成功するとVSCodeのフッターに`Host`の名前が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/54c3f3d1-8137-84dd-d8bc-174e93d52fe3.png)

VSCodeのエクスプローラーからConoHa VPS上のLaravelがインストールされているディレクトリを開きます。
「フォルダーを開く」をクリック後、表示されるコマンドパレットにlaravelがインストールされているパスを指定します。

```
var/www/html/laravel
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/86433f6d-8fe0-54bb-1a5d-5896bab7ba40.png)

OKをクリックすると、エクスプローラーに`laravel`のディレクトリ構成が表示されます。
これによって、ConoHa VPSに接続した上で、VSCodeのエディターを使ってファイルを編集する環境が出来ました。

#### VSCodeのターミナル画面からConoHa VPS上でコマンドライン操作ができるようにする

デフォルトだと設定がされておらず、ConoHa VPS上のファイル操作が行えません。
この手順ではリモート接続しているサーバー上の`bash`が読み込まれるよう設定を変更します。

まずはVSCode左下、「設定」アイコンから「設定」をクリックし、「Terminal Automation shell Linux」で検索します。
![スクリーンショット 2020-05-11 21.08.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165355/1d9c318b-c269-0c84-bd00-3c38a779410f.png)


「リモート」を選択して`Automation Shell:Linux`の下にある`setting.json`で編集を開き、ConoHa VPS側の`bash`パスを指定します。
ConoHa VPSでは`/usr/bin/`配下に`bash`があります。

```json:[local]setting.json
{
  "terminal.integrated.shell.linux": "/usr/bin/bash"
}
```

この状態で保存してターミナルを開くと、ConoHa VPS上に接続した状態でサーバーのターミナルを操作する事ができます。
試しに`php artisan -V`で確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/994d9469-17ef-cf02-d150-5f7712f3649d.png)


### ConoHa VPS上で マイグレーションを行う

リモートに接続ができたら、DBと接続してマイグレーションを行います。
最初のConoHa VPSのコンソールでログインしたときの画面を思い出してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/1b71a7bb-a4d9-1043-51e3-d2d6ace3ecfb.png)


こちらの`MySQL Passoword`を`.env`ファイルに追記します。

```env:[ConoHaVPS]/var/www/html/laravel/.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD={MySQL Passoword}
```

Laravel側の設定としてはこれで終わりですが、このままではまだマイグレーションが出来ません。
ConoHa VPSのMySQLにアクセスして、接続する`database`を作成します。
`.env`を見ると`laravel`が指定されていますが、実際にMySQLにログインすると

```text:[ConoHaVPS]
# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.01 sec)
```

`laravel`というDBがまだ存在していないため、直接SQLを叩いてDBを作ります。

```text:[ConoHaVPS]
REATE DATABASE laravel;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
```

これで出来たのでマイグレーションを実行してみます。しかし、このままではまだエラーが出てしまいます。

```text:[ConoHaVPS]
php artisan migrate

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
```


このエラーの原因は次のとおりです。
Laravel5.4から標準charasetが`utf8mb4`に変わりましたが、この形式に対応できるMySQLのバージョンは`5.7.7`以上となっております。
しかしConoHa VPSで稼働しているMySQLバージョンは`5.5`のため、ユニーク制約を付けたカラムを設定する際に指定サイズを超えてしまい、エラーとなります。
詳細:[Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する - Qiita](https://qiita.com/beer_geek/items/6e4264db142745ea666f)

対応方法としてはいくつかあるのですが、Laravelでテーブルのスキームを定義する際の最大長未指定時のdefault値を指定サイズ以下に抑えるよう設定することでこの問題を回避します。

編集するファイルは`app/Providers/AppServiceProvider.php`です。

```php:[ConoHaVPS]/var/www/html/laravel/app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
```


この状態であればConoHa VPS上で問題なくマイグレーションが出来る状態になります。

```text:[ConoHaVPS]
# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.02 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0 seconds)
```

実際にテーブルが出来ているかを確認します。

```text:[ConoHaVPS]
MariaDB [laravel]> show tables;
+-------------------+
| Tables_in_laravel |
+-------------------+
| failed_jobs       |
| migrations        |
| users             |
+-------------------+
3 rows in set (0.00 sec)
```

以上でマイグレーションの説明は終わりです。

やる事は沢山ありますが、一つ一つ確認していけば、詰まらずに構築できると思います！
お疲れ様でした。

### 参考資料

- [VSCode の Remote – SSH 機能を使って EC2 上で開発する – サーバーワークスエンジニアブログ](http://blog.serverworks.co.jp/tech/2020/02/20/vscode-remote-ssh/)
- [Developing on Remote Machines using SSH and Visual Studio Code](https://code.visualstudio.com/docs/remote/ssh)