diff --git a/Dockerfile b/Dockerfile index 1cd3f0bfca..08367cdd48 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,95 +1,56 @@ -ARG BASE=node:20.18.0 -FROM ${BASE} AS base - +# ---- build stage ---- +FROM node:22-bookworm-slim AS build WORKDIR /app -# Install dependencies (this step is cached as long as the dependencies don't change) -COPY package.json pnpm-lock.yaml ./ +# CI-friendly env +ENV HUSKY=0 +ENV CI=true -#RUN npm install -g corepack@latest +# Use pnpm +RUN corepack enable && corepack prepare pnpm@9.15.9 --activate -#RUN corepack enable pnpm && pnpm install -RUN npm install -g pnpm && pnpm install +# Accept (optional) build-time public URL for Remix/Vite (Coolify can pass it) +ARG VITE_PUBLIC_APP_URL +ENV VITE_PUBLIC_APP_URL=${VITE_PUBLIC_APP_URL} -# Copy the rest of your app's source code -COPY . . +# Install deps efficiently +COPY package.json pnpm-lock.yaml* ./ +RUN pnpm fetch -# Expose the port the app runs on -EXPOSE 5173 +# Copy source and build +COPY . . +# install with dev deps (needed to build) +RUN pnpm install --offline --frozen-lockfile -# Production image -FROM base AS bolt-ai-production +# Build the Remix app (SSR + client) +RUN NODE_OPTIONS=--max-old-space-size=4096 pnpm run build -# Define environment variables with default values or let them be overridden -ARG GROQ_API_KEY -ARG HuggingFace_API_KEY -ARG OPENAI_API_KEY -ARG ANTHROPIC_API_KEY -ARG OPEN_ROUTER_API_KEY -ARG GOOGLE_GENERATIVE_AI_API_KEY -ARG OLLAMA_API_BASE_URL -ARG XAI_API_KEY -ARG TOGETHER_API_KEY -ARG TOGETHER_API_BASE_URL -ARG AWS_BEDROCK_CONFIG -ARG VITE_LOG_LEVEL=debug -ARG DEFAULT_NUM_CTX +# Keep only production deps for runtime +RUN pnpm prune --prod --ignore-scripts -ENV WRANGLER_SEND_METRICS=false \ - GROQ_API_KEY=${GROQ_API_KEY} \ - HuggingFace_KEY=${HuggingFace_API_KEY} \ - OPENAI_API_KEY=${OPENAI_API_KEY} \ - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} \ - OPEN_ROUTER_API_KEY=${OPEN_ROUTER_API_KEY} \ - GOOGLE_GENERATIVE_AI_API_KEY=${GOOGLE_GENERATIVE_AI_API_KEY} \ - OLLAMA_API_BASE_URL=${OLLAMA_API_BASE_URL} \ - XAI_API_KEY=${XAI_API_KEY} \ - TOGETHER_API_KEY=${TOGETHER_API_KEY} \ - TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL} \ - AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG} \ - VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \ - DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX}\ - RUNNING_IN_DOCKER=true -# Pre-configure wrangler to disable metrics -RUN mkdir -p /root/.config/.wrangler && \ - echo '{"enabled":false}' > /root/.config/.wrangler/metrics.json +# ---- runtime stage ---- +FROM node:22-bookworm-slim AS runtime +WORKDIR /app -RUN pnpm run build +ENV NODE_ENV=production +ENV PORT=3000 +ENV HOST=0.0.0.0 -CMD [ "pnpm", "run", "dockerstart"] +# Install curl so Coolify’s healthcheck works inside the image +RUN apt-get update && apt-get install -y --no-install-recommends curl \ + && rm -rf /var/lib/apt/lists/* -# Development image -FROM base AS bolt-ai-development +# Copy only what we need to run +COPY --from=build /app/build /app/build +COPY --from=build /app/node_modules /app/node_modules +COPY --from=build /app/package.json /app/package.json -# Define the same environment variables for development -ARG GROQ_API_KEY -ARG HuggingFace -ARG OPENAI_API_KEY -ARG ANTHROPIC_API_KEY -ARG OPEN_ROUTER_API_KEY -ARG GOOGLE_GENERATIVE_AI_API_KEY -ARG OLLAMA_API_BASE_URL -ARG XAI_API_KEY -ARG TOGETHER_API_KEY -ARG TOGETHER_API_BASE_URL -ARG VITE_LOG_LEVEL=debug -ARG DEFAULT_NUM_CTX +EXPOSE 3000 -ENV GROQ_API_KEY=${GROQ_API_KEY} \ - HuggingFace_API_KEY=${HuggingFace_API_KEY} \ - OPENAI_API_KEY=${OPENAI_API_KEY} \ - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} \ - OPEN_ROUTER_API_KEY=${OPEN_ROUTER_API_KEY} \ - GOOGLE_GENERATIVE_AI_API_KEY=${GOOGLE_GENERATIVE_AI_API_KEY} \ - OLLAMA_API_BASE_URL=${OLLAMA_API_BASE_URL} \ - XAI_API_KEY=${XAI_API_KEY} \ - TOGETHER_API_KEY=${TOGETHER_API_KEY} \ - TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL} \ - AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG} \ - VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \ - DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX}\ - RUNNING_IN_DOCKER=true +# Healthcheck for Coolify +HEALTHCHECK --interval=10s --timeout=3s --start-period=5s --retries=5 \ + CMD curl -fsS http://localhost:3000/ || exit 1 -RUN mkdir -p ${WORKDIR}/run -CMD pnpm run dev --host +# Start the Remix server +CMD ["node", "build/server/index.js"]