#!/usr/bin/env bash # # Guard against serving a corrupted / dev-contaminated Next.js production build. # # Runs as an ExecStartPre for bbe-frontend.service. A stray `next dev` against # the production checkout overwrites .next/build-manifest.json (and friends) with # development artifacts, which makes every request-time route 500. Rather than # let the server boot and silently serve errors for days, we refuse to start and # log a clear, actionable message. # # Exit codes: 0 = build looks like a valid production build, non-zero otherwise. set -euo pipefail # Resolve the frontend dir relative to this script so it works regardless of cwd. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" FRONTEND_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" NEXT_DIR="${FRONTEND_DIR}/.next" fail() { echo "verify-prod-build: FATAL: $1" >&2 echo "verify-prod-build: run 'npm run build' (or scripts/deploy-frontend.sh) to produce a clean production build." >&2 exit 1 } [ -d "${NEXT_DIR}" ] || fail "no .next directory at ${NEXT_DIR}" [ -f "${NEXT_DIR}/BUILD_ID" ] || fail ".next/BUILD_ID is missing (incomplete or wiped build)" [ -f "${NEXT_DIR}/build-manifest.json" ] || fail ".next/build-manifest.json is missing" [ -f "${NEXT_DIR}/app-build-manifest.json" ] || fail ".next/app-build-manifest.json is missing" [ -f "${NEXT_DIR}/prerender-manifest.json" ] || fail ".next/prerender-manifest.json is missing (dev builds omit it)" # A dev run leaves .next/static/development/ behind; production never has it. if [ -d "${NEXT_DIR}/static/development" ]; then fail ".next/static/development exists — this .next was contaminated by 'next dev'" fi # Development manifests reference static/development/* chunks; production ones don't. if grep -q "static/development" "${NEXT_DIR}/build-manifest.json" 2>/dev/null; then fail "build-manifest.json references static/development — dev build detected" fi echo "verify-prod-build: OK (BUILD_ID=$(cat "${NEXT_DIR}/BUILD_ID"))" exit 0