## Description Les robots Harbor (ro-robot, rw-robot, project-robot) sont actuellement créés avec `duration: -1`, c'est-à -dire sans expiration. Le secret correspondant est stocké dans Vault et n'est régénéré que si l'hôte Harbor change ou si l'âge du secret dépasse `HARBOR_ROBOT_ROTATION_THRESHOLD_DAYS` (rotation préventive). Il n'existe pourtant aucun paramètre permettant de donner une expiration réelle aux robots côté Harbor : la rotation préventive s'applique à des robots immortels, ce qui rend la sauvegarde de sécurité incohérente (si la rotation échoue silencieusement, le robot reste valide indéfiniment). Il faut un paramètre de configuration global `HARBOR_ROBOT_EXPIRATION_DAYS` (entier positif, en jours) appliqué comme `duration` à la création de chaque robot projet. La rotation (`HARBOR_ROBOT_ROTATION_THRESHOLD_DAYS`) doit rester strictement inférieure à l'expiration pour qu'un robot soit toujours remplacé avant qu'il ne expire : cette contrainte doit être validée par le schéma de configuration (rejet au démarrage si `rotation >= expiration`). ## PRs liées ## Issues liées ## Exemples simples - `HARBOR_ROBOT_EXPIRATION_DAYS=180`, `HARBOR_ROBOT_ROTATION_THRESHOLD_DAYS=90` : les robots expirent au bout de 180 jours et sont régénérés vers 90 jours. - `HARBOR_ROBOT_EXPIRATION_DAYS=90`, `HARBOR_ROBOT_ROTATION_THRESHOLD_DAYS=90` : la configuration est rejetée au démarrage. ## Spécifications techniques - `apps/server-nestjs/src/config/harbor.config.ts` : nouveau champ optionnel `HARBOR_ROBOT_EXPIRATION_DAYS` (z.coerce.number().int().positive(), défaut à définir), transformé en `robotExpirationDays` ; superRefine rejetant `robotRotationThresholdDays >= robotExpirationDays`. - `apps/server-nestjs/src/modules/registry/registry-client.service.ts` : `HarborRobotCreateRequest.duration` conserve -1 comme valeur « jamais » ; le service transmet la durée configurée. - `apps/server-nestjs/src/modules/registry/registry.service.ts` : `generateRobotPermissions` utilise la durée issue de la configuration au lieu de -1. - Le plugin historique `plugins/harbor` n'est pas modifié (cible backend : `apps/server-nestjs`). ## Définition du fini - [ ] La fonctionnalité est terminée - [ ] Les tests liés à cette fonctionnalité ont été ajoutés - [ ] La documentation liée a été ajoutée
Activity
feat(server-nestjs): configurable Harbor robot expiration with enforc…
feat(server-nestjs): configurable Harbor robot expiration with enforc…