/ 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"]