Laravel + Livewire Starter Kit を Docker で検証して改良した fork を公開
公式の laravel/livewire-starter-kit(Livewire v4 + Flux + Alpine)を Docker Desktop で動かし、本番運用に耐える形に書き直したフォークを公開する。テストは公式版の 33 passed をベースに 37 passed / 92 assertions まで増加、改良は 7 commits。React / Vue 版とは findings の構成が違う点が Livewire 変種の特徴で、本記事はその差分を中心…
検証環境
- PHP 8.5.5
- Laravel 13.x
- Composer 2.9.7
- Node 22.22.2
- npm 10.9.7
- Frontend Livewire v4 + Flux + Alpine
- Database SQLite (tests)
- OS Docker Desktop (php:8.5-cli-bookworm)
Laravel + Livewire Starter Kit を Docker で検証して改良した fork を公開
公式の laravel/livewire-starter-kit(Livewire v4 + Flux + Alpine)を Docker Desktop で動かし、本番運用に耐える形に書き直したフォークを公開する。テストは公式版の 33 passed をベースに 37 passed / 92 assertions まで増加、改良は 7 commits。React / Vue 版とは findings の構成が違う点が Livewire 変種の特徴で、本記事はその差分を中心に記録する。
姉妹記事:
- Laravel + React Starter Kit を Docker で検証して改良した fork を公開
- Laravel + Vue Starter Kit を Docker で検証して改良した fork を公開
対象の公式サンプル
| 項目 | 値 |
|---|---|
| 名前 | Laravel + Livewire Starter Kit |
| 公式 URL | https://github.com/laravel/livewire-starter-kit |
| 概要 | Laravel 13 + Livewire v4 + Flux UI + Alpine + 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.x |
| Composer | 2.9.7 |
| Node / npm | 22.22.2 / 10.9.7 |
| フロント | Livewire v4 + Flux + Alpine |
| テスト用 DB | SQLite |
| 上流 commit | laravel/livewire-starter-kit@62c60c8 |
公式版の評価
docker compose run --rm app 一発で 33 passed (77 assertions)、52s。React / Vue 版の 40 passed よりテスト数が少ないが、これは Livewire 変種が Livewire component テスト経由 でフォームの挙動を検証するため、Inertia HTTP harness を使う React / Vue 側とアサーション数の分布が違うだけ(カバレッジが劣るわけではない)。
React / Vue 版との差分
Laravel backend は共通だが、Livewire 変種では次の点が違う:
| 項目 | React / Vue | Livewire |
|---|---|---|
@laravel/vite-plugin-wayfinder |
採用(Vite build 中に artisan を shell out) | 不採用 |
| Inertia | 使用(初期 props を <script> inline で埋込) |
未使用 |
bootstrap/app.php 既定 middleware |
3 つ(Inertia 系)append 済み | 空(withMiddleware callback の中身が // だけ) |
| settings ルート | PATCH/DELETE の HTTP verb + Controller | Route::livewire(...) + 内部 AJAX action |
結果として React/Vue 版に当てはまった 8 件のうち、Livewire では 7 件が有効、1 件(J)が適用形状を変える必要 がある。
改良方針と具体的な改善点
A. README に Setup セクションを追加(弱体化版)
React/Vue との違い: React/Vue 版で指摘した「composer install 前に npm run build すると Wayfinder 経由で意味不明な autoload エラー」は Livewire 変種では起こらない。vite.config.js に wayfinder プラグインが入っていないため。
ただし Setup セクション自体は公式 README にないので contributor のために追加しておく。
B. .env.example が開発用デフォルトのみ
React/Vue と同じ。該当キーにインラインコメントで production 推奨値を併記。
C. config/app.php の timezone が文字列リテラル
React/Vue と同じ。env('APP_TIMEZONE', 'UTC') に変更。
D. セキュリティレスポンスヘッダの middleware が無い(React/Vue より初期状態が悪い)
Livewire 固有: bootstrap/app.php の withMiddleware() は callback 本体が空(// コメントだけ)。React/Vue 版は 3 つの Inertia 系 middleware が append 済みだったが、Livewire は一切なし。
改良: 新規 SetSecurityHeaders middleware を $middleware->web(append: [...]) で追加(この fork では最初に append される web middleware になる)。
CSP ポリシーは React/Vue と同じ「本番時のみ 'unsafe-inline' 許可」にしている。理論上は Livewire が Inertia のような inline props 埋込をしないので 'unsafe-inline' を外せる余地があるが、Flux コンポーネント / Alpine の実装パターンによっては inline の event handler が出る可能性があり、今回は同じ policy を維持。nonce-based CSP への移行は将来の独立記事で扱う。
テストは tests/Feature/SecurityHeadersTest.php を追加(2 件)。
E. HTTPS scheme 強制ヘルパーが無い
React/Vue と同じ。AppServiceProvider::configureDefaults に URL::forceScheme('https') を本番時だけ追加。
F. パスワード強度ルール → 既対応
React/Vue と同じく、AppServiceProvider に strong Password::defaults が production で入っている。変更なし。
G. ログインのレート制限が email+IP の 1 段のみ
React/Vue と同じ。2 段構え(email+IP per-minute + email 単体 per-hour)に変更。
H. 2FA は有効だがポリシー強制は無し
他変種と同じく運用設計の判断。コード変更なし。
I. ログチャンネルがサブシステム別に分かれていない
React/Vue と同じ。auth チャンネル追加 + AuthActivitySubscriber で認証イベントを構造化ログ出力。テスト 2 件追加。
J. 設定画面のレート制限が password endpoint だけ → Livewire では形が違うので保留
Livewire 固有: routes/settings.php は Route::livewire('settings/profile', ...) でページコンポーネントをレンダリングする形で、プロフィール更新やパスワード変更は Livewire 内部の AJAX エンドポイント (/livewire/update) を経由する。React/Vue 版のように「PATCH settings/profile に throttle を貼る」パターンが効かない(route-level throttle は初期ページロードだけに効き、コンポーネントアクションには効かない)。
正しい対策は「コンポーネントクラス内で RateLimiter::tooManyAttempts を呼ぶ」方式だが、commit の形状が React/Vue と substantively 違う ので、この pass では保留。将来 Livewire 独自の記事で扱う。
before / after 比較
| 観点 | 公式版 | 改良版 |
|---|---|---|
php artisan test |
33 passed / 77 assertions | 37 passed / 92 assertions |
| README Setup セクション | なし | 追加 |
.env.example に production 値 |
なし | インラインコメント |
APP_TIMEZONE を env 経由 |
不可 | 可 |
| 基本 security headers | 一切無し(空の middleware 群) | 常時 4 種 + 本番のみ HSTS / CSP |
| HTTPS scheme 強制 | なし | 本番のみ forceScheme('https') |
| ログインのレート制限 | email+IP の 1 段 | email+IP + email 単体の 2 段 |
| 認証イベントのログ | 他と混在 | 専用 auth daily channel(90 日) |
| settings endpoints の throttle | — | 保留(Livewire 固有の扱い) |
どのケースでこの改良版が向くか
laravel/livewire-starter-kitをベースに本番プロダクトを立ち上げる予定で、Livewire 特有の事情を踏まえた hardening が欲しい- React / Vue と何が違って、何が同じかを把握したい
- Livewire だと CSP をどこまで絞れるのかに興味がある(→ nonce-based CSP は follow-up 記事で扱う)
3 種比較の参考
React / Vue / Livewire の starter kit を production 適性軸で比較する記事を別途準備中。Laravel backend の production 整備コストは React ≈ Vue > Livewire(middleware 初期状態の差で)だが、フロントエンド側の管理コストや Livewire 固有のコンポーネント rate limit などを総合すると単純比較はできない。
再現と取り込み
改良版: improvements ブランチ。
git clone https://github.com/codelift-dev/livewire-starter-kit.git
cd livewire-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 更新により状況は変わる可能性がある。
この記事を含む比較
関連記事
- Laravel + React Starter Kit を Docker で検証して改良した fork を公開 公式の laravel/react-starter-kit(Inertia + React 19 + shadcn/ui + Fortify)を Docker Desktop で実際に動かし、本番運用に耐える形に書き直したフォークを公開する。ドキュメント不足 2 件と Laravel backend 側の実コード改良 6 件で合計 8 commits、テストは公式版の 40 passed をベースに 44 passed / 151 assertions まで増加。以下は検証…
- 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 独自に知りたい人が…
- Laravel + Livewire Starter Kit の CSP を nonce 化 Livewire Starter Kit の Docker 検証・改良版フォークで組んだ SetSecurityHeaders middleware は、Content-Security-Policy の script-src / style-src に 'unsafe-inline' を残していた。これは React / Vue 変種と揃えるための暫定措置で、Livewire 変種では 実際には不要 と前回の記事でも予告した通り。本記事ではその予告を回収する作業ログと、最…