CI / ci (push) Successful in 2m13s
- /privacy/ page covering the contact form (Formspree), Umami, GA4 and server logs; linked from the footer - Analytics.astro: GA4 alongside Umami, both limited to the production host so staging and local builds are not counted - Dockerfile ARGs + CI build args from repo Actions variables GA_MEASUREMENT_ID and UMAMI_WEBSITE_ID (non-secret)
33 lines
1.3 KiB
Docker
33 lines
1.3 KiB
Docker
# syntax=docker/dockerfile:1
|
|
FROM node:22-alpine AS deps
|
|
WORKDIR /app
|
|
COPY package.json package-lock.json* ./
|
|
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"
|
|
ARG PUBLIC_GA_MEASUREMENT_ID=""
|
|
ARG PUBLIC_UMAMI_SRC="https://stats.bluecapstrategies.com/script.js"
|
|
ARG PUBLIC_UMAMI_WEBSITE_ID=""
|
|
ENV PUBLIC_CONTACT_FORM_ENDPOINT=$PUBLIC_CONTACT_FORM_ENDPOINT \
|
|
PUBLIC_SITE_URL=$PUBLIC_SITE_URL \
|
|
PUBLIC_GA_MEASUREMENT_ID=$PUBLIC_GA_MEASUREMENT_ID \
|
|
PUBLIC_UMAMI_SRC=$PUBLIC_UMAMI_SRC \
|
|
PUBLIC_UMAMI_WEBSITE_ID=$PUBLIC_UMAMI_WEBSITE_ID
|
|
COPY --from=deps /app/node_modules ./node_modules
|
|
COPY . .
|
|
RUN npm run build
|
|
|
|
FROM nginx:1.27-alpine AS runtime
|
|
COPY deploy/nginx.conf /etc/nginx/conf.d/default.conf
|
|
COPY --from=build /app/dist /usr/share/nginx/html
|
|
EXPOSE 80
|
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
CMD wget -qO- http://127.0.0.1/healthz || exit 1
|