# syntax=docker/dockerfile:1 # ============================================================================ # Builder stage - compile Rust/WASM and TypeScript # ============================================================================ FROM node:22.14.0-slim AS builder # Install build dependencies for Rust RUN apt-get update && apt-get install -y \ curl \ build-essential \ pkg-config \ libssl-dev \ ca-certificates \ && rm -rf /var/lib/apt/lists/* # Enable corepack for pnpm RUN npm install -g corepack@latest && corepack enable # Install Rust toolchain RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \ --default-toolchain stable \ --profile minimal \ --target wasm32-unknown-unknown ENV PATH="/root/.cargo/bin:${PATH}" # Install wasm-bindgen-cli RUN cargo install wasm-bindgen-cli WORKDIR /app # Copy workspace configuration COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./ COPY packages/buttplug ./packages/buttplug # Install dependencies RUN pnpm install --frozen-lockfile --filter @sexy.pivoine.art/buttplug # Build WASM RUN RUSTFLAGS='--cfg getrandom_backend="wasm_js" --cfg=web_sys_unstable_apis' \ pnpm --filter @sexy.pivoine.art/buttplug build:wasm # Build TypeScript RUN pnpm --filter @sexy.pivoine.art/buttplug build # ============================================================================ # Runner stage - nginx serving dist/ and wasm/ # ============================================================================ FROM nginx:1.27-alpine AS runner # Remove default nginx config RUN rm /etc/nginx/conf.d/default.conf # Copy nginx config COPY nginx.buttplug.conf /etc/nginx/conf.d/buttplug.conf # Copy built artifacts COPY --from=builder /app/packages/buttplug/dist /usr/share/nginx/html/dist COPY --from=builder /app/packages/buttplug/wasm /usr/share/nginx/html/wasm EXPOSE 80 HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost/dist/index.js || exit 1