さくらのレンタルサーバ スタンダードに Laravel 12 を設置したときのメモ 2025-04

## 概要

　自端末上の既存 Laravel プロジェクトをさくらのレンタルサーバ スタンダードに設置する。さくらのレンタルサーバのデフォルトの公開ディレクトリ `www` は維持しつつ、複数の Laravel プロジェクトを設置できるようにする。

## バージョン

- 自端末側
    - Windows + WSL2 + ubuntu 22.04
    - Docker version 28.0.1
    - Docker Compose version v2.33.1
    - Laravel 12.8.1
        - PHP8.3で使える Laravel の 2025-04時点の最新
- さくらのレンタルサーバ スタンダード
    - 古いスタンダードプランの場合は新環境に移行しておく
        - 無料でできるが移行に２時間くらいかかる
        - SSD が使われていて早いらしい
    - PHP 8.3.8
    - MySQL 8.0

## 補足

- さくらのレンタルサーバ スタンダードには SSH でログインできるようにしておく

## 自端末側作業

Laravel のプロジェクトを laravel.build 経由の Laravel sail で作る。`laravel_sakura` はプロジェクト名なので任意の名称でよい。

```bash
curl -s https://laravel.build/laravel_sakura?php=83 | bash
```

Larael sail の長いビルドが終わると Laravel のソースコードが設置されている。

将来他の Laravel プロジェクトも置きたいので、データベース内のテーブル名にはプレフィックスを付けて被らないようにしておく。

`config/database.php` の `prefix` のところにすべてに `DB_REFIX` を仕込み、
.env に `DB_REFIX=laravel_sakura_`を追記する。

```php
'prefix' => '',
// ↓
'prefix' => env('DB_REFIX', ''),
```

Laravel の `public` をさくらのレンタルサーバ側の `www/hogehoge` としたいので、ソースを調整する。

まず、`config/app.php` に下記を追記する。

```php
'public_path' => env('APP_PUBLIC_PATH', null),
```

次に `bootstrap/app.php` で `DB_REFIX` が設定されている場合のみ　`app.public_path` を使うように調整する。

```php
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

$app = Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__ . '/../routes/web.php',
        commands: __DIR__ . '/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })
    ->create();

// ここで publicPath が調整される。
$publicPath = env('app.public_path');
if (!empty($publicPath)) {
    $app->usePublicPath($publicPath);
}

return $app;
```

一度コンテナを起動する。
Laravel sail の作るコンテナのネットワークがブリッジなので既にホスト側で 80 番ポート等が使われているとエラーになるので注意。

```bash
./vendor/bin/sail up -d
```

`DB_REFIX` を確実に反映させるためにキャッシュをクリアしておく。

```bash
./vendor/bin/sail artisan config:clear
```

マイグレーションを実行する。

```bash
./vendor/bin/sail artisan migrate
```

| Tables_in_laravel                    |
|--------------------------------------|
| laravel_sakura_cache                 |
| laravel_sakura_cache_locks           |
| laravel_sakura_failed_jobs           |
| laravel_sakura_job_batches           |
| laravel_sakura_jobs                  |
| laravel_sakura_migrations            |
| laravel_sakura_password_reset_tokens |
| laravel_sakura_sessions              |
| laravel_sakura_users                 |

Vite 関連をビルドする。

```bash
./vendor/bin/sail npm install
./vendor/bin/sail npm run build
```

`laravel_sakura/public/build` のディレクトリが作られる。alpine.js などをコンパイルした静的な javascript 等が入っている。

## さくらのレンタルサーバ側作業

将来他の Laravel プロジェクトも置きたいので、サブディレクトリ `www/hogehoge` を作っておく。

```bash
mkdir ~/www/hogehoge
```

Laravel 本体を置くディレクトリを作る。

```bash
mkdir -p ~/src
cd ~/src
```

自端末側から Laravel のソースを持ってきて `src/laravel_sakura` に置く。
持ってくる方法は rsync 使ったり、github 経由で pull したり、やりやすい方法で。

2025-04 時点のさくらのレンタルサーバには `/usr/local/bin/composer.phar` が既に入っていたので、それを使って `composer install` を行う。

