| # forecast-service — TimesFM 2.x + Chronos-2 ensemble API. | |
| # Builds a container any host can run (Hugging Face Spaces / Render / Railway / Fly / a VM), | |
| # so the Vercel app can reach it via FORECAST_URL. | |
| # | |
| # First boot downloads ~2GB of model weights from HuggingFace into HF_HOME (expected, once). | |
| # Binds 0.0.0.0 (FORECAST_HOST) so the host can route to it; honours the host's $PORT | |
| # (Render/Railway/Fly inject one) and otherwise serves on 8008. | |
| FROM python:3.12-slim | |
| # build-essential for any source-built wheels; libgomp1 for torch; git in case a dep needs it. | |
| RUN apt-get update && apt-get install -y --no-install-recommends \ | |
| build-essential git libgomp1 \ | |
| && rm -rf /var/lib/apt/lists/* | |
| WORKDIR /app | |
| # Install deps first so Docker caches this layer across code changes. | |
| COPY requirements.txt . | |
| RUN pip install --no-cache-dir -r requirements.txt | |
| COPY . . | |
| ENV FORECAST_HOST=0.0.0.0 \ | |
| HF_HOME=/app/.hf_cache \ | |
| PYTHONUNBUFFERED=1 | |
| EXPOSE 8008 | |
| # ${PORT:-8008}: use the platform-injected port if present, else 8008. | |
| CMD ["sh", "-c", "FORECAST_PORT=${PORT:-8008} python main.py"] | |