Files
sexy/Dockerfile.backend

83 lines
3.2 KiB
Docker

# syntax=docker/dockerfile:1
# ============================================================================
# Builder stage
# ============================================================================
FROM node:22.14.0-slim AS builder
RUN npm install -g corepack@latest && corepack enable
WORKDIR /app
# Copy all package manifests so pnpm can resolve the workspace lockfile,
# but use --ignore-scripts to skip buttplug's Rust/WASM build entirely.
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
COPY packages/backend/package.json ./packages/backend/package.json
COPY packages/frontend/package.json ./packages/frontend/package.json
COPY packages/buttplug/package.json ./packages/buttplug/package.json
COPY packages/types/package.json ./packages/types/package.json
COPY packages/email/package.json ./packages/email/package.json
RUN pnpm install --frozen-lockfile --filter @sexy.pivoine.art/backend --filter @sexy.pivoine.art/email --ignore-scripts
# Rebuild native bindings (argon2, sharp)
RUN pnpm rebuild argon2 sharp
COPY packages/types ./packages/types
COPY packages/email ./packages/email
COPY packages/backend ./packages/backend
RUN pnpm --filter @sexy.pivoine.art/email build
RUN pnpm --filter @sexy.pivoine.art/backend build
RUN CI=true pnpm install --frozen-lockfile --filter @sexy.pivoine.art/backend --prod --ignore-scripts
RUN pnpm rebuild argon2 sharp
# ============================================================================
# Runner stage
# ============================================================================
FROM node:22.14.0-slim AS runner
RUN apt-get update && apt-get install -y \
dumb-init \
ffmpeg \
wget \
&& rm -rf /var/lib/apt/lists/*
RUN userdel -r node && \
groupadd -r -g 1000 node && \
useradd -r -u 1000 -g node -m -d /home/node -s /bin/bash node
WORKDIR /home/node/app
RUN mkdir -p packages/backend packages/email
COPY --from=builder --chown=node:node /app/node_modules ./node_modules
COPY --from=builder --chown=node:node /app/package.json ./package.json
COPY --from=builder --chown=node:node /app/packages/backend/dist ./packages/backend/dist
COPY --from=builder --chown=node:node /app/packages/backend/node_modules ./packages/backend/node_modules
COPY --from=builder --chown=node:node /app/packages/backend/package.json ./packages/backend/package.json
COPY --from=builder --chown=node:node /app/packages/backend/src/migrations ./packages/backend/dist/migrations
COPY --from=builder --chown=node:node /app/packages/email/dist ./packages/email/dist
COPY --from=builder --chown=node:node /app/packages/email/node_modules ./packages/email/node_modules
COPY --from=builder --chown=node:node /app/packages/email/email.css ./packages/email/email.css
COPY --from=builder --chown=node:node /app/packages/email/templates ./packages/email/templates
COPY --from=builder --chown=node:node /app/packages/email/package.json ./packages/email/package.json
RUN mkdir -p /data/uploads && chown node:node /data/uploads
USER node
ENV NODE_ENV=production \
PORT=4000
EXPOSE 4000
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:4000/health
ENTRYPOINT ["dumb-init", "--"]
CMD ["node", "packages/backend/dist/index.js"]