#!/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