Caddyを利用した Next.js 無停止デプロイ(ローカルサーバー)

힘센캥거루
2026년 1월 4일(수정됨)
3
10

ホームページに何かをちょこちょこ載せたくなるたびにビルドしていたら、そのタイミング에 가끔 접속하는人がいるようだった。

そうしているうちに、サーチコンソールでスコアがどんどん下がる現象が起きた。

このままではまずいと思い、無停止デプロイをする方法を考えてみることにした。

Caddyを利用した Next.js 無停止デプロイ(ローカルサーバー)-1

1. プロジェクトフォルダ2つ+ターミナル2つ

答えは意外とシンプルで、ターミナルを2つ開くことだった。

片方で build を回している間、もう片方のターミナルではサーバーが動いている、という形。

問題は、1つのプロジェクト内でターミナルを2つ開いて動かすと衝突が起きること。

片方が正常に動いていても、もう一方のターミナルで build した瞬間に .next フォルダが新しく作られてしまうので、内部エラーが発生し、最終的にホームページが止まってしまう。

Caddyを利用した Next.js 無停止デプロイ(ローカルサーバー)-2

なので、既存のプロジェクトとまったく同じフォルダがもう1つ必要になる。

自分は画像もすべてローカルに保存していたので、blogCopy というコピーしたプロジェクトは、元のフォルダを見るように修正しておいた。

あとは Caddy をいじればよい。

2. Caddy 公式ドキュメント

ChatGPT と Claude もよく分かっていないのか、2つとも変なことばかり言うので、結局公式ドキュメントを見ることにした。

公式ドキュメントに載っていた例は以下のとおり。

example.com {
	reverse_proxy node1:80 node2:80 node3:80 {
		health_uri /healthz
		lb_try_duration 5s
	}
}

ただ、これは3つのノードにリクエストを均等に割り振るもので、今回は別のやり方が必要だった。

AI はずっと下のような方法にこだわっていたが、そのまま入れるとリバースプロキシが止まってしまった。

example.com {
    reverse_proxy localhost:3000 localhost:3001 {
        health_uri /health
        health_interval 5s
        health_timeout 2s
        health_status 200
    }
}

まず、これの問題はどのポートがメインなのかを定義していないこと。

それから、Caddy が5秒ごとにポートをチェックするため、起動してから5秒経つまでは正しいポートに接続できない。

なので、手動で制御することにした。

example.com {
	reverse_proxy localhost:3000 localhost:3001 {
		lb_policy first
	
   		fail_duration 20s
   		max_fails 2
	}
}

単純に、ユーザーの接続失敗を検知してポートを切り替える方式に変えた。

こうしたところ、うまく動作した。

3. 感想

これで思う存分(?)ビルドできるようになった。

たまにビルド中にエラーが出たりすると、サーバーを止めすぎているんじゃないかとヒヤヒヤしていた。

これからはそういう心配はなくなりそうだ。

毎日学んでいるのに、まだまだ学ぶことが次々と出てくるのが不思議だ。

Caddyを利用した Next.js 無停止デプロイ(ローカルサーバー)-3

관련 글

Next.js フルスタックブログ開発記
Next.js フルスタックブログ開発記
Web開発に初めて触れてから1年ほど経った頃、自分だけのブログを持ちたいと思うようになった。そこで、およそ6か月これだけにかかりきりになって作ってみることにした。フロントエンド側の機能については、下記のキム・ドヒョンさんのブログを参考にするだけで十分だと思う。自分も mdx を使ってブログを作るだけ...
Google検索インデックスの自動化 - Web Search Indexing API
Google検索インデックスの自動化 - Web Search Indexing API
前回の IndexNow に続いて、Google でも自動化してみることにした。調べてみると、Google は API として Web Search Indexing というものを提供していた。1. 対象範囲公式にこの API がサポートしている範囲は、求人情報とストリーミング動画サービスである。リ...
検索インデックス生成の自動化 - IndexNow
検索インデックス生成の自動化 - IndexNow
Bingにサイト登録をしている途中で知ったのだが、Bingでは IndexNow という機能を提供している。ポイントは、APIキーを使って、記事を書いた直後にすぐインデックス作成リクエストを飛ばせるということ。下のようなリクエストを fetch で作り、投稿機能に連動させておけば、記事をDBに保存す...
Nextjs、React サーバーがハッキングされた経験
Nextjs、React サーバーがハッキングされた経験
最初にセキュリティ問題に気づいたのは、12月5日の未明だった。React で認証なしにリモートコード実行が可能だということ。そのニュースを見て他の人には共有したものの、自分は大丈夫だろうと思って特に気にも留めなかった。1. ハッキングの痕跡を発見ところが、ブログのコードを更新しようとアクセスしてみる...
ブログに多言語機能を追加する(NextJS・next-intl・Vercel AI SDK)
ブログに多言語機能を追加する(NextJS・next-intl・Vercel AI SDK)
最近、ブログに多言語対応機能が必要だと感じた。そこで next-intl を使って多言語サービスを実装してみることにした。1.i18nまず多言語サービスを行うときには、守るべき原則がある。これを internationalization と呼ぶが、かなり長いので、先頭の i と末尾の n、そしてその...
Nextjsで多言語設定をする方法
Nextjsで多言語設定をする方法
私のブログへのアクセスを増やすためにどうすればいいか考えて、多言語設定を試してみることにしました。さまざまな方法を探しましたが、まずは言語ごとに異なるルーティングをすることから始めることに。next-intlを使って試してみました。1. インストールyarn add next-intl2. 適用適用は少し面倒ですが、次のような手順で進めれば大丈夫です。

댓글을 불러오는 중...