Add production Docker deployment

Amp-Thread-ID: https://ampcode.com/threads/T-01a02485-5574-707c-bff4-5668d83bee8a
Co-authored-by: Heaust Azure <heaust.azure@gmail.com>
This commit is contained in:
Amp
2026-08-22 06:54:18 +00:00
co-authored by heaust
parent d95e099fa4
commit eb7508d1c1
11 changed files with 286 additions and 6 deletions
+70
View File
@@ -0,0 +1,70 @@
# 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/handles/package.json ./addons/handles/package.json
RUN --mount=type=cache,target=/root/.npm npm ci --include=dev
COPY core ./core
COPY addons/handles ./addons/handles
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
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
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"]