wbxcallprov/docker/remote-agent/Dockerfile
jmcqueen 93b060bc8b Modernize bot to Node.js 22 with modular architecture and remote SIW agent
- Refactor monolithic index.js (2646 lines) into src/{webex,integrations,
  cards,flows,commands,services} modules; replace node-fetch/form-data
  with native fetch/FormData; move all secrets to .env via dotenv
- Add dockerized remote SIW agent (docker/remote-agent/) with cross-arch
  buildx packaging (arm64 Mac -> linux/amd64), idempotent install.sh
  deploy bundle, and docker-free ZIP inspector for arch verification
- Bot hosts a WebSocket server; agent proxies SIW requests with a
  per-request insecure:true flag, replacing the process-wide
  NODE_TLS_REJECT_UNAUTHORIZED bypass
- Add ESLint flat config + Prettier, rewrite Dockerfile as non-root
  multi-stage node:22-alpine build, README covering setup / deploy /
  remote agent workflow
- Fix parseStoreArg to read trigger.prompt correctly (was indexing past
  the framework's post-match slice); register /help as regex (string
  matcher only compares the first token); switch catch-all to /.+/
  (previous /.*/gim was stateful due to the g flag); remove
  /fixDisplayNames command and its flow/card

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 14:48:51 -04:00

54 lines
1.9 KiB
Docker

# syntax=docker/dockerfile:1.7
# ============================================================================
# wbxStoreProvision — Remote Agent
# ----------------------------------------------------------------------------
# Tiny WebSocket client that proxies HTTP requests (Store Info Web today,
# anything else in the future) from an internal network back to the main
# wbxStoreProvision bot. Ships as a standalone container so it can run
# inside the segmented network where SIW lives.
#
# Build context is docker/remote-agent (self-contained — the agent doesn't
# need any of the bot's source or dependencies).
#
# Build:
# docker build -f docker/remote-agent/Dockerfile \
# -t wbxprov-remote-agent:latest docker/remote-agent
#
# Run:
# docker run --rm -it \
# --env-file docker/remote-agent/.env \
# --name wbxprov-remote-agent \
# wbxprov-remote-agent:latest
# ============================================================================
# ---- Stage 1: dependencies ------------------------------------------------
FROM node:22-alpine AS deps
WORKDIR /app
# Minimal manifest: ws + axios + dotenv. No lockfile — three stable deps.
COPY package.json ./package.json
RUN npm install --omit=dev --no-audit --no-fund && npm cache clean --force
# ---- Stage 2: runtime -----------------------------------------------------
FROM node:22-alpine AS runtime
# tini reaps zombies and forwards signals correctly so `docker stop` reaches
# Node's SIGTERM handler for a clean websocket close.
RUN apk add --no-cache tini
WORKDIR /app
USER node
COPY --chown=node:node --from=deps /app/node_modules ./node_modules
COPY --chown=node:node package.json ./package.json
COPY --chown=node:node remoteAgent.js ./remoteAgent.js
ENV NODE_ENV=production
# The agent is a WebSocket CLIENT — it doesn't listen on any port, so we
# intentionally skip EXPOSE.
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "remoteAgent.js"]