Spaces:
Running
Running
# Multi-stage build for optimal image size and security | |
FROM oven/bun:1.2.17-alpine AS base | |
# Install curl for healthcheck | |
RUN apk --no-cache add curl | |
# Set working directory | |
WORKDIR /app | |
# Create non-root user for security | |
RUN addgroup -g 1001 -S user && \ | |
adduser -S user -u 1001 | |
# =============================== | |
# Dependencies stage | |
# =============================== | |
FROM base AS deps | |
# Copy package files for dependency installation | |
COPY package.json bun.lock* ./ | |
# Copy local packages and external dependencies | |
COPY packages/ packages/ | |
COPY external/ external/ | |
# Install dependencies with frozen lockfile (including devDependencies) | |
RUN bun install --frozen-lockfile | |
# =============================== | |
# Build stage | |
# =============================== | |
FROM base AS builder | |
# Copy installed dependencies from deps stage | |
COPY --from=deps /app/node_modules ./node_modules | |
COPY --from=deps /app/packages ./packages | |
COPY --from=deps /app/external ./external | |
# Copy source code and configuration files | |
COPY . . | |
# Build the static site | |
RUN bun run build | |
# =============================== | |
# Production stage | |
# =============================== | |
FROM base AS runner | |
# Set environment to production | |
ENV NODE_ENV=production | |
ENV PORT=3000 | |
# Copy built application and static server | |
COPY --from=builder --chown=user:user /app/build ./build | |
COPY --chown=user:user static-server.js ./ | |
# Switch to non-root user | |
USER user | |
ARG PUBLIC_TRANSPORT_SERVER_URL=https://blanchon-robothub-transportserver.hf.space/api | |
ENV PUBLIC_TRANSPORT_SERVER_URL=${PUBLIC_TRANSPORT_SERVER_URL} | |
ARG PUBLIC_INFERENCE_SERVER_URL=https://blanchon-robothub-inferenceserver.hf.space/api | |
ENV PUBLIC_INFERENCE_SERVER_URL=${PUBLIC_INFERENCE_SERVER_URL} | |
ARG PORT=8000 | |
ENV PORT=${PORT} | |
# Expose port | |
EXPOSE ${PORT} | |
# Health check | |
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ | |
CMD curl -f http://localhost:8000/ || exit 1 | |
# Start custom static file server | |
CMD ["bun", "static-server.js"] |