File size: 1,703 Bytes
9de795a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# Hugging-Face-Space `Bryan-HSLU/FP_POC` (Docker-SDK, CPU, Port 7860).
#
# Multi-Stage, weil Frontend-Build (Node/pnpm) und Engines-Laufzeit (Python/uv)
# unterschiedliche Toolchains brauchen; nur das Build-Ergebnis (apps/web/dist)
# wandert in das schlanke Python-Image. Die Repo-Struktur bleibt im Image
# erhalten (/repo/apps/web/dist, /repo/data, /repo/packages/shared,
# /repo/services/engines), weil die Engines Stammdaten und Schemas zur
# Laufzeit über REPO_ROOT relativ zu ihrer eigenen Datei lesen (siehe
# services/engines/src/fp_engines/api.py bzw. space.py).

# --- Stage 1: Frontend bauen -------------------------------------------------
FROM node:22-alpine AS webbuild

RUN corepack enable
WORKDIR /repo
COPY . .
RUN pnpm install --frozen-lockfile && pnpm --filter @fp/web build

# --- Stage 2: Engines-Laufzeit + gebautes Frontend --------------------------
FROM python:3.12-slim

COPY --from=ghcr.io/astral-sh/uv:0.5.11 /uv /uvx /usr/local/bin/

RUN useradd --create-home --uid 1000 user

WORKDIR /repo
COPY . .
COPY --from=webbuild /repo/apps/web/dist ./apps/web/dist
RUN chown -R user:user /repo

USER user
ENV UV_CACHE_DIR=/tmp/uv-cache

RUN uv --project services/engines sync --frozen --no-dev

EXPOSE 7860
# WICHTIG: --no-sync + --frozen, damit `uv run` beim CONTAINERSTART die beim Build
# fertig installierte Umgebung NICHT neu auflöst (kein Netzwerk/Index-Zugriff).
# Ohne das versucht uv run bei jedem Start zu syncen → auf HF flakiger Start
# ("Runtime error"/Startup-Hang). So ist der Start deterministisch und schnell.
CMD ["uv", "--project", "services/engines", "run", "--no-sync", "--frozen", "uvicorn", "fp_engines.space:app", "--host", "0.0.0.0", "--port", "7860"]