{} CodeLift

Laravel + Vue Starter Kit を Docker で検証して改良した fork を公開

公式の laravel/vue-starter-kit(Inertia + Vue 3 + shadcn-vue + Fortify)を Docker で動かし、本番運用に耐える形に書き直したフォークを公開する。結果は React 版と完全対応の 8 commits(Laravel backend が両 Starter で共通なので findings も同一)、テストは 40 passed → 44 passed / 151 assertions。Vue 独自に知りたい人が…

公開 2026-04-19 検証 2026-04-19 更新 2026-04-19

検証環境

  • PHP 8.5.5
  • Laravel 13.5.0
  • Composer 2.9.7
  • Node 22.22.2
  • npm 10.9.7
  • Frontend Vue 3 (Composition API) + Inertia
  • Database SQLite (tests)
  • OS Docker Desktop (php:8.5-cli-bookworm)

Laravel + Vue Starter Kit を Docker で検証して改良した fork を公開

公式の laravel/vue-starter-kit(Inertia + Vue 3 + shadcn-vue + Fortify)を Docker で動かし、本番運用に耐える形に書き直したフォークを公開する。結果は React 版と完全対応の 8 commits(Laravel backend が両 Starter で共通なので findings も同一)、テストは 40 passed → 44 passed / 151 assertions。Vue 独自に知りたい人が React 記事まで戻らなくて済むよう、Vue fork 単体で完結した作業ログとして記録した。

姉妹記事:

対象の公式サンプル

項目
名前 Laravel + Vue Starter Kit
公式 URL https://github.com/laravel/vue-starter-kit
概要 Laravel 13 + Inertia + Vue 3 + Composition API + shadcn-vue + Fortify
元ライセンス MIT
改良版ライセンス MIT

検証日

2026-04-19

検証環境

すべて Docker Desktop 上のコンテナ内で実施(CodeLift spec §5-6)。

項目
基盤イメージ php:8.5-cli-bookworm + Node 22
PHP 8.5.5
Laravel Framework 13.5.0
Composer 2.9.7
Node / npm 22.22.2 / 10.9.7
フロント Vue 3 (Composition API) + Inertia
テスト用 DB SQLite
上流 commit laravel/vue-starter-kit@1233a92

公式版の評価

docker compose run --rm app 一発で 40 passed (136 assertions)、22.99s。Vite ビルドも通る。テンプレートとしての完成度は React 版と同じで高い。

そのうえで Laravel backend 由来の改善余地が 8 件残っている。Fortify 設定、AppServiceProviderbootstrap/app.phpconfig/logging.php などは React 版と同一コードなので、findings は完全対応する。「同じ指摘を別のリポに適用するだけ?」と言えばその通りだが、fork と diff を別個に公開しないと Vue チームは取り込みようがないので独立記事として切った。

改良方針と具体的な改善点

長い説明は React 版記事に書いたので、ここでは 変更箇所とポイント を列挙する。各 finding の背景を知りたい場合は姉妹記事を参照。

A. composer install 前に npm run build するとビルドが失敗する

@laravel/vite-plugin-wayfinderphp artisan wayfinder:generate を shell out する構造は React 版と同じ。

改良: README に Setup セクションを追加。composer installnpm run build の順を明記。

B. .env.example が開発用デフォルトのみ

APP_DEBUG=true / LOG_LEVEL=debug / SESSION_ENCRYPT=false / SESSION_SECURE_COOKIE なし。

改良: 該当キーにインラインコメントで production 推奨値を併記。

C. config/app.php の timezone が文字列リテラル

config/app.php:68'timezone' => 'UTC'APP_TIMEZONE が効かない。

改良:

-    'timezone' => 'UTC',
+    'timezone' => env('APP_TIMEZONE', 'UTC'),

D. セキュリティレスポンスヘッダの middleware が無い

bootstrap/app.phpHandleAppearance / HandleInertiaRequests / AddLinkHeadersForPreloadedAssets の 3 つだけ。CSP / HSTS / nosniff / X-Frame-Options / Referrer-Policy / Permissions-Policy が全部無い。

改良: app/Http/Middleware/SetSecurityHeaders.php を新規作成、web stack 末尾に登録。

  • 全環境: nosniff / X-Frame-Options: SAMEORIGIN / Referrer-Policy: strict-origin-when-cross-origin / Permissions-Policy
  • 本番のみ: Strict-Transport-Security / Content-Security-Policy

CSP は 'unsafe-inline' を script-src に残してある。これは フロントが React でも Vue でも共通 で、Inertia が初期 props を <script> inline で出力するため。将来は nonce-based に切り替える余地あり(その際 HandleInertiaRequests 側で nonce 払い出し)。

