# x402 Payment Gateway Dockerfile
# Enterprise-grade gateway with payment processing, rate limiting, and analytics
#
# @author nirholas
# @license Apache-2.0
FROM node:22-alpine AS builder
WORKDIR /app
# Install build dependencies
RUN apk add --no-cache python3 make g++ git
# Copy package files
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY x402-deploy/package.json ./x402-deploy/
COPY packages/marketplace/package.json ./packages/marketplace/
COPY packages/payments/x402/package.json ./packages/payments/x402/
# Install pnpm and dependencies
RUN npm install -g pnpm@9
RUN pnpm install --frozen-lockfile
# Copy source
COPY x402-deploy ./x402-deploy
COPY packages/marketplace ./packages/marketplace
COPY packages/payments/x402 ./packages/payments/x402
COPY src ./src
COPY tsconfig.json tsup.config.ts ./
# Build
RUN pnpm --filter @nirholas/x402-deploy build
RUN pnpm --filter @nirholas/universal-crypto-mcp-marketplace build
RUN pnpm build
# ═══════════════════════════════════════════════════════════════
# Production Stage
# ═══════════════════════════════════════════════════════════════
FROM node:22-alpine AS production
WORKDIR /app
# Install runtime dependencies
RUN apk add --no-cache curl tini
# Copy package files
COPY package.json pnpm-lock.yaml ./
COPY x402-deploy/package.json ./x402-deploy/
COPY packages/marketplace/package.json ./packages/marketplace/
COPY packages/payments/x402/package.json ./packages/payments/x402/
# Install pnpm and production dependencies
RUN npm install -g pnpm@9
RUN pnpm install --prod --frozen-lockfile
# Copy built files
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/x402-deploy/dist ./x402-deploy/dist
COPY --from=builder /app/packages/marketplace/dist ./packages/marketplace/dist
COPY --from=builder /app/packages/payments/x402/dist ./packages/payments/x402/dist
# Copy gateway server
COPY deploy/enterprise/gateway ./gateway
# Create non-root user
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
# Create data directories
RUN mkdir -p /app/data /app/logs /app/config && \
chown -R nodejs:nodejs /app
USER nodejs
# Environment
ENV NODE_ENV=production
ENV PORT=3000
ENV SSE_PORT=3001
ENV METRICS_PORT=3002
EXPOSE 3000 3001 3002
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD curl -f http://localhost:3002/health || exit 1
# Use tini for proper signal handling
ENTRYPOINT ["/sbin/tini", "--"]
# Start gateway
CMD ["node", "gateway/server.js"]