# syntax=docker/dockerfile:1.7 FROM node:24-bookworm-slim AS build WORKDIR /app COPY package.json package-lock.json ./ COPY server/package.json ./server/package.json RUN npm ci --workspace @frameflow/server --include-workspace-root=false COPY server ./server RUN npm run build --workspace @frameflow/server FROM node:24-bookworm-slim AS runtime ENV NODE_ENV=production WORKDIR /app RUN DEBIAN_FRONTEND=noninteractive apt-get \ -o Acquire::Retries=3 \ -o Acquire::ForceIPv4=true \ -o Acquire::http::Timeout=30 \ -o Acquire::http::Pipeline-Depth=0 \ -o Acquire::http::No-Cache=true \ -o Acquire::BrokenProxy=true \ -o Acquire::https::Timeout=30 \ update \ && DEBIAN_FRONTEND=noninteractive apt-get \ -o Acquire::Retries=3 \ -o Acquire::ForceIPv4=true \ -o Acquire::http::Timeout=30 \ -o Acquire::http::Pipeline-Depth=0 \ -o Acquire::http::No-Cache=true \ -o Acquire::BrokenProxy=true \ -o Acquire::https::Timeout=30 \ install -y --no-install-recommends ca-certificates dumb-init ffmpeg fonts-noto-cjk \ && rm -rf /var/lib/apt/lists/* COPY package.json package-lock.json ./ COPY server/package.json ./server/package.json RUN npm ci --omit=dev --workspace @frameflow/server --include-workspace-root=false \ && npm cache clean --force COPY --from=build --chown=node:node /app/server/dist ./server/dist COPY --chown=node:node server/drizzle ./server/drizzle USER node EXPOSE 8787 9092 ENTRYPOINT ["dumb-init", "--"] CMD ["node", "server/dist/index.js"]