# syntax=docker/dockerfile:1.7 ARG NODE_IMAGE=node:20-bookworm-slim FROM ${NODE_IMAGE} AS deps WORKDIR /app RUN apt-get update \ && apt-get install -y --no-install-recommends python3 make g++ \ && rm -rf /var/lib/apt/lists/* COPY package.json package-lock.json ./ COPY shared/package.json ./shared/ COPY server/package.json ./server/ COPY client/package.json ./client/ RUN npm ci FROM deps AS build WORKDIR /app COPY . . RUN npm run build RUN npm prune --omit=dev FROM ${NODE_IMAGE} AS runtime WORKDIR /app ENV NODE_ENV=production ENV PORT=7860 COPY --from=build --chown=node:node /app/package.json /app/package-lock.json ./ COPY --from=build --chown=node:node /app/node_modules ./node_modules COPY --from=build --chown=node:node /app/shared ./shared COPY --from=build --chown=node:node /app/server/package.json ./server/package.json COPY --from=build --chown=node:node /app/server/dist ./server/dist COPY --from=build --chown=node:node /app/client/dist ./client/dist RUN mkdir -p /app/server/data && chown -R node:node /app/server/data # Include the pre-seeded local database! COPY --chown=node:node server/data/freeapi.dat /app/server/data/freeapi.db USER node EXPOSE 7860 HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ CMD node -e "fetch('http://127.0.0.1:7860/api/ping').then((res) => { if (!res.ok) process.exit(1); }).catch(() => process.exit(1));" CMD ["node", "server/dist/index.js"]