php artisan down — アプリをメンテナンスモードにする

artisan
  • カテゴリ: artisan
  • 掲載バージョン: Laravel 12・PHP 8.4
  • コマンド: php artisan down
  • 関連: up, config:cache, route:cache, view:clear
  • 変更履歴: Laravel 8 以降でオプション体系が整理(secret / with-secret / render など)

要点(TL;DR)

  • 公開中アプリを 503(メンテナンス) 状態に切り替える
  • 最低限の使い方: php artisan down
  • よくある罠
    • 複数台構成で 特定サーバだけ down になってない(ファイル方式の場合) (Laravel)
    • 依存更新中にアクセスされると、503 すら返せずエラーになることがある → --render で事前レンダ (Laravel)
    • secret をURLに含めるので 文字種(? &など)に注意 (Laravel)

概要

php artisan down は、Laravel アプリをメンテナンスモードに切り替え、通常リクエストへメンテナンス用レスポンスを返します。デプロイ中の一時停止や、障害対応で意図的にアクセスを抑止したいときに使います。依存更新のタイミング次第では 503 表示前に落ちうるため、実運用ではオプション併用が定石です。 (Laravel)

構文 / シグネチャ

php artisan down
php artisan down --refresh=15
php artisan down --retry=60
php artisan down --secret="TOKEN"
php artisan down --with-secret
php artisan down --render="errors::503"
php artisan down --redirect=/

オプション

オプション必須既定値説明
--refreshintなしRefresh ヘッダを付与し、指定秒数後にブラウザ更新を促す (Laravel)
--retryintなしRetry-After ヘッダを指定秒数で返す(ブラウザは無視しがち) (Laravel)
--secretstringなし指定トークンのURLにアクセスするとバイパスクッキーを発行し、メンテ中でも閲覧可能にする (Laravel)
--with-secret(flag)なしLaravel にトークン生成させる。メンテ移行後に表示される (Laravel)
--renderview名なしメンテ表示用ビューを 事前レンダ(依存更新中のエラー回避に有効) (Laravel)
--redirectパスなしすべてのリクエストを指定URLへリダイレクト (Laravel)
  • 戻り値:なし
  • 例外/副作用:メンテナンス状態の切替(デフォルトはファイル方式)。複数サーバで状態を揃えるにはキャッシュ方式も検討 (Laravel)

使用例

最小例

php artisan down

実務例(デプロイで「落ちる前提」を潰す)

# 依存更新中でもメンテ画面を返せるよう、事前レンダビューを使う
php artisan down --render="errors::503" --refresh=15

# ここで composer install / migrate / cache などを実行…

php artisan up

--render を付けると、テンプレートエンジンや依存が完全に起動する前に返せるメンテビューを用意でき、デプロイ中の取りこぼしを減らせます。 (Laravel)

実務例(管理者だけバイパス)

php artisan down --with-secret
# 表示されたトークンURL(例: https://example.com/{token})へ管理者だけアクセスしてクッキー発行

トークンはURLに載るため、英数字+ダッシュ中心にし、?& など意味を持つ文字は避けます。 (Laravel)

よくある落とし穴・注意

  • 複数サーバ構成(LB配下など)
    デフォルトはファイル方式なので、各サーバで down が必要です。1台だけ down しても他が生きていると挙動が割れます。 (Laravel)
    1回の実行で全台に反映したいなら、.env のメンテナンスドライバをキャッシュ方式へ(共有ストア必須)。 (Laravel)
  • キューは処理されない
    メンテ中はキュージョブが処理されず、up 後に再開します(停止して見えるのは正常)。 (Laravel)
  • 「メンテに入れる=安全」ではない
    down 実行直後に依存更新を始めると、レースでエラーが見えることがあります。--render を優先。 (Laravel)

代替・関連APIとの比較

  • down / up:アプリ側で 503 を返す(手軽、単体〜中規模向け)
  • ロードバランサ/リバプロで切替:アプリを触らず遮断(大規模・ゼロダウンタイム構成向け)
  • マネージド基盤のゼロダウンタイムデプロイ:そもそも down に頼らない選択肢 (Laravel)

選定基準:単体運用・短時間停止なら down、複数台/無停止要件ならインフラ側で吸収

テスト例(Pest)

use Illuminate\Support\Facades\Artisan;

it('can toggle maintenance mode', function () {
    Artisan::call('down', ['--render' => 'errors::503']);
    expect(app()->isDownForMaintenance())->toBeTrue();

    Artisan::call('up');
    expect(app()->isDownForMaintenance())->toBeFalse();
});

トラブルシュート(エラー別)

症状/エラー原因対処
503 が出ず 500/白画面になる依存更新中で起動できずメンテ判定前に落ちているphp artisan down --render="errors::503" を使う (Laravel)
サーバによってメンテ表示が出ない複数サーバで down 実行が揃っていない(ファイル方式)全サーバで down / もしくはキャッシュ方式へ (Laravel)
管理者が入れないsecret のURLにアクセスしていない / トークンが不適切トークンURLへアクセスしてクッキー発行、文字種注意 (Laravel)

スケジューラ例(定期メンテ用途)

// app/Console/Kernel.php

protected function schedule(\Illuminate\Console\Scheduling\Schedule $schedule): void
{
    // 例:毎週日曜 03:00 にメンテ開始(定期メンテのときだけ)
    $schedule->command('down --render="errors::503" --refresh=30')->sundays()->at('03:00');
}

※ デプロイ用途は “開始と終了” の制御が必要なので、基本は CI/CD の手順内で down→作業→up を明示するのが安全です。

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする