/ Dockerfile
Dockerfile
1 FROM node:22-slim AS base 2 3 # Install git (needed for update checker) and build essentials (needed for better-sqlite3) 4 RUN apt-get update && apt-get install -y git python3 make g++ && rm -rf /var/lib/apt/lists/* 5 6 WORKDIR /app 7 8 # Install dependencies 9 COPY package.json package-lock.json ./ 10 COPY scripts/postinstall.mjs ./scripts/postinstall.mjs 11 RUN npm config set fetch-retries 5 \ 12 && npm config set fetch-retry-factor 2 \ 13 && npm config set fetch-retry-mintimeout 10000 \ 14 && npm config set fetch-retry-maxtimeout 120000 \ 15 && attempt=1 \ 16 && until npm ci; do \ 17 if [ "$attempt" -ge 3 ]; then \ 18 exit 1; \ 19 fi; \ 20 echo "npm ci failed on attempt ${attempt}; retrying..." >&2; \ 21 sleep $((attempt * 5)); \ 22 attempt=$((attempt + 1)); \ 23 done 24 25 # Copy source 26 COPY . . 27 28 # Build 29 RUN SWARMCLAW_BUILD_MODE=1 npm run build:ci 30 31 # Production 32 FROM node:22-slim AS runner 33 34 RUN apt-get update && apt-get install -y git curl unzip && rm -rf /var/lib/apt/lists/* 35 36 WORKDIR /app 37 38 COPY --from=base /app/.next/standalone ./ 39 COPY --from=base /app/.next/static ./.next/static 40 COPY --from=base /app/public ./public 41 COPY --from=base /app/node_modules ./node_modules 42 COPY --from=base /app/package.json ./ 43 44 # Data directory (mount as volume for persistence) 45 RUN mkdir -p /app/data 46 47 ENV NODE_ENV=production 48 ENV PORT=3456 49 ENV HOSTNAME=0.0.0.0 50 51 EXPOSE 3456 52 EXPOSE 3457 53 54 CMD ["node", "server.js"]