# Shared build: generates /dist (Astro site + admin SPA) and tina/__generated__ FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --legacy-peer-deps COPY . . ENV TINA_PUBLIC_IS_LOCAL=true RUN npm run build:tina # Frontend: Nginx serving the static site + TinaCMS admin SPA FROM nginx:alpine AS frontend RUN rm /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx/conf.d/default.conf COPY --from=builder /app/dist /usr/share/nginx/html EXPOSE 80 # Backend: TinaCMS self-hosted API server FROM node:20-alpine AS backend WORKDIR /app COPY package*.json ./ RUN npm ci --legacy-peer-deps --omit=dev COPY backend/ ./backend/ COPY --from=builder /app/tina/__generated__ ./tina/__generated__ ENV NODE_ENV=production EXPOSE 3000 CMD ["node", "backend/index.js"]