Guía de actualización en contenedores (modo mantenimiento)¶
1) Prerrequisitos¶
- Tabla
Settings(en la BD de configuración) con:AutoUpdateURL— URL del feed NuGet (ej.: https://nuget.ahorabh.com/v3/index.json).AutoUpdatePackageNamespace— Namespace del producto que identifica todos los nugets. (ej.: deCRMCORE.Conf.Databasesería CRMCORE).AutoUpdateBeta— 0/1 para permitir versiones prerelease.
-
Tabla
DbConnectionStrings(en la BD de configuración) con:ConnStringId(ej.:ConfConnectionString/DataConnectionString)PackageDbNamesin el prefijoProductNameni el sufijoDatabase, solo la parte intermedia (ej.:Conf) el resto se concatena con el settingAutoUpdatePackageNamespacey .Database.Active = 1yUpdateDataModel = 1para las conexiones que se deben actualizar.
-
Docker Compose:
- En backend:
- En caso de usar un repositorio nuget con credenciales usar las variables
NUGET_USERyNUGET_PASSWORD. - Variable
FLEXYGO_PACKAGES_ROOTapuntando a la misma ruta creada en el Dockerfile del backend (p. ej./var/lib/flexygo/packages). - Healthcheck para que el frontend espere a que el backend esté listo:
- El contenedor del backend debe tener
curlinstalado. - La ruta de health debe existir y devolver 200 (ver ejemplo en el punto 2). - En frontend:
- Variable
MAINT_TOKEN(el token que pedirá para la actualización). - depends_on del frontend sobre el backend con
condition: service_healthy.
- Variable
Nota: crea la carpeta de paquetes en el Dockerfile del backend, con permisos de escritura para el usuario que ejecuta la app:
Si usas healthcheck con
curl, instálalo:
2) Ejemplo docker-compose.yml¶
YAML
services:
flx-frontend:
image: flexygo-frontend
restart: unless-stopped
environment:
- ASPNETCORE_ENVIRONMENT=Production
- MAINT_TOKEN=${MAINT_TOKEN}
secrets:
- flexygo_config_key
ports:
- "${FRONTEND_PORT}:8080"
volumes:
- flx-front-conf:/app/conf
- flx-front-custom:/app/custom
networks:
- flx-front-network
depends_on:
flx-backend:
condition: service_healthy
flx-backend:
image: flexygo-backend
restart: unless-stopped
environment:
- ASPNETCORE_ENVIRONMENT=Production
- FLEXYGO_PACKAGES_ROOT=/var/lib/flexygo/packages
secrets:
- flexygo_config_key
volumes:
- flx-back-conf:/app/conf
- flx-back-custom:/app/custom
networks:
- flx-front-network
- flx-back-network
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://flx-backend:8080/api/backend/Sys/ApplicationStatus || exit 1"]
interval: 10s
timeout: 3s
retries: 10
start_period: 3s
networks:
flx-front-network:
driver: bridge
flx-back-network:
driver: bridge
volumes:
flx-front-conf:
flx-front-custom:
flx-back-conf:
flx-back-custom:
secrets:
flexygo_config_key:
file: ./flexygo_config_key.txt
Con ASPNETCORE_ENVIRONMENT=Production los contenedores guardan cifradas las contraseñas y claves de sus appsettings. El secreto flexygo_config_key les da la llave: crea el fichero flexygo_config_key.txt antes del primer docker compose up (openssl rand -base64 32 > flexygo_config_key.txt) y guárdalo a salvo. Los detalles están en Cifrado de los appsettings.
3) Comportamiento al levantar nueva versión¶
- Lanza
docker compose up -dcon la nueva imagen. - Si la versión de la app > versión de BD, el frontend entra en modo mantenimiento automáticamente.
4) Proceso de actualización¶
- Accede a
/maintenance/update. - Introduce el
MAINT_TOKEN(mismo valor que en el compose del frontend). - Al confirmar:
- Se leen las conexiones de
DbConnectionStringsconActive = 1yUpdateDataModel = 1. - Se descarga el paquete NuGet (usando
FLEXYGO_PACKAGES_ROOT). - Se aplican las actualizaciones de todas las BDs marcadas.
- Se leen las conexiones de
- Al finalizar:
- Se desactiva el modo mantenimiento.
- Se redirige al login.
5) Checklist de diagnóstico rápido¶
DbConnectionStrings¶
PackageDbNamecorrecto: solo la parte intermedia, sin el namespace ni.Database(ej.:Conf)Active = 1yUpdateDataModel = 1
Settings¶
AutoUpdateURLválido y accesible desde los contenedoresAutoUpdateNugetUser/AutoUpdateNugetPassworddefinidos si el feed requiere credencialesAutoUpdateBetasegún necesites prerelease
FLEXYGO_PACKAGES_ROOT¶
- Existe y es escribible en el contenedor backend
MAINT_TOKEN¶
- Definido en el frontend y coincide con el introducido en
/maintenance/update