VercelでLaravel10をデプロイしてVercel Strage(DB)を繋ぐ

# はじめに
こちらの記事を拝見して、Vercelいいじゃん！って思って自分でもやろうとしたけどめちゃくちゃ詰まって、radditや海外の記事、果てはNeonの公式Discordまで色々探してどうにかうまくいったので備忘録としてまとめておきます。

https://qiita.com/Masanarea_qiita/items/2e1616e4e18f6c8ee26d#%E3%81%8A%E3%81%BE%E3%81%91

# 対象者
- なるべくGUIベースでわかりやすく行きたい人
- 従量課金が怖い人

# Vercelのいいとこ
- hobbyプランなら従量課金もなく完全無料（個人的かつ非営利な目的に限る）
- SSLの自動設定
- PostgresDBが無料で1つ使える
- gitのリポジトリと連携して自動デプロイ

CI/CDがブラックボックス化していますが、シンプルでわかりやすく、SQLサーバーを別に用意しなくてもいいという点でとても楽だなと思います。

# 導入方法
Laravelのプロジェクトと、それを管理するリポジトリはあるものとします

### 1. パッケージ導入
まずVercelにLaravelをデプロイするためのパッケージを導入します。

Laravelのプロジェクトファイル以下で以下のコマンドを実行します。
``` 
composer require revolution/laravel-vercel-installer --dev
php artisan vercel:install
```
すると諸々ファイルが追加されるので、その中でvercelの設定ファイルである `vercel.json`を編集します。

``` vercel.json
{
    "regions": [
        "hnd1"
    ],
    "functions": {
        "api/index.php": {
            "runtime": "vercel-php@0.6.2"
        }
    },
    "routes": [
        {
            "src": "/build/(.*)",
            "dest": "/public/build/"
        },
        {
            "src": "/(.*)",
            "dest": "/api/index.php"
        }
    ],
    "env": {
        "APP_NAME": "Laravel Vercel",
        "APP_DEBUG": "false",
        "APP_CONFIG_CACHE": "/tmp/config.php",
        "APP_EVENTS_CACHE": "/tmp/events.php",
        "APP_PACKAGES_CACHE": "/tmp/packages.php",
        "APP_ROUTES_CACHE": "/tmp/routes.php",
        "APP_SERVICES_CACHE": "/tmp/services.php",
        "CACHE_DRIVER": "array",
        "CACHE_STORE": "array",
        "LOG_CHANNEL": "stderr",
        "SESSION_DRIVER": "cookie",
        "VIEW_COMPILED_PATH": "/tmp"
    }
}
```

自分はphpのバージョンが8.2なので、対応する`vercel-php@0.6.2`を記載していますが、以下を参考に対応するバージョンを記載してください

https://github.com/vercel-community/php?tab=readme-ov-file#:~:text=%F0%9F%92%AF-,Versions,-vercel%2Dphp%400.7.1

修正が終わったらmainブランチにプッシュしておきます。

### 2. Vercelの設定

#### 2.1 Vercelのアカウント作成
GitHubからログインしておくと後が楽です。

https://vercel.com/login

#### 2.2 プロジェクトの作成
Add NewからProjectを選択して、デプロイしたいGitのプロジェクトをImportします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/da92b614-eb34-240d-5bd5-aef3189c1c74.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/911e5072-c888-271b-3038-41ad400bbf4d.png)

Frameworkは`Vite`、Environment VariablesでLaravelプロジェクト.envにあるのAPP_KEYを入力、AddしてからDeployします。
※このDeployは失敗します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/21d45d41-4963-6d8d-8681-44a3c0d4dc37.png)

#### 2.3 プロジェクトの設定

ProjectのSettingsを開き、以下2点を編集します

1. GeneralのOutput Directoryを`public`にOverrideしてSave
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/53775940-f15f-3750-cd31-c208933acee8.png)
    
2. Node.js Versionを`18.x`に変更してSave
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/0165549a-3bdd-4225-1465-946d001acbdf.png)

変更が終わったらDeploymentsタブにある失敗したデプロイの三点リーダーからRedeployします。

終わったらVisitしてみて、こんな感じでLaravelっぽい画面が出てたら成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/ddf7fb5b-3a5b-6559-15d1-236a8a1ff7f2.png)

### 3. DBの作成と接続
#### 3.1 DBの作成
Storageタブの`Create Database`からPostgresを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/b57058bc-883f-52e6-3ec0-1daad749c471.png)

作成したものをクリックすると、Quickstartのところにpsqlがあると思うのでそれをコピーしておきます

#### 3.2 ローカルでDBに接続
ローカル環境で接続してmigrationを走らせます。

`.env`を編集します。
```.env
DB_CONNECTION=pgsql
DB_HOST=ep-misty-snow-a14m8di4.ap-southeast-1.aws.neon.tech
DB_PORT=5432
DB_DATABASE=verceldb
DB_USERNAME=default
DB_PASSWORD=endpoint=ep-misty-snow-a14m8di4;{password}
DATABASE_URL=postgres://default:{password}@ep-misty-snow-a14m8di4-pooler.ap-southeast-1.aws.neon.tech?sslmode=require
```

それぞれの値は先ほどQuickstartでコピーした値を参考にして作成していきます。
URLは全体から、port番号とDB名を抜いておきます。

``` psql

psql "postgres://default:************@ep-misty-snow-a14m8di4.ap-southeast-1.aws.neon.tech:5432/verceldb?sslmode=require"
                | user  |  passwprd  |                 DB HOST                           |port|database|
      |                                                     URL                                                        |
```

ローカルで`php artisan migrate`して、DBに問題なく接続してmigrationが実行できることを確認します。

#### 3.3 VercelでDBに接続
ProjectのSetting > Environment Variablesに先ほど`.env`に記載したものを追加していきます。

最終的にこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/bfcc628c-1c81-a1b7-41b6-e143583e470e.png)


補足：Vercel Storageの方からprojectに紐づけすると、`POSTGRES_URL`などの環境変数が追加されて自分はうまくいかなかったです。

### 4. 確認
環境変数を変えたのでRedeployしておきます。

自分はBleezeを入れておいたので、ユーザーを作成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/44ac86f9-0694-6a0c-2935-4168f2e325ef.png)


無事ユーザーが作成でき、VercelのStorageタブからクエリを走らせてみても、DBに情報が入っていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/6dda4ee5-f5e6-27b8-7c93-ded1ea407c20.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837860/9aed077b-cf13-f866-d9fc-d8d1ad5995e3.png)

## 補足
実際にデプロイしてみて、500エラーは出るもののLogのstack trace見てもなんかよくわかんないってときは、この記事のLoggingの設定を真似したらいい感じに表示されるようになりました。

https://qiita.com/conjLob/items/f11fbb852d179d83523c#logging

## おわりに
vercel.jsonの書き方やNode.jsのバージョンあたりがなかなか正解にたどり着かず、途中Fly.ioやlightsail、GCPも試したりしてみたのですが、上手くいってしまえば一番Vercelがシンプルでした。

おすすめの無料PaaSがあれば教えてください。