FROM node:22-alpine AS build WORKDIR /app # Native modules (better-sqlite3, ssh2, node-pty) need a toolchain to compile. RUN apk add --no-cache python3 make g++ COPY package.json package-lock.json* ./ RUN npm install --omit=dev=false COPY . . RUN npm run build FROM node:22-alpine WORKDIR /app ENV NODE_ENV=production # Toolchain is needed again here: production deps are reinstalled fresh, and the # native modules (better-sqlite3, ssh2, node-pty) compile from source on install. # openssh-client provides the `ssh` binary, which node-pty shells out to for # certificate-based auth (ssh2 has no OpenSSH certificate support). RUN apk add --no-cache python3 make g++ openssh-client COPY package.json package-lock.json* ./ RUN npm install --omit=dev COPY --from=build /app/dist ./dist EXPOSE 4000 CMD ["node", "dist/server.js"]