Saltar a contenido

Configuración (env)

Todo se configura mediante variables de entorno. El ejemplo canónico es backend/.env.example.

Nunca subas secretos al repositorio

backend/.env, el .env raíz y backend.env están todos ignorados por git. Cuando añadas una variable, documéntala en los README, nunca su valor.

Básicos

Variable Ejemplo Función
PORT 8080 Puerto de escucha de la API
ENVIRONMENT production Activa las comprobaciones estrictas de producción
DEBUG false Registro detallado
ALLOWED_ORIGINS https://open.gerege.mn Lista de orígenes CORS (separados por comas; * prohibido)
TRUSTED_PROXIES Direcciones de los proxies inversos

Base de datos y Redis

Variable Función
DB_POSTGRE_DSN / DB_POSTGRE_URL Cadena de conexión
DB_MAX_OPEN_CONNS, DB_MAX_IDLE_CONNS, DB_CONN_MAX_LIFE_MINS Ajuste del pool
REDIS_HOST, REDIS_PASS, REDIS_EXPIRED Conexión a Redis y TTL

En producción los DSN deben usar sslmode=verify-full

La comprobación de producción lo exige. La pila de Docker Compose se ejecuta deliberadamente con ENVIRONMENT=development, porque su base de datos interna no tiene TLS.

La API no debe conectarse como superusuario

La RLS solo se aplica si la aplicación se conecta con un rol de mínimo privilegio. Un rol superusuario o con BYPASSRLS hace fallar el arranque en producción.

JWT y sesiones

Variable Función
JWT_SECRET ≥32 caracteres. Cambiarlo invalida todas las sesiones
JWT_EXPIRED, JWT_REFRESH_EXPIRED Vigencia de acceso / actualización
JWT_ISSUER Normalmente el dominio de la aplicación. Cambiarlo invalida todos los tokens existentes

eID (parte confiante)

Variable Función
EID_BASE_URL Base /v3 de eID Mongolia (o el relé de firma del SSO)
EID_RP_UUID, EID_RP_SECRET Credenciales de parte confiante
SIGN_RELAY_TOKEN Token compartido del relé de firma (vacío lo desactiva)

Gerege SSO (lado RP: esta aplicación como cliente)

Variable Ejemplo Función
SSO_ISSUER https://sso.gerege.mn Valor por defecto si no se define
SSO_CLIENT_ID / SSO_CLIENT_SECRET Vacío deja el flujo SSO inactivo
SSO_REDIRECT_URI https://open.gerege.mn/sso/callback Debe estar registrado exactamente igual en el cliente SSO
SSO_SCOPE openid profile email nationalid nationalid añade el número de identidad civil
SSO_NATIVE_CLIENT_ID Cliente del flujo móvil (PKCE, público)
SSO_EID_PROXY_BASE_URL Si se define, la superficie PKI de eID pasa por el proxy del SSO

Un cliente sin registrar devuelve invalid_client

Si SSO_CLIENT_ID no consta en el registro de clientes del proveedor, el paso de autorización devuelve {"error":"invalid_client"}. La URI de redirección también debe coincidir exactamente.

Lado proveedor OIDC (esta aplicación como proveedor)

Variable Función
OAUTH_ISSUER Por ejemplo https://open.gerege.mn. El proveedor se activa solo cuando se define
SSO_STATE_KEY Clave HMAC del estado transitorio de acceso/consentimiento (≥32 bytes)
SSO_FIRSTPARTY_CLIENTS Clientes de primera parte que omiten la pantalla de consentimiento
SSO_ADMIN_API_KEYS, SSO_ADMIN_SUBS Acceso a la API de administración

Superficie de acceso (AUTH_MODE)

Que la plataforma autentique ella misma o redirija a un SSO superior no es una diferencia de código: lo decide esta única variable.

Valor En la portada y en /login
provider La tarjeta de acceso (eID n.º de registro/QR · Google) se muestra aquí
client Redirección al SSO superior (SSO_ISSUER)
AUTH_MODE=client      # despliegue de referencia de esta plantilla — parte confiante del SSO
AUTH_MODE=provider    # un servicio de identidad como sso.dgov.mn / sso.gerege.mn

Déjala vacía y se deduce de si SSO_CLIENT_ID está configurado, de modo que los despliegues existentes no necesitan cambio alguno.

Una errata NO provoca un repliegue silencioso

Con un valor no reconocido, el backend se niega a arrancar. De lo contrario, la plataforma se levantaría en silencio con una superficie de acceso distinta de la prevista.

Un eje APARTE de OAUTH_ISSUER

OAUTH_ISSUER responde a «¿es esta plataforma un issuer para otras aplicaciones?»; AUTH_MODE responde a «¿dónde inician sesión los usuarios de esta plataforma?». Ambos pueden estar activos a la vez: un montaje encadenado.

El frontend obtiene su modo del endpoint público GET /api/v1/site/auth (sin autenticación ni secretos), así que no hay variables de entorno duplicadas en el frontend.

Idiomas de la interfaz

La plataforma incluye traducciones integradas para el mongol y las seis lenguas oficiales de la ONU (árabe · chino · inglés · francés · ruso · español). Las siete funcionan de inmediato: con la base de datos vacía y sin ningún paso de traducción.

El árabe recibe automáticamente <html dir="rtl">.

Variable Notas
No hace falta configuración; los idiomas llegan a la tabla languages como is_builtin

Si necesitas más idiomas, un superadministrador los añade en Idiomas y rellena las traducciones con Gemini: se guardan como overlay en la base de datos.

Terceros y almacenamiento

Variable Función
GEMINI_API_KEY Canal de IA. Sin ella, /ai/* devuelve un 500 real
GOOGLE_CLIENT_ID / SECRET Vinculación con Google (el botón se oculta si está vacío)
VERIFY_API_BASE, VERIFY_API_KEY, VERIFY_CHANNEL Verificación de ciudadanos / organizaciones
XYP_API_BASE, XYP_CLIENT_ID, XYP_CLIENT_SECRET Consultas a los registros públicos
GSPACE_* Almacenamiento SFTP propio de la aplicación (cuota por usuario)
INTEGRATION_ENC_KEY ≥16 bytes. Cifra los tokens OAuth y el MFA del superadministrador

INTEGRATION_ENC_KEY es obligatoria

Los despliegues requieren esta clave y, una vez definida, nunca debe cambiar: rotarla rompe todos los valores cifrados previamente.

Observabilidad

Variable Función
OTEL_EXPORTER, OTEL_SAMPLE_RATIO Trazas de OpenTelemetry
OBSERVABILITY_TOKEN Token bearer que protege /metrics y /swagger en producción

Frontend

Variable Función
BACKEND_URL La dirección interna a la que llama el BFF (p. ej. http://api:8080)

El nombre api puede colisionar en una red compartida

Cuando varias pilas comparten una misma red de Docker, http://api:8080 puede resolverse a otro contenedor y todas las llamadas /api/v1/* acaban en 404. En ese caso, fija BACKEND_URL al nombre completo de tu propio contenedor api.