ia_dev/projects/kogus/docs/Deployment.md
Nicolas Cantu 49de4eea20 docs(multisite): remove enso line references and tighten SSH/read-only guidance
Update ia_dev agent playbooks and kogus docs to reflect two-line multisite (lecoffreio/genealogie), enforce SSH execution requirements in analyse mode, and refresh deployment/multisite documentation links.
2026-05-13 22:59:34 +02:00

96 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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/`** avec **`SITE_CODE=lecoffreio`** côté processus / BDD ; voir **`docs/features/secrets-multisite-kogus-and-sites.md`**). **connectDB** orchestrateur : **`.secrets/kogus/<env>/`** ; pour lexport local **`export-db-artifacts`**, dupliquer le connectDB **lecoffreio****kogus** si besoin (même doc).
- **Legacy** (checkout non migré) : `.secrets/<env>/…` (ex. `.secrets/test/`).
**Commandes** :
```bash
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 `textKey` commence par `thirdParty.` (ex. `thirdParty.roleLabel.courtier`), le champ **`scope`** en base et dans `seed-site-texts-<env>.ts` doit être exactement **`thirdParty`** (camelCase), comme dans `defaultSiteTextFallbacks.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 scope **`forms`**. La variante UI `THIRD_PARTY_UI_VARIANT = "third-party"` (tiret) concerne le parcours / laffichage membre, **pas** le scope `site_texts`.
- **Vérification en lecture seule** (sur la base V2 de lenvironnement) : 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écute `psql` **sur la cible** en utilisant le fichier connectDB résolu sur la cible (canonique imbriqué `.secrets/<site_code>/<env>/.env.<env>.connectDB`, ou legacy orchestrateur `deploy/.env.<env>.connectDB`, comme `resolve_connect_db_path_on_target` / `import-v1.sh`) **présent sur ce serveur** (`DATABASE_HOST=db``127.0.0.1` côté cible).
```bash
./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 :
```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** : danciennes 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 quune 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. Najouter un scope supplémentaire à `SITE_TEXTS_BOOT_SCOPES` quen dernier recours si des données historiques ne peuvent pas être migrées tout de suite.
### 4. Évolution
- Nouvelle clé dans un seed : lajouter à `SITE_TEXTS_KEYS_INDEX` du même env et aligner test/pprod/prod.
- Nouveau scope en base : lajouter à `SITE_TEXTS_BOOT_SCOPES` si nécessaire au chargement initial.
---
## Fichiers de textes (validation métier)
Liste des fichiers contenant les textes affichés à lutilisateur (libellés, messages derreur, placeholders) à transmettre au métier pour validation :
- **COMMON_UI_I18N** : commonUiI18nPart1.ts, commonUiI18nPart2.ts (modales, formulaires, dossiers, documents, rôles, types dactes, 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 dans `env-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`](./features/multi-site-deploy-runbook.md). Snippet wiki : [`features/wiki-deployment-multisite-snippet.md`](./features/wiki-deployment-multisite-snippet.md). **Checklist opérateur** : [`features/multisite-operator-master-checklist.md`](./features/multisite-operator-master-checklist.md). **Secrets / migration cible** : [`features/secrets-multisite-kogus-and-sites.md`](./features/secrets-multisite-kogus-and-sites.md). **Politique données** : [`features/multisite-data-policy-lecoffre-vs-ia-dev.md`](./features/multisite-data-policy-lecoffre-vs-ia-dev.md).
- **Admin local (exports / imports secrets par site, sans déploiement)** : [`features/secrets-devai-kogus-sites-and-imports.md`](./features/secrets-devai-kogus-sites-and-imports.md) — couches dev_ai / kogus / site, API `back-admin`, UI `front-admin`, fichiers matrice et catalogues actes.
- **Automation git-issues / IMAP** : module **`automation/imap-bridge/imap_common.py`** ; gabarit **`automation/imap-bridge/imap-bridge.env.example`** ; secrets préférés **`.secrets/automation/git-issues/`** (non versionné). Copie depuis **`ia_dev`** avec backups horodatés : **`bash automation/imap-bridge/centralize-ia-dev-secrets.sh`** (`IADEV_ROOT` si besoin). Détails : **`automation/imap-bridge/README.md`**, **`automation/backups/README.md`**, doc **`ia_dev`** [`projects/ia_dev/docs/GIT_ISSUES_SCRIPTS_AGENTS.md`](../../ia_dev/projects/ia_dev/docs/GIT_ISSUES_SCRIPTS_AGENTS.md) (chemins résolus).
- **Orchestration ia_dev** : depuis la racine du dépôt ia_dev, `./deploy/deploy.sh <project_id> <env> [options]` exporte `IA_PROJECT_ID` puis exécute `orchestrator.sh`. Celui-ci enchaîne les scripts listés dans `deploy.hooks.phases` du `conf.json` du projet (chemins relatifs à `repository_root`), ou exécute `deploy.deploy_script_path` si `phases` est vide. `run-project-hooks.sh` délègue à `orchestrator.sh` (compatibilité). Cadrage : `deploy/DEPLOY_ORCHESTRATION_IA_DEV.md`.
- **Scripts** : `deploy/scripts_v2/` ; chemin projet dans ia_dev `projects/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 lancien 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'` (lexpansion de `$HOME`, `${HOME}` et un préfixe `~/` est appliquée par `lcf_deploy_resolve_deploy_ssh_key` après `load_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 avec `ssh-keygen -y`. Vérification réseau : `bash deploy/scripts_v2/run-verify-ssh.sh <env>` ou les trois dun coup : `bash deploy/scripts_v2/run-verify-ssh-all-envs.sh`.
- **Modifications locales** : **`deploy.sh`** ne modifie pas la branche locale **`test`** (pas de **`git pull`** ni **`git stash`** sur **`test`** avec **`--sync-origin`**). Les fichiers déployés depuis lorchestrateur (scripts, **`import-v1`**) proviennent dun **worktree** détaché au ref **`kogus/<branche denv>`** ; le working tree du clone principal peut donc contenir du WIP non poussé sans être écrasé — seul le tip **`kogus/test`** (ou branche alignée pour **pprod**/**prod**) part sur la cible après **`git push`**. Pour **pprod**/**prod**, lindex 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.sh` exécute `hooks/verify-npm-lockfiles.sh` sur la racine du **worktree** de déploiement (ref **`kogus/<branche>`**), après préparation de ce worktree et après le hook de concurrence. Pour chaque `build_dir` (ressources-common, back-common, front-common) : présence de `package-lock.json`, JSON valide, `npm install --package-lock-only --dry-run` (cohérence `package.json` ↔ lockfile), puis `npm audit --audit-level=high`. Sur la cible, `deploy/scripts_v2/remote/deploy-app.sh` exécute `npm_ci_strict` (suppression de `node_modules` puis `npm ci` sans repli `npm 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.txt` pour linjection en BDD (répertoire imbriqué ; ancien plat `.secrets/<env>/` uniquement le temps dune migration) ; NOTARY_AI_AGENT_URL, NOTARY_AI_AGENT_TOKEN pour lagent 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:shell` exécute `scripts/run-shellcheck.sh` sur `deploy/**/*.sh`, `scripts/*.sh` et `back-common/scripts/**/*.sh` (options : `--external-sources`, `--source-path=SCRIPTDIR`, `--severity=warning`). Helpers déploiement : `_lib/deploy-export-ssh-from-infos-json.sh` (chargement `infos.json`), `_lib/ssh-run-app-script.sh` (`lcf_ssh_run_remote_deploy_script`, `lcf_ssh_run_remote_mkdir_p`, etc.). Détail : `deploy/scripts_v2/hooks/README.md`.