**Motivations:** - Mirror LeCoffre deploy-test/deploy-pprod/deploy-prod per-site agents in ia_dev. **Root causes:** - N/A **Correctifs:** - N/A **Evolutions:** - Nine .smartIde/agents deploy-* stubs linking to LECOFFRE_REPO playbooks. - deploy-by-script.md multisite paragraph lists dedicated agents. - projects/kogus/docs/Deployment.md bullet for operator reference. **Pages affectées:** - ia_dev agents and kogus Deployment doc only.
11 KiB
Deployment – Env, seeds, site_texts, vérifications
Auteur : Équipe 4NK
Vérification site_texts (seeds, env, boot)
Objectif : aligner les clés site_texts entre seeds, env et boot (test, pprod, prod).
1. Seeds ↔ env (SITE_TEXTS_KEYS_INDEX)
Les clés du seed seed-site-texts-<env>.ts (champ textKey) doivent être exactement celles listées dans SITE_TEXTS_KEYS_INDEX du fichier env-full-<env>-for-bdd-injection.txt du même environnement.
Chemins :
- Multi-site (préféré) :
.secrets/<site_dir>/<env>/…(ligne notaire :.secrets/lecoffreio/test/avecSITE_CODE=lecoffreiocôté processus / BDD ; voirdocs/features/secrets-multisite-kogus-and-sites.md). connectDB orchestrateur :.secrets/kogus/<env>/; pour l’export localexport-db-artifacts, dupliquer le connectDB lecoffreio → kogus si besoin (même doc). - Legacy (checkout non migré) :
.secrets/<env>/…(ex..secrets/test/).
Commandes :
SITE_CODE=lecoffreio
ENV=test
# Ligne notaire : répertoire disque lecoffreio/ (SITE_CODE processus = lecoffreio)
SECRETS_DIR=".secrets/lecoffreio/${ENV}" # ou ".secrets/${ENV}" (legacy plat)
grep -oP 'textKey: "\K[^"]+' "${SECRETS_DIR}/seed-site-texts-${ENV}.ts" | sort -u > /tmp/seed-keys.txt
grep '^SITE_TEXTS_KEYS_INDEX=' "${SECRETS_DIR}/env-full-${ENV}-for-bdd-injection.txt" | sed 's/SITE_TEXTS_KEYS_INDEX=//' | tr ',' '\n' | sort -u > /tmp/env-keys.txt
diff /tmp/seed-keys.txt /tmp/env-keys.txt # doit être vide
2. Alignement test / pprod / prod
Mêmes clés site_texts sur les trois environnements ; seuls les contenus peuvent différer (ex. mention [ENVIRONNEMENT DE TEST]). Comparer les listes de clés extraites des seeds test, pprod et prod.
3. Boot : SITE_TEXTS_BOOT_SCOPES
SITE_TEXTS_BOOT_SCOPES (dans front-common/src/front/Stores/siteTextsBootConfig.ts) doit couvrir tous les scopes chargés au boot. Valeur type : ["login", "my-account", "components", "folder", "forms", "documentTypes", "office", "thirdParty"]. Aucun scope des seeds ne doit être absent du boot.
3.1 Scope des textes « tiers » (thirdParty.roleLabel.*)
- Cible : pour les clés dont le
textKeycommence parthirdParty.(ex.thirdParty.roleLabel.courtier), le champscopeen base et dansseed-site-texts-<env>.tsdoit être exactementthirdParty(camelCase), comme dansdefaultSiteTextFallbacks.ts. Le préfixe API publique utilise ce même identifiant :GET .../site-texts?scope=thirdParty,.... - À ne pas confondre : les clés
forms.thirdParty.*(formulaire édition tiers) restent en scopeforms. La variante UITHIRD_PARTY_UI_VARIANT = "third-party"(tiret) concerne le parcours / l’affichage membre, pas le scopesite_texts. - Vérification en lecture seule (sur la base V2 de l’environnement) : le script ne se connecte pas à une base locale ; il copie le SQL et un runner sur le serveur de déploiement (SSH, même mécanisme que
scripts/e2e-verify-db-env.sh), puis exécutepsqlsur la cible en utilisant le fichier connectDB résolu sur la cible (canonique imbriqué.secrets/<site_code>/<env>/.env.<env>.connectDB, ou legacy orchestrateurdeploy/.env.<env>.connectDB, commeresolve_connect_db_path_on_target/import-v1.sh) présent sur ce serveur (DATABASE_HOST=db→127.0.0.1côté cible).
./scripts/verify-site-texts-thirdparty-scope-readonly.sh <test|pprod|prod>
Fichiers : deploy/scripts_v2/remote/run-verify-site-texts-thirdparty-on-target.sh (cible), deploy/scripts_v2/remote/sql/verify-site-texts-thirdparty-scope-readonly.sql. Équivalent SQL :
SELECT DISTINCT scope, text_key
FROM site_texts
WHERE text_key LIKE 'thirdParty.%'
ORDER BY scope, text_key;
Convention cible : une seule valeur de scope pour ces lignes : thirdParty (cohérent avec le préfixe thirdParty. du text_key).
Données historiques : d’anciennes lignes peuvent rester publiées avec scope: folder pour ces clés. Le backend getPublishedTextMap retient la version publiée la plus récente par text_key + locale (indépendamment du scope), afin qu’une migration seed vers thirdParty soit effective côté API. Recommandation : seeds sous thirdParty (voir docs/fixKnowledge/site-texts-thirdparty-scope-seed-and-public-merge.md) ; archiver les vieilles versions folder en super-admin si besoin de nettoyage.
Si une valeur inattendue apparaît (third-party, etc.), corriger le seed et republier. N’ajouter un scope supplémentaire à SITE_TEXTS_BOOT_SCOPES qu’en dernier recours si des données historiques ne peuvent pas être migrées tout de suite.
4. Évolution
- Nouvelle clé dans un seed : l’ajouter à
SITE_TEXTS_KEYS_INDEXdu même env et aligner test/pprod/prod. - Nouveau scope en base : l’ajouter à
SITE_TEXTS_BOOT_SCOPESsi nécessaire au chargement initial.
Fichiers de textes (validation métier)
Liste des fichiers contenant les textes affichés à l’utilisateur (libellés, messages d’erreur, placeholders) à transmettre au métier pour validation :
- COMMON_UI_I18N : commonUiI18nPart1.ts, commonUiI18nPart2.ts (modales, formulaires, dossiers, documents, rôles, types d’actes, souscription, Corbeille, erreurs métier, confrères, admin site texts, collaborateurs, etc.).
- Upload / validation : fileUploadUiI18n.ts, fileValidationI18n.ts.
- Erreurs / login : Utils/errorMessages/* (getUserFriendlyError, httpStatusMessages, humanizeError), loginErrorCodes.ts.
- Site texts :
.secrets/<site_code>/<env>/seed-site-texts-<env>.ts(ou legacy.secrets/<env>/…) ; clés dansenv-full-*-for-bdd-injection.txt(SITE_TEXTS_KEYS_INDEX).
Déploiement applicatif
- Multi-site (runbook) : ordre test → préparation pprod/prod, migrations Prisma, smoke
site-config—features/multi-site-deploy-runbook.md. Snippet à intégrer à la page wiki Deployment :features/wiki-deployment-multisite-snippet.md. - Agents Cursor (une ligne × environnement) : neuf fichiers dans le dépôt LeCoffre
repository_root/.cursor/agents/—deploy-test-lecoffreio,deploy-test-enso,deploy-test-genealogie,deploy-pprod-lecoffreio,deploy-pprod-enso,deploy-pprod-genealogie,deploy-prod-lecoffreio,deploy-prod-enso,deploy-prod-genealogie; miroirs courts sousia_dev/.smartIde/agents/. Tableau et chemins absolus :LECOFFRE_REPO/.cursor/agents/agent-paths-registry.md§3 bis (voir aussi ce fichier dans le clone applicatif configuré parprojects/kogus/conf.json). - Admin local (exports / imports secrets par site, sans déploiement) :
features/secrets-devai-kogus-sites-and-imports.md— couches dev_ai / kogus / site, APIback-admin, UIfront-admin, fichiers matrice et catalogues actes. - Orchestration ia_dev : depuis la racine du dépôt ia_dev,
./deploy/deploy.sh <project_id> <env> [options]exporteIA_PROJECT_IDpuis exécuteorchestrator.sh. Celui-ci enchaîne les scripts listés dansdeploy.hooks.phasesduconf.jsondu projet (chemins relatifs àrepository_root), ou exécutedeploy.deploy_script_pathsiphasesest vide.run-project-hooks.shdélègue àorchestrator.sh(compatibilité). Cadrage :deploy/DEPLOY_ORCHESTRATION_IA_DEV.md. - Scripts :
deploy/scripts_v2/; chemin projet dans ia_devprojects/kogus/conf.json(project_path, build_dirs, deploy.deploy_script_path, deploy.secrets_path). - Clé SSH déploiement (
DEPLOY_SSH_KEY) : définie dans.secrets/<site_code>/<env>/.env.<env>(layout imbriqué obligatoire pour le multisite ; migration depuis l’ancien plat :SITE_CODE=lecoffreio bash deploy/scripts_v2/sites/lecoffreio/migrate-secrets-legacy-to-nested-lecoffreio.sh <env>…>; gabarits locaux optionnels :node deploy/scripts_v2/nested-secrets-tool.mjs materialize— alias :materialize-nested-secrets-mandatory.mjs). Utiliser un chemin portable : par ex.DEPLOY_SSH_KEY='$HOME/.ssh/id_ed25519_4nk'(l’expansion de$HOME,${HOME}et un préfixe~/est appliquée parlecoffre_deploy_resolve_deploy_ssh_keyaprèsload_dotenv_file_strict, qui ne fait pas d’eval). Ne pas figer un autre compte système (/home/desk/...). Ordre de repli si la clé indiquée est absente :$HOME/.ssh/id_ed25519_4nk, puis$HOME/.ssh/id_ed25519. Avant toute connexion SSH, la clé retenue est validée avecssh-keygen -y. Vérification réseau :bash deploy/scripts_v2/run-verify-ssh.sh <env>ou les trois d’un coup :bash deploy/scripts_v2/run-verify-ssh-all-envs.sh. - Modifications locales :
deploy.shne modifie pas la branche localetest(pas degit pullnigit stashsurtestavec--sync-origin). Les fichiers déployés depuis l’orchestrateur (scripts,import-v1) proviennent d’un worktree détaché au refkogus/<branche d’env>; le working tree du clone principal peut donc contenir du WIP non poussé sans être écrasé — seul le tipkogus/test(ou branche alignée pour pprod/prod) part sur la cible aprèsgit push. Pour pprod/prod, l’index du clone principal doit rester propre (local_git_require_clean_index_strict). - Versions : version.package_json_paths (backend, frontend) ; splash_app_name pour la notice.
- Dépendances npm (fiabilité avant phases distantes) :
deploy.shexécutehooks/verify-npm-lockfiles.shsur la racine du worktree de déploiement (refkogus/<branche>), après préparation de ce worktree et après le hook de concurrence. Pour chaquebuild_dir(ressources-common, back-common, front-common) : présence depackage-lock.json, JSON valide,npm install --package-lock-only --dry-run(cohérencepackage.json↔ lockfile), puisnpm audit --audit-level=high. Sur la cible,deploy/scripts_v2/remote/deploy-app.shexécutenpm_ci_strict(suppression denode_modulespuisnpm cisans replinpm install) pour les trois mêmes répertoires. Contournements documentés :DEPLOY_SKIP_NPM_LOCKFILE_VERIFY=1,DEPLOY_SKIP_NPM_AUDIT=1. - Secrets :
.secrets/<site_code>/<env>/env-full-<env>-for-bdd-injection.txtpour l’injection en BDD (répertoire imbriqué ; ancien plat.secrets/<env>/uniquement le temps d’une migration) ; NOTARY_AI_AGENT_URL, NOTARY_AI_AGENT_TOKEN pour l’agent IA notaire (voir API.md). - Cartographie des checks de déploiement : référence unique dans la doc projet (ex. projects/kogus/docs ou doc dédiée) ; ne pas dupliquer ici.
- ShellCheck :
npm run lint:shellexécutescripts/run-shellcheck.shsurdeploy/**/*.sh,scripts/*.shetback-common/scripts/**/*.sh(options :--external-sources,--source-path=SCRIPTDIR,--severity=warning). Helpers déploiement :_lib/deploy-export-ssh-from-infos-json.sh(chargementinfos.json),_lib/ssh-run-app-script.sh(lecoffre_ssh_run_remote_deploy_script,lecoffre_ssh_run_remote_mkdir_p, etc.). Détail :deploy/scripts_v2/hooks/README.md.