diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 7a20c09..98d0d31 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -94,7 +94,14 @@ jobs: - name: Build & push image to Gitea Packages run: | echo "${{ secrets.CI_TOKEN }}" | docker login 10.66.15.22:3000 -u "${{ github.repository_owner }}" --password-stdin - docker build -t "$PUSH_IMAGE:${{ steps.tag.outputs.sha }}" -t "$PUSH_IMAGE:latest" . + # PUBLIC_* values are inlined at build time (static Astro) — they cannot be supplied at + # deploy time. CONTACT_FORM_ENDPOINT is the Formspree URL; set it as a repo Actions + # secret. If it is empty the build still succeeds and the contact form degrades to a + # mailto draft, so a missing secret is survivable but should be caught in review. + docker build \ + --build-arg PUBLIC_CONTACT_FORM_ENDPOINT="${{ secrets.CONTACT_FORM_ENDPOINT }}" \ + --build-arg PUBLIC_SITE_URL="https://www.bluecapstrategies.com" \ + -t "$PUSH_IMAGE:${{ steps.tag.outputs.sha }}" -t "$PUSH_IMAGE:latest" . # Registry pushes can time out on a slow blob; docker push is resumable, so retry. push_retry() { for i in 1 2 3 4 5; do diff --git a/Dockerfile b/Dockerfile index 00b0f59..5f20126 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,14 @@ RUN npm ci FROM node:22-alpine AS build WORKDIR /app +# Astro is a STATIC build: import.meta.env.PUBLIC_* is inlined into the HTML here, at image build +# time. A runtime env var on the pod can never reach it (the pod only runs nginx over pre-built +# files), so anything the browser needs must arrive as a build arg. CI passes these; see +# .gitea/workflows/ci.yml. +ARG PUBLIC_CONTACT_FORM_ENDPOINT="" +ARG PUBLIC_SITE_URL="https://www.bluecapstrategies.com" +ENV PUBLIC_CONTACT_FORM_ENDPOINT=$PUBLIC_CONTACT_FORM_ENDPOINT \ + PUBLIC_SITE_URL=$PUBLIC_SITE_URL COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build diff --git a/k8s/configmap.yaml b/k8s/configmap.yaml index cd486aa..14b1d61 100644 --- a/k8s/configmap.yaml +++ b/k8s/configmap.yaml @@ -1,9 +1,18 @@ +# NOTE: this ConfigMap is NOT consumed by the Deployment, and wiring it up would not help. +# The site is a STATIC Astro build served by nginx — every PUBLIC_* value is inlined into the HTML +# when the image is built, so a runtime env var cannot change it. Configure these as build args in +# .gitea/workflows/ci.yml instead (PUBLIC_CONTACT_FORM_ENDPOINT comes from the CONTACT_FORM_ENDPOINT +# Actions secret). +# +# Kept as documentation of the values the build expects. Do not add envFrom pointing at it — that +# would imply a runtime knob that does not exist. apiVersion: v1 kind: ConfigMap metadata: name: bluecap-website-config namespace: bluecap-strategies data: + # Mirrors the build arg default in the Dockerfile. PUBLIC_SITE_URL: "https://www.bluecapstrategies.com" - # Set to a Formspree, webhook, ntfy, or self-hosted form endpoint before production cutover. + # Real value lives in the CONTACT_FORM_ENDPOINT Actions secret, injected at image build. PUBLIC_CONTACT_FORM_ENDPOINT: "" diff --git a/src/pages/contact.astro b/src/pages/contact.astro index 73f9eab..50f4222 100644 --- a/src/pages/contact.astro +++ b/src/pages/contact.astro @@ -35,6 +35,8 @@ const endpoint = import.meta.env.PUBLIC_CONTACT_FORM_ENDPOINT ?? "";