Files

81 lines
2.4 KiB
Docker

# =============================================================================
# RuvBot - Multi-stage Dockerfile for Google Cloud Run
# =============================================================================
# Optimized for:
# - Minimal image size (~150MB)
# - Fast cold starts (<2s)
# - Security (non-root, distroless base)
# - Cost efficiency (Cloud Run serverless)
# =============================================================================
# -----------------------------------------------------------------------------
# Stage 1: Dependencies
# -----------------------------------------------------------------------------
FROM node:22-alpine AS deps
WORKDIR /app
# Copy package files
COPY package.json package-lock.json* ./
# Install production dependencies only
RUN npm ci --only=production --ignore-scripts && \
npm cache clean --force
# -----------------------------------------------------------------------------
# Stage 2: Builder
# -----------------------------------------------------------------------------
FROM node:22-alpine AS builder
WORKDIR /app
# Copy package files
COPY package.json package-lock.json* tsconfig*.json ./
# Install all dependencies (including dev)
RUN npm ci --ignore-scripts
# Copy source code
COPY src/ ./src/
# Build TypeScript
RUN npm run build
# Copy static files to dist
RUN mkdir -p dist/api/public && cp -r src/api/public/* dist/api/public/ 2>/dev/null || true
# -----------------------------------------------------------------------------
# Stage 3: Production Runner
# -----------------------------------------------------------------------------
FROM node:22-alpine AS runner
WORKDIR /app
# Security: Create non-root user
RUN addgroup --system --gid 1001 ruvbot && \
adduser --system --uid 1001 --ingroup ruvbot ruvbot
# Set production environment
ENV NODE_ENV=production
ENV PORT=8080
# Copy production dependencies
COPY --from=deps --chown=ruvbot:ruvbot /app/node_modules ./node_modules
# Copy built application
COPY --from=builder --chown=ruvbot:ruvbot /app/dist ./dist
COPY --from=builder --chown=ruvbot:ruvbot /app/package.json ./
# Health check endpoint
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1
# Switch to non-root user
USER ruvbot
# Expose port
EXPOSE 8080
# Start the application
CMD ["node", "dist/server.js"]