# syntax=docker/dockerfile:1.7

# ============================================================================
# justthetips.dev — Production Dockerfile
# ============================================================================

ARG NODE_VERSION=22.11.0

FROM node:${NODE_VERSION}-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm ci --no-audit --no-fund

FROM deps AS typecheck
COPY tsconfig.json biome.json ./
COPY src ./src
COPY scripts ./scripts
COPY tests ./tests
RUN npm run typecheck

FROM node:${NODE_VERSION}-alpine AS prod-deps
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm ci --omit=dev --no-audit --no-fund

FROM node:${NODE_VERSION}-alpine AS runtime
WORKDIR /app

RUN addgroup -g 1001 -S justthetips && \
    adduser -S justthetips -u 1001 -G justthetips

COPY --from=prod-deps --chown=justthetips:justthetips /app/node_modules ./node_modules
COPY --chown=justthetips:justthetips package.json tsconfig.json ./
COPY --chown=justthetips:justthetips src ./src

USER justthetips

ENV NODE_ENV=production
EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
  CMD node -e "fetch('http://localhost:'+(process.env.API_PORT||3000)+'/healthz').then(r => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"

CMD ["node", "--experimental-strip-types", "src/api/server.ts"]
