# ── Stage 1: Build ────────────────────────────────────────────── FROM node:22-alpine AS builder WORKDIR /app # Install build dependencies for better-sqlite3 (native addon) RUN apk add --no-cache python3 make g++ COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build # ── Stage 2: Runtime ──────────────────────────────────────────── FROM node:22-slim WORKDIR /app # better-sqlite3 needs shared libs available in slim RUN apt-get update && apt-get install -y --no-install-recommends \ tini \ && rm -rf /var/lib/apt/lists/* # Copy built output and production node_modules COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./ # Create directories for persistent data RUN mkdir -p /data /uploads && chown -R node:node /data /uploads /app USER node ENV HOST=0.0.0.0 ENV PORT=4321 ENV DATABASE_PATH=/data/emdash.db ENV UPLOAD_DIR=/uploads EXPOSE 4321 VOLUME ["/data", "/uploads"] ENTRYPOINT ["tini", "--"] CMD ["node", "./dist/server/entry.mjs"]