Como publicar a plataforma com URL pública, grátis e sem perder funcionalidade.
✅ No ar: https://samuelorrico-guardiaoai.hf.space — Hugging Face Spaces, URL única (API + frontend no mesmo container). Este guia documenta como foi feito e como atualizar a demo.
A Vercel é serverless/stateless. O backend é stateful: o pipeline roda no boot e
mantém 5,2M leituras processadas em RAM (DataStore). Em serverless cada
invocação é um processo novo → o store volta vazio → 503 em tudo. Além disso o
parquet de features (137 MB) + 48 modelos estouram o limite de 250 MB de função.
→ Frontend roda liso na Vercel; backend precisa de processo persistente.
Um único container serve a API (/api/*) e o frontend React (todo o resto).
HF Spaces free dá 16 GB de RAM — folgado para o pandas/scikit-learn (os hosts
free concorrentes dão 512 MB, apertado para esse pipeline).
| Valor | |
|---|---|
| Plataforma | Hugging Face Spaces — SDK Docker |
| RAM (free) | 16 GB |
| Porta | 7860 |
| Payload | ~164 MB de artefatos (sem o banco de 626 MB) |
| URL | https://<user>-<space>.hf.space |
O banco assets/banco_de_dados.db (626 MB) não é necessário em runtime — ele só
gera os artefatos. O container só precisa de:
backend/models/artifacts/features_cache.parquet(~137 MB)backend/models/artifacts/isolation_forest/*.joblib(48 modelos, ~30 MB)backend/models/artifacts/clustering/kmeans.joblib
Gere-os uma vez localmente (precisa do banco):
make train # = python backend/scripts/train_models.pyO
.gitignoredo projeto ignorabackend/models/artifacts/. No repositório do Space eles precisam ser versionados via Git LFS (ver passo 3).
1. Teste local com Docker (valida a imagem antes de subir):
Antes de tudo: abra o Docker Desktop e espere o ícone ficar verde (daemon ativo). Sem ele,
make docker-buildfalha comfailed to connect to the docker API ... check if the daemon is running.
make docker-build # docker build -t guardiaoia .
make docker-run # http://localhost:7860Abra http://localhost:7860 — a barra de progresso aparece e em ~30–60s o painel
carrega. (O primeiro acesso pode levar ~1 min enquanto o store popula.)
2. Crie o Space em huggingface.co → New Space → SDK Docker → Blank.
3. Crie um token de escrita em huggingface.co/settings/tokens → New token →
Type Write. O git por HTTPS não aceita a senha da conta: no push, a "senha"
é esse token. (Alternativa: rodar hf auth login uma vez — pip install -U huggingface_hub.)
4. Envie numa branch dedicada — mantém o main do GitHub limpo, sem os 164 MB:
git lfs install
git remote add space https://huggingface.co/spaces/<user>/<space>
git checkout -b deploy-hf # branch só para o deploy
# Adicione o cabeçalho YAML no TOPO do README.md (o Space precisa dele):
# ---
# title: <nome>
# sdk: docker
# app_port: 7860
# ---
# edite e salve o README.md, então:
git add -f backend/models/artifacts # força: estão no .gitignore. .gitattributes manda p/ LFS
git add README.md
git commit -m "deploy(hf): config do Space + artefatos via LFS"
# 1º deploy usa --force: o Space tem um commit inicial automático (história não-relacionada)
git push space deploy-hf:main --forceAo pedir credencial: usuário = seu login HF · senha = o token (passo 3).
O HF detecta o Dockerfile, builda e publica em https://<user>-<space>.hf.space.
⚠️ Não rodegit push origin deploy-hf— mandaria os 164 MB para o GitHub. Adeploy-hfé só para o Space; seumaincontinua limpo. Para voltar ao trabalho normal:git checkout main.
A história já está alinhada — sem --force daqui pra frente:
git checkout deploy-hf
git merge main # traz o que mudou no main
# (se README.md conflitar, mantenha o cabeçalho YAML do topo)
git add -f backend/models/artifacts # só se rodou `make train` de novo
git push space deploy-hf:main
git checkout main # volta ao trabalho normalVantagem: o frontend num CDN global (mais rápido) e deploy independente. Custo: 2 URLs + configurar CORS.
Backend (HF Spaces): mesma imagem; defina a env CORS_ORIGINS com a URL da Vercel.
Frontend (Vercel):
- Root directory:
frontend - Build command:
npm run build· Output:dist - Env var:
VITE_API_URL=https://<user>-<space>.hf.space/api
Como o backend serve a API sob /api, o VITE_API_URL aponta para .../api.
| Var | Default | Para quê |
|---|---|---|
PORT |
7860 | Porta do uvicorn (Render/Railway injetam) |
FRONTEND_DIST |
frontend/dist |
Pasta do SPA buildado; se não existir, API roda sozinha |
CORS_ORIGINS |
http://localhost:5173 |
Origens liberadas (frontend separado) |
DB_PATH |
assets/banco_de_dados.db |
Só usado se faltar cache (re-treina) |
SKIP_STARTUP |
0 |
1 pula o pipeline (usado em testes) |