Guided Build Lab — Phase 34: Production Deployment
Purpose
Deploy the real topology—Next.js, NestJS image, Supabase services, migrations, domains/TLS/CORS, secrets, health checks, smoke tests, and rollback—as one release system.
Deliverable
Staging and production deployment runbooks with release identity, environment matrix, smoke tests, and rollback procedure.
Before you touch the code
Open the previous phase checkpoint, run the repository's verification commands, and make sure Git is clean. A guided lab is useful only when you know which change introduced a failure. Write down the current browser/API/database behavior you expect before modifying anything.
Architecture trace
verified commit/artifact -> migration gate -> Vercel web + API host -> Supabase prod services -> DNS/TLS -> smoke test -> monitor/rollback
Read this flow left to right, then right to left. For each arrow, say what data crosses the boundary, which side trusts the other, and what evidence would prove that this boundary works. This habit prevents framework APIs from becoming disconnected memorization.
Step 1 — Create separate staging/production environment matrices before entering any dashboard values.
Do the smallest version of this step first. After the change, stop and verify it before continuing. Use terminal output, HTTP responses, browser DevTools, tests, or database inspection depending on the boundary. If the result differs from your prediction, do not add more code; explain the mismatch and fix the earliest failing assumption.
Step 2 — Deploy Next.js from the intended monorepo root with public/server env vars separated.
Do the smallest version of this step first. After the change, stop and verify it before continuing. Use terminal output, HTTP responses, browser DevTools, tests, or database inspection depending on the boundary. If the result differs from your prediction, do not add more code; explain the mismatch and fix the earliest failing assumption.
Step 3 — Deploy the exact API container artifact and verify bind address, PORT, and readiness endpoint.
Do the smallest version of this step first. After the change, stop and verify it before continuing. Use terminal output, HTTP responses, browser DevTools, tests, or database inspection depending on the boundary. If the result differs from your prediction, do not add more code; explain the mismatch and fix the earliest failing assumption.
Step 4 — Apply database migrations as a controlled release step and document backward-compatibility assumptions.
Do the smallest version of this step first. After the change, stop and verify it before continuing. Use terminal output, HTTP responses, browser DevTools, tests, or database inspection depending on the boundary. If the result differs from your prediction, do not add more code; explain the mismatch and fix the earliest failing assumption.
Step 5 — Configure custom domains/TLS and the exact CORS/redirect origins for production.
Do the smallest version of this step first. After the change, stop and verify it before continuing. Use terminal output, HTTP responses, browser DevTools, tests, or database inspection depending on the boundary. If the result differs from your prediction, do not add more code; explain the mismatch and fix the earliest failing assumption.
Step 6 — Run a smoke-test checklist and practice rollback of code while reasoning about whether the database migration is reversible.
Do the smallest version of this step first. After the change, stop and verify it before continuing. Use terminal output, HTTP responses, browser DevTools, tests, or database inspection depending on the boundary. If the result differs from your prediction, do not add more code; explain the mismatch and fix the earliest failing assumption.
Checkpoint
When the lab works, inspect git diff. Remove accidental debugging output and unrelated edits. Run type checking/tests/build commands relevant to this phase. Commit the checkpoint with a message that describes the capability added, not merely the files changed.
Explain-back
Without looking at the lesson, explain why each layer in the architecture trace exists, what this phase added to TaskFlow, and what would break if the new responsibility were moved to the wrong layer. If you cannot explain the boundary, repeat the trace before moving on.