# ── Dev stage ──────────────────────────────────────────────────────── FROM node:20-slim AS dev WORKDIR /app COPY package.json package-lock.json* ./ RUN npm install COPY . . EXPOSE 4321 CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"] # ── Build stage ────────────────────────────────────────────────────── FROM node:20-slim AS build WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci COPY . . RUN npm run build # ── Prod stage ─────────────────────────────────────────────────────── FROM caddy:2-alpine AS prod COPY --from=build /app/dist /srv # Simple Caddyfile for serving the static Astro build RUN echo ':4321 {\n\ root * /srv\n\ encode gzip\n\ try_files {path} {path}/index.html /index.html\n\ file_server\n\ header {\n\ X-Content-Type-Options nosniff\n\ X-Frame-Options DENY\n\ Referrer-Policy strict-origin-when-cross-origin\n\ }\n\ }' > /etc/caddy/Caddyfile EXPOSE 4321 CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile"]