feat: Update docker-compose configuration to use environment variables for sensitive data, enhance testing documentation with new LaTeX files for capacity planning, and refine README for clarity on compilation and testing processes.

This commit is contained in:
erik
2026-07-17 08:32:00 -05:00
parent e47ef4f8c6
commit dc3fcc2280
89 changed files with 5331 additions and 1210 deletions
+48 -11
View File
@@ -1,11 +1,48 @@
\chapter{Arquitectura bajo prueba}
\label{ch:arquitectura}
\section{Vista de componentes}
El host solo expone el Gateway en el puerto \textbf{8189}. El resto de APIs viven en la red Docker. El agent del bot corre en PCs externas y se comunica por HTTP + PutObject a MinIO.
\section{C\'omo est\'a dise\~nado el sistema}
IPSExtractor sigue una arquitectura de \textbf{microservicios} detrás de un
\textbf{API Gateway}. El host solo expone el puerto \textbf{8189}; el resto vive
en la red Docker. Los agents Selenium corren en PCs externas (HTTP + PutObject a MinIO).
\noindent\textbf{Nombres:} \texttt{bot-descarga} = orquestador (API); \textbf{agent Selenium} = PC que descarga.
ST-BOT-* mide el orquestador; $\sim$422 fact/h es del agent.
\input{diagrams/arquitectura}
\section{Patrones de dise\~no}
\begin{description}[style=nextline,leftmargin=0.8cm,labelwidth=3.2cm]
\item[API Gateway]
\'Unica puerta p\'ublica. Proxy a extraction, cleaning, count-api y bot-descarga.
Centraliza CORS, health y timeouts (JSON 30\,s; uploads del orquestador 600\,s).
\emph{Implicaci\'on de prueba:} ST-GW-* miden el gateway, no el OCR ni el LLM.
\item[Bounded contexts]
Cada servicio tiene un dominio claro: OCR (count-api), LLM (extraction+workers),
orquestaci\'on de descarga (\texttt{bot-descarga}), limpieza CSV (cleaning).
\emph{Implicaci\'on:} fallos y capacidad se prueban por servicio, no solo E2E.
\item[Cola as\'incrona (ARQ)]
Con \texttt{ASYNC\_QUEUE=true}, el ingest encola en Redis y los workers drenan.
Con \texttt{false} (default), el API procesa en el mismo request (sync).
\emph{Implicaci\'on:} ST-EXT-01 exige async + workers; ST-EXT-02 puede correr sync.
\item[Claim / lease]
Un job \texttt{pending} solo lo toma un agent Selenium (claim at\'omico v\'ia \texttt{bot-descarga}). Heartbeat
mantiene al worker online; sin heartbeat, no se asignan jobs.
\emph{Implicaci\'on:} ST-BOT-01/02 miden el orquestador (heartbeats y contenci\'on de claim).
\end{description}
\input{diagrams/patrones}
\section{Pipeline de negocio}
\input{diagrams/pipeline_negocio}
\begin{enumerate}
\item \textbf{Descarga:} agent Selenium obtiene PDFs $\rightarrow$ MinIO.
\item \textbf{Conteo:} OCR/ONNX valida el documento (filtro de calidad).
\item \textbf{Extracci\'on:} LLM rellena campos $\rightarrow$ PostgreSQL.
\item \textbf{Limpieza:} reglas/CSV sobre el lote.
\end{enumerate}
\section{Inventario de componentes}
\begin{table}[ht]
\centering
@@ -14,35 +51,35 @@ El host solo expone el Gateway en el puerto \textbf{8189}. El resto de APIs vive
\textbf{Componente} & \textbf{Puerto} & \textbf{Responsabilidad} \\
\midrule
\texttt{api\_gateway} & Host 8189 & Proxy HTTP, health agregado, CORS \\
\texttt{extraction} & 8001 & Jobs/tasks, LLM, ingest PDFs \\
\texttt{extraction} & 8001 & Tasks, LLM, ingest PDFs \\
\texttt{worker} (ARQ) & --- & Procesamiento async v\'ia Redis \\
\texttt{cleaning} & 8002 & Limpieza CSV / reglas \\
\texttt{count-api} & 8080 & OCR + ONNX, stateless \\
\texttt{bot-descarga} & 8200 & Control remoto de bots \\
\texttt{bot-descarga} & 8200 & Orquestador: jobs, claim, heartbeats, events \\
PostgreSQL 16 & 5432 & Persistencia compartida \\
Redis 7 & 6379 & Cola ARQ + rate limiter \\
Desktop & local & Cliente Electron/React \\
Agent bot & local PC & Selenium + MinIO upload \\
MinIO/S3 & externo & Excel y PDFs del bot \\
Agent Selenium & local PC & Descarga PDFs (Selenium/Imaging) + MinIO upload \\
MinIO/S3 & externo & Excel y PDFs del pipeline de descarga \\
\bottomrule
\end{tabular}
\caption{Componentes del sistema bajo prueba.}
\end{table}
\section{Flujo cr\'itico: bot de descarga}
\section{Flujo cr\'itico: descarga (orquestador + agent Selenium)}
\input{diagrams/flujo_bot}
Secuencia resumida:
\begin{enumerate}
\item Agent: \texttt{register} + loop \texttt{heartbeat} / \texttt{claim\_pending} ($\sim$8\,s).
\item Agent Selenium: \texttt{register} + loop \texttt{heartbeat} / \texttt{claim\_pending} ($\sim$8\,s).
\item Desktop: \texttt{POST /bot-descarga/jobs} (Excel, \texttt{worker\_id}, \texttt{job\_id}).
\item API: valida job padre y worker online; sube Excel a MinIO; estado \texttt{pending}.
\item Agent: claim $\rightarrow$ \texttt{RUNNING}; descarga Excel; Selenium/Imaging; PutObject PDFs.
\item Agent Selenium: claim $\rightarrow$ \texttt{RUNNING}; descarga Excel; Selenium/Imaging; PutObject PDFs.
\item Eventos \texttt{POST /events}; cierre \texttt{PATCH /jobs/\{id\}} (\texttt{completed}/\texttt{failed}).
\end{enumerate}
Layout MinIO:
\begin{lstlisting}[language={},caption={Prefijos MinIO del bot}]
\begin{lstlisting}[language={},caption={Prefijos MinIO del pipeline de descarga}]
uploads/{download_job_id}/input.xlsx
downloads/{download_job_id}/{nit}/{radicado}.pdf
downloads/{download_job_id}/_manifest.json
@@ -51,6 +88,6 @@ downloads/{download_job_id}/_manifest.json
\section{Otros flujos de negocio}
\begin{description}
\item[Conteo] Desktop $\rightarrow$ \texttt{POST /count/v1/count} $\rightarrow$ \texttt{POST /count-jobs} $\rightarrow$ validaci\'on humana.
\item[Extracci\'on] \texttt{from-count} o ingest de PDFs $\rightarrow$ workers ARQ $\rightarrow$ filas en BD.
\item[Extracci\'on] \texttt{from-count} o ingest de PDFs $\rightarrow$ (ARQ) workers $\rightarrow$ filas en BD.
\item[Limpieza] Job cleaning desde \texttt{extraction\_batch\_id} o CSV upload.
\end{description}