# ── Build stage ────────────────────────────────────────────────────────────── FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm install COPY tsconfig.json ./ COPY src ./src RUN npm run build # ── Runtime stage ───────────────────────────────────────────────────────────── FROM node:20-alpine AS runtime WORKDIR /app # Production deps + rebuild better-sqlite3 for Alpine (musl libc) COPY package*.json ./ RUN npm install --omit=dev && \ npm rebuild better-sqlite3 && \ npm cache clean --force COPY --from=builder /app/dist ./dist COPY public ./public RUN mkdir -p /app/data EXPOSE 3457 CMD ["node", "dist/index.js"]