Spaces:
Running
Running
# Multi-stage Dockerfile for Hugging Face Spaces | |
# - Builds the client with Vite | |
# - Bundles the server with esbuild (via npm run build) | |
# - Serves on PORT (default 7860) from dist/index.js | |
############################ | |
# Builder stage | |
############################ | |
FROM node:20-bookworm-slim AS builder | |
WORKDIR /app | |
# Install system deps needed for native builds (e.g., bcrypt) | |
RUN apt-get update \ | |
&& apt-get install -y --no-install-recommends \ | |
python3 \ | |
make \ | |
g++ \ | |
&& rm -rf /var/lib/apt/lists/* | |
# Copy dependency manifests first for better caching | |
COPY package.json package-lock.json ./ | |
# Install all deps (including devDeps to build) | |
RUN npm ci | |
# Copy the rest of the project | |
COPY . . | |
# Build client and server to dist/ | |
RUN npm run build | |
############################ | |
# Runtime stage | |
############################ | |
FROM node:20-bookworm-slim AS runner | |
ENV NODE_ENV=production | |
ENV PORT=7860 | |
WORKDIR /app | |
# Copy only the runtime artifacts | |
COPY --from=builder /app/package.json ./package.json | |
COPY --from=builder /app/node_modules ./node_modules | |
COPY --from=builder /app/dist ./dist | |
COPY --from=builder /app/uploads ./uploads | |
# Ensure uploads directory exists and is writable | |
RUN mkdir -p /app/uploads && chmod -R 777 /app/uploads | |
# Expose the Space port (Hugging Face sets PORT env var) | |
EXPOSE 7860 | |
# Start the server (listens on 0.0.0.0:${PORT}) | |
CMD ["npm", "run", "start"] | |