From 277ff29298df22a160b8fa047beca2d20410ac17 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 15 May 2026 01:21:58 -0700 Subject: [PATCH] feat: add Dockerfile, captain-definition, and production-ready Nginx configuration for deployment --- Dockerfile | 26 ++++++++++++++++++++++++++ captain-definition | 4 ++++ nginx.conf | 23 +++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 Dockerfile create mode 100644 captain-definition create mode 100644 nginx.conf diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..396d7e6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +# ── Stage 1: Build ────────────────────────────────────────────── +FROM node:22-alpine AS builder + +WORKDIR /app + +COPY package*.json ./ +RUN npm ci + +COPY . . +RUN npm run build + +# ── Stage 2: Serve ────────────────────────────────────────────── +FROM nginx:stable-alpine + +# Remove default nginx static assets +RUN rm -rf /usr/share/nginx/html/* + +# Copy built output from builder +COPY --from=builder /app/dist /usr/share/nginx/html + +# nginx config — SPA-friendly: route all 404s back to index.html +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/captain-definition b/captain-definition new file mode 100644 index 0000000..0e14f82 --- /dev/null +++ b/captain-definition @@ -0,0 +1,4 @@ +{ + "schemaVersion": 2, + "dockerfilePath": "./Dockerfile" +} diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..1f90847 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,23 @@ +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + # Gzip + gzip on; + gzip_types text/plain text/css application/javascript application/json image/svg+xml; + gzip_min_length 1024; + + # Cache static assets aggressively (Vite hashes filenames) + location ~* \.(?:js|css|woff2?|png|jpg|jpeg|webp|svg|ico)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + # SPA fallback — always serve index.html for unknown routes + location / { + try_files $uri $uri/ /index.html; + } +}