Prime's directive via pewpew-dev. Images are built on nh3-dev from a clean archive of vh/pewpewstudio (26bba3c; hamr over gitea SSH via BuildKit --ssh) and loaded on nh3-docker. Caddy serves the SPA and strips /api/ in front of the backend. It refuses foreign Host headers inside a route block, because the Host rewrite would otherwise bypass the backend's TrustedHost. The DB, assets and the app-edited shop config live on named volumes inside nh3-docker's nightly vzdump. Verified: SPA, /api/machines and /api/generate/workflows 200; foreign Host 400.
34 lines
1.7 KiB
Docker
34 lines
1.7 KiB
Docker
# syntax=docker/dockerfile:1.7
|
|
# pewpewstudio images, built on nh3-dev from a clean `git archive` of vh/pewpewstudio (see ../README.md).
|
|
# api: the FastAPI backend (core.api), venv built with uv; hamr is a git dependency over gitea SSH (BuildKit --ssh).
|
|
# web: Caddy serving the SPA (web/dist) and proxying /api/* to the api with the prefix stripped (Caddyfile mounted).
|
|
|
|
FROM python:3.12-slim-bookworm AS build
|
|
RUN apt-get update && apt-get install -y --no-install-recommends git openssh-client build-essential \
|
|
&& rm -rf /var/lib/apt/lists/* && pip install --no-cache-dir uv==0.13.0
|
|
# gitea's SSH is 10.250.50.70:222; the lockfile names ssh://git@gitea.phasefinal.com/vh/hamr.git, as nh3-dev's ssh config maps it
|
|
RUN install -d -m 700 /root/.ssh \
|
|
&& printf 'Host gitea.phasefinal.com\n HostName 10.250.50.70\n Port 222\n User git\n' > /root/.ssh/config \
|
|
&& ssh-keyscan -p 222 10.250.50.70 > /root/.ssh/known_hosts 2>/dev/null
|
|
ENV UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=never UV_PROJECT_ENVIRONMENT=/app/.venv
|
|
WORKDIR /app
|
|
COPY . /app
|
|
RUN --mount=type=ssh uv sync --frozen --no-dev && uv --version > /app/.uv-version
|
|
|
|
FROM python:3.12-slim-bookworm AS api
|
|
COPY --from=build /app /app
|
|
RUN install -d -o 1000 -g 1000 /state /state/assets /config
|
|
WORKDIR /app
|
|
ENV PATH=/app/.venv/bin:$PATH PYTHONUNBUFFERED=1
|
|
USER 1000:1000
|
|
EXPOSE 8000
|
|
CMD ["python", "-c", "import uvicorn; from core.api.app import create_app; from core.api.config import ApiConfig; uvicorn.run(create_app(ApiConfig.from_env()), host='0.0.0.0', port=8000)"]
|
|
|
|
FROM oven/bun:1.3 AS webbuild
|
|
WORKDIR /web
|
|
COPY web/ /web/
|
|
RUN bun install --frozen-lockfile && bun run build
|
|
|
|
FROM caddy:2-alpine AS web
|
|
COPY --from=webbuild /web/dist /srv
|