Spaces:
Sleeping
Sleeping
| # Build stage | |
| FROM node:20-alpine AS builder | |
| WORKDIR /app | |
| # Copy package files | |
| COPY package.json package-lock.json* ./ | |
| # Install dependencies | |
| RUN npm ci | |
| # Copy Prisma schema | |
| COPY prisma ./prisma/ | |
| # Copy source files | |
| COPY . . | |
| # Build TypeScript | |
| RUN npm run build | |
| # Production stage | |
| FROM node:20-bookworm-slim AS runner | |
| WORKDIR /app | |
| # Set to production | |
| ENV NODE_ENV=production | |
| # Install OpenSSL for Prisma | |
| RUN apt-get update && apt-get install -y openssl && rm -rf /var/lib/apt/lists/* | |
| # Create non-root user for security | |
| RUN groupadd --system --gid 1001 nodejs | |
| RUN useradd --system --uid 1001 --gid nodejs appuser | |
| # Copy package files | |
| COPY package.json package-lock.json* ./ | |
| # Install production dependencies only | |
| RUN npm ci --only=production | |
| # Copy Prisma schema and generate client for debian | |
| COPY prisma ./prisma/ | |
| RUN npx prisma generate | |
| # Copy built files | |
| COPY --from=builder /app/dist ./dist | |
| # Create uploads directory | |
| RUN mkdir -p uploads && chown -R appuser:nodejs uploads | |
| # Set correct ownership | |
| RUN chown -R appuser:nodejs /app | |
| # Switch to non-root user | |
| USER appuser | |
| # Expose port (Hugging Face Spaces uses 7860) | |
| EXPOSE 7860 | |
| # Set port | |
| ENV PORT=7860 | |
| # Start the application | |
| CMD ["node", "dist/index.js"] | |