88 lines
3.0 KiB
Docker
88 lines
3.0 KiB
Docker
# syntax=docker/dockerfile:1
|
|
# Multi-stage production image for KCA (kaya backend + Sycamore/WASM frontend).
|
|
# The build context is the repository root (see ../docker-compose.yml).
|
|
|
|
# --- Frontend --------------------------------------------------------------
|
|
FROM rust:1-slim AS web-builder
|
|
|
|
ARG TRUNK_VERSION=0.21.14
|
|
|
|
RUN sed -i 's|http://deb.debian.org|https://deb.debian.org|g' \
|
|
/etc/apt/sources.list.d/debian.sources 2>/dev/null || true \
|
|
&& apt-get update \
|
|
&& apt-get install -y --no-install-recommends curl ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
RUN curl -sSfL \
|
|
"https://github.com/trunk-rs/trunk/releases/download/v${TRUNK_VERSION}/trunk-x86_64-unknown-linux-gnu.tar.gz" \
|
|
| tar -xz -C /usr/local/bin \
|
|
&& rustup target add wasm32-unknown-unknown
|
|
|
|
WORKDIR /web
|
|
COPY web/Cargo.toml web/Cargo.lock ./
|
|
COPY web/index.html web/style.css web/theme.css web/Trunk.toml ./
|
|
COPY web/vendor ./vendor
|
|
COPY web/pwa ./pwa
|
|
COPY web/src ./src
|
|
RUN --mount=type=cache,target=/usr/local/cargo/registry \
|
|
--mount=type=cache,target=/web/target \
|
|
trunk build --release --public-url /static/
|
|
|
|
# --- Backend ---------------------------------------------------------------
|
|
FROM alpine:3.24 AS builder
|
|
|
|
COPY --from=ghcr.io/astral-sh/uv:0.13.1 /uv /uvx /bin/
|
|
|
|
RUN --mount=type=cache,target=/var/cache/apk \
|
|
apk add python3 build-base python3-dev git
|
|
RUN git config --global --add safe.directory /repo
|
|
|
|
ENV UV_PYTHON_DOWNLOADS=0 \
|
|
UV_PROJECT_ENVIRONMENT=/opt/venv \
|
|
UV_LINK_MODE=copy
|
|
|
|
WORKDIR /repo/server
|
|
COPY server/uv.lock server/pyproject.toml ./
|
|
COPY server/packages/kca-core/pyproject.toml packages/kca-core/
|
|
COPY server/packages/kca-app/pyproject.toml packages/kca-app/
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
uv sync --frozen --no-install-workspace --package kca-app --extra otel --no-dev
|
|
|
|
COPY server/packages/ ./packages/
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
uv sync --locked --no-editable --package kca-app --extra otel --no-dev \
|
|
--reinstall-package kca-core --reinstall-package kca-app
|
|
|
|
COPY server/migrations ./migrations
|
|
|
|
# --- Runtime ---------------------------------------------------------------
|
|
FROM alpine:3.24
|
|
|
|
RUN --mount=type=cache,target=/var/cache/apk \
|
|
apk add python3 ca-certificates tzdata \
|
|
&& addgroup -S app && adduser -S -G app app
|
|
|
|
COPY --from=builder /opt/venv /opt/venv
|
|
COPY --from=builder /repo/server/migrations /app/migrations
|
|
COPY --from=builder /repo/server/pyproject.toml /app/pyproject.toml
|
|
COPY --from=web-builder /web/dist /app/web/dist
|
|
|
|
ENV PATH="/opt/venv/bin:$PATH" \
|
|
PYTHONUNBUFFERED=1 \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
GRANIAN_HOST=0.0.0.0 \
|
|
GRANIAN_PORT=8080 \
|
|
GRANIAN_INTERFACE=rsgi \
|
|
GRANIAN_STATIC_PATH_ROUTE="/static" \
|
|
GRANIAN_STATIC_PATH_MOUNT="/app/web/dist" \
|
|
GRANIAN_STATIC_PATH_DIR_TO_FILE=index.html \
|
|
STATIC_DIR=/app/web/dist
|
|
|
|
USER app
|
|
EXPOSE 8080
|
|
|
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s \
|
|
CMD wget -q -O- http://127.0.0.1:8080/api/health || exit 1
|
|
|
|
CMD ["granian", "kca.app:app"]
|