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.
This commit is contained in:
parent
c77afdff4c
commit
49de4eea20
@ -1,11 +1,16 @@
|
||||
---
|
||||
name: analyse
|
||||
description: Analyse pré-correctif (lecture seule) — inventaire métier, SSH + logs + BDD RO, hypothèses, recommandations sans contournement. Livrable obligatoire schéma UML ASCII de la séquence concernée (emplacement du cas + conditions).
|
||||
description: Analyse pré-correctif (lecture seule dépôt + BDD) — inventaire métier, exécution réelle SSH + logs + BDD RO, hypothèses, recommandations sans contournement. Livrable obligatoire schéma UML ASCII. readonly dépôt ; la lecture seule ne dispense pas SSH §1 bis.
|
||||
model: inherit
|
||||
is_background: false
|
||||
readonly: true
|
||||
---
|
||||
|
||||
## SSH / réseau — exécution réelle obligatoire
|
||||
|
||||
- **`readonly: true`** : pas de commit, pas de patch applicatif, pas d’UPDATE/DELETE BDD. **Ne bloque pas** SSH ni les scripts RO distants : l’agent **lance** `read-backend-logs.sh`, `user-profil-env.sh`, autres scripts RO, chaîne SSH du dépôt LeCoffre. **Interdit** d’omettre §1 bis en prétextant « readonly », « mode Ask » ou « lecture seule » quand l’environnement a accès SSH (clés habituelles).
|
||||
- Échec réseau **documenté** (sortie commande) → audit incomplet ; absence d’exécution sans preuve d’indisponibilité → livrable **non conforme** au mandat analyse.
|
||||
|
||||
## Règle d’alignement avec LeCoffre
|
||||
|
||||
La procédure détaillée (registre chemins, SSH, scripts, §1 bis exécutions réelles) est **canonique** dans le dépôt applicatif :
|
||||
@ -35,6 +40,6 @@ Remontée **purement infrastructure** : mini diagramme d’activité « investig
|
||||
|
||||
**`LECOFFRE_REPO/docs/features/login-and-email-helpers-structure.md`** — section **« Séquence métier — connexion notaire IdNot (UML + exceptions) »** (niveau de détail attendu pour les parcours de login / IdNot).
|
||||
|
||||
## Lecture seule
|
||||
## Lecture seule (périmètre dépôt + données en écriture)
|
||||
|
||||
Pas de modification applicative, pas de commit, pas de déploiement dans ce run. Enchaînement : **`/fix`** ou **`/evol`** après validation humaine.
|
||||
Pas de modification applicative, pas de commit, pas de déploiement dans ce run. **Exécuter** malgré tout SSH + logs + scripts RO (§1 bis LeCoffre). Enchaînement : **`/fix`** ou **`/evol`** après validation humaine.
|
||||
|
||||
@ -48,7 +48,7 @@ En tant qu'agent, avant de solliciter l'ia, regarde ce que tu peux scripter (imp
|
||||
|
||||
**Documentation** : La doc des projets gérés est dans **`projects/<id>/docs`** ; la doc ia_dev est dans **`projects/ia_dev/docs`**.
|
||||
|
||||
**Rôle de l’agent :** vérifier que la branche locale est test (sinon retour 1), fournir le message de commit (via /push-by-script), lancer le script, contrôler la sortie et le code de retour. **Rôle du script :** exécution déterministe (vérif branche test, `branch-align.sh test`, puis sauf **`--align-only`** : **`orchestrator.sh test --no-sync-origin`** ou, à défaut, **`bash deploy/scripts_v2/deploy-multisite-lines.sh test --no-sync-origin`** — **toujours les trois lignes** lecoffreio / enso / genealogie lorsque le dépôt expose **`deploy-multisite-lines.sh`** ; repli historique **`deploy.sh test`** uniquement si ce script est absent). Flags métier via **`$SECRETS_BASE/<site>/test/deploy.conf`** (par ligne) ; journalisation **`./logs/deploy_*.log`**. Préparation OS : **`/setup-host`** + **`run-setup-host.sh`**, pas confondre avec le déploiement applicatif.
|
||||
**Rôle de l’agent :** vérifier que la branche locale est test (sinon retour 1), fournir le message de commit (via /push-by-script), lancer le script, contrôler la sortie et le code de retour. **Rôle du script :** exécution déterministe (vérif branche test, `branch-align.sh test`, puis sauf **`--align-only`** : **`orchestrator.sh test --no-sync-origin`** ou, à défaut, **`bash deploy/scripts_v2/deploy-multisite-lines.sh test --no-sync-origin`** — **toujours les deux lignes** lecoffreio / genealogie lorsque le dépôt expose **`deploy-multisite-lines.sh`** ; repli historique **`deploy.sh test`** uniquement si ce script est absent). Flags métier via **`$SECRETS_BASE/<site>/test/deploy.conf`** (par ligne) ; journalisation **`./logs/deploy_*.log`**. Préparation OS : **`/setup-host`** + **`run-setup-host.sh`**, pas confondre avec le déploiement applicatif.
|
||||
|
||||
**Projet kogus (monorepo LeCoffre) :** si le script enchaîne **`deploy/scripts_v2`**, appliquer le contrat multisite (**`SITE_CODE`** / **`deploy-site.sh`** / **`deploy-multisite-lines.sh`**, secrets **`.secrets/<site>/<env>/`**) décrit dans **`repository_root/docs/features/multi-site-architecture.md`** et **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis (les agents Cursor du dépôt applicatif sont sous **`.cursor/agents/`**, pas **`.smartIde`**).
|
||||
|
||||
|
||||
@ -42,7 +42,7 @@ En tant qu'agent, avant de solliciter l'ia, regarde ce que tu peux scripter (imp
|
||||
|
||||
## Multisite — projet **kogus** (site produit `lecoffreio` = ligne notaire)
|
||||
|
||||
Lorsque le playbook appelle **`repository_root/deploy/scripts_v2/`**, respecter la boucle **`SITE_CODE`** (**`lecoffreio`**, **`enso`**, **`genealogie`**) ou **`deploy-site.sh`** / **`deploy-multisite-lines.sh`** ; **`deploy-by-script-to`** ne positionne pas **`SITE_CODE`**. Secrets : **`.secrets/<site>/<env>/`**. Source normative : **`repository_root/docs/features/multi-site-architecture.md`** ; **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis ; § **Multisite** dans **`repository_root/.cursor/agents/deploy-pprod-or-prod.md`**. **Une seule ligne** : **neuf agents** (site × env) — **`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`** (fichiers **`.smartIde/agents/deploy-*.md`**, playbook canonique sous **`LECOFFRE_REPO/.cursor/agents/`**). **Repli paramétrique** : **`deploy-test-site.md`** (**`deploy-site.sh test <site>`**), **`deploy-pprod-or-prod-site.md`** (align puis **`deploy-site.sh <pprod|prod> <site>`**, sans **`deploy-by-script-to`**).
|
||||
Lorsque le playbook appelle **`repository_root/deploy/scripts_v2/`**, respecter la boucle **`SITE_CODE`** (**`lecoffreio`**, **`genealogie`**) ou **`deploy-site.sh`** / **`deploy-multisite-lines.sh`** ; **`deploy-by-script-to`** ne positionne pas **`SITE_CODE`**. Secrets : **`.secrets/<site>/<env>/`**. Source normative : **`repository_root/docs/features/multi-site-architecture.md`** ; **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis ; § **Multisite** dans **`repository_root/.cursor/agents/deploy-pprod-or-prod.md`**. **Une seule ligne** : **six agents** (site × env) — **`deploy-test-lecoffreio`**, **`deploy-test-genealogie`**, **`deploy-pprod-lecoffreio`**, **`deploy-pprod-genealogie`**, **`deploy-prod-lecoffreio`**, **`deploy-prod-genealogie`** (fichiers **`.smartIde/agents/deploy-*.md`**, playbook canonique sous **`LECOFFRE_REPO/.cursor/agents/`**). **Repli paramétrique** : **`deploy-test-site.md`** (**`deploy-site.sh test <site>`**), **`deploy-pprod-or-prod-site.md`** (align puis **`deploy-site.sh <pprod|prod> <site>`**, sans **`deploy-by-script-to`**).
|
||||
|
||||
Cet agent lance le déploiement vers l’**environnement passé au script** (ex. `./deploy/deploy-by-script-to.sh <id> test|pprod|prod`) via **scripts_v2**. **Si `deploy.host_stays_on_test` est absent ou false :** en pratique la branche locale du dépôt applicatif correspond souvent à l’env cible pour **pprod**/**prod**. **Rôle de l’agent :** vérifier le contexte (si **`host_stays_on_test`** : branche locale = **test** ; sinon : cohérence branche / env selon le projet), lancer le script, contrôler la sortie et le code de retour, synthèse et clôture. **Rôle du script :** exécution et orchestration sûre (suivi branches, sync, log, déploiement).
|
||||
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
---
|
||||
name: deploy-pprod-enso
|
||||
description: Déploiement **pprod** ligne **enso** — playbook **`LECOFFRE_REPO/.cursor/agents/deploy-pprod-enso.md`**. Projet **kogus**.
|
||||
model: inherit
|
||||
is_background: false
|
||||
---
|
||||
|
||||
## Source normative
|
||||
|
||||
**`/home/desk/code/lecoffre_ng_test/.cursor/agents/deploy-pprod-enso.md`** — align puis **`deploy-site.sh pprod enso`**.
|
||||
@ -12,7 +12,7 @@ is_background: false
|
||||
## Rappel opérationnel
|
||||
|
||||
1. Racine **`IADEV_REPO`** : `./deploy/change-to-all-branches.sh kogus --align-only` (prérequis **`origin/test`** à jour — push hors agent).
|
||||
2. **`LECOFFRE_REPO`** : `bash deploy/scripts_v2/deploy-site.sh <pprod|prod> <lecoffreio|enso|genealogie>` [options].
|
||||
2. **`LECOFFRE_REPO`** : `bash deploy/scripts_v2/deploy-site.sh <pprod|prod> <lecoffreio|genealogie>` [options].
|
||||
|
||||
## Référence flux trois lignes (pprod/prod)
|
||||
|
||||
|
||||
@ -82,7 +82,7 @@ Cocher explicitement : **« Ordre anti-duplication : respecté (pas d’agent `/
|
||||
|
||||
## Multisite — projet **kogus** (monorepo LeCoffre ; code produit site `lecoffreio` inchangé)
|
||||
|
||||
Quand **`repository_root`** est le monorepo LeCoffre et **`deploy-by-script-to`** enchaîne **`deploy/scripts_v2/`**, l’orchestration doit couvrir **`notary`**, **`enso`**, **`genealogie`** (**`SITE_CODE`** ou **`deploy-site.sh`** / **`deploy-multisite-lines.sh`**) ; **`deploy-by-script-to`** ne définit pas **`SITE_CODE`**. Secrets : **`.secrets/<site>/<env>/`**. Doc : **`repository_root/docs/features/multi-site-architecture.md`** ; **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis ; **`repository_root/.cursor/agents/deploy-pprod-or-prod.md`** § Multisite.
|
||||
Quand **`repository_root`** est le monorepo LeCoffre et **`deploy-by-script-to`** enchaîne **`deploy/scripts_v2/`**, l’orchestration doit couvrir **`lecoffreio`** et **`genealogie`** (**`SITE_CODE`** ou **`deploy-site.sh`** / **`deploy-multisite-lines.sh`**) ; **`deploy-by-script-to`** ne définit pas **`SITE_CODE`**. Secrets : **`.secrets/<site>/<env>/`**. Doc : **`repository_root/docs/features/multi-site-architecture.md`** ; **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis ; **`repository_root/.cursor/agents/deploy-pprod-or-prod.md`** § Multisite.
|
||||
|
||||
## Workflow obligatoire
|
||||
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
---
|
||||
name: deploy-prod-enso
|
||||
description: Déploiement **prod** ligne **enso** — playbook **`LECOFFRE_REPO/.cursor/agents/deploy-prod-enso.md`**. Projet **kogus**.
|
||||
model: inherit
|
||||
is_background: false
|
||||
---
|
||||
|
||||
## Source normative
|
||||
|
||||
**`/home/desk/code/lecoffre_ng_test/.cursor/agents/deploy-prod-enso.md`** — align puis **`deploy-site.sh prod enso`**.
|
||||
@ -1,10 +0,0 @@
|
||||
---
|
||||
name: deploy-test-enso
|
||||
description: Déploiement LeCoffre **test** ligne **enso** — playbook **`LECOFFRE_REPO/.cursor/agents/deploy-test-enso.md`**. Projet **kogus**.
|
||||
model: inherit
|
||||
is_background: false
|
||||
---
|
||||
|
||||
## Source normative
|
||||
|
||||
**`/home/desk/code/lecoffre_ng_test/.cursor/agents/deploy-test-enso.md`** — **`deploy-site.sh test enso`** depuis **`LECOFFRE_REPO`**.
|
||||
@ -1,6 +1,6 @@
|
||||
---
|
||||
name: deploy-test-site
|
||||
description: Déploiement LeCoffre **test** pour **une ligne** (`lecoffreio` \| `enso` \| `genealogie`) via `deploy-site.sh` depuis le clone applicatif — une tentative par run ; prérequis alignés sur `deploy-test-by-script`. Exécution depuis `IADEV_REPO` ou `LECOFFRE_REPO` selon le prompt.
|
||||
description: Déploiement LeCoffre **test** pour **une ligne** (`lecoffreio` \| `genealogie`) via `deploy-site.sh` depuis le clone applicatif — une tentative par run ; prérequis alignés sur `deploy-test-by-script`. Exécution depuis `IADEV_REPO` ou `LECOFFRE_REPO` selon le prompt.
|
||||
model: inherit
|
||||
is_background: false
|
||||
---
|
||||
@ -12,7 +12,7 @@ is_background: false
|
||||
## Rappel opérationnel
|
||||
|
||||
- **Répertoire** : `cd "$(jq -r '.deploy.repository_root' projects/kogus/conf.json)"` (souvent **`/home/desk/code/lecoffre_ng_test`**).
|
||||
- **Commande** : `bash deploy/scripts_v2/deploy-site.sh test <lecoffreio|enso|genealogie>` [options `deploy.sh`].
|
||||
- **Commande** : `bash deploy/scripts_v2/deploy-site.sh test <lecoffreio|genealogie>` [options `deploy.sh`].
|
||||
- **Projet ia_dev** : **`kogus`** (injection systématique aux scripts **`change-to-all-branches`**, **`pousse.sh`**, etc., comme les autres agents déploiement).
|
||||
|
||||
## Référence multisite trois lignes (test)
|
||||
|
||||
@ -23,7 +23,7 @@ is_background: false
|
||||
4. **Invocation** : depuis la racine du dépôt projet (`cd "$(jq -r '.deploy.repository_root' conf.json)"` ou équivalent) :
|
||||
- `bash deploy/scripts_v2/run-setup-host.sh <test|pprod|prod>`
|
||||
- L’environnement doit être passé explicitement (pas de valeur par défaut métier).
|
||||
5. **Secrets** : **`run-setup-host.sh`** résout le répertoire d’env via **`lecoffre_secrets_env_dir_for_read`** (layout **`.secrets/<site>/<env>/`** pour LeCoffre, comme **`deploy.sh`** / **`connect-db-paths.sh`**) ; s’assurer que **`SITE_CODE`** ou les trois branches **`lecoffreio`**, **`enso`**, **`genealogie`** sont peuplées selon le projet — voir **`repository_root/docs/features/multi-site-architecture.md`** pour le projet **kogus** (monorepo LeCoffre).
|
||||
5. **Secrets** : **`run-setup-host.sh`** résout le répertoire d’env via **`lecoffre_secrets_env_dir_for_read`** (layout **`.secrets/<site>/<env>/`** pour LeCoffre, comme **`deploy.sh`** / **`connect-db-paths.sh`**) ; s’assurer que **`SITE_CODE`** ou les branches **`lecoffreio`**, **`genealogie`** sont peuplées selon le projet — voir **`repository_root/docs/features/multi-site-architecture.md`** pour le projet **kogus** (monorepo LeCoffre).
|
||||
6. **Sortie** : ne pas masquer stdout/stderr ; en échec, relire les messages sudo / SSH.
|
||||
7. **Clôture** : appliquer `.smartIde/rules/cloture-evolution.mdc` en fin d’exécution agent (horodatage, questions 3–11 selon périmètre touché).
|
||||
|
||||
|
||||
@ -5,13 +5,46 @@
|
||||
## Architecture front — URL API notaire
|
||||
|
||||
- Tout nouvel appel HTTP, flux SSE, refresh token ou URL backend dérivée pour l’API notaire doit passer par **`getBaseUrl()`** (`front-common/src/front/Api/helpers/configHelpers.ts`) ou **`baseApi.getBaseUrl()`** sur un service **`BaseApiService`**, pas par concaténation manuelle de **`BACK_API_*`** ni par composition d’URL à partir de **`process.env.NEXT_PUBLIC_BACK_API_*`** en dehors des chemins bootstrap / runtime déjà documentés.
|
||||
|
||||
- **Navigation notaire — contexte « Dossiers invités »** : toute évolution du basculement office / invité ou du retour depuis les écrans document doit tenir compte de **`notaryInvitedFoldersNavPersistence.ts`** (**`sessionStorage`**, **`pathnameEligibleForPersistedInvitedNav`**) et des consommateurs **`folderContextViewFlags`**, **`viewDocumentsBackUrlCompute`**, **`ActiveOfficeStore.reset`** — détail comportement et chemins dans **`docs/Frontend.md`** (section *Persistance du contexte « Dossiers invités »*).
|
||||
|
||||
### Next.js — `PublicSiteConfigProvider` et prerender (SSG)
|
||||
|
||||
- Tout hook qui appelle **`usePublicSiteConfigContext`** (y compris **`useApplyPublicSiteTheme`**) doit vivre **sous** **`PublicSiteConfigProvider`** dans **`front-common/src/pages/_app.tsx`**. Les hooks du shell parent (**`AppShell`**, ex. **`useAppFrontendBootstrap`**) restent limités au bootstrap env / session : pas de contexte site public à cet niveau.
|
||||
- Pattern retenu : composant **`PublicSiteThemeEffect`** (enfant du provider) qui appelle **`useApplyPublicSiteTheme`** — voir **`docs/Frontend.md`** § *Config site public* et **`docs/Operations.md`** § *Next.js — prerender / SSG*.
|
||||
- Préférer le hook **`useApiClient`** et le catalogue **`apiV1Paths`** pour les segments sous **`/api/v1`** ; exposer **`baseUrl`** du hook plutôt que **`protocol` + `host`** isolés.
|
||||
- Politique **`process.env`**, liste des fichiers autorisés et commandes de contrôle : **`docs/Operations.md`** § *Front — URL API : centralisation sur getBaseUrl()*.
|
||||
- Détail produit (réécriture d’hôte, **`invalidateBaseUrl()`**, anti-patterns) : **`docs/Frontend.md`** § *Base URL backend (API notaire)*.
|
||||
|
||||
## `front-backoffice` — typage i18n
|
||||
## Multisite back-end — résolution de déploiement vs options `sites`
|
||||
|
||||
- Pour le code sous **`front-backoffice/src/`** qui appelle **`t("…")`** avec des clés du catalogue **`src/i18n/messages.*.ts`**, typer l’argument **`t`** avec **`TranslateFn`** depuis **`@/i18n`** (alias vers **`src/i18n`**) dans les helpers et modules extraits — aligné avec les écrans case / document du monorepo **`lecoffre_ng_test`** ; détail : **`docs/Frontend.md`** § *I18n — périmètres*.
|
||||
- **Routage** : lorsque le même binaire sert plusieurs hôtes publics, **`getEffectiveDeploymentSiteCode`** / ALS (`back-common/src/common/request/deploymentSiteContext.ts`) rattachent la requête à la **ligne `sites` effective** et aux enregistrements **`site_code`** concernés — aligné sur **`GET /v1/public/site-config`**.
|
||||
- **Logique métier** : le code applicatif doit rester **agnostique des noms de site** (`lecoffreio`, `genealogie`). Il se pilote sur les **options activées** (**`integration_flags`**, contenu de **`theme_json`**, etc.) pour cette ligne, pas sur des branchements métier par libellé de ligne. Exceptions : couches **Host** / chemins secrets, **migrations** ou **seeds** SQL par partition documentés, **scripts shell** avec **`SITE_CODE`**.
|
||||
- **Référence** : **`docs/features/multi-site-architecture.md`** § *Backend HTTP partagé* / *Règle code métier*.
|
||||
|
||||
## Déploiement Node — `deploy/scripts_v2/lib/` et PostgreSQL
|
||||
|
||||
- **Fichiers qui ouvrent une `Pool` `pg`** : uniquement **`deploy/scripts_v2/lib/pgPoolFromConnectDb.mjs`** (résolution **DATABASE_URL** **kogus** / surcharge env, **`createVerifiedPgPool`**, **`createVerifiedPgPoolFromUrl`**, **`resolveDatabaseUrlForDeployScript`**), **`connectDbUrl.mjs`** (**`loadDatabaseUrlFromConnectDb`**, **`tryLoadDatabaseUrlFromConnectDbFile`**, **`nestedLineConnectDbPath`**, chemins connectDB), et **`exportMandatoryLineArtifactsFromDb.mjs`** (**SELECT** multi-**`site_code`** pour les exports JSON ligne). C’est le périmètre **pg** du dossier **`lib/`** ; pas d’autre **`.mjs`** y créer une pool pour l’instant.
|
||||
- **Autres `*.mjs` sous `lib/`** (`nestedSecretsMaterialize`, `mergeInfosV2DatabaseFromSiteLineEnv`, `mandatoryLineArtifactsTemplates`, `nestedSecretsEnsureGaps`, `generateEnvFullFromInfos`, `merge-env-full-site-keys-cli`, `stripInfosV2CrossLineSecrets`, `parseEnvFileValue`, `loadPg`, `warnConnectDbLoopback`) : disque uniquement (gabarits, **`infos_v2`**, merge env-full, avertissements) — **pas** d’accès PostgreSQL.
|
||||
- **Nouveau script Node** sous **`deploy/scripts_v2/`** (racine ou **`lib/`**) qui doit lire PostgreSQL : réutiliser **`resolveDatabaseUrlForDeployScript`**, **`nestedLineConnectDbPath`** / **`tryLoadDatabaseUrlFromConnectDbFile`**, et **`createVerifiedPgPoolFromUrl`** comme **`nested-secrets-tool.mjs`** (**`export-db-artifacts`**) — une pool par **`DATABASE_URL`** de ligne lorsque le connectDB **ligne** diffère du défaut **kogus** ; éviter une résolution d’URL dupliquée ou une seule pool implicite pour tout le multisite.
|
||||
- **Couche shell distante** : hors **`lib/`**, l’accès BDD sur les cibles passe par **`load_connectdb_v2`**, **`SITE_CODE`**, **`resolve_connect_db_path_on_target`** (**`deploy/scripts_v2/remote/_lib.sh`**). Ne pas court-circuiter cette résolution pour du métier runtime.
|
||||
- **Références** : **`docs/features/secrets-multisite-kogus-and-sites.md`** § *CLI `nested-secrets-tool.mjs`* et inventaire **`lib/`** ; **`docs/features/multi-site-architecture.md`**.
|
||||
|
||||
## Déploiement shell — chemins cible (`APP_ROOT`) et multisite
|
||||
|
||||
- **Chemin dépôt distant (orchestrateur)** : une seule fonction **`get_env_remote_app_root <env> <site>`** dans **`deploy/scripts_v2/_lib/env-map.sh`** (forme **`/srv/4NK/<fqdn>`** dérivée de **`get_env_domain_for_site`**). Les scripts sous **`deploy/scripts_v2/`** (hors **`remote/`** qui reçoivent déjà **`<app_root>`** en argument) ne doivent **pas** recalculer **`/srv/4NK/${DOMAIN}`** ou dupliquer la règle FQDN → disque.
|
||||
- **FQDN public aligné sur `APP_ROOT`** : **`get_env_domain_for_site <env> <site>`** avec le **même** **`site`** (`lecoffreio` \| `genealogie`) que pour **`get_env_remote_app_root`**.
|
||||
- **Contexte déploiement** : **`lcf_deploy_export_target_context`** (**`deploy/scripts_v2/_lib/deploy-target-context.sh`**) résout **`site`** une fois depuis **`SITE_CODE`** / **`LECOFFRE_SITE_CODE`** / **`DEPLOY_SITE_CODE`**, pose **`DOMAIN`** et **`APP_ROOT`** via ces deux fonctions, puis les ports systemd via **`get_env_*_port`** lorsque demandé — pas de second chemin pour **`APP_ROOT`**.
|
||||
- **Outils sans boucle `for site`** : second argument explicite ; **`lcf_site_code_for_remote_app_root_or_lecoffreio`** (**`env-map.sh`**) lorsque le défaut **lecoffreio** ou un **`SITE_CODE`** exporté hors boucle suffit ; boucles multisite : passer **`site`** / **`SITE`** en clair.
|
||||
- **Détail opérateur** (arbres **`.secrets/`**, **kogus**, sync connectDB sur les trois **`APP_ROOT`**, matrice post-déploiement, exceptions stockage) : **`docs/features/secrets-multisite-kogus-and-sites.md`** — ne pas y recopier la norme ci-dessus ; renvoyer ici pour toute nouvelle règle shell sur **`APP_ROOT`** / **`DOMAIN`**.
|
||||
|
||||
## `front-backoffice` (cabinet) — `fetch` same-origin et `basePath`
|
||||
|
||||
- **Route Handlers Next** (`src/app/api/**`, même déploiement que l’App Router) : tout **`fetch`** navigateur vers ces chemins doit passer par **`fetchUnderCurrentAppBase`** ou **`nextAppSameOriginUrl`** (`front-backoffice/src/lib/oauth.ts`), afin d’inclure le préfixe **`/backoffice`**. **Inventaire actuel du dépôt** : un seul appel — **`docvOAuthBrowser.ts`** → **`/api/auth/docv-token`**. Toute nouvelle route **`app/api/...`** consommée en **`fetch`** côté client doit réutiliser ce mécanisme.
|
||||
- **API docv-back** : les chemins **`/api/v1/...`** passent par **`docvFetch`** et **`docvApiBase()`** (`front-backoffice/src/lib/docv/client.ts`, origine **`/docv-api`**). **Ne pas** les faire transiter par **`pathWithBase`** / **`fetchUnderCurrentAppBase`**.
|
||||
- **Liens et redirections** : **`Link`**, **`redirect()`**, **`router.replace()`** avec chemins commençant par **`/`** restent sans préfixe manuel **`/backoffice`** ; Next applique **`basePath`** automatiquement.
|
||||
- Détail déploiement et smoke réseau : **`docs/features/monorepo-backoffice-oauth-default.md`** § *`fetch` same-origin : Route Handlers Next vs API docv-back*.
|
||||
- **Typage i18n** : pour le code sous **`front-backoffice/src/`** qui appelle **`t("…")`** avec des clés du catalogue **`src/i18n/messages.*.ts`**, typer l’argument **`t`** avec **`TranslateFn`** depuis **`@/i18n`** (alias vers **`src/i18n`**) dans les helpers et modules extraits — aligné avec les écrans case / document déjà refactorés.
|
||||
|
||||
## Lint backend (back-common) – refactors restants
|
||||
|
||||
|
||||
@ -81,9 +81,9 @@ Liste des fichiers contenant les textes affichés à l’utilisateur (libellés,
|
||||
|
||||
## 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 à intégrer à la page wiki **Deployment** : [`features/wiki-deployment-multisite-snippet.md`](./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 sous **`ia_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é par `projects/kogus/conf.json`).
|
||||
- **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 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 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 d’un coup : `bash deploy/scripts_v2/run-verify-ssh-all-envs.sh`.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user