# syntax=docker/dockerfile:1.7 FROM rust:1.92-trixie AS builder ARG DEBIAN_MIRROR=http://deb.debian.org/debian ARG CARGO_REGISTRY_MIRROR= WORKDIR /app RUN sed -i "s|http://deb.debian.org/debian|${DEBIAN_MIRROR%/}|g" /etc/apt/sources.list.d/debian.sources \ && DEBIAN_FRONTEND=noninteractive apt-get update \ && apt-get install -y --no-install-recommends \ cmake \ libdav1d-dev \ nasm \ pkg-config \ && rm -rf /var/lib/apt/lists/* COPY Cargo.toml Cargo.lock ./ COPY .cargo ./.cargo COPY src ./src COPY migrations ./migrations COPY templates ./templates RUN --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked \ --mount=type=cache,target=/app/target,sharing=locked \ if [ -n "$CARGO_REGISTRY_MIRROR" ]; then \ printf '\n[source.crates-io]\nreplace-with = "deployment-mirror"\n\n[source.deployment-mirror]\nregistry = "%s"\n' \ "$CARGO_REGISTRY_MIRROR" >> .cargo/config.toml; \ fi \ && cargo build --release --locked \ && cp /app/target/release/imageforge /app/imageforge FROM node:22-alpine AS frontend-builder WORKDIR /app/frontend COPY frontend/package*.json ./ RUN --mount=type=cache,target=/root/.npm,sharing=locked npm ci COPY frontend ./ RUN npm run build FROM debian:trixie-slim ARG DEBIAN_MIRROR=http://deb.debian.org/debian RUN sed -i "s|http://deb.debian.org/debian|${DEBIAN_MIRROR%/}|g" /etc/apt/sources.list.d/debian.sources \ && DEBIAN_FRONTEND=noninteractive apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ libdav1d7 \ && rm -rf /var/lib/apt/lists/* RUN groupadd --system --gid 10001 imageforge \ && useradd --system --uid 10001 --gid imageforge --home-dir /app --shell /usr/sbin/nologin imageforge WORKDIR /app COPY --from=builder /app/imageforge ./imageforge COPY --from=frontend-builder /app/frontend/dist ./static COPY migrations ./migrations RUN mkdir -p uploads \ && chown imageforge:imageforge uploads ENV HOST=0.0.0.0 ENV PORT=8080 EXPOSE 8080 USER 10001:10001 CMD ["./imageforge"]