テスト 2 件追加(tests/Feature/SecurityHeadersTest.php)。

E. HTTPS scheme 強制ヘルパーが無い

リポ全域に forceScheme / forceHttps が 0 件。TLS を proxy で終端する構成で mixed-scheme URL が吐かれる。

改良: AppServiceProvider::configureDefaults に 3 行追加。

if (app()->isProduction()) {
    URL::forceScheme('https');
}

F. パスワード強度ルール → 既対応

React 版と同じく、AppServiceProvider::configureDefaults に以下がすでに入っている:

Password::defaults(fn (): ?Password => app()->isProduction()
    ? Password::min(12)->mixedCase()->letters()->numbers()->symbols()->uncompromised()
    : null,
);

変更なし。公式のこの設定を見落として「デフォルトのまま」と誤認しないよう、改めて記録しておく。

G. ログインのレート制限が email+IP の 1 段のみ

IP ローテーションでバイパス可能。

改良: 2 段構えに変更。

return [
    Limit::perMinute(5)->by($email.'|'.$ip),       // burst guard
    Limit::perHour(20)->by('login-account|'.$email), // account cumulative
];

H. 2FA は機能として存在するが運用強制の入口が無い

Fortify feature として有効化・UI・テスト揃い済み。管理者に 2FA 必須化するポリシーヘルパー / リマインダーが無いのは defect ではなく運用設計の判断。コード変更なし、議論項目として残す。

I. ログチャンネルがサブシステム別に分かれていない

config/logging.php は stack → single stream。認証イベントが他ログに埋もれる。

改良: 2 ファイル変更。

  1. config/logging.phpauth チャンネル追加(daily、90 日保持、LOG_AUTH_LEVEL / LOG_AUTH_DAYS で env 可変)
  2. app/Listeners/AuthActivitySubscriber.php 新規作成、AppServiceProvider::bootEvent::subscribe

subscriber が処理するイベント:

  • Illuminate\Auth\Events\Registered / Login / Logout / Failed / PasswordReset
  • Laravel\Fortify\Events\TwoFactorAuthenticationEnabled / TwoFactorAuthenticationDisabled

各レコードに user_id / email / ip / user_agent を構造化コンテキストで出す。テスト 2 件(tests/Feature/Auth/AuthLoggingTest.php)。

J. 設定画面のレート制限が password endpoint だけ

routes/settings.php で throttle が明示されているのは settings/password のみ。

改良: profile update に throttle:10,1、profile destroy に throttle:3,1(アカウント削除は terminal なので絞る)。

before / after 比較

観点 公式版 改良版
php artisan test 40 passed / 136 assertions 44 passed / 151 assertions
Setup 順序ドキュメント なし README に明記
.env.example に production 値 なし インラインコメント
APP_TIMEZONE を env 経由 不可(ハードコード)
基本 security headers 一切無し 常時 4 種 + 本番のみ HSTS / CSP
HTTPS scheme 強制 なし 本番のみ forceScheme('https')
ログインのレート制限 email+IP の 1 段 email+IP + email 単体の 2 段
認証イベントのログ 他と混在 専用 auth daily channel(90 日)
settings endpoints のレート制限 password のみ profile update / destroy にも

どのケースでこの改良版が向くか

  • laravel/vue-starter-kit をテンプレに本番プロダクトを立ち上げる予定で、Vue 側 + Laravel 側の両方で production 基礎を整えたい
  • 既にスキャフォールド済みのプロジェクトに cherry-pick で部分適用したい
  • React か Vue かで迷っていて、「どちらにしても backend hardening は同じ作業量」を確認したい(答え: 同じ)

React 版との使い分け

フロントエンドを React にするか Vue にするかは好み・採用市場・既存コード資産で決まる。Laravel backend の production 整備コストは両者で同一なので、ここでは技術選定の決め手にならない。

(3 本目の比較記事で React / Vue / Livewire の starter kit を production 観点で並べる予定)

再現と取り込み

改良版は improvements ブランチ。手元で走らせる場合:

git clone https://github.com/codelift-dev/vue-starter-kit.git
cd vue-starter-kit
git checkout improvements
docker compose -f codelift/docker-compose.yml build
docker compose -f codelift/docker-compose.yml run --rm app

本体差分だけ見たい場合(CodeLift 検証用ファイルを除外):

git diff main improvements -- . ':!codelift'

各 commit は独立なので cherry-pick 可能。

ライセンス / 法務

  • 元サンプル: MIT(Laravel LLC / 開発チーム)
  • 改良版: MIT(CodeLift / JIT 株式会社)

本記事内の検証結果は検証日時点のもの。以降の upstream 更新により状況は変わる可能性がある。

この記事を含む比較

関連記事