floter.design/Dockerfile
2026-02-16 12:00:12 +01:00

44 lines
1.1 KiB
Docker

# Multi-stage build for SvelteKit app (environment-agnostic)
# Stage 1: Build
FROM node:24.13.1-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --legacy-peer-deps
# Build-time args (for VITE_PUBLIC_* variables - these are public anyway)
ARG VITE_PUBLIC_CLOUDINARY_CLOUD_NAME=""
ENV VITE_PUBLIC_CLOUDINARY_CLOUD_NAME=${VITE_PUBLIC_CLOUDINARY_CLOUD_NAME}
COPY . .
RUN npm run build
# Stage 2: Production
FROM node:24.13.1-alpine
WORKDIR /app
RUN npm install -g pm2
COPY package*.json ./
RUN npm ci --only=production --legacy-peer-deps && npm cache clean --force
COPY --from=builder /app/build ./build
COPY --from=builder /app/ecosystem.config.cjs ./ecosystem.config.cjs
RUN mkdir -p logs
# Default port; override with PORT env in compose or .env
ENV NODE_ENV=production
ENV HOST=0.0.0.0
ARG PORT=3001
ENV PORT=${PORT}
EXPOSE ${PORT}
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node -e "require('http').get('http://localhost:' + (process.env.PORT || 3001), (r) => { process.exit(r.statusCode === 200 ? 0 : 1); })"
CMD ["pm2-runtime", "start", "ecosystem.config.cjs"]