# syntax=docker/dockerfile:1.6
#
# Packages Conduit Market (github.com/Conduit-BTC/conduit-mono, apps/market)
# as a static Archipelago app. Conduit itself is a pure client-side SPA --
# products are Nostr events (NIP-99), orders are encrypted DMs, payments go
# over Lightning via NWC -- no custom backend, confirmed by reading
# packages/core/src/config.ts and apps/market/package.json directly rather
# than assumed. Upstream ships no Dockerfile; this one is new.
#
# Pinned to a specific upstream commit (not a moving branch) for
# reproducibility, matching the archy convention already used for
# apps/cuprate. Re-pin deliberately, not on every rebuild.
#
# oven/bun:1.1-slim is pinned to an EOL Debian bullseye base whose
# -security pool no longer serves the package versions it references
# (404s on ca-certificates/curl et al). oven/bun:1-slim currently resolves
# to bun 1.4.x on Debian trixie (current), so use that instead -- still a
# floating minor tag, but the alternative (hand-pinning a bullseye/bookworm
# digest) just reintroduces the same staleness problem later.
FROM oven/bun:1-slim AS build
ARG CONDUIT_COMMIT=c6606382dda8953763646f4498b2c4a4103da0a3
WORKDIR /build
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl python3 \
&& rm -rf /var/lib/apt/lists/*
RUN curl -fsSL "https://github.com/Conduit-BTC/conduit-mono/archive/${CONDUIT_COMMIT}.tar.gz" \
-o /tmp/conduit.tar.gz \
&& tar xzf /tmp/conduit.tar.gz --strip-components=1 \
&& rm /tmp/conduit.tar.gz
# Full workspace install: apps/market depends on @conduit/core and
# @conduit/ui via workspace:*, so bun needs the whole monorepo present to
# link them, even though only the market app actually gets built below.
RUN bun install --frozen-lockfile
COPY apply-runtime-override.py /build/apply-runtime-override.py
RUN python3 apply-runtime-override.py
# Loads window.__CONDUIT_RUNTIME_ENV__ (written by docker-entrypoint.sh at
# container start) before the app bundle runs. A plain (non-module) script
# tag with an absolute path: Vite copies these through to dist/index.html
# verbatim without trying to resolve them as part of the module graph, and
# does not require the file to exist in the source tree at build time.
RUN sed -i 's##\n #' \
apps/market/index.html
# Leave every VITE_* relay/network var unset here on purpose -- the runtime
# override (see above) is the actual public/private switch; baking any of
# these in at build time would defeat the point of a live-configurable
# single image.
RUN bun run --filter '@conduit/market' build
FROM nginx:1.27-alpine
COPY --from=build /build/apps/market/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY docker-entrypoint.sh /docker-entrypoint.d/50-conduit-runtime-env.sh
RUN chmod +x /docker-entrypoint.d/50-conduit-runtime-env.sh
EXPOSE 8080