Isolate next dev from production .next, add build-guard/atomic deploy/health watchdog, error boundaries, and fix JWT startup, meetup leaks, media path traversal, SVG/memory uploads, and JSON-LD escaping. Co-authored-by: Cursor <cursoragent@cursor.com>
44 lines
1.9 KiB
Bash
Executable File
44 lines
1.9 KiB
Bash
Executable File
#!/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
|