# syntax=docker/dockerfile:1 FROM node:22-bookworm AS package-builder RUN apt-get update \ && apt-get install -y --no-install-recommends build-essential ca-certificates curl libssl-dev pkg-config \ && rm -rf /var/lib/apt/lists/* RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ | sh -s -- -y --profile minimal --default-toolchain stable ENV PATH="/root/.cargo/bin:${PATH}" RUN cargo install wasm-pack --version 0.15.0 --locked WORKDIR /src COPY Cargo.toml Cargo.lock rust-toolchain.toml ./ COPY .cargo ./.cargo RUN toolchain="$(sed -n 's/^channel = "\([^"]*\)"/\1/p' rust-toolchain.toml)" \ && rustup toolchain install "$toolchain" --profile minimal --component rust-src --target wasm32-unknown-unknown COPY package.json package-lock.json ./ COPY core/package.json ./core/package.json COPY addons ./addons COPY vendor ./vendor RUN --mount=type=cache,target=/root/.npm npm ci --include=dev COPY core ./core COPY server/build.mjs ./server/build.mjs RUN --mount=type=cache,target=/src/target mkdir -p /out \ && wasm-pack build core --target web --out-dir /out/pkg --release \ && node server/build.mjs /src /out FROM golang:1.24-bookworm AS server-builder WORKDIR /src COPY go.work ./ COPY server/go.mod server/go.sum ./server/ RUN --mount=type=cache,target=/go/pkg/mod go mod download COPY server ./server RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ CGO_ENABLED=1 go test ./server/... \ && CGO_ENABLED=1 go build -trimpath -ldflags="-s -w" -o /out/yawn-server ./server FROM debian:bookworm-slim AS runtime ARG YAWN_DEPLOYED_AT="" ARG YAWN_DEPLOY_COMMIT_MESSAGE="" RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl \ && rm -rf /var/lib/apt/lists/* \ && groupadd --system --gid 10001 yawn \ && useradd --system --uid 10001 --gid yawn --home-dir /app --create-home yawn \ && mkdir -p /data \ && chown yawn:yawn /data WORKDIR /app COPY --from=server-builder --chown=yawn:yawn /out/yawn-server /app/yawn-server COPY --from=package-builder --chown=yawn:yawn /out /app/packages COPY --from=package-builder --chown=yawn:yawn /src/node_modules/monaco-editor/min /app/node_modules/monaco-editor/min ENV PORT=5002 \ YAWN_ROOT=/app \ YAWN_PACKAGES=/app/packages \ YAWN_DATABASE=/data/yawn.db \ YAWN_DEPLOYED_AT="${YAWN_DEPLOYED_AT}" \ YAWN_DEPLOY_COMMIT_MESSAGE="${YAWN_DEPLOY_COMMIT_MESSAGE}" USER yawn:yawn VOLUME ["/data"] EXPOSE 5002 STOPSIGNAL SIGTERM HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \ CMD curl --fail --silent --show-error "http://127.0.0.1:${PORT}/healthz" || exit 1 ENTRYPOINT ["/app/yawn-server"]