Newer
Older
mobile.raikyakun.app / switch-mode.sh
nutrition 11 hours ago 3 KB 直接入力対応
#!/usr/bin/env bash
# mobile コンテナのビルドモード切り替え & 本番成果物のパッケージング。
#
#   ./switch-mode.sh prod      本番ビルドモードへ
#   ./switch-mode.sh dev       dev モードへ
#   ./switch-mode.sh status    現在のモードを表示 (restart しない)
#   ./switch-mode.sh package   本番ビルド成果物を tar に固める (restart しない)
#
# prod/dev: node/.prod-mode マーカーの有無を docker-compose.yml の command が判定する。
# このスクリプトはマーカーを set/clear して `docker compose restart node` する。
# prod は restart 後、コンテナ内の yarn build 完了 (next start の "Ready") まで待つ
# ので、戻ってきたらそのまま package できる。
# package: ./build を呼び、standalone/static/public の3つを tar.gz 化する
# (モード切り替えとは別の責務だが、本番反映フローを1コマンドに集約するため同居。
#  Next.js の `next export` (静的HTML出力) とは無関係なので名前を package にしている)。
set -euo pipefail
cd "$(dirname "$0")"

MARKER=node/.prod-mode
BUILD_TIMEOUT=900   # ビルド完了待ちのタイムアウト (秒)

case "${1:-}" in
	prod)
		touch "$MARKER"
		echo "→ prod build mode (yarn build && yarn start)"
		docker compose restart node
		echo "→ コンテナ内で yarn build 実行中… 完了まで待機します (数分かかります)"
		deadline=$(( $(date +%s) + BUILD_TIMEOUT ))
		while true; do
			# tee がログを truncate するので [run] 行が見えれば再起動後の新しい run。
			log=$(docker compose exec -T node tail -n 200 /tmp/next-dev.log 2>/dev/null || true)
			if echo "$log" | grep -q '\[run\] prod build mode'; then
				if echo "$log" | grep -qE 'Ready in|✓ Ready'; then
					echo "✓ build 完了・サーバー起動済み"
					break
				fi
				if echo "$log" | grep -qE 'Failed to compile|error Command failed|Build error occurred'; then
					echo "✗ build 失敗。ログ: docker compose logs --tail=80 node" >&2
					exit 1
				fi
			fi
			if [ "$(date +%s)" -ge "$deadline" ]; then
				echo "✗ タイムアウト ($((BUILD_TIMEOUT/60))分)。ログ: docker compose logs --tail=80 node" >&2
				exit 1
			fi
			sleep 5
		done
		echo "次: ./switch-mode.sh package で成果物を tar 化"
		exit 0
		;;
	dev)
		rm -f "$MARKER"
		echo "→ dev mode (yarn dev)"
		docker compose restart node
		echo "done. ログ: docker compose logs -f node  (または ssh raikyakun-mobile 'tail -f /tmp/next-dev.log')"
		exit 0
		;;
	status)
		if [ -f "$MARKER" ]; then
			echo "current: prod build mode"
		else
			echo "current: dev mode"
		fi
		exit 0
		;;
	package)
		if [ ! -d node/build/standalone ]; then
			echo "error: node/build/standalone が無い。先に './switch-mode.sh prod' で本番ビルドを完了させてください。" >&2
			exit 1
		fi
		echo "→ 本番成果物を tar に固めます (standalone / static / public)"
		./build
		ls -lh standalone.tar.gz static.tar.gz public.tar.gz
		echo "done. この3つを本番先へ展開してください。"
		exit 0
		;;
	*)
		echo "usage: $0 {prod|dev|status|package}" >&2
		exit 1
		;;
esac