# --------------------------------------------------------------------------- # Stage 1: install Node dependencies (npm runs only inside Docker) # --------------------------------------------------------------------------- FROM node:22-bookworm-slim AS deps WORKDIR /app COPY bot/package.json bot/package-lock.json ./ RUN npm ci --omit=dev # --------------------------------------------------------------------------- # Stage 2: runtime image = Node 22 on Debian 12 (bookworm) + Cloudflare WARP # --------------------------------------------------------------------------- FROM node:22-bookworm-slim ARG WARP_VERSION=2026.7.1377.0 ARG WARP_DEB_URL=https://downloads.cloudflareclient.com/v1/download/bookworm-intel/version/${WARP_VERSION} ENV DEBIAN_FRONTEND=noninteractive \ NODE_ENV=production # dbus + iproute2 are required by warp-svc; curl for health checks. RUN apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates curl gnupg dbus iproute2 procps \ && curl -fsSL "${WARP_DEB_URL}" -o /tmp/cloudflare-warp.deb \ && apt-get install -y --no-install-recommends /tmp/cloudflare-warp.deb \ && rm -f /tmp/cloudflare-warp.deb \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && warp-cli --version WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY bot/package.json ./package.json COPY bot/src ./src COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh # WARP registration/state lives here; mount a volume per container to keep it. VOLUME ["/var/lib/cloudflare-warp"] HEALTHCHECK --interval=60s --timeout=15s --start-period=90s --retries=3 \ CMD curl -fsS --max-time 10 https://www.cloudflare.com/cdn-cgi/trace | grep -Eq '^warp=(on|plus)$' || exit 1 ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["node", "src/index.js"]