Configuración y Despliegue
GM Fiscal Backend se configura mediante variables de entorno cargadas desde un archivo .env.{ENVIRONMENT} al iniciar. La carga ocurre exclusivamente en src/main.go mediante config.LoadConfig(). El servidor se ejecuta siempre a través de Docker Compose; el uso de go run está prohibido en todos los entornos.
Requisitos del entorno de desarrollo
- Docker y Docker Compose.
- Go 1.24.5 (solo para ejecutar tests y herramientas; el servidor se ejecuta dentro del contenedor).
Perfiles de Docker Compose
El sistema soporta cuatro perfiles, cada uno asociado a un archivo .env:
| Perfil | Archivo de entorno | Uso |
|---|---|---|
dev | .env.dev | Desarrollo local con BD local |
qa | .env.qa | Testing y QA |
staging | .env.staging | Pre-producción |
prod | .env | Producción |
Comandos de gestión del entorno
# Levantar API + PostgreSQL principal (5433) + PostgreSQL caché (5434)docker-compose --profile dev up -d
# Ver logs en tiempo realdocker-compose --profile dev logs -f api
# Detener todos los serviciosdocker-compose --profile dev down
# Reconstruir la imagen tras cambios en el códigodocker-compose --profile dev build --no-cache && docker-compose --profile dev up -dVariables de entorno
Servidor
PORT=8046ENVIRONMENT=devCORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:4200Base de datos principal
DB_HOST=localhostDB_PORT=5433DB_USER=postgresDB_PASS=postgresDB_NAME=gm_fiscalDB_SSLMODE=disableBase de datos caché CFDI
Solo activa cuando INVOICE_PROVIDER=hades. Almacena los metadatos de los CFDIs descargados para evitar reconsultas al SAT.
CACHE_DB_HOST=localhostCACHE_DB_PORT=5434CACHE_DB_USER=postgresCACHE_DB_PASS=postgresCACHE_DB_NAME=gm_fiscal_cacheProveedor de facturas
La variable INVOICE_PROVIDER determina qué sistema se usa para obtener los CFDIs del SAT. El switch no requiere cambios de código:
INVOICE_PROVIDER=prodigia # HTTP REST (legado)INVOICE_PROVIDER=hades # gRPC + caché dual (alta escala)Configuración Prodigia:
PRODIGIA_BASEURL=https://api.prodigia.mxPRODIGIA_PADE_USER=usuario@empresa.comPRODIGIA_PADE_PASS=contraseñaPRODIGIA_CONTRATO=contratoConfiguración Hades gRPC:
# Desarrollo y QAHADES_GRPC_ADDRESS=localhost:9456HADES_GRPC_TLS=false
# ProducciónHADES_GRPC_ADDRESS=hades.gmtransport.co:443HADES_GRPC_TLS=trueERP interno
APIERP=http://192.168.2.x:8080/apiAutenticación JWT
JWT_SECRET=clave-secreta-segura-minimo-32-caracteresJWT_EXPIRY_HOURS=24JWT_REFRESH_EXPIRY_DAYS=30SERVICIOS_GM_URL=http://192.168.2.248:9300/apiAzure Blob Storage
AZURE_ACCOUNT_NAME=cuentaAZURE_ACCOUNT_KEY=claveAZURE_CONTAINER_NAME=contenedorAZURE_ENDPOINT=https://cuenta.blob.core.windows.netAZURE_SAS_EXPIRY_MINUTES=1440Si Azure no está disponible al iniciar o durante la operación, el sistema cae de forma automática hacia almacenamiento local sin interrumpir el flujo.
Caché CFDI (solo con Hades)
CACHE_MAX_ENTRIES_PER_RFC=1000000 # Cuota máxima por empresaCACHE_EVICTION_TARGET_PERCENT=50 # Objetivo de evicción al superar la cuotaCuando una empresa supera 1,000,000 entradas en caché, el sistema aplica evicción FIFO automática hasta reducir al 50% del límite. No requiere intervención manual.
Logging centralizado
GMLOGS_ENABLED=trueGMLOGS_APIENDPOINT=192.168.2.248:9432GMLOGS_APIKEY=api-keyGMLOGS_DEBUG=falseCon GMLOGS_ENABLED=true, todos los logs se envían a GM Logs vía TCP en batch de forma asíncrona. El uso de log.Printf o fmt.Println está prohibido en producción.
Contrato de rutas HTTP
El contrato de rutas es permanente. Las rutas, métodos HTTP y estructura de request/response no se modifican sin un proceso de deprecación explícito. Todas las rutas bajo /api/* requieren Authorization: Bearer <token> excepto las de autenticación.
# AutenticaciónPOST /api/auth/loginPOST /api/auth/refreshPOST /api/auth/logout
# EmpresaGET /api/empresasPOST /api/empresasGET /api/empresas/rfc/{rfc}GET /api/empresas/{id}PUT /api/empresas/{id}DELETE /api/empresas/{id}
# SolicitudPOST /api/solicitudesGET /api/solicitudes/{id}PUT /api/solicitudes/{id}DELETE /api/solicitudes/{id}GET /api/solicitudes/uuid/{uuid}GET /api/solicitudes/estatus/{estatus}GET /api/solicitudes/rfc/{rfc}GET /api/solicitudes/rfc/{rfc}/sincronizar
# ConciliaciónPOST /api/conciliacionGET /api/conciliacion/{uuid}GET /api/conciliacion/{uuid}/exportGET /api/conciliacion/{id}/columnas_impuestosGET /api/conciliaciones/por-rfc/{rfc}POST /api/conciliacion/manualGET /api/conciliacion/manual/xml/{uuid}GET /api/conciliacion/manual/solicitud/{uuid}/xmlsGET /api/conciliacion/manual/solicitud/{uuid}/download-zip
# ReportePOST /api/reporteGET /api/reporte/{uuid}GET /api/reporte/rfc/{rfc}GET /api/reporte/solicitud/{solicitud_uuid}DELETE /api/reporte/{uuid}GET /api/reporte/validation
# FacturasGET /api/facturas/erp/{rfc}GET /api/facturas/prodigia/{rfc}GET /api/facturas/para-conciliacion/{rfc}
# ComprobantePOST /api/comprobantes/requestGET /api/descargas/DELETE /api/descargas/{uuid}
# NotificacionesGET /api/notificaciones/{rfc}POST /api/notificaciones/{id}/marcar-leidoWS /api/ws/notificaciones/{rfc}
# CertificadoPOST /api/certificados/validarPOST /api/certificados/generar-tokenPOST /api/certificados/renovar
# HealthGET /api/healthGET /api/health/liveGET /api/health/readyLos endpoints de health se usan como probes de Kubernetes/Container Apps:
| Endpoint | Probe | Descripción |
|---|---|---|
/api/health | Startup | Responde inmediatamente al arranque |
/api/health/live | Liveness | Verifica que el proceso no está bloqueado |
/api/health/ready | Readiness | Verifica BD, storage y configuración |
Proceso de verificación local
Antes de cualquier pull request, ejecutar la suite de verificación completa:
go vet ./src/...go build ./srcgo test ./src/domain/... # funciones puras, siempre verdego test ./src/application/... # mocks testify, siempre verdego test ./tests/... # BDD godoggo test ./src/infrastructure/... # requiere PostgreSQL en 5433go test ./... -race -count=1 # detección de data racesSi un test falla dos veces con el mismo error, o si go build falla, se detiene el trabajo y se reporta el error exacto. No se continúa con el siguiente paso.
Resumen
- La configuración se carga desde
.env.{ENVIRONMENT}exclusivamente ensrc/main.go. Ningún otro módulo llama aconfig.LoadConfig(). - El servidor se ejecuta siempre mediante
docker-compose --profile {env} up -d. El uso dego runestá prohibido. INVOICE_PROVIDERcontrola el proveedor de facturas:prodigia(HTTP REST) ohades(gRPC + caché dual).- El caché CFDI (PostgreSQL 5434) solo se activa con
INVOICE_PROVIDER=hades; la base de datos de caché no es necesaria con Prodigia. - Azure Blob Storage tiene fallback automático a almacenamiento local si no está disponible.
- El contrato de rutas HTTP es permanente y no se modifica sin proceso de deprecación explícito.