1+ # ---- build stage ----
2+ FROM node:22-bookworm-slim AS build
3+ WORKDIR /app
4+
5+ # Install build dependencies for native modules (fs-xattr, etc.)
6+ RUN apt-get update && apt-get install -y --no-install-recommends \
7+ python3 \
8+ make \
9+ g++ \
10+ && rm -rf /var/lib/apt/lists/*
11+
12+ # CI-friendly env
13+ ENV HUSKY=0
14+ ENV CI=true
15+
16+ # Use pnpm
17+ RUN corepack enable && corepack prepare pnpm@9.15.9 --activate
18+
19+ # Accept (optional) build-time public URL for Remix/Vite (Coolify can pass it)
20+ ARG VITE_PUBLIC_APP_URL
21+ ENV VITE_PUBLIC_APP_URL=${VITE_PUBLIC_APP_URL}
22+
23+ # Install deps efficiently
24+ COPY package.json pnpm-lock.yaml* ./
25+ RUN pnpm fetch
26+
27+ # Copy source and build
28+ COPY . .
29+ # install with dev deps (needed to build)
30+ RUN pnpm install --offline --frozen-lockfile
31+
32+ # Build the Remix app (SSR + client)
33+ RUN NODE_OPTIONS=--max-old-space-size=4096 pnpm run build
34+
35+ # Keep only production deps for runtime
36+ RUN pnpm prune --prod --ignore-scripts
37+
38+
39+ # ---- runtime stage ----
40+ FROM node:22-bookworm-slim AS runtime
41+ WORKDIR /app
42+
43+ ENV NODE_ENV=production
44+ ENV PORT=3000
45+ ENV HOST=0.0.0.0
46+
47+ # Install curl so Coolify’s healthcheck works inside the image
48+ RUN apt-get update && apt-get install -y --no-install-recommends curl \
49+ && rm -rf /var/lib/apt/lists/*
50+
51+ # Copy only what we need to run
52+ COPY --from=build /app/build /app/build
53+ COPY --from=build /app/node_modules /app/node_modules
54+ COPY --from=build /app/package.json /app/package.json
55+
56+ EXPOSE 3000
57+
58+ # Healthcheck for Coolify
59+ HEALTHCHECK --interval=10s --timeout=3s --start-period=5s --retries=5 \
60+ CMD curl -fsS http://localhost:3000/ || exit 1
61+
62+ # Start the Remix server
63+ CMD ["node" , "build/server/index.js" ]
64+
65+
66+ # ---- development stage ----
67+ FROM build AS codinit-ai-development
68+
69+ # Define environment variables for development
70+ ARG GROQ_API_KEY
71+ ARG HuggingFace_API_KEY
72+ ARG OPENAI_API_KEY
73+ ARG ANTHROPIC_API_KEY
74+ ARG OPEN_ROUTER_API_KEY
75+ ARG GOOGLE_GENERATIVE_AI_API_KEY
76+ ARG OLLAMA_API_BASE_URL
77+ ARG XAI_API_KEY
78+ ARG TOGETHER_API_KEY
79+ ARG TOGETHER_API_BASE_URL
80+ ARG VITE_LOG_LEVEL=debug
81+ ARG DEFAULT_NUM_CTX
82+
83+ ENV GROQ_API_KEY=${GROQ_API_KEY} \
84+ HuggingFace_API_KEY=${HuggingFace_API_KEY} \
85+ OPENAI_API_KEY=${OPENAI_API_KEY} \
86+ ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} \
87+ OPEN_ROUTER_API_KEY=${OPEN_ROUTER_API_KEY} \
88+ GOOGLE_GENERATIVE_AI_API_KEY=${GOOGLE_GENERATIVE_AI_API_KEY} \
89+ OLLAMA_API_BASE_URL=${OLLAMA_API_BASE_URL} \
90+ XAI_API_KEY=${XAI_API_KEY} \
91+ TOGETHER_API_KEY=${TOGETHER_API_KEY} \
92+ TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL} \
93+ AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG} \
94+ VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \
95+ DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX} \
96+ RUNNING_IN_DOCKER=true
97+
98+ RUN mkdir -p /app/run
99+ CMD ["pnpm" , "run" , "dev" , "--host" ]
100+
101+ # ---- production stage alias ----
102+ FROM runtime AS codinit-ai-production
0 commit comments