FROM python:3.12-slim # Zona horaria del contenedor. Por defecto Perú (America/Lima), a juego con # los datos de SAP que usa esta app (Country "PE", SUNAT, soles); cambiar el # build arg si se despliega para un cliente en otro país de Latinoamérica. ARG TZ=America/Lima ENV TZ=${TZ} RUN apt-get update \ && apt-get install -y --no-install-recommends tzdata \ && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \ && echo ${TZ} > /etc/timezone \ && rm -rf /var/lib/apt/lists/* # Librerías nativas que necesita WeasyPrint (routers/reports.py) para # renderizar HTML/CSS a PDF: no vienen incluidas en python:3.12-slim. RUN apt-get update \ && apt-get install -y --no-install-recommends \ libpango-1.0-0 \ libpangocairo-1.0-0 \ libpangoft2-1.0-0 \ libcairo2 \ libgdk-pixbuf-2.0-0 \ shared-mime-info \ fonts-liberation \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Certificado extra de la empresa (VPN, proxy o antivirus corporativo que # intercepta HTTPS, ej. Zscaler/Netskope). Si mini-backend/certs/ tiene un # archivo .pem/.crt, pip confía en él para poder salir a internet durante el # build. Si la carpeta está vacía (caso normal), este paso no hace nada. COPY certs/ /usr/local/share/extra-ca/ COPY requirements.txt . RUN CERT_FILE=$(find /usr/local/share/extra-ca -maxdepth 1 -type f \( -name "*.pem" -o -name "*.crt" -o -name "*.cer" \) 2>/dev/null | head -n1); \ if [ -n "$CERT_FILE" ]; then export PIP_CERT="$CERT_FILE"; fi; \ pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 # Un solo worker (por diseño, no un límite temporal): la sesión de SAP y las # sesiones de empleado viven en diccionarios en memoria del proceso # (core/sap.py, core/session.py). Con --workers > 1 cada proceso tendría su # propia copia y los usuarios verían "sesión expirada" de forma intermitente # según a qué worker los enrutara Docker/el proxy. CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]