XSERVERにlaravelのwebアプリをgitからデプロイ


この作業が何回やっても慣れず、自分の備忘録的な意味も含めて書かせていただきました。
もしよければ参考にしてみてください。

## SSH接続
初期設定の部分は簡単なので飛ばします

ログインコマンドはこちらです
```
ssh -l サーバーID -i ~/.ssh/サーバーID.key サーバーID.xsrv.jp -p 10022
```

## PHPのバージョンアップ

#### １ , 現在のバージョンを確認
LaravelにはPHPのバージョンが7以上であることを要求されています。
まずは以下のコマンドを実行してphpのバージョンを確認してみます。
```
php -v
```
laravel8.*を使うときはバージョンが７以上
laravel9.*を使うときはバージョンが8以上であれば、そのままでも大丈夫です。

#### 2 , バージョンアップ
では、実際にphpのバージョンを変更していきます。
まずはHOME直下にbinディレクトリを作成します。

```
mkdir $HOME/bin
```

下記コマンドを実行すると使えるバージョンが表示されます。
```
find /opt/php-*/bin -type f -name 'php'
```

次に先ほど作成したbinディレクトリにシンボリックリンクを作成します。
```
ln -s /opt/php-8.0.12/bin/php $HOME/bin/php
```
*「php-8.0.12」のところは使いたいphpのバージョンに合わせてください。


次に「.bash_profile」ファイルを開きます。
```
vi ~/.bash_profile
```

ファイルを開いたら次の「変更後」のように「変更前」の内容を書き換えます。
```
//変更前
PATH=$PATH:$HOME/bin

//変更後
PATH=$HOME/bin:$PATH
```
「a」キーを押してインサートモードにし、記述内容を修正します、修正が終わったら「esc」キーでInsertモードを解除、「:wq」で変更したファイルを保存します。

次に新しく作ったバスを反映させます。
```
source ~/.bash_profile
```

これでphpのバージョンアップは完了です。
バージョンアップ出来ているか確認してみます。
```
php -v
```

このときXserverの方でも設定したphpバージョンに合わせておくことをお勧めします。


#### 3 , Composerのインストール
以下のコマンドを実行してComposerをインストールします。
```
curl -sS https://getcomposer.org/installer | php
```

composerのインストールが正常に終了したらバージョンを確認してみます。
```
composer -v
```
バージョンが表示されていれば、composerはインストールされています。

#### 4 , Node.jsのインストール
今回はバージョン管理ツール「nodebrew」を使ってNode.jsをインストールを行います。

下記コマンドで「nodebrew」をインストールします。
```
wget git.io/nodebrew
```

次に「nodebrew」を使えるようにするため下記コマンドでセットアップします。
```
perl nodebrew setup
```

表示されたログの通りにパスを通していきます。

下記コマンドでパスを通します。
```
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bath_profile
```

下記コマンドでパスを反映させます。
```
source ~/.bath_profile
```

「nodebrew」がインストールされているか確認しましょう。
```
nodebrew -v
```

続いて「nodebrew」を使って「Node.js」をインストールします。
```
nodebrew install-binary latest
```

インストールしたNode.jsのバージョンを確認し、これをアクティブにします。
```
nodebrew list
nodebrew use 確認したバージョン
```

最後にnodeとnpmのバージョンを確認して、node.jsのインストールは完了です.
```
node -v
npm -v
```

#### 5 , LaravelをGIT経由でクローン
まず、SSHの現在の場所から、Laravelをインストールするディレクトリ(フォルダ)に移動します。
```
cd ドメイン名
```

ここに、Laravelプロジェクトをクローンします。
```
git clone https://github.com/user/xxxx.git
```
このときプロジェクトをprivateにしているとパスワードを求められ、アクセストークンが必要になるので
この作業の時だけはpublicにしとくのがお勧めです。

cloneしただけだと、vendorフォルダなど、足りないものがあり、まだLaravelは動かないので、それをComposerでインストールしていきます。

```
cd プロジェクト
composer install
```

続いて、envファイルの設定をしていきますが、cloneしたプロジェクトには.envファイルがないので、「.env example」をコピーして使います。
```
cp .env.example .env
```

ファイルを開いて、変更します。
```
vi .env
```

修正する内容は下記の通りです。
```
APP_NAME=○○　//アプリ名
APP_ENV=production　//「local」から「production」にする
APP_KEY=　←空白でOK
APP_DEBUG=false　//「true」から「false」にする
APP_URL=https://ドメイン名　//httpsにするのがポイント

~省略~

DB_CONNECTION=mysql
DB_HOST=○○.xserver.jp もしくは　　localhost  //Xserverのphpmyadminから確認
DB_PORT=3306
DB_DATABASE=○○　//xserverで作成したデータベース名
DB_USERNAME=○○　//xserverでユーザー名
DB_PASSWORD=○○　//xserverでパスワード
~省略~
```
次にアプリケーションキーを作成します
```
php artisan key:generate
```

これで.envファイルの「APP_KEY=」の空白のところに値が追加されているはずです。

データベースのテーブルを作る必要があるので、マイグレーションファイルを実行します。
```
php artisan migrate
```

#### 5 , シンボリックリンクの作成
Laravelでは全ての処理の起点は「public」ディレクトリでされているので、アプリURLにアクセスしたらpublicディレクトリに通るようにシンボリックリンクを貼ります。

ということで、下記コマンドでシンボリックリンクを貼ってください。
```
ln -s ~/メインドメイン/プロジェクト名/public ~/メインドメイン/public_html/public
```

#### 6 , .htaccessファイルを2つ追加
まず、public_html内に.htaccessがあるかチェックしてください。あればそれを編集、無ければメモ帳などで作成します。

下記コードをpublic_html内の.htaccessに書き換えます
```
<IfModule mod_rewrite.c>
RewriteEngine On
# Laravelのpublicフォルダをサイトトップ表示
RewriteRule ^(.*)$ public/$1 [QSA,L]
</IfModule>
```

さらに今度は、プロジェクト/public内に.htaccessがあるかチェックしてください。
あれば、それを編集、無ければ作成してください。下記コードを追記します。
```
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>

RewriteEngine On

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

# httpsからの通信でwww有りの場合、www無しにリダイレクト
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www.japaslang.com$
RewriteRule ^(.*)$ https://japaslang.com/$1 [R=301,L]

</IfModule>
```

以上で、デプロイ作業は完了です。
URLにアクセスして、画面に表示される確認をしましょう。

お疲れ様でした。


#### おまけ
laravel9で作成したwebアプリを公開するときに、xseverのphpバージョンが古いことから
```
Fatal error: Uncaught TypeError: 
Return value of Illuminate\Container\Container::offsetGet() 
must be an instance of Illuminate\Container\mixed, 
instance of Illuminate\Events\Dispatcher returned in 
/home/xxx/vendor/laravel/framework/src/Illuminate/Container/Container.php:1417 
```
こちらのエラーが出ました。
同様のエラーが出た方は、Xserverのphpバージョンを８以上にすることで解決すると思います。