fredcaixeta commited on
Commit
f39d1ce
·
1 Parent(s): 6b09f4c
Files changed (5) hide show
  1. .gitignore +0 -2
  2. Dockerfile +9 -32
  3. app.py +5 -13
  4. modelo_random_forest.joblib +3 -0
  5. scaler.joblib +3 -0
.gitignore CHANGED
@@ -1,3 +1 @@
1
  working.py
2
- *.joblib
3
- .env
 
1
  working.py
 
 
Dockerfile CHANGED
@@ -1,41 +1,18 @@
1
- # ──────────────────────────────────────────────
2
- # Dockerfile pronto para Spaces (Hugging Face)
3
- # ──────────────────────────────────────────────
4
  FROM python:3.9-slim
5
 
6
- # 1. Pacotes de sistema necessários
7
- RUN apt-get update \
8
- && apt-get install -y --no-install-recommends ffmpeg \
9
- && apt-get clean \
10
- && rm -rf /var/lib/apt/lists/*
11
-
12
- # 2. Cria o usuário padrão exigido nos Spaces (UID 1000)
13
- RUN useradd -m -u 1000 user
14
  WORKDIR /app
15
 
16
- # 3. Instala dependências Python
17
- COPY --chown=user requirements.txt .
18
- RUN pip install --no-cache-dir -r requirements.txt
19
 
20
- # 4. Copia o código-fonte
21
- COPY --chown=user . /app
22
 
23
- # 5. Copia o arquivo .env (fornecido como secret no build)
24
- # a) Suba o .env para os Secrets da Space
25
- # b) O runtime da Space vai recriar /app/.env automaticamente
26
- # (não fica exposto nas camadas da imagem)
27
- # Se estiver testando localmente via buildx:
28
- # docker buildx build --secret id=MY_ENV_FILE,src=.env -t my-space .
29
- RUN --mount=type=secret,id=MY_ENV_FILE,mode=0440 \
30
- cp /run/secrets/MY_ENV_FILE /app/.env
31
 
32
- # 6. Variáveis de ambiente & PATH corretos
33
- USER user
34
- ENV HOME=/home/user \
35
- PATH=/home/user/.local/bin:$PATH
36
 
37
- # 7. Exponha a porta padrão
38
- EXPOSE 7860
39
 
40
- # 8. Comando de inicialização
41
- CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
 
 
 
 
1
  FROM python:3.9-slim
2
 
 
 
 
 
 
 
 
 
3
  WORKDIR /app
4
 
5
+ RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg && \
6
+ apt-get clean && \
7
+ rm -rf /var/lib/apt/lists/*
8
 
9
+ COPY requirements.txt ./
 
10
 
11
+ RUN pip install --no-cache-dir -r requirements.txt
 
 
 
 
 
 
 
12
 
13
+ COPY . .
 
 
 
14
 
15
+ RUN --mount=type=secret,id=WORKING_PY_CONTENT,mode=0440 \
16
+ cp /run/secrets/WORKING_PY_CONTENT /app/working.py
17
 
18
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
 
app.py CHANGED
@@ -3,8 +3,7 @@ from fastapi.middleware.cors import CORSMiddleware
3
  from fastapi.responses import FileResponse
4
  from fastapi.staticfiles import StaticFiles
5
  from pydantic import BaseModel
6
- import importlib.util
7
- import sys
8
 
9
  # --- 1. SETUP DO FASTAPI ---
10
  app = FastAPI(
@@ -22,18 +21,11 @@ app.add_middleware(
22
 
23
  app.mount("/static", StaticFiles(directory="static"), name="static")
24
 
25
- # --- 2. CARREGAR MÓDULO working.py DINAMICAMENTE ---
26
- spec = importlib.util.spec_from_file_location("working", "working.py")
27
- working = importlib.util.module_from_spec(spec)
28
- sys.modules["working"] = working
29
- spec.loader.exec_module(working)
30
- main = working.main
31
-
32
- # --- 3. MODELO DE DADOS ---
33
  class URLPayload(BaseModel):
34
  url: str
35
 
36
- # --- 4. ROTA DE CLASSIFICAÇÃO ---
37
  @app.post("/api/classify")
38
  def classify_audio(payload: URLPayload):
39
  try:
@@ -44,7 +36,7 @@ def classify_audio(payload: URLPayload):
44
  except Exception as e:
45
  raise HTTPException(status_code=500, detail=f"Erro interno: {e}")
46
 
47
- # --- 5. ROTA DE SAÚDE ---
48
  @app.get("/", response_class=FileResponse)
49
  def home():
50
- return "./static/index.html"
 
3
  from fastapi.responses import FileResponse
4
  from fastapi.staticfiles import StaticFiles
5
  from pydantic import BaseModel
6
+ from working import main
 
7
 
8
  # --- 1. SETUP DO FASTAPI ---
9
  app = FastAPI(
 
21
 
22
  app.mount("/static", StaticFiles(directory="static"), name="static")
23
 
24
+ # --- 2. MODELO DE DADOS ---
 
 
 
 
 
 
 
25
  class URLPayload(BaseModel):
26
  url: str
27
 
28
+ # --- 3. ROTA DE CLASSIFICAÇÃO ---
29
  @app.post("/api/classify")
30
  def classify_audio(payload: URLPayload):
31
  try:
 
36
  except Exception as e:
37
  raise HTTPException(status_code=500, detail=f"Erro interno: {e}")
38
 
39
+ # --- 4. ROTA DE SAÚDE ---
40
  @app.get("/", response_class=FileResponse)
41
  def home():
42
+ return "./static/index.html"
modelo_random_forest.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b7f6e4f5f5ddb79ba2b2dd1833baf11023938fc5963a5e861e8dc107bb377abc
3
+ size 81609
scaler.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:733bfb8d8744a97c600707fe4d594261732dc5890587579030f241a878cfb8bd
3
+ size 903