# syntax=docker/dockerfile:1.7
#
# Hivemind Content Studio, hosted mode: the control API and the built studio,
# for a public server. No ComfyUI, no MLX engines, no media gateway, no Node
# services — a hosted studio makes everything on the HivemindOS hosted rail,
# on each person's own credits (docs/HOSTING.md).

# ── the studio frontend ─────────────────────────────────────────────────────
FROM node:22-bookworm-slim AS frontend
RUN corepack enable
WORKDIR /src/packages/open-generative-ai
COPY packages/open-generative-ai/package.json packages/open-generative-ai/pnpm-lock.yaml packages/open-generative-ai/pnpm-workspace.yaml ./
RUN pnpm install --frozen-lockfile
COPY packages/open-generative-ai/ ./
# The build stamps the product version from the one file that owns it.
COPY pyproject.toml /src/pyproject.toml
RUN pnpm run vite:build

# ── the control API ─────────────────────────────────────────────────────────
FROM python:3.12-slim-bookworm AS app
RUN apt-get update \
 && apt-get install -y --no-install-recommends ffmpeg git ca-certificates \
 && rm -rf /var/lib/apt/lists/*
COPY --from=ghcr.io/astral-sh/uv:0.8 /uv /usr/local/bin/uv
WORKDIR /app
COPY . .
COPY --from=frontend /src/packages/open-generative-ai/dist /app/packages/open-generative-ai/dist
# The AGPL-3.0 §13 offer: every network user can download the exact source
# this image runs, from /source (api/legal.py). Built from what was copied in,
# so it is the deployed tree by construction.
RUN tar --exclude=./packages/open-generative-ai/dist --exclude=./.venv \
        -czf /tmp/source.tar.gz -C /app . \
 && mv /tmp/source.tar.gz /app/source.tar.gz
# The image's own Python (3.12, inside pyproject's >=3.11,<3.13), never one uv
# downloads: a downloaded interpreter lands in root's home, which the runtime
# user cannot read, and the venv would point at nothing.
ENV UV_LINK_MODE=copy UV_PROJECT_ENVIRONMENT=/app/.venv \
    UV_PYTHON=/usr/local/bin/python3.12 UV_PYTHON_DOWNLOADS=never
RUN uv sync --frozen --no-dev
RUN useradd --create-home --uid 10001 studio && mkdir -p /data && chown studio:studio /data
USER studio

ENV CONTENT_STUDIO_HOSTED=1 \
    CONTENT_STUDIO_CONTROL_HOST=0.0.0.0 \
    CONTENT_STUDIO_CONTROL_PORT=8765 \
    CONTENT_STUDIO_DATA_DIR=/data \
    HIVEMIND_MEDIA_STATE_DIR=/data/media-state \
    CONTENT_STUDIO_FRONTEND_DIST=/app/packages/open-generative-ai/dist \
    CONTENT_STUDIO_SOURCE_ARCHIVE=/app/source.tar.gz \
    HOME=/data/home \
    PATH=/app/.venv/bin:$PATH
VOLUME ["/data"]
EXPOSE 8765
HEALTHCHECK --interval=30s --timeout=5s --start-period=120s --retries=3 \
  CMD python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8765/healthz', timeout=4).status == 200 else 1)"
CMD ["content-studio-api"]
