From d4dd2f3999b587c01c1a206b1eaf898de38a1930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Alberto=20=C3=81lvarez=20Henao?= Date: Wed, 5 Nov 2025 11:21:22 -0500 Subject: [PATCH 1/2] =?UTF-8?q?chore(genAI):=20integra=20genAI=20como=20su?= =?UTF-8?q?bm=C3=B3dulo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 4 ++++ genAI | 1 + 2 files changed, 5 insertions(+) create mode 100644 .gitmodules create mode 160000 genAI diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d4c324f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "genAI"] + path = genAI + url = https://github.com/carlosalvarezh/genAI.git + branch = main diff --git a/genAI b/genAI new file mode 160000 index 0000000..f399e09 --- /dev/null +++ b/genAI @@ -0,0 +1 @@ +Subproject commit f399e099644339deaeb908057f1e2f45daa044e8 From f1c6b452c41ba693df8ec0369690697e4fe2b8d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Alberto=20=C3=81lvarez=20Henao?= Date: Wed, 5 Nov 2025 11:37:35 -0500 Subject: [PATCH 2/2] docs+docker: README actualizado + .dockerignore + Dockerfile + compose --- .dockerignore | 21 +++++++++++++++++++++ Dockerfile | 35 +++++++++++++++++++++++++++++++++++ README.md | 4 ++-- docker-compose.yml | 12 ++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e684b41 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,21 @@ +# Entorno y cachés +.venv/ +__pycache__/ +*.pyc +*.pyo +*.pyd +*.pytest_cache/ +.ipynb_checkpoints/ + +# Git y editor +.git/ +.gitignore +.vscode/ + +# Datos locales (no necesarios para la imagen) +data/ +reports/ + +# Otros +dist/ +build/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..dab0d73 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,35 @@ +# Imagen base ligera +FROM python:3.11-slim + +# Evitar bytecode y forzar log en stdout +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 + +# Crear usuario no-root +RUN useradd -m appuser + +# Directorio de trabajo +WORKDIR /app + +# Instalar dependencias del sistema (si hicieran falta en el futuro) +# RUN apt-get update && apt-get install -y --no-install-recommends \ +# build-essential && \ +# rm -rf /var/lib/apt/lists/* + +# Copiar requirements e instalar +COPY requirements.txt /app/requirements.txt +RUN pip install --no-cache-dir -r /app/requirements.txt + +# Copiar código y artefactos del modelo +COPY src /app/src +COPY main.py /app/main.py +COPY models_artifacts /app/models_artifacts + +# Exponer puerto del servicio +EXPOSE 8000 + +# Cambiar a usuario no-root +USER appuser + +# Comando por defecto: levantar la API +CMD ["uvicorn", "src.api.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/README.md b/README.md index e2185aa..a588e0f 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ Proyecto técnico que integra: - `src/`: código productivo (features, modelos, API, utilidades). - `models_artifacts/`: artefactos serializados del modelo (p. ej., `clf_alpha_beta_final.joblib`, `inference_config.json`). - `reports/`: métricas, gráficos y salidas. -- `genai/`: POC de agente generativo (opcional). -- `docker/`: contenedorización (opcional). +- `genai/`: e decidio realizarlo en un proyecto aparte. +- `docker/`: contenedorización. - `tests/`: pruebas unitarias. --- diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..99e8d19 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +services: + api: + build: . + image: predictia-api:latest + ports: + - "8000:8000" + restart: unless-stopped + # Si quieres ejecutar el script por fuera, no necesitas volúmenes. + # Si quisieras usar el script dentro del contenedor contra tus datos locales: + # volumes: + # - ./data:/app/data + # - ./reports:/app/reports