【Laravel】エックスサーバー(サブドメイン)でデプロイ手順

# 前提
・この手順は、XserverのサブドメインへLaravelアプリを公開する場合を基本

# 0. 準備
https://www.udemy.com/course/laravelxserver/

↑ 上記の講座の ↓ 以下内容を済ませておく。

| セッション2 | セッション3 | セッション4 |
|:-----------|:------------|:-------------|
| SSHによるサーバーへの接続 | アプリ実行中に利用されるPHPの設定 | Gitの設定 |
|  | コンソール上で利用されるPHPの設定 | composerのバージョンアップ |
|  | データベース(MySQL)の作成 |  |
|  | データベース(MySQL)の作成 |  |


# 1. サブドメイン作成
エックスサーバーのサーバーパネルでログイン
↓
「サブドメイン設定」をクリック
↓
以下画像箇所を入力
![スクリーンショット 2025-04-16 9.16.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/49961026-8835-43c7-ac3a-571b28fd2a08.png)
↓
「確認画面に進む」→「追加する」


# 2. SSHによるサーバーへの接続(SSH接続)
「XXX.key」ファイルがある階層で行う
```ssh
pwd
→ /Users/(ユーザー名)/Laravel/Xserver
```
→ Xserverの後に「/XXX.key」がある状態
![スクリーンショット 2025-04-15 15.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/77ca9b9c-6c61-459c-93c7-a415d5f4ae3d.png)

↓

```ssh
ssh -i XXX.key (サーバーID)@(サーバー情報).xserver.jp -p 10022
↓
自身で設定した(パスフレーズ)を入力
```


# 3. Xserverを初期化(メインドメインやサブドメインを全部初期化したい場合)
エックスサーバーのサーバーパネル「ログイン」→「ドメイン設定」で行う。
まずは「初期化」をクリック
![スクリーンショット 2025-04-15 15.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/1317f456-6638-4d09-899e-f5fb5ded8405.png)

↓

「ドメイン設定の初期化」をクリック → 「確認画面へ進む」をクリック → 「実行する」
![スクリーンショット 2025-04-15 15.52.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/d50ee7cd-f9fd-4b83-a2a9-09db686d3607.png)


# 4. ドキュメントルートの確認
↓ が存在すればOK
```ssh
/home/akkun1114/akkun1114.com/public_html/exp-alert.akkun1114.com
```


# 5. Git clone
```ssh
# 階層移動
cd /home/(ユーザー名)/(メインドメイン)
例) /home/akkun1114/akkun1114.com

# clone(githubの画像のようにコピーしたのをペーストすればOK)
git clone git@XXX
```
![スクリーンショット 2025-04-15 15.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/9a97603f-73db-4c42-8312-34bb0acc9e99.png)


# 6. public/index.php, .htaccess をルートへコピー
Laravelアプリをサーバーのルートドメイン（https://example.com）で直接アクセスできるようにするための作業
```ssh
cd /home/akkun1114/akkun1114.com/EXP-alert

cp public/index.php /home/akkun1114/akkun1114.com/public_html/exp-alert.akkun1114.com/
cp public/.htaccess /home/akkun1114/akkun1114.com/public_html/exp-alert.akkun1114.com/
```


# 7. index.php を修正
```ssh
cd /home/akkun1114/akkun1114.com/public_html/exp-alert.akkun1114.com

# index.phpがあるか確認
ll -a

vi index.php
```
↓
```ssh
# 編集モード
i

↓

// 修正前
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';

// 修正後（フルパスにする）
require '/home/akkun1114/akkun1114.com/EXP-alert/vendor/autoload.php';
$app = require_once '/home/akkun1114/akkun1114.com/EXP-alert/bootstrap/app.php';

↓

# 保存、終了
esc
:wq
```

## 「vendor/autoload.php」の解説
「require '/home/.../vendor/autoload.php';」の部分

✔ 何してる？
・Composerのオートローダーを読み込んでます。
・Laravel本体・依存パッケージ（例：illuminate, guzzle, faker など）を使えるようにしてる。
・あらゆるuse クラス名やnew クラス名を自動で探して読み込むための仕組み。
・Laravel以外のPHPプロジェクトでも Composer を使っていればこのファイルはほぼ絶対使います。

## 「bootstrap/app.php」の解説
「$app = require_once '/home/.../bootstrap/app.php';」の部分

✔ 何してる？
・Laravelアプリケーション本体（Applicationインスタンス）を作成しています。
・サービスコンテナのインスタンスを $app に代入。
・ここで HTTPカーネルやCLIカーネルなどの初期バインドが行われる。
・この $app を使ってリクエストの処理がスタートする。


# 8. envの設定
https://www.udemy.com/course/laravelxserver/

セッション4：Laravelの導入：3:10~の箇所(コピーから)


# 9. Composer install
```ssh
cd /home/akkun1114/akkun1114.com/EXP-alert
# 本番用
composer install --no-dev --optimize-autoloader
```


# 10. Laravelコマンド実行
```ssh
php artisan key:generate
php artisan storage:link

# その他
# 画像圧縮の場合
composer require intervention/image
```


# 11. npm 系コマンド
```ssh
npm install
npm run build
```


# 12. データベース初期化
```ssh
php artisan migrate:fresh --seed

# 2回目以降行う場合で画像を削除したい場合(以下URLを参照)
php artisan storage:clear-item-images
php artisan migrate:fresh --seed
```
https://qiita.com/honaki/items/3418c1bcac437fe846c4


# 13. Vite build ファイルをルートへコピー
Laravel + Vite でビルドされたアセットファイル（CSS・JSなど）をサーバーの公開領域に配置するための操作
※ npm run build を実行した後に行う
```ssh
cp -r public/build /home/akkun1114/akkun1114.com/public_html/サブドメイン名
```


# 14. storage シンボリックリンク作成
Laravelで保存した画像などのファイルをWebブラウザからアクセス可能にするための操作
```ssh
cd /home/akkun1114/akkun1114.com/public_html/サブドメイン名

ln -s /home/akkun1114/akkun1114.com/EXP-alert/storage/app/public /home/akkun1114/akkun1114.com/public_html/サブドメイン名m/storage
```


# 15. index.html の削除
```ssh
cd /home/akkun1114/akkun1114.com/public_html/サブドメイン名

rm index.html
# あとで使う場合は、名前を変更
# mv index.html index.html.bak
```


# 参考：ディレクトリ構成
![ChatGPT Image 2025年4月16日 10_16_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/94fb2741-e6f9-4572-8f36-56e2a2a852c5.png)
![スクリーンショット 2025-04-16 10.17.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/95b00e23-01ba-4247-9549-99154856cb9b.png)