From bfe5897232cf0022e5249012acaf057930c3f87f Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 3 Nov 2025 10:47:27 +0100 Subject: [PATCH] Fix NEXT_PUBLIC environment variables for production builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: - NEXT_PUBLIC_* variables must be baked into Next.js build at BUILD TIME - Setting them in docker-compose is too late (bundle already built) - This caused "NEXT_PUBLIC_WREN_API_TOKEN is undefined" errors in production Solution: 1. Updated Dockerfile to accept ARG values for all NEXT_PUBLIC_* variables 2. Set ARGs as ENV variables before npm run build (lines 15-26) 3. Updated CI/CD workflow to pass build-args from Gitea secrets/vars 4. Variables are now baked into the image during build Next Steps: 1. Add these secrets to Gitea repository settings: - NEXT_PUBLIC_WREN_API_TOKEN - NEXT_PUBLIC_FORMSPREE_CONTACT_ID - NEXT_PUBLIC_FORMSPREE_OFFSET_ID - NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY 2. Add this variable to Gitea repository settings: - NEXT_PUBLIC_API_BASE_URL 3. Next push will build image with variables baked in 4. Can simplify docker-compose (remove NEXT_PUBLIC_* from web service) Files Changed: - Dockerfile: Added ARG and ENV declarations before build step - .gitea/workflows/build-deploy.yml: Added build-args to frontend image build 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .gitea/workflows/build-deploy.yml | 6 ++++++ Dockerfile | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/build-deploy.yml b/.gitea/workflows/build-deploy.yml index 39cf9f1..7c5f743 100644 --- a/.gitea/workflows/build-deploy.yml +++ b/.gitea/workflows/build-deploy.yml @@ -30,6 +30,12 @@ jobs: file: ./Dockerfile platforms: linux/amd64 push: true + build-args: | + NEXT_PUBLIC_API_BASE_URL=${{ vars.NEXT_PUBLIC_API_BASE_URL }} + NEXT_PUBLIC_WREN_API_TOKEN=${{ secrets.NEXT_PUBLIC_WREN_API_TOKEN }} + NEXT_PUBLIC_FORMSPREE_CONTACT_ID=${{ secrets.NEXT_PUBLIC_FORMSPREE_CONTACT_ID }} + NEXT_PUBLIC_FORMSPREE_OFFSET_ID=${{ secrets.NEXT_PUBLIC_FORMSPREE_OFFSET_ID }} + NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${{ secrets.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY }} tags: | ${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }}:frontend-latest ${{ vars.REGISTRY_HOST }}/${{ vars.REGISTRY_USERNAME }}/${{ vars.IMAGE_NAME }}:frontend-main-${{ github.sha }} diff --git a/Dockerfile b/Dockerfile index 7fb0bd6..5c24034 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,8 +10,23 @@ RUN npm ci # Copy the rest of the app COPY . . +# Accept build arguments for NEXT_PUBLIC_ variables +# These MUST be provided at build time +ARG NEXT_PUBLIC_API_BASE_URL +ARG NEXT_PUBLIC_WREN_API_TOKEN +ARG NEXT_PUBLIC_FORMSPREE_CONTACT_ID +ARG NEXT_PUBLIC_FORMSPREE_OFFSET_ID +ARG NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY + +# Set as environment variables so Next.js can bake them into the build +ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL +ENV NEXT_PUBLIC_WREN_API_TOKEN=$NEXT_PUBLIC_WREN_API_TOKEN +ENV NEXT_PUBLIC_FORMSPREE_CONTACT_ID=$NEXT_PUBLIC_FORMSPREE_CONTACT_ID +ENV NEXT_PUBLIC_FORMSPREE_OFFSET_ID=$NEXT_PUBLIC_FORMSPREE_OFFSET_ID +ENV NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=$NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY + # Build Next.js app (standalone mode) -# Environment variables with NEXT_PUBLIC_ prefix are baked in at build time +# NEXT_PUBLIC_ variables are now baked in at build time RUN npm run build # Production Stage - Next.js standalone server