```bash
php /usr/local/bin/composer.phar --version
Composer version 2.5.8 2023-06-09 17:13:21

php /usr/local/bin/composer.phar install
```

`.env` を作っておく。
- 基本は自端末側で作ったもの
- APP_ENV は本番環境 (production) にしておく
- APP_DEBUG は false にしておく
- APP_URL は環境に合わせる
- LOG_CHANNEL は daily にしておく
- DB 設定はさくらのレンタルサーバに載ってる情報にあわせる
- メールの設定もさくらのレンタルサーバの情報にあわせる
- APP_PUBLIC_PATH, DB_REFIX は自分で仕込んだやつ


```ini
APP_NAME=Laravel
APP_ENV=production
APP_KEY=base64:xxxx
APP_DEBUG=false
APP_URL=https://exapmle.com/hogehoge

APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US

APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database

APP_PUBLIC_PATH=/home/yyyy/www/hogehoge

PHP_CLI_SERVER_WORKERS=4

BCRYPT_ROUNDS=12

LOG_CHANNEL=daily
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=mysqlxx.yyyy.sakura.ne.jp
DB_PORT=3306
DB_DATABASE=yyyy_zzzz
DB_USERNAME=yyyy_zzzz
DB_PASSWORD=xxxx
DB_REFIX=laravel_sakura_

SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null

BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database

CACHE_STORE=database
# CACHE_PREFIX=

MEMCACHED_HOST=127.0.0.1

REDIS_CLIENT=phpredis
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_SCHEME=null
MAIL_HOST=yyyy.sakura.ne.jp
MAIL_PORT=587
MAIL_USERNAME=yyyy
MAIL_PASSWORD=xxxx
MAIL_FROM_ADDRESS="aaaa@exapmle.com"
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

VITE_APP_NAME="${APP_NAME}"

SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://meilisearch:7700

MEILISEARCH_NO_ANALYTICS=false
```

`src/laravel_sakura/public` の中身を `www/hogehoge` の中にコピーしておく。

```bash
rsync -avz ~/src/laravel_sakura/public/ ~/www/hogehoge/

ls ~/www/hogehoge/
build           favicon.ico     index.php       robots.txt
```

node のインストールもできるらしいが、この記事では自端末でビルドしたものを `www/hogehoge/build` と `src/laravel_sakura/public/build` に置く。

```bash
# 自端末側
laravel_sakura/public/build

# ↓

# さくらのレンタルサーバ側
www/hogehoge/build
src/laravel_sakura/public/build
```

`DB_REFIX` を確実に反映させるためキャッシュをクリアしておく。

```bash
php artisan config:clear
```

マイグレーションを実行する。
production にしているので最初に警告がでるが `Yes` で進める。

```bash
php artisan migrate
```

Laravel の `public` の代わりに `www/hogehoge` を公開ディレクトリとして使うように調整する。`www/hogehoge/.htaccess` に `RewriteBase /hogehoge/` を追記する。

```apache
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On
    RewriteBase /hogehoge/

    # 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]
</IfModule>
```

`~/www/hogehoge/index.php` を書き換えて、`../../src/laravel_sakura` を参照するようにする。

```php
<?php

use Illuminate\Foundation\Application;
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

// Determine if the application is in maintenance mode...
if (file_exists($maintenance = __DIR__.'/../../src/laravel_sakura/storage/framework/maintenance.php')) {
    require $maintenance;
}

// Register the Composer autoloader...
require __DIR__.'/../../src/laravel_sakura/vendor/autoload.php';

// Bootstrap Laravel and handle the request...
/** @var Application $app */
$app = require_once __DIR__.'/../../src/laravel_sakura/bootstrap/app.php';

$app->handleRequest(Request::capture());
```

キャッシュのクリアをしておく。

```bash
php artisan config:clear
php artisan view:clear
php artisan cache:clear
php artisan route:clear
```

ここまででブラウザからアクセスできるようになっている。

## その他

`php artisan route:cache` でキャッシュクリアすると、`405 Method Not Allowed` のエラーになった。`php artisan route:clear` にすると見れるようになったので、`php artisan route:cache` の実行で詰め込まれるルートキャッシュが何かおかしいのかも？