From d36f20deac82f16a2b4459297f352a6ed7715dd5 Mon Sep 17 00:00:00 2001 From: jason Date: Sat, 7 Mar 2026 23:05:32 -0600 Subject: [PATCH] feat: update Dockerfile with multi-stage TypeScript build and env vars --- Dockerfile | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5ca6362..ab66df9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,27 +3,42 @@ FROM node:20-alpine AS frontend-builder WORKDIR /app/frontend +# Copy frontend package files and install ALL dependencies (including devDependencies for build) COPY frontend/package*.json ./ RUN npm ci +# Copy frontend source and build COPY frontend/ ./ RUN npm run build -# Stage 2: Production Server +# Stage 2: Build Backend +FROM node:20-alpine AS backend-builder + +WORKDIR /app/backend + +# Copy backend package files and install ALL dependencies (including TypeScript) +COPY backend/package*.json ./ +RUN npm ci + +# Copy backend source and compile TypeScript +COPY backend/ ./ +RUN npm run build + +# Stage 3: Production Runtime FROM node:20-alpine WORKDIR /app -# Install production dependencies +# Install production dependencies only COPY backend/package*.json ./ RUN npm ci --only=production && \ npm cache clean --force -# Copy backend source -COPY backend/ ./ +# Copy compiled backend from builder +COPY --from=backend-builder /app/backend/dist ./dist -# Copy built frontend -COPY --from=frontend-builder /app/frontend/dist ./public +# Copy built frontend into public directory for Express to serve +COPY --from=frontend-builder /app/frontend/dist ./dist/public # Create temp upload directory RUN mkdir -p /app/temp && \ @@ -32,12 +47,18 @@ RUN mkdir -p /app/temp && \ # Switch to non-root user USER node +# Environment variables (can be overridden via Unraid UI) +ENV NODE_ENV=production +ENV PORT=3000 +ENV MAX_FILE_SIZE=10485760 +ENV TEMP_DIR=/app/temp + # Expose port EXPOSE 3000 # Health check HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ - CMD node -e "require('http').get('http://localhost:3000/api/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" + CMD node -e "require('http').get('http://localhost:3000/', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" # Start server -CMD ["node", "src/server.js"] \ No newline at end of file +CMD ["node", "dist/index.js"] \ No newline at end of file