Spaces:
Sleeping
Sleeping
| # ============================================================ | |
| # Analytical-Force — Imagem Docker para Hugging Face Spaces | |
| # ------------------------------------------------------------ | |
| # Space do tipo "docker". A aplicação (FastAPI/uvicorn) escuta na porta 7860, | |
| # que é a porta esperada pelo HF (definida em app_port no README). | |
| # | |
| # As credenciais NÃO ficam na imagem: são lidas de variáveis de ambiente | |
| # (Secrets do Space). Nunca faça COPY do arquivo .env. | |
| # | |
| # Build em duas etapas: a primeira compila o painel React (frontend-react/) | |
| # com Node; a segunda é a imagem Python final, que só recebe o resultado | |
| # estático (dist/) — o Node não entra na imagem publicada. O FastAPI serve | |
| # esse dist/ em "/" (ver api.py), então API e painel respondem na mesma | |
| # porta/Space, sem precisar de um segundo host nem de CORS entre os dois. | |
| # ============================================================ | |
| # ---------------- Etapa 1: build do painel (Node) ---------------- | |
| FROM node:20-slim AS frontend-build | |
| WORKDIR /frontend | |
| COPY frontend-react/package.json frontend-react/package-lock.json* ./ | |
| RUN npm install | |
| COPY frontend-react/ ./ | |
| RUN npm run build | |
| # ---------------- Etapa 2: imagem final (Python) ---------------- | |
| FROM python:3.11-slim | |
| ENV PYTHONUNBUFFERED=1 \ | |
| PYTHONDONTWRITEBYTECODE=1 \ | |
| PIP_NO_CACHE_DIR=1 \ | |
| HOME=/home/user \ | |
| # Cache do Hugging Face (download de modelos) em diretório gravável. | |
| HF_HOME=/home/user/.cache/huggingface \ | |
| HF_HUB_DISABLE_TELEMETRY=1 | |
| # Usuário não-root (HF Spaces executa como uid 1000). | |
| RUN useradd -m -u 1000 user | |
| WORKDIR /home/user/app | |
| # Dependências (leves): API + agente + cliente de inferência hospedada. | |
| # Sem torch/transformers — a IA usa a Inference API da HF (modelo hospedado). | |
| COPY --chown=user:user requirements-hf.txt ./requirements-hf.txt | |
| RUN pip install --no-cache-dir -r requirements-hf.txt | |
| # Copia o código da aplicação. | |
| COPY --chown=user:user . . | |
| # Copia só o resultado do build do painel (estático) — não o Node nem o | |
| # node_modules, que ficam de fora da imagem final. | |
| COPY --chown=user:user --from=frontend-build /frontend/dist ./frontend-react/dist | |
| # Garante diretórios graváveis (logs/relatórios/exports são transitórios; | |
| # a persistência real é no Turso). Inclui o cache de modelos do Hugging Face. | |
| RUN mkdir -p logs reports/daily data/exports /home/user/.cache/huggingface \ | |
| && chown -R user:user /home/user | |
| USER user | |
| EXPOSE 7860 | |
| # Sobe a API. A porta 7860 deve bater com app_port no README do Space. | |
| CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "7860"] | |