| # Aurelius backend — container image. | |
| # | |
| # Works on any always-on container host (Hugging Face Spaces, Fly.io, | |
| # Railway, Google Cloud Run). NOT for serverless/edge platforms (Vercel, | |
| # Netlify, Firebase Functions) — the app holds a ~400 MB ML model in | |
| # memory for its whole lifetime and serves a persistent WebSocket, neither | |
| # of which a cold-starting serverless function can do. | |
| FROM python:3.11-slim | |
| # --- CPU-only PyTorch FIRST ------------------------------------------------ | |
| # Installing torch from the default index pulls ~2 GB of NVIDIA CUDA wheels | |
| # that are useless on a CPU host (and OOM/bloat the build). Pinning the CPU | |
| # index gets the ~190 MB CPU build instead. Must come BEFORE requirements so | |
| # sentence-transformers finds torch already satisfied and doesn't re-resolve | |
| # it from the GPU index. | |
| RUN pip install --no-cache-dir torch --index-url https://download.pytorch.org/whl/cpu | |
| # --- App dependencies ------------------------------------------------------ | |
| COPY requirements.txt . | |
| RUN pip install --no-cache-dir -r requirements.txt | |
| # --- Non-root user (Hugging Face Spaces runs containers as UID 1000) ------- | |
| # A writable HOME is required so sentence-transformers can download the | |
| # model into ~/.cache/huggingface on first boot. Running as root on Spaces | |
| # makes that cache dir unwritable and the model load fails. | |
| RUN useradd -m -u 1000 user | |
| USER user | |
| ENV HOME=/home/user \ | |
| PATH=/home/user/.local/bin:$PATH | |
| WORKDIR /home/user/app | |
| COPY --chown=user . . | |
| # Hugging Face Spaces routes to port 7860 by default (app_port in README). | |
| # main.py reads $PORT, so setting it here makes the same image bind 7860 on | |
| # Spaces and whatever $PORT other hosts inject. | |
| ENV PORT=7860 | |
| EXPOSE 7860 | |
| CMD ["python", "main.py"] | |