|
1 |
| -ARG BASE=node:20.18.0 |
2 |
| -FROM ${BASE} AS base |
3 |
| - |
| 1 | +# ---- build stage ---- |
| 2 | +FROM node:22-bookworm-slim AS build |
4 | 3 | WORKDIR /app
|
5 | 4 |
|
6 |
| -# Install dependencies (this step is cached as long as the dependencies don't change) |
7 |
| -COPY package.json pnpm-lock.yaml ./ |
| 5 | +# CI-friendly env |
| 6 | +ENV HUSKY=0 |
| 7 | +ENV CI=true |
8 | 8 |
|
9 |
| -#RUN npm install -g corepack@latest |
| 9 | +# Use pnpm |
| 10 | +RUN corepack enable && corepack prepare [email protected] --activate |
10 | 11 |
|
11 |
| -#RUN corepack enable pnpm && pnpm install |
12 |
| -RUN npm install -g pnpm && pnpm install |
| 12 | +# Accept (optional) build-time public URL for Remix/Vite (Coolify can pass it) |
| 13 | +ARG VITE_PUBLIC_APP_URL |
| 14 | +ENV VITE_PUBLIC_APP_URL=${VITE_PUBLIC_APP_URL} |
13 | 15 |
|
14 |
| -# Copy the rest of your app's source code |
15 |
| -COPY . . |
| 16 | +# Install deps efficiently |
| 17 | +COPY package.json pnpm-lock.yaml* ./ |
| 18 | +RUN pnpm fetch |
16 | 19 |
|
17 |
| -# Expose the port the app runs on |
18 |
| -EXPOSE 5173 |
| 20 | +# Copy source and build |
| 21 | +COPY . . |
| 22 | +# install with dev deps (needed to build) |
| 23 | +RUN pnpm install --offline --frozen-lockfile |
19 | 24 |
|
20 |
| -# Production image |
21 |
| -FROM base AS bolt-ai-production |
| 25 | +# Build the Remix app (SSR + client) |
| 26 | +RUN NODE_OPTIONS=--max-old-space-size=4096 pnpm run build |
22 | 27 |
|
23 |
| -# Define environment variables with default values or let them be overridden |
24 |
| -ARG GROQ_API_KEY |
25 |
| -ARG HuggingFace_API_KEY |
26 |
| -ARG OPENAI_API_KEY |
27 |
| -ARG ANTHROPIC_API_KEY |
28 |
| -ARG OPEN_ROUTER_API_KEY |
29 |
| -ARG GOOGLE_GENERATIVE_AI_API_KEY |
30 |
| -ARG OLLAMA_API_BASE_URL |
31 |
| -ARG XAI_API_KEY |
32 |
| -ARG TOGETHER_API_KEY |
33 |
| -ARG TOGETHER_API_BASE_URL |
34 |
| -ARG AWS_BEDROCK_CONFIG |
35 |
| -ARG VITE_LOG_LEVEL=debug |
36 |
| -ARG DEFAULT_NUM_CTX |
| 28 | +# Keep only production deps for runtime |
| 29 | +RUN pnpm prune --prod --ignore-scripts |
37 | 30 |
|
38 |
| -ENV WRANGLER_SEND_METRICS=false \ |
39 |
| - GROQ_API_KEY=${GROQ_API_KEY} \ |
40 |
| - HuggingFace_KEY=${HuggingFace_API_KEY} \ |
41 |
| - OPENAI_API_KEY=${OPENAI_API_KEY} \ |
42 |
| - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} \ |
43 |
| - OPEN_ROUTER_API_KEY=${OPEN_ROUTER_API_KEY} \ |
44 |
| - GOOGLE_GENERATIVE_AI_API_KEY=${GOOGLE_GENERATIVE_AI_API_KEY} \ |
45 |
| - OLLAMA_API_BASE_URL=${OLLAMA_API_BASE_URL} \ |
46 |
| - XAI_API_KEY=${XAI_API_KEY} \ |
47 |
| - TOGETHER_API_KEY=${TOGETHER_API_KEY} \ |
48 |
| - TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL} \ |
49 |
| - AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG} \ |
50 |
| - VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \ |
51 |
| - DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX}\ |
52 |
| - RUNNING_IN_DOCKER=true |
53 | 31 |
|
54 |
| -# Pre-configure wrangler to disable metrics |
55 |
| -RUN mkdir -p /root/.config/.wrangler && \ |
56 |
| - echo '{"enabled":false}' > /root/.config/.wrangler/metrics.json |
| 32 | +# ---- runtime stage ---- |
| 33 | +FROM node:22-bookworm-slim AS runtime |
| 34 | +WORKDIR /app |
57 | 35 |
|
58 |
| -RUN pnpm run build |
| 36 | +ENV NODE_ENV=production |
| 37 | +ENV PORT=3000 |
| 38 | +ENV HOST=0.0.0.0 |
59 | 39 |
|
60 |
| -CMD [ "pnpm", "run", "dockerstart"] |
| 40 | +# Install curl so Coolify’s healthcheck works inside the image |
| 41 | +RUN apt-get update && apt-get install -y --no-install-recommends curl \ |
| 42 | + && rm -rf /var/lib/apt/lists/* |
61 | 43 |
|
62 |
| -# Development image |
63 |
| -FROM base AS bolt-ai-development |
| 44 | +# Copy only what we need to run |
| 45 | +COPY --from=build /app/build /app/build |
| 46 | +COPY --from=build /app/node_modules /app/node_modules |
| 47 | +COPY --from=build /app/package.json /app/package.json |
64 | 48 |
|
65 |
| -# Define the same environment variables for development |
66 |
| -ARG GROQ_API_KEY |
67 |
| -ARG HuggingFace |
68 |
| -ARG OPENAI_API_KEY |
69 |
| -ARG ANTHROPIC_API_KEY |
70 |
| -ARG OPEN_ROUTER_API_KEY |
71 |
| -ARG GOOGLE_GENERATIVE_AI_API_KEY |
72 |
| -ARG OLLAMA_API_BASE_URL |
73 |
| -ARG XAI_API_KEY |
74 |
| -ARG TOGETHER_API_KEY |
75 |
| -ARG TOGETHER_API_BASE_URL |
76 |
| -ARG VITE_LOG_LEVEL=debug |
77 |
| -ARG DEFAULT_NUM_CTX |
| 49 | +EXPOSE 3000 |
78 | 50 |
|
79 |
| -ENV GROQ_API_KEY=${GROQ_API_KEY} \ |
80 |
| - HuggingFace_API_KEY=${HuggingFace_API_KEY} \ |
81 |
| - OPENAI_API_KEY=${OPENAI_API_KEY} \ |
82 |
| - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} \ |
83 |
| - OPEN_ROUTER_API_KEY=${OPEN_ROUTER_API_KEY} \ |
84 |
| - GOOGLE_GENERATIVE_AI_API_KEY=${GOOGLE_GENERATIVE_AI_API_KEY} \ |
85 |
| - OLLAMA_API_BASE_URL=${OLLAMA_API_BASE_URL} \ |
86 |
| - XAI_API_KEY=${XAI_API_KEY} \ |
87 |
| - TOGETHER_API_KEY=${TOGETHER_API_KEY} \ |
88 |
| - TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL} \ |
89 |
| - AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG} \ |
90 |
| - VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \ |
91 |
| - DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX}\ |
92 |
| - RUNNING_IN_DOCKER=true |
| 51 | +# Healthcheck for Coolify |
| 52 | +HEALTHCHECK --interval=10s --timeout=3s --start-period=5s --retries=5 \ |
| 53 | + CMD curl -fsS http://localhost:3000/ || exit 1 |
93 | 54 |
|
94 |
| -RUN mkdir -p ${WORKDIR}/run |
95 |
| -CMD pnpm run dev --host |
| 55 | +# Start the Remix server |
| 56 | +CMD ["node", "build/server/index.js"] |
0 commit comments