fix(tuxedo): copy public/ to standalone, mark storm/founder priority
Deploy to route.crispygoat.com / deploy (push) Successful in 4m17s
Deploy to route.crispygoat.com / deploy (push) Successful in 4m17s
Three issues caused the 'images don't work, video doesn't play' report on https://water.tuxedocorn.com/tuxedo: 1. (ROOT CAUSE) Next.js standalone build was missing .next/standalone/public/. The deploy workflow copied .next/static to .next/standalone/.next/static but never mirrored public/. Without that, the image optimizer returns 400 'url parameter is not allowed' on every local-relative URL — so the brand logo (and favicon, etc.) went blank. Symptom: HTTP 400 on /_next/image?url=%2Fbrand-logos%2F64294306-...%2Flogo.png. Fixed by: - cp -r public/. .next/standalone/public/ on the running server (live) - updating .gitea/workflows/deploy.yml to mirror public/ on every deploy - adding scripts/regression-brand-logos.mjs so this can't regress silently 2. Storm-field and founder-portrait images rendered as 'loading=lazy' and appeared blank above the fold. Marked priority so they preload. 3. Pre-existing build error: Next.js 16.2 RSC bundler treats 'export type { FieldSession }' re-exports through server-action modules as runtime exports ('Export FieldSession doesn't exist in target module'). Removed the re-exports in water-log/auth.ts and field.ts; field.ts now imports FieldSession directly from @/lib/water-log/session-server. Verified live (post-fix) on 2026-07-06: - regression-brand-logos.mjs: HTTP 200 image/png, header+footer logos render with naturalWidth=160 - diag-home-only.mjs: all 6 images complete=true, natural sizes match source (storm 1440x1080, founder 604x340, ear 692x476, etc.) - verify-hero-video.mjs: readyState=4, paused=false, currentTime advancing 2.86s -> 6.87s over 4s (=30fps; the prior 'video doesn't play' was likely user perception — the poster+video look near- identical, and 'net::ERR_ABORTED' on the MP4 is normal Chrome behavior for parallel byte-range requests)
This commit is contained in:
@@ -213,15 +213,26 @@ jobs:
|
||||
# We also need to (1) ship the standalone loader script
|
||||
# `scripts/start-standalone.cjs`, (2) copy `.next/static/` into
|
||||
# `.next/standalone/.next/static/` so the standalone server can
|
||||
# serve client-side JS/CSS chunks, and (3) load `.env` via a
|
||||
# Node loader — bash's `set -a; . ./.env` truncates DATABASE_URL
|
||||
# at the `&` in `&channel_binding=require`.
|
||||
# serve client-side JS/CSS chunks, (3) copy `public/` into
|
||||
# `.next/standalone/public/` (REQUIRED for Next.js standalone —
|
||||
# without it, `/_next/image?url=/brand-logos/...` returns 400
|
||||
# because the optimizer can't resolve local relative paths),
|
||||
# and (4) load `.env` via a Node loader — bash's
|
||||
# `set -a; . ./.env` truncates DATABASE_URL at the `&` in
|
||||
# `&channel_binding=require`.
|
||||
scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no scripts/start-standalone.cjs tyler@route.crispygoat.com:$APP_DIR/scripts/start-standalone.cjs 2>/dev/null || true
|
||||
ssh -o ConnectTimeout=60 -o StrictHostKeyChecking=no tyler@route.crispygoat.com "set -e; cd $APP_DIR && npm install --omit=dev 2>&1 | tail -5 && \
|
||||
# Standalone server reads .next/static/ relative to itself.
|
||||
mkdir -p .next/standalone/.next && \
|
||||
rm -rf .next/standalone/.next/static && \
|
||||
cp -r .next/static .next/standalone/.next/static && \
|
||||
# Next.js standalone REQUIRES public/ in the standalone tree;
|
||||
# without it, the image optimizer returns 400 on local-relative
|
||||
# image URLs (e.g. /brand-logos/.../logo.png) and storefront
|
||||
# logos / favicons go blank. Mirror public/ → .next/standalone/public/.
|
||||
rm -rf .next/standalone/public && \
|
||||
mkdir -p .next/standalone/public && \
|
||||
cp -r public/. .next/standalone/public/ && \
|
||||
# Start with the wrapper that loads .env and exec's the server.
|
||||
# `pm2 start` is idempotent via `pm2 restart` after the first run.
|
||||
pm2 delete route-commerce 2>/dev/null || true; \
|
||||
|
||||
Reference in New Issue
Block a user