Appearance
Backends: dependencias y configuración
Dependencias
Versiones de requirements.prod.txt (las que se instalan en la imagen Docker).
Comunes a ambos backends
| Paquete | Versión | Uso |
|---|---|---|
django | 5.2.14 (IDP) · 5.2.16 (SPS) | Framework web |
graphene-django | 3.2.2 | APIs GraphQL sobre los modelos de Django |
graphene-file-upload | 1.2.2 | Subida de archivos en GraphQL (multipart) |
django-graphbox | 1.5.14 | Construcción de schemas GraphQL y middleware de autenticación |
djangorestframework | 3.17.1 | API REST /api/v1/ |
drf-spectacular | 0.29.0 | Generación de OpenAPI, Swagger UI y ReDoc |
django-extensions | 3.1.3 | runscript, graph_models y utilidades de desarrollo |
django-environ | 0.7.0 | Lectura de variables desde .env |
wsgicors | 0.7.0 | Cabeceras CORS a nivel WSGI |
psycopg[binary] | 3.3.4 | Driver de PostgreSQL |
gunicorn | 26.0.0 | Servidor WSGI en producción |
cryptography | 48.0.0 | Primitivas criptográficas |
PyJWT | 2.10.1 | Emisión y validación de JWT |
pyotp | 2.9.0 | Códigos TOTP (segundo factor) |
requests | 2.34.2 | Cliente HTTP para servicios externos |
Pillow | 9.5.0 | Procesamiento de imágenes |
qrcode | 8.2 | Generación de códigos QR |
pypdf | 6.14.2 | Lectura y manipulación de PDF |
Faker | 37.11.0 (IDP) · ≥18.0.0 (SPS) | Datos ficticios para comandos de prueba |
Solo IDP (auth-backend)
| Paquete | Versión | Uso |
|---|---|---|
captcha | 0.7.1 | Captcha de imagen en el flujo de login |
pyHanko | 0.35.2 | Firmas digitales en PDF. Declarado en requirements; no se encontró uso directo en el código |
Solo SPS (backend-seleccion-postulantes)
| Paquete | Versión | Uso |
|---|---|---|
weasyprint | 69.0 | Generación de PDF desde HTML |
Jinja2 | 3.1.6 | Plantillas de documentos |
tiptapy | 0.21.0 | Conversión de contenido del editor Tiptap a HTML |
beautifulsoup4 | 4.9.3 | Procesamiento de HTML |
openpyxl | 3.1.5 | Lectura y escritura de Excel |
pdf2image | 1.16.0 | Conversión de PDF a imagen |
opencv-contrib-python | 4.8.1.78 | Lectura OMR de hojas de respuestas y marcadores ArUco en documentos |
numpy | 1.24.3 | Cálculo numérico (requerido por OpenCV) |
PyNaCl | 1.6.2 | Cifrado de bancos de preguntas (compatible con Custodio) |
zipstream-ng | 1.9.3 | Descarga de archivos ZIP en streaming |
pycountry | 26.2.16 | Catálogo de países |
num2words | 0.5.14 | Números en letras para documentos |
Dependencias de sistema
La imagen Docker instala además:
- Ambos:
nginx,curl. - SPS:
ghostscripty librerías nativas de WeasyPrint y OpenCV (Pango, Cairo, GDK-PixBuf, libffi, libGL, fuentes Liberation y DejaVu). Ver Imágenes Docker.
requirements.txt frente a requirements.prod.txt
requirements.txt es para desarrollo local: no incluye gunicorn y agrega mysqlclient (driver MySQL, requiere las librerías de desarrollo de MySQL en el sistema). En el SPS también fija Pillow>=13.0.0. La imagen Docker usa solo requirements.prod.txt.
Variables de entorno
Los backends leen su configuración de un archivo .env en la raíz del proyecto (django-environ). La plantilla es .env.example. En los servidores, este archivo es el back.env que genera el pipeline (ver Variables y secretos de CI/CD).
Comunes
| Variable | Descripción |
|---|---|
SECRET_KEY | Clave secreta de Django |
DEBUG | Modo depuración. Debe ser False en servidores |
SYSTEM_STATUS | True para operar; False activa el modo standby (503) y bloquea comandos de manage.py |
ALLOWED_HOSTS | Dominios aceptados (lista separada por comas) |
ALLOWED_CORS | Orígenes de los frontends permitidos (CORS y CSRF) |
MAIN_DOMAIN | Dominio base para las cookies (sin subdominio) |
DATABASE_ENGINE | Motor de Django (django.db.backends.postgresql) |
DATABASE_NAME · DATABASE_USER · DATABASE_PASS · DATABASE_HOST · DATABASE_PORT | Conexión a la base de datos |
SIGNING_KEY_MASTER_SECRET | Clave maestra de cifrado de datos sensibles |
STATIC_ROOT | Destino de collectstatic (por defecto assets/) |
PUBLIC_MEDIA_ROOT | Raíz de archivos públicos (por defecto files/; en Docker /app/public_files) |
PRIVATE_MEDIA_ROOT | Raíz de archivos privados (por defecto private_files/; en Docker /app/private_files) |
PRIVATE_MEDIA_SERVE_BACKEND | Cómo se entregan los archivos privados: django, apache o nginx (por defecto django) |
PRIVATE_MEDIA_NGINX_HEADER · PRIVATE_MEDIA_NGINX_INTERNAL_PREFIX | Cabecera (X-Accel-Redirect) y prefijo interno (/private_files/) para nginx |
PRIVATE_MEDIA_APACHE_HEADER | Cabecera para Apache (X-Sendfile) |
PRIVATE_MEDIA_URL | URL de archivos privados cuando los sirve Django |
TIP
En los contenedores, nginx está configurado para X-Accel-Redirect sobre /private_files/, por lo que corresponde PRIVATE_MEDIA_SERVE_BACKEND=nginx.
Solo IDP
| Variable | Descripción |
|---|---|
AUTHSERVER_ISSUER | Issuer del servidor de autorización (tokens y discovery OIDC) |
PUBLIC_LOGIN_URL | URL pública del portal de login |
IDP_CALLBACK_URL | Callback del login con proveedores de identidad externos |
IDP_LINKING_CALLBACK_URL | Callback de vinculación de proveedores externos con una cuenta existente |
IDP_LOGIN_CD_FOR_APPROVAL_CALLBACK_URL | Callback del login con Ciudadanía Digital para aprobar documentos |
CD_AGETIC_ISSUER | Issuer de Ciudadanía Digital (AGETIC) |
BASE_SERVE_PRIVATE_FILES | URL base para construir enlaces a archivos privados |
SSO_COOKIE_SESSION_KEY | Nombre de la cookie de sesión SSO |
Solo SPS
| Variable | Descripción |
|---|---|
DATABASE_CONN_MAX_AGE | Persistencia de conexiones en segundos (por defecto 900) |
IDP_OIDC_DISCOVERY_URL | Discovery OIDC del IDP |
IDP_OIDC_CLIENT_ID · IDP_OIDC_CLIENT_SECRET | Cliente OIDC del SPS para el login de los portales |
IDP_OIDC_SCOPES | Scopes solicitados en el login |
IDP_OIDC_ADMIN_REDIRECT_URI · IDP_OIDC_ADMIN_LOGOUT_REDIRECT_URI | Redirecciones de login/logout del portal administrativo |
IDP_OIDC_COMISIONES_REDIRECT_URI · IDP_OIDC_COMISIONES_LOGOUT_REDIRECT_URI | Ídem, portal de comisiones |
IDP_OIDC_POSTULANTE_REDIRECT_URI · IDP_OIDC_POSTULANTE_LOGOUT_REDIRECT_URI | Ídem, portal de postulantes |
IDP_API_CLIENT_ID · IDP_API_CLIENT_SECRET | Cliente client_credentials para consumir las APIs REST del IDP |
IDP_API_SCOPES | Scopes de ese cliente |
IDP_API_BASE_URL | URL base de las APIs del IDP |
COOKIE_SESSION_KEY | Nombre de la cookie de sesión de los portales |
COOKIE_ESTACION_SESSION_KEY | Nombre de la cookie de sesión de las estaciones de examen |
CREDENTIALS_KEY_EXAMEN_VIRTUAL | Clave de las credenciales JWT de estaciones de examen |
APPROVALDOCS_APPROVAL_URL | URL del IDP donde el usuario aprueba documentos |
POST_APPROVALDOCS_POSTULACION_REDIRECT_URI | Redirección tras aprobar documentos de una postulación |
PUBLIC_DOCS_VERIFICATION_BASE_URL | URL pública de verificación de documentos emitidos (códigos QR) |
WEBSITE_API_BASE_URL · WEBSITE_API_KEY | API del sitio web institucional (publicación de avisos) |
MIGRATION_MSSQL_CONN | Conexión a los backups SQL Server de datos históricos (opcional) |
Ejecución local
sh
# 1. Entorno virtual con Python 3.11
python3.11 -m venv env
source env/bin/activate
# 2. Dependencias
pip install -r requirements.txt
# 3. Configuración
cp .env.example .env # completar valores; SYSTEM_STATUS=True
# 4. Base de datos
python manage.py migrate
# 5. Servidor de desarrollo
python manage.py runserverEn el IDP, después de migrar ejecute los comandos de inicialización que en Docker corren en el arranque (rotate_signing_keys, create_default_scopes, create_claim_definitions) y cree un administrador con create_super_admin. Ver Scripts útiles de los backends.
En el SPS, WeasyPrint requiere las librerías nativas en el sistema (en Debian/Ubuntu: libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev libcairo2 shared-mime-info fonts-liberation fonts-dejavu-core).
