rust-x402 0.3.0

HTTP-native micropayments with x402 protocol
Documentation
# Multi-stage build for both backend and facilitator services
# Optimized for build caching to avoid rebuilding dependencies
FROM rust:latest as builder

WORKDIR /app

# Install build dependencies that rarely change
RUN apt-get update && \
    apt-get install -y pkg-config libssl-dev && \
    rm -rf /var/lib/apt/lists/*

# Copy dependency files first (for better caching)
COPY Cargo.toml Cargo.lock ./
COPY README.md ./

# Copy source code structure (needed for Cargo to understand the project)
COPY src ./src
COPY main.rs ./

# Create dummy binaries to cache dependencies
# This allows Cargo to cache dependencies separately from binary source code
RUN mkdir -p src/bin integration-test/backend/src && \
    echo 'fn main() {}' > src/bin/facilitator.rs && \
    echo 'fn main() {}' > integration-test/backend/src/main.rs && \
    cargo build --release --bin facilitator --bin integration-test-backend --features axum,redis || \
    cargo build --release --bin facilitator --features axum,redis || \
    cargo build --release --bin integration-test-backend --features axum || true

# Copy actual binary source files (this invalidates cache only when binaries change)
COPY src/bin/facilitator.rs ./src/bin/
COPY integration-test/backend/main.rs ./integration-test/backend/main.rs

# Build actual binaries (dependencies are already built and cached)
RUN touch src/bin/facilitator.rs integration-test/backend/main.rs && \
    cargo build --release --bin facilitator --bin integration-test-backend --features axum,redis

# Runtime stage
FROM debian:bookworm-slim

RUN apt-get update && \
    apt-get install -y ca-certificates curl && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Copy both binaries from builder
COPY --from=builder /app/target/release/facilitator /app/facilitator
COPY --from=builder /app/target/release/integration-test-backend /app/integration-test-backend

# Create entrypoint script
RUN echo '#!/bin/sh\n\
if [ "$SERVICE" = "facilitator" ]; then\n\
    exec /app/facilitator\n\
elif [ "$SERVICE" = "backend" ]; then\n\
    exec /app/integration-test-backend\n\
else\n\
    echo "Error: SERVICE environment variable must be set to either '\''facilitator'\'' or '\''backend'\''"\n\
    exit 1\n\
fi' > /app/entrypoint.sh && chmod +x /app/entrypoint.sh

EXPOSE 4020 4021

HEALTHCHECK --interval=10s --timeout=5s --retries=5 \
    CMD curl -f http://localhost:${PORT:-4020}/health || exit 1

ENTRYPOINT ["/app/entrypoint.sh"]