feat: préparer l'intégration complète dans 4NK_node - ajout Dockerfile.4nk-node optimisé pour l'intégration - configuration nginx.4nk-node.conf adaptée aux services 4NK_node - script start-4nk-node.sh avec vérification des services - docker-compose.4nk-node.yml pour l'intégration - documentation INTEGRATION_4NK_NODE.md complète - script d'automatisation integrate-4nk-node.sh - structure .cursor/rules pour la cohérence avec 4NK_node - fichier AGENTS.md pour la gouvernance du projet
This commit is contained in:
parent
484b5ea250
commit
c563d7b16c
11
.cursor/.cursorignore
Normal file
11
.cursor/.cursorignore
Normal file
@ -0,0 +1,11 @@
|
||||
# Ignorer les sorties volumineuses ou non pertinentes pour le contexte IA
|
||||
archive/**
|
||||
tests/logs/**
|
||||
tests/reports/**
|
||||
node_modules/**
|
||||
dist/**
|
||||
build/**
|
||||
.tmp/**
|
||||
.cache/**#
|
||||
.env
|
||||
.env.*
|
59
.cursor/rules/00-foundations.mdc
Normal file
59
.cursor/rules/00-foundations.mdc
Normal file
@ -0,0 +1,59 @@
|
||||
---
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Fondations de rédaction et de comportement
|
||||
|
||||
[portée]
|
||||
S’applique à tout le dépôt 4NK/4NK_node pour toute génération, refactorisation, édition inline ou discussion dans Cursor.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Garantir l’usage exclusif du français.
|
||||
- Proscrire l’injection d’exemples de code applicatif dans la base de code.
|
||||
- Assurer une cohérence stricte de terminologie et de ton.
|
||||
- Exiger une introduction et/ou une conclusion dans toute proposition de texte.
|
||||
|
||||
[directives]
|
||||
|
||||
- Toujours répondre et documenter en français.
|
||||
- Ne pas inclure d’exemples exécutables ou de quickstarts dans la base ; préférer des descriptions prescriptives.
|
||||
- Tout contenu produit doit mentionner explicitement les artefacts à mettre à jour lorsqu’il impacte docs/ et tests/.
|
||||
- Préserver la typographie française (capitaliser uniquement le premier mot d’un titre et les noms propres).
|
||||
|
||||
[validations]
|
||||
|
||||
- Relecture linguistique et technique systématique.
|
||||
- Refuser toute sortie avec exemples de code applicatif.
|
||||
- Vérifier que l’issue traitée se conclut par un rappel des fichiers à mettre à jour.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- README.md, docs/**, tests/**, CHANGELOG.md, .gitea/**.# Fondations de rédaction et de comportement
|
||||
|
||||
[portée]
|
||||
S’applique à tout le dépôt 4NK/4NK_node pour toute génération, refactorisation, édition inline ou discussion dans Cursor.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Garantir l’usage exclusif du français.
|
||||
- Proscrire l’injection d’exemples de code applicatif dans la base de code.
|
||||
- Assurer une cohérence stricte de terminologie et de ton.
|
||||
- Exiger une introduction et/ou une conclusion dans toute proposition de texte.
|
||||
|
||||
[directives]
|
||||
|
||||
- Toujours répondre et documenter en français.
|
||||
- Ne pas inclure d’exemples exécutables ou de quickstarts dans la base ; préférer des descriptions prescriptives.
|
||||
- Tout contenu produit doit mentionner explicitement les artefacts à mettre à jour lorsqu’il impacte docs/ et tests/.
|
||||
- Préserver la typographie française (capitaliser uniquement le premier mot d’un titre et les noms propres).
|
||||
|
||||
[validations]
|
||||
|
||||
- Relecture linguistique et technique systématique.
|
||||
- Refuser toute sortie avec exemples de code applicatif.
|
||||
- Vérifier que l’issue traitée se conclut par un rappel des fichiers à mettre à jour.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- README.md, docs/**, tests/**, CHANGELOG.md, .gitea/**.
|
139
.cursor/rules/10-project-structure.mdc
Normal file
139
.cursor/rules/10-project-structure.mdc
Normal file
@ -0,0 +1,139 @@
|
||||
---
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Structure projet 4NK_node
|
||||
|
||||
[portée]
|
||||
Maintenance de l’arborescence canonique, création/mise à jour/suppression de fichiers et répertoires.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Garantir l’alignement strict avec l’arborescence 4NK_node.
|
||||
- Prévenir toute dérive structurelle.
|
||||
|
||||
[directives]
|
||||
|
||||
- S’assurer que l’arborescence suivante existe et reste conforme :
|
||||
|
||||
4NK/4NK_node
|
||||
├── archive
|
||||
├── CHANGELOG.md
|
||||
├── CODE_OF_CONDUCT.md
|
||||
├── CONTRIBUTING.md
|
||||
├── docker-compose.yml
|
||||
├── docs
|
||||
│ ├── API.md
|
||||
│ ├── ARCHITECTURE.md
|
||||
│ ├── COMMUNITY_GUIDE.md
|
||||
│ ├── CONFIGURATION.md
|
||||
│ ├── GITEA_SETUP.md
|
||||
│ ├── INDEX.md
|
||||
│ ├── INSTALLATION.md
|
||||
│ ├── MIGRATION.md
|
||||
│ ├── OPEN_SOURCE_CHECKLIST.md
|
||||
│ ├── QUICK_REFERENCE.md
|
||||
│ ├── RELEASE_PLAN.md
|
||||
│ ├── ROADMAP.md
|
||||
│ ├── SECURITY_AUDIT.md
|
||||
│ ├── TESTING.md
|
||||
│ └── USAGE.md
|
||||
├── LICENSE
|
||||
├── README.md
|
||||
├── tests
|
||||
│ ├── cleanup.sh
|
||||
│ ├── connectivity
|
||||
│ ├── external
|
||||
│ ├── integration
|
||||
│ ├── logs
|
||||
│ ├── performance
|
||||
│ ├── README.md
|
||||
│ ├── reports
|
||||
│ └── unit
|
||||
└── .gitea
|
||||
├── ISSUE_TEMPLATE
|
||||
│ ├── bug_report.md
|
||||
│ └── feature_request.md
|
||||
├── PULL_REQUEST_TEMPLATE.md
|
||||
└── workflows
|
||||
└── ci.yml
|
||||
|
||||
- Tout document obsolète est déplacé vers archive/ avec métadonnées (date, raison).
|
||||
- Interdire la suppression brute de fichiers sans archivage et note dans CHANGELOG.md.
|
||||
|
||||
[validations]
|
||||
|
||||
- Diff structurel comparé à cette référence.
|
||||
- Erreur bloquante si un fichier « requis » manque.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- archive/**, docs/**, tests/**, .gitea/**, CHANGELOG.md.
|
||||
|
||||
# Structure projet 4NK_node
|
||||
|
||||
[portée]
|
||||
Maintenance de l’arborescence canonique, création/mise à jour/suppression de fichiers et répertoires.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Garantir l’alignement strict avec l’arborescence 4NK_node.
|
||||
- Prévenir toute dérive structurelle.
|
||||
|
||||
[directives]
|
||||
|
||||
- S’assurer que l’arborescence suivante existe et reste conforme :
|
||||
|
||||
4NK/4NK_node
|
||||
├── archive
|
||||
├── CHANGELOG.md
|
||||
├── CODE_OF_CONDUCT.md
|
||||
├── CONTRIBUTING.md
|
||||
├── docker-compose.yml
|
||||
├── docs
|
||||
│ ├── API.md
|
||||
│ ├── ARCHITECTURE.md
|
||||
│ ├── COMMUNITY_GUIDE.md
|
||||
│ ├── CONFIGURATION.md
|
||||
│ ├── GITEA_SETUP.md
|
||||
│ ├── INDEX.md
|
||||
│ ├── INSTALLATION.md
|
||||
│ ├── MIGRATION.md
|
||||
│ ├── OPEN_SOURCE_CHECKLIST.md
|
||||
│ ├── QUICK_REFERENCE.md
|
||||
│ ├── RELEASE_PLAN.md
|
||||
│ ├── ROADMAP.md
|
||||
│ ├── SECURITY_AUDIT.md
|
||||
│ ├── TESTING.md
|
||||
│ └── USAGE.md
|
||||
├── LICENSE
|
||||
├── README.md
|
||||
├── tests
|
||||
│ ├── cleanup.sh
|
||||
│ ├── connectivity
|
||||
│ ├── external
|
||||
│ ├── integration
|
||||
│ ├── logs
|
||||
│ ├── performance
|
||||
│ ├── README.md
|
||||
│ ├── reports
|
||||
│ └── unit
|
||||
└── .gitea
|
||||
├── ISSUE_TEMPLATE
|
||||
│ ├── bug_report.md
|
||||
│ └── feature_request.md
|
||||
├── PULL_REQUEST_TEMPLATE.md
|
||||
└── workflows
|
||||
└── ci.yml
|
||||
|
||||
- Tout document obsolète est déplacé vers archive/ avec métadonnées (date, raison).
|
||||
- Interdire la suppression brute de fichiers sans archivage et note dans CHANGELOG.md.
|
||||
|
||||
[validations]
|
||||
|
||||
- Diff structurel comparé à cette référence.
|
||||
- Erreur bloquante si un fichier « requis » manque.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- archive/**, docs/**, tests/**, .gitea/**, CHANGELOG.md.
|
62
.cursor/rules/20-documentation.mdc
Normal file
62
.cursor/rules/20-documentation.mdc
Normal file
@ -0,0 +1,62 @@
|
||||
---
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Documentation continue
|
||||
|
||||
[portée]
|
||||
Mises à jour de docs/** corrélées à tout changement de code, configuration, dépendance, données ou CI.
|
||||
|
||||
[objectifs]
|
||||
- Remplacer toute section générique « RESUME » par des mises à jour ciblées dans les fichiers appropriés.
|
||||
- Tenir INDEX.md comme table des matières de référence.
|
||||
|
||||
[directives]
|
||||
- À chaque changement, mettre à jour :
|
||||
- API.md (spécifications, contrats, schémas, invariants).
|
||||
- ARCHITECTURE.md (décisions, diagrammes, couplages, performances).
|
||||
- CONFIGURATION.md (paramètres, formats, valeurs par défaut).
|
||||
- INSTALLATION.md (pré-requis, étapes, vérifications).
|
||||
- MIGRATION.md (chemins de migration, scripts, compatibilités).
|
||||
- USAGE.md (parcours fonctionnels, contraintes).
|
||||
- TESTING.md (pyramide, critères d’acceptation).
|
||||
- SECURITY_AUDIT.md (menaces, contrôles, dettes résiduelles).
|
||||
- RELEASE_PLAN.md, ROADMAP.md (planification), OPEN_SOURCE_CHECKLIST.md, COMMUNITY_GUIDE.md, GITEA_SETUP.md.
|
||||
- Maintenir QUICK_REFERENCE.md pour les référentiels synthétiques utilisés par l’équipe.
|
||||
- Ajouter un REX technique en cas d’hypothèses multiples avant résolution dans archive/.
|
||||
|
||||
[validations]
|
||||
- Cohérence croisée entre README.md et INDEX.md.
|
||||
- Refus si une modification de code n’a pas de trace dans docs/** correspondants.
|
||||
|
||||
[artefacts concernés]
|
||||
- docs/**, README.md, archive/**.
|
||||
# Documentation continue
|
||||
|
||||
[portée]
|
||||
Mises à jour de docs/** corrélées à tout changement de code, configuration, dépendance, données ou CI.
|
||||
|
||||
[objectifs]
|
||||
- Remplacer toute section générique « RESUME » par des mises à jour ciblées dans les fichiers appropriés.
|
||||
- Tenir INDEX.md comme table des matières de référence.
|
||||
|
||||
[directives]
|
||||
- À chaque changement, mettre à jour :
|
||||
- API.md (spécifications, contrats, schémas, invariants).
|
||||
- ARCHITECTURE.md (décisions, diagrammes, couplages, performances).
|
||||
- CONFIGURATION.md (paramètres, formats, valeurs par défaut).
|
||||
- INSTALLATION.md (pré-requis, étapes, vérifications).
|
||||
- MIGRATION.md (chemins de migration, scripts, compatibilités).
|
||||
- USAGE.md (parcours fonctionnels, contraintes).
|
||||
- TESTING.md (pyramide, critères d’acceptation).
|
||||
- SECURITY_AUDIT.md (menaces, contrôles, dettes résiduelles).
|
||||
- RELEASE_PLAN.md, ROADMAP.md (planification), OPEN_SOURCE_CHECKLIST.md, COMMUNITY_GUIDE.md, GITEA_SETUP.md.
|
||||
- Maintenir QUICK_REFERENCE.md pour les référentiels synthétiques utilisés par l’équipe.
|
||||
- Ajouter un REX technique en cas d’hypothèses multiples avant résolution dans archive/.
|
||||
|
||||
[validations]
|
||||
- Cohérence croisée entre README.md et INDEX.md.
|
||||
- Refus si une modification de code n’a pas de trace dans docs/** correspondants.
|
||||
|
||||
[artefacts concernés]
|
||||
- docs/**, README.md, archive/**.
|
57
.cursor/rules/30-testing.mdc
Normal file
57
.cursor/rules/30-testing.mdc
Normal file
@ -0,0 +1,57 @@
|
||||
---
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Tests et qualité
|
||||
|
||||
[portée]
|
||||
Stratégie de tests, exécution locale, stabilité, non-régression.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Exiger des tests verts avant tout commit.
|
||||
- Couvrir les axes unit, integration, connectivity, performance, external.
|
||||
|
||||
[directives]
|
||||
|
||||
- Ajouter/mettre à jour des tests dans tests/unit, tests/integration, tests/connectivity, tests/performance, tests/external selon l’impact.
|
||||
- Consigner les journaux dans tests/logs et les rapports dans tests/reports.
|
||||
- Maintenir tests/README.md (stratégie, outillage, seuils).
|
||||
- Fournir un nettoyage reproductible via tests/cleanup.sh.
|
||||
- Bloquer l’édition si des tests échouent tant que la correction n’est pas appliquée.
|
||||
|
||||
[validations]
|
||||
|
||||
- Refus d’un commit si tests en échec.
|
||||
- Exiger justification et plan de test dans docs/TESTING.md pour toute refonte majeure.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- tests/**, docs/TESTING.md, CHANGELOG.md.
|
||||
|
||||
# Tests et qualité
|
||||
|
||||
[portée]
|
||||
Stratégie de tests, exécution locale, stabilité, non-régression.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Exiger des tests verts avant tout commit.
|
||||
- Couvrir les axes unit, integration, connectivity, performance, external.
|
||||
|
||||
[directives]
|
||||
|
||||
- Ajouter/mettre à jour des tests dans tests/unit, tests/integration, tests/connectivity, tests/performance, tests/external selon l’impact.
|
||||
- Consigner les journaux dans tests/logs et les rapports dans tests/reports.
|
||||
- Maintenir tests/README.md (stratégie, outillage, seuils).
|
||||
- Fournir un nettoyage reproductible via tests/cleanup.sh.
|
||||
- Bloquer l’édition si des tests échouent tant que la correction n’est pas appliquée.
|
||||
|
||||
[validations]
|
||||
|
||||
- Refus d’un commit si tests en échec.
|
||||
- Exiger justification et plan de test dans docs/TESTING.md pour toute refonte majeure.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- tests/**, docs/TESTING.md, CHANGELOG.md.
|
55
.cursor/rules/40-dependencies-and-build.mdc
Normal file
55
.cursor/rules/40-dependencies-and-build.mdc
Normal file
@ -0,0 +1,55 @@
|
||||
---
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Dépendances, compilation et build
|
||||
|
||||
[portée]
|
||||
Gestion des dépendances, compilation fréquente, politique de versions.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Ajouter automatiquement les dépendances manquantes si justifié.
|
||||
- Rechercher systématiquement les dernières versions stables.
|
||||
|
||||
[directives]
|
||||
|
||||
- Lorsqu’une fonctionnalité nécessite une dépendance, l’ajouter et la documenter (nom, version, portée, impact) dans docs/ARCHITECTURE.md et docs/CONFIGURATION.md si nécessaire.
|
||||
- Compiler très régulièrement et « quand nécessaire » (avant refactor, avant push, après mise à jour de dépendances).
|
||||
- Corriger toute erreur de compilation/exécution avant de poursuivre.
|
||||
- Documenter tout changement de dépendances (raison, risques, rollback).
|
||||
|
||||
[validations]
|
||||
|
||||
- Interdire la progression si la compilation échoue.
|
||||
- Vérifier la présence d’une note de changement dans CHANGELOG.md en cas de dépendance ajoutée/retirée.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- docs/ARCHITECTURE.md, docs/CONFIGURATION.md, CHANGELOG.md.
|
||||
|
||||
# Dépendances, compilation et build
|
||||
|
||||
[portée]
|
||||
Gestion des dépendances, compilation fréquente, politique de versions.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Ajouter automatiquement les dépendances manquantes si justifié.
|
||||
- Rechercher systématiquement les dernières versions stables.
|
||||
|
||||
[directives]
|
||||
|
||||
- Lorsqu’une fonctionnalité nécessite une dépendance, l’ajouter et la documenter (nom, version, portée, impact) dans docs/ARCHITECTURE.md et docs/CONFIGURATION.md si nécessaire.
|
||||
- Compiler très régulièrement et « quand nécessaire » (avant refactor, avant push, après mise à jour de dépendances).
|
||||
- Corriger toute erreur de compilation/exécution avant de poursuivre.
|
||||
- Documenter tout changement de dépendances (raison, risques, rollback).
|
||||
|
||||
[validations]
|
||||
|
||||
- Interdire la progression si la compilation échoue.
|
||||
- Vérifier la présence d’une note de changement dans CHANGELOG.md en cas de dépendance ajoutée/retirée.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- docs/ARCHITECTURE.md, docs/CONFIGURATION.md, CHANGELOG.md.
|
54
.cursor/rules/50-data-csv-models.mdc
Normal file
54
.cursor/rules/50-data-csv-models.mdc
Normal file
@ -0,0 +1,54 @@
|
||||
---
|
||||
alwaysApply: false
|
||||
---
|
||||
# Modélisation des données à partir de CSV
|
||||
|
||||
[portée]
|
||||
Utilisation des CSV comme base des modèles de données, y compris en-têtes multi-lignes.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Confirmer la structure inférée pour chaque CSV.
|
||||
- Demander une définition formelle de toutes les colonnes.
|
||||
|
||||
[directives]
|
||||
|
||||
- Gérer explicitement les en-têtes multi-lignes (titre principal + sous-colonnes).
|
||||
- Confirmer par écrit dans docs/API.md ou docs/ARCHITECTURE.md : nombre de lignes d’en-tête, mapping colonnes→types, unités, domaines de valeurs, nullabilité, contraintes.
|
||||
- Poser des questions si ambiguïtés ; proposer une normalisation temporaire documentée.
|
||||
- Corriger automatiquement les incohérences de types si une règle de mapping est établie ailleurs et documenter la transformation.
|
||||
|
||||
[validations]
|
||||
|
||||
- Aucune ingestion sans spécification de colonnes validée.
|
||||
- Traçabilité des corrections de types (avant/après) dans docs/ARCHITECTURE.md.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- docs/API.md, docs/ARCHITECTURE.md, docs/USAGE.md.
|
||||
|
||||
# Modélisation des données à partir de CSV
|
||||
|
||||
[portée]
|
||||
Utilisation des CSV comme base des modèles de données, y compris en-têtes multi-lignes.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Confirmer la structure inférée pour chaque CSV.
|
||||
- Demander une définition formelle de toutes les colonnes.
|
||||
|
||||
[directives]
|
||||
|
||||
- Gérer explicitement les en-têtes multi-lignes (titre principal + sous-colonnes).
|
||||
- Confirmer par écrit dans docs/API.md ou docs/ARCHITECTURE.md : nombre de lignes d’en-tête, mapping colonnes→types, unités, domaines de valeurs, nullabilité, contraintes.
|
||||
- Poser des questions si ambiguïtés ; proposer une normalisation temporaire documentée.
|
||||
- Corriger automatiquement les incohérences de types si une règle de mapping est établie ailleurs et documenter la transformation.
|
||||
|
||||
[validations]
|
||||
|
||||
- Aucune ingestion sans spécification de colonnes validée.
|
||||
- Traçabilité des corrections de types (avant/après) dans docs/ARCHITECTURE.md.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- docs/API.md, docs/ARCHITECTURE.md, docs/USAGE.md.
|
41
.cursor/rules/60-office-docs.mdc
Normal file
41
.cursor/rules/60-office-docs.mdc
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
alwaysApply: false
|
||||
---
|
||||
# Lecture des documents bureautiques
|
||||
|
||||
[portée]
|
||||
Lecture des fichiers .docx et alternatives.
|
||||
|
||||
[objectifs]
|
||||
- Utiliser docx2txt par défaut.
|
||||
- Proposer des solutions de repli si lecture impossible.
|
||||
|
||||
[directives]
|
||||
- Lire les .docx avec docx2txt.
|
||||
- En cas d’échec, proposer : conversion via pandoc, demande d’une source alternative, ou extraction textuelle.
|
||||
- Documenter dans docs/INDEX.md la provenance et le statut des documents importés.
|
||||
|
||||
[validations]
|
||||
- Vérification que les contenus extraits sont intégrés aux fichiers docs/ concernés.
|
||||
|
||||
[artefacts concernés]
|
||||
- docs/**, archive/**.
|
||||
# Lecture des documents bureautiques
|
||||
|
||||
[portée]
|
||||
Lecture des fichiers .docx et alternatives.
|
||||
|
||||
[objectifs]
|
||||
- Utiliser docx2txt par défaut.
|
||||
- Proposer des solutions de repli si lecture impossible.
|
||||
|
||||
[directives]
|
||||
- Lire les .docx avec docx2txt.
|
||||
- En cas d’échec, proposer : conversion via pandoc, demande d’une source alternative, ou extraction textuelle.
|
||||
- Documenter dans docs/INDEX.md la provenance et le statut des documents importés.
|
||||
|
||||
[validations]
|
||||
- Vérification que les contenus extraits sont intégrés aux fichiers docs/ concernés.
|
||||
|
||||
[artefacts concernés]
|
||||
- docs/**, archive/**.
|
56
.cursor/rules/70-frontend-architecture.mdc
Normal file
56
.cursor/rules/70-frontend-architecture.mdc
Normal file
@ -0,0 +1,56 @@
|
||||
---
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# Architecture frontend
|
||||
|
||||
[portée]
|
||||
Qualité du bundle, découpage, état global et couche de services.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Réduire la taille du bundle initial via code splitting.
|
||||
- Éviter le prop drilling via Redux ou Context API.
|
||||
- Abstraire les services de données pour testabilité et maintenance.
|
||||
|
||||
[directives]
|
||||
|
||||
- Mettre en place React.lazy et Suspense pour le chargement différé des vues/segments.
|
||||
- Centraliser l’état global via Redux ou Context API.
|
||||
- Isoler les appels « data » derrière une couche d’abstraction à interface stable.
|
||||
- Interdire l’ajout d’exemples front dans la base de code.
|
||||
|
||||
[validations]
|
||||
|
||||
- Vérifier que les points d’entrée sont minimes et que les segments non critiques sont chargés à la demande.
|
||||
- S’assurer que docs/ARCHITECTURE.md décrit les décisions et les points d’extension.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- docs/ARCHITECTURE.md, docs/TESTING.md.
|
||||
# Architecture frontend
|
||||
|
||||
[portée]
|
||||
Qualité du bundle, découpage, état global et couche de services.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Réduire la taille du bundle initial via code splitting.
|
||||
- Éviter le prop drilling via Redux ou Context API.
|
||||
- Abstraire les services de données pour testabilité et maintenance.
|
||||
|
||||
[directives]
|
||||
|
||||
- Mettre en place React.lazy et Suspense pour le chargement différé des vues/segments.
|
||||
- Centraliser l’état global via Redux ou Context API.
|
||||
- Isoler les appels « data » derrière une couche d’abstraction à interface stable.
|
||||
- Interdire l’ajout d’exemples front dans la base de code.
|
||||
|
||||
[validations]
|
||||
|
||||
- Vérifier que les points d’entrée sont minimes et que les segments non critiques sont chargés à la demande.
|
||||
- S’assurer que docs/ARCHITECTURE.md décrit les décisions et les points d’extension.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- docs/ARCHITECTURE.md, docs/TESTING.md.
|
53
.cursor/rules/80-versioning-and-release.mdc
Normal file
53
.cursor/rules/80-versioning-and-release.mdc
Normal file
@ -0,0 +1,53 @@
|
||||
---
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# Versionnage et publication
|
||||
|
||||
[portée]
|
||||
Gestion sémantique des versions, CHANGELOG, confirmation push/tag.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Tenir CHANGELOG.md comme source unique de vérité.
|
||||
- Demander confirmation avant push et tag.
|
||||
|
||||
[directives]
|
||||
|
||||
- À chaque changement significatif, mettre à jour CHANGELOG.md (ajouts, changements, corrections, ruptures).
|
||||
- Proposer un bump semver (major/minor/patch) motivé par l’impact.
|
||||
- Avant tout push ou tag, demander confirmation explicite.
|
||||
|
||||
[validations]
|
||||
|
||||
- Refus si modification sans entrée correspondante dans CHANGELOG.md.
|
||||
- Cohérence entre CHANGELOG.md, docs/RELEASE_PLAN.md et docs/ROADMAP.md.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- CHANGELOG.md, docs/RELEASE_PLAN.md, docs/ROADMAP.md.
|
||||
|
||||
# Versionnage et publication
|
||||
|
||||
[portée]
|
||||
Gestion sémantique des versions, CHANGELOG, confirmation push/tag.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Tenir CHANGELOG.md comme source unique de vérité.
|
||||
- Demander confirmation avant push et tag.
|
||||
|
||||
[directives]
|
||||
|
||||
- À chaque changement significatif, mettre à jour CHANGELOG.md (ajouts, changements, corrections, ruptures).
|
||||
- Proposer un bump semver (major/minor/patch) motivé par l’impact.
|
||||
- Avant tout push ou tag, demander confirmation explicite.
|
||||
|
||||
[validations]
|
||||
|
||||
- Refus si modification sans entrée correspondante dans CHANGELOG.md.
|
||||
- Cohérence entre CHANGELOG.md, docs/RELEASE_PLAN.md et docs/ROADMAP.md.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- CHANGELOG.md, docs/RELEASE_PLAN.md, docs/ROADMAP.md.
|
59
.cursor/rules/90-gitea-and-oss.mdc
Normal file
59
.cursor/rules/90-gitea-and-oss.mdc
Normal file
@ -0,0 +1,59 @@
|
||||
---
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Open source et Gitea
|
||||
|
||||
[portée]
|
||||
Conformité open source, templates Gitea, CI.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Préparer chaque projet pour un dépôt Gitea (git.4nkweb.com).
|
||||
- Maintenir les fichiers de gouvernance et la CI.
|
||||
|
||||
[directives]
|
||||
|
||||
- Vérifier la présence et l’actualité de : LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, OPEN_SOURCE_CHECKLIST.md.
|
||||
- Maintenir .gitea/ :
|
||||
- ISSUE_TEMPLATE/bug_report.md, feature_request.md
|
||||
- PULL_REQUEST_TEMPLATE.md
|
||||
- workflows/ci.yml
|
||||
- Documenter dans docs/GITEA_SETUP.md la configuration distante et les permissions.
|
||||
|
||||
[validations]
|
||||
|
||||
- Refus si un des fichiers « gouvernance/CI » manque.
|
||||
- Cohérence entre docs/OPEN_SOURCE_CHECKLIST.md et l’état du repo.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- .gitea/**, docs/GITEA_SETUP.md, docs/OPEN_SOURCE_CHECKLIST.md.
|
||||
|
||||
# Open source et Gitea
|
||||
|
||||
[portée]
|
||||
Conformité open source, templates Gitea, CI.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Préparer chaque projet pour un dépôt Gitea (git.4nkweb.com).
|
||||
- Maintenir les fichiers de gouvernance et la CI.
|
||||
|
||||
[directives]
|
||||
|
||||
- Vérifier la présence et l’actualité de : LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, OPEN_SOURCE_CHECKLIST.md.
|
||||
- Maintenir .gitea/ :
|
||||
- ISSUE_TEMPLATE/bug_report.md, feature_request.md
|
||||
- PULL_REQUEST_TEMPLATE.md
|
||||
- workflows/ci.yml
|
||||
- Documenter dans docs/GITEA_SETUP.md la configuration distante et les permissions.
|
||||
|
||||
[validations]
|
||||
|
||||
- Refus si un des fichiers « gouvernance/CI » manque.
|
||||
- Cohérence entre docs/OPEN_SOURCE_CHECKLIST.md et l’état du repo.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- .gitea/**, docs/GITEA_SETUP.md, docs/OPEN_SOURCE_CHECKLIST.md.
|
53
.cursor/rules/95-triage-and-problem-solving.mdc
Normal file
53
.cursor/rules/95-triage-and-problem-solving.mdc
Normal file
@ -0,0 +1,53 @@
|
||||
---
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Tri, diagnostic et résolution de problèmes
|
||||
|
||||
[portée]
|
||||
Boucle de triage : reproduction, diagnostic, correctif, non-régression.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Exécuter automatiquement les étapes de résolution.
|
||||
- Bloquer l’avancement tant que les erreurs ne sont pas corrigées.
|
||||
|
||||
[directives]
|
||||
|
||||
- Étapes obligatoires : reproduction minimale, inspection des logs, bissection des changements, formulation d’hypothèses, tests ciblés, correctif, test de non-régression.
|
||||
- Lorsque plusieurs hypothèses ont été testées, produire un REX dans archive/ avec liens vers les commits.
|
||||
- Poser des questions de cohérence fonctionnelle si des ambiguïtés subsistent (contrats d’API, invariants, SLA).
|
||||
|
||||
[validations]
|
||||
|
||||
- Interdiction de clore une tâche si un test échoue ou si une alerte critique subsiste.
|
||||
- Traçabilité du REX si investigations multiples.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- tests/**, archive/**, docs/TESTING.md, docs/ARCHITECTURE.md.
|
||||
|
||||
# Tri, diagnostic et résolution de problèmes
|
||||
|
||||
[portée]
|
||||
Boucle de triage : reproduction, diagnostic, correctif, non-régression.
|
||||
|
||||
[objectifs]
|
||||
|
||||
- Exécuter automatiquement les étapes de résolution.
|
||||
- Bloquer l’avancement tant que les erreurs ne sont pas corrigées.
|
||||
|
||||
[directives]
|
||||
|
||||
- Étapes obligatoires : reproduction minimale, inspection des logs, bissection des changements, formulation d’hypothèses, tests ciblés, correctif, test de non-régression.
|
||||
- Lorsque plusieurs hypothèses ont été testées, produire un REX dans archive/ avec liens vers les commits.
|
||||
- Poser des questions de cohérence fonctionnelle si des ambiguïtés subsistent (contrats d’API, invariants, SLA).
|
||||
|
||||
[validations]
|
||||
|
||||
- Interdiction de clore une tâche si un test échoue ou si une alerte critique subsiste.
|
||||
- Traçabilité du REX si investigations multiples.
|
||||
|
||||
[artefacts concernés]
|
||||
|
||||
- tests/**, archive/**, docs/TESTING.md, docs/ARCHITECTURE.md.
|
15
.cursor/rules/ruleset-index.md
Normal file
15
.cursor/rules/ruleset-index.md
Normal file
@ -0,0 +1,15 @@
|
||||
# Index des règles .cursor/rules
|
||||
|
||||
- 00-foundations.mdc : règles linguistiques et éditoriales (français, pas d’exemples en base, introduction/conclusion).
|
||||
- 10-project-structure.mdc : arborescence canonique 4NK_node et garde-fous.
|
||||
- 20-documentation.mdc : documentation continue, remplacement de « RESUME », INDEX.md.
|
||||
- 30-testing.mdc : tests (unit, integration, connectivity, performance, external), logs/reports.
|
||||
- 40-dependencies-and-build.mdc : dépendances, compilation, corrections bloquantes.
|
||||
- 50-data-csv-models.mdc : CSV avec en-têtes multi-lignes, définition des colonnes.
|
||||
- 60-office-docs.mdc : lecture .docx via docx2txt + repli.
|
||||
- 70-frontend-architecture.mdc : React.lazy/Suspense, état global, couche de services.
|
||||
- 80-versioning-and-release.mdc : CHANGELOG, semver, confirmation push/tag.
|
||||
- 90-gitea-and-oss.mdc : fichiers open source, .gitea, CI, Gitea remote.
|
||||
- 95-triage-and-problem-solving.mdc : boucle de diagnostic, REX, non-régression.
|
||||
|
||||
Ces règles sont conçues pour être ajoutées au contexte de Cursor depuis l’interface (@Cursor Rules) et s’appuient sur le mécanisme de règles projet stockées dans `.cursor/rules/`. :contentReference[oaicite:3]{index=3}
|
43
.github/workflows/cicd.yml
vendored
43
.github/workflows/cicd.yml
vendored
@ -1,43 +0,0 @@
|
||||
name: Build and Push to Registry
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ cicd ]
|
||||
|
||||
env:
|
||||
REGISTRY: git.4nkweb.com
|
||||
IMAGE_NAME: 4nk/ihm_client
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ secrets.USER }}
|
||||
password: ${{ secrets.TOKEN }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
ssh: default
|
||||
build-args: |
|
||||
ENV_VARS=${{ secrets.ENV_VARS }}
|
||||
tags: |
|
||||
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
||||
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }}
|
258
AGENTS.md
Normal file
258
AGENTS.md
Normal file
@ -0,0 +1,258 @@
|
||||
# AGENTS.md
|
||||
|
||||
## Table des matières
|
||||
|
||||
- [Introduction](#introduction)
|
||||
- [Agents fondamentaux](#agents-fondamentaux)
|
||||
- [Agents spécialisés documentation](#agents-spécialisés-documentation)
|
||||
- [Agents spécialisés tests](#agents-spécialisés-tests)
|
||||
- [Agents techniques](#agents-techniques)
|
||||
- [Agents frontend](#agents-frontend)
|
||||
- [Agents open source et CI](#agents-open-source-et-ci)
|
||||
- [Agents complémentaires](#agents-complémentaires)
|
||||
- [Matrice de coordination](#matrice-de-coordination)
|
||||
- [Conclusion](#conclusion)
|
||||
|
||||
---
|
||||
|
||||
## Introduction
|
||||
|
||||
Ce document définit les agents, leurs rôles et leurs responsabilités dans le projet `4NK/4NK_node`.
|
||||
Chaque agent est assigné à un périmètre clair (documentation, tests, dépendances, données, CI, gouvernance open source).
|
||||
L’objectif est d’assurer une maintenance cohérente de l’arborescence, une traçabilité complète et une exécution fiable des bonnes pratiques.
|
||||
Les règles détaillées de réalisation et de contrôle sont précisées dans `.cursor/rules/`.
|
||||
|
||||
---
|
||||
|
||||
## Agents fondamentaux
|
||||
|
||||
### Agent Fondation
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Garantir que toute production est en français.
|
||||
- Vérifier l’absence d’exemples de code applicatif dans la base de code.
|
||||
- Imposer l’introduction et/ou conclusion dans chaque contenu.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- Tous fichiers.
|
||||
|
||||
---
|
||||
|
||||
### Agent Structure
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir l’arborescence canonique du projet.
|
||||
- Déplacer les documents obsolètes vers `archive/`.
|
||||
- Bloquer toute suppression non documentée.
|
||||
|
||||
**Artefacts :**
|
||||
|
||||
- `archive/`, `docs/`, `tests/`, `.gitea/`, `CHANGELOG.md`.
|
||||
|
||||
---
|
||||
|
||||
## Agents spécialisés documentation
|
||||
|
||||
### Agent Documentation
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Mettre à jour les fichiers de `docs/` selon l’impact des changements.
|
||||
- Maintenir `INDEX.md` comme table des matières centrale.
|
||||
- Produire des REX techniques dans `archive/`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Données CSV
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Considérer les CSV comme source de vérité des modèles de données.
|
||||
- Confirmer la structure et exiger une définition des colonnes.
|
||||
- Corriger automatiquement les incohérences de type documentées.
|
||||
|
||||
---
|
||||
|
||||
### Agent Documents bureautiques
|
||||
|
||||
**Rôle (Consulté)** :
|
||||
|
||||
- Lire les `.docx` via `docx2txt`.
|
||||
- Proposer des alternatives en cas d’échec.
|
||||
- Documenter les imports dans `INDEX.md`.
|
||||
|
||||
---
|
||||
|
||||
## Agents spécialisés tests
|
||||
|
||||
### Agent Tests
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir la couverture : `unit`, `integration`, `connectivity`, `performance`, `external`.
|
||||
- Gérer `tests/logs` et `tests/reports`.
|
||||
- Exiger des tests verts avant commit.
|
||||
|
||||
---
|
||||
|
||||
### Agent Performance
|
||||
|
||||
**Rôle (Consulté)** :
|
||||
|
||||
- Conduire des benchmarks reproductibles.
|
||||
- Vérifier l’impact performance avant toute fusion.
|
||||
|
||||
---
|
||||
|
||||
## Agents techniques
|
||||
|
||||
### Agent Dépendances
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Ajouter automatiquement les dépendances manquantes.
|
||||
- Vérifier les dernières versions stables.
|
||||
- Documenter les changements dans `ARCHITECTURE.md`, `CONFIGURATION.md` et `CHANGELOG.md`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Compilation
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Compiler très régulièrement et à chaque étape critique.
|
||||
- Bloquer toute progression en présence d’erreurs.
|
||||
|
||||
---
|
||||
|
||||
### Agent Résolution
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Exécuter systématiquement la boucle de diagnostic (reproduction, logs, bissection, hypothèses, correctif, non-régression).
|
||||
- Produire un REX en cas d’hypothèses multiples.
|
||||
|
||||
---
|
||||
|
||||
## Agents frontend
|
||||
|
||||
### Agent Frontend
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Implémenter le code splitting (`React.lazy`, `Suspense`).
|
||||
- Centraliser l’état via Redux ou Context API.
|
||||
- Créer une couche d’abstraction pour les services de données.
|
||||
|
||||
---
|
||||
|
||||
## Agents open source et CI
|
||||
|
||||
### Agent Open Source
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir à jour : `LICENSE`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `OPEN_SOURCE_CHECKLIST.md`.
|
||||
- Vérifier l’alignement continu avec `4NK_node`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Gitea
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Vérifier la présence et l’actualité de `.gitea/ISSUE_TEMPLATE/*`, `PULL_REQUEST_TEMPLATE.md`, `.gitea/workflows/ci.yml`.
|
||||
- Documenter la configuration dans `docs/GITEA_SETUP.md`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Versionnage
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Maintenir `CHANGELOG.md` comme source unique de vérité.
|
||||
- Proposer un bump semver justifié.
|
||||
- Demander confirmation avant push et tag.
|
||||
|
||||
---
|
||||
|
||||
## Agents complémentaires
|
||||
|
||||
### Agent Coordination
|
||||
|
||||
**Rôle (Accountable)** :
|
||||
|
||||
- Vérifier que tous les agents concernés ont bien agi lors d’un changement complexe.
|
||||
- Consolider les validations avant merge.
|
||||
|
||||
---
|
||||
|
||||
### Agent Qualité / Linting
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Appliquer les règles de style, lint et sécurité statique.
|
||||
- Surveiller la dette technique et l’accessibilité.
|
||||
|
||||
---
|
||||
|
||||
### Agent Release Manager
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Superviser le passage d’une version à l’autre.
|
||||
- Vérifier la cohérence entre `CHANGELOG.md`, `ROADMAP.md` et les tags Git.
|
||||
- Déclencher les workflows CI/CD de release.
|
||||
|
||||
---
|
||||
|
||||
### Agent Sécurité proactive
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- Surveiller les dépendances vulnérables (CVE, advisories).
|
||||
- Mettre à jour `SECURITY_AUDIT.md` et notifier l’agent Dépendances.
|
||||
|
||||
---
|
||||
|
||||
### Agent Contributeurs externes
|
||||
|
||||
**Rôle (Consulté)** :
|
||||
|
||||
- Encadrer la réception de PRs et issues communautaires.
|
||||
- Veiller au respect de `CODE_OF_CONDUCT.md`.
|
||||
|
||||
---
|
||||
|
||||
### Agent Documentation communautaire
|
||||
|
||||
**Rôle (Responsable)** :
|
||||
|
||||
- S’assurer que `COMMUNITY_GUIDE.md` et `OPEN_SOURCE_CHECKLIST.md` sont accessibles, clairs et alignés avec l’expérience contributeurs.
|
||||
|
||||
---
|
||||
|
||||
## Matrice de coordination
|
||||
|
||||
| Type de changement | Agents impliqués | Artefacts principaux | Validation obligatoire |
|
||||
|--------------------------------|----------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------|------------------------|
|
||||
| Ajout de fonctionnalité | Documentation, Tests, Dépendances, Frontend | API.md, USAGE.md, ARCHITECTURE.md, tests/unit, tests/integration, CHANGELOG.md (*Added*), README.md | Oui |
|
||||
| Correction de bug | Résolution, Tests, Documentation | tests/unit, TESTING.md, archive/, CHANGELOG.md (*Fixed*) | Oui |
|
||||
| Refactorisation / amélioration | Structure, Documentation, Compilation | ARCHITECTURE.md, archive/, CHANGELOG.md (*Changed*) | Oui |
|
||||
| Dépendance ajoutée/mise à jour | Dépendances, Compilation, Documentation | ARCHITECTURE.md, CONFIGURATION.md, CHANGELOG.md (*Dependencies*) | Oui |
|
||||
| Données CSV modifiées | Données CSV, Documentation, Tests | API.md, ARCHITECTURE.md, USAGE.md, tests/unit, CHANGELOG.md (*Data model update*) | Oui |
|
||||
| Migration / breaking change | Documentation, Tests, Résolution, Versionnage | MIGRATION.md, INSTALLATION.md, RELEASE_PLAN.md, ROADMAP.md, tests/integration, CHANGELOG.md (*Breaking*)| Oui |
|
||||
| Sécurité / audit | Documentation, Tests, Open Source, Sécurité proactive | SECURITY_AUDIT.md, tests/external, tests/connectivity, CHANGELOG.md (*Security*) | Oui |
|
||||
| Préparation open source / CI | Open Source, Gitea, Versionnage, Documentation communautaire, Contributeurs externes | .gitea/**, GITEA_SETUP.md, OPEN_SOURCE_CHECKLIST.md, CHANGELOG.md (*CI/CD* / *Governance*) | Oui |
|
||||
| Optimisation performance | Performance, Tests, Documentation | tests/performance, tests/reports, ARCHITECTURE.md, CHANGELOG.md (*Performance*) | Oui |
|
||||
| Évolution frontend | Frontend, Documentation, Tests | ARCHITECTURE.md, USAGE.md, tests/integration, CHANGELOG.md (*Frontend*) | Oui |
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
Le présent `AGENTS.md` formalise non seulement les rôles et responsabilités, mais également la coordination opérationnelle entre agents pour chaque type de changement.
|
||||
Grâce à la table des matières, aux agents complémentaires et à la matrice structurée, ce fichier constitue une référence vivante garantissant la cohérence entre code, documentation, tests, dépendances, CI/CD et gouvernance open source.
|
53
Dockerfile.4nk-node
Normal file
53
Dockerfile.4nk-node
Normal file
@ -0,0 +1,53 @@
|
||||
# Dockerfile optimisé pour l'intégration dans 4NK_node
|
||||
FROM node:20-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Installation des dépendances système
|
||||
RUN apk update && apk add --no-cache \
|
||||
git \
|
||||
build-base \
|
||||
python3 \
|
||||
make \
|
||||
g++
|
||||
|
||||
# Copie des fichiers de dépendances
|
||||
COPY package*.json ./
|
||||
|
||||
# Installation des dépendances
|
||||
RUN npm ci --only=production
|
||||
|
||||
# Copie du code source
|
||||
COPY . .
|
||||
|
||||
# Build de l'application
|
||||
RUN npm run build
|
||||
|
||||
# Image de production
|
||||
FROM nginx:alpine
|
||||
|
||||
# Installation de Node.js pour les scripts de démarrage
|
||||
RUN apk update && apk add --no-cache nodejs npm
|
||||
|
||||
# Copie des fichiers buildés
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
COPY --from=builder /app/package*.json /app/
|
||||
|
||||
# Copie de la configuration nginx optimisée pour 4NK_node
|
||||
COPY nginx.4nk-node.conf /etc/nginx/conf.d/default.conf
|
||||
|
||||
# Script de démarrage
|
||||
COPY start-4nk-node.sh /start-4nk-node.sh
|
||||
RUN chmod +x /start-4nk-node.sh
|
||||
|
||||
# Exposition des ports
|
||||
EXPOSE 80 3003
|
||||
|
||||
# Variables d'environnement pour 4NK_node
|
||||
ENV SDK_RELAY_WS_URL=ws://sdk_relay_1:8090
|
||||
ENV SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091
|
||||
ENV BITCOIN_RPC_URL=http://bitcoin:18443
|
||||
ENV BLINDBIT_URL=http://blindbit:8000
|
||||
|
||||
# Point d'entrée
|
||||
CMD ["/start-4nk-node.sh"]
|
305
INTEGRATION_4NK_NODE.md
Normal file
305
INTEGRATION_4NK_NODE.md
Normal file
@ -0,0 +1,305 @@
|
||||
# Intégration de l'Interface Utilisateur dans 4NK_node
|
||||
|
||||
Ce document décrit le processus d'intégration de l'interface utilisateur `ihm_client` dans l'infrastructure `4NK_node`.
|
||||
|
||||
## 🎯 Objectif
|
||||
|
||||
Intégrer l'interface utilisateur web dans le conteneur `4NK_node` pour fournir une interface graphique complète pour :
|
||||
- Gestion des paiements silencieux
|
||||
- Interaction avec les relais sdk_relay
|
||||
- Monitoring de l'infrastructure Bitcoin
|
||||
- Interface utilisateur pour les fonctionnalités 4NK
|
||||
|
||||
## 📁 Fichiers d'Intégration
|
||||
|
||||
### Nouveaux Fichiers Créés
|
||||
|
||||
- `Dockerfile.4nk-node` - Dockerfile optimisé pour l'intégration
|
||||
- `nginx.4nk-node.conf` - Configuration nginx adaptée à 4NK_node
|
||||
- `start-4nk-node.sh` - Script de démarrage avec vérification des services
|
||||
- `docker-compose.4nk-node.yml` - Configuration Docker Compose
|
||||
- `INTEGRATION_4NK_NODE.md` - Cette documentation
|
||||
|
||||
## 🏗️ Architecture d'Intégration
|
||||
|
||||
```
|
||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ ihm_client │ │ sdk_relay_1 │ │ sdk_relay_2 │
|
||||
│ (Port 8080) │◄──►│ (Port 8090) │◄──►│ (Port 8091) │
|
||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
│ │ │
|
||||
│ ▼ ▼
|
||||
│ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ │ sdk_relay_3 │ │ Bitcoin │
|
||||
│ │ (Port 8092) │ │ (Port 18443) │
|
||||
│ └─────────────────┘ └─────────────────┘
|
||||
│ │ │
|
||||
│ ▼ ▼
|
||||
│ ┌─────────────────┐ ┌─────────────────┐
|
||||
└─────────────►│ Blindbit │ │ Tor │
|
||||
│ (Port 8000) │ │ (Port 9050) │
|
||||
└─────────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
## 🚀 Démarrage Rapide
|
||||
|
||||
### 1. Prérequis
|
||||
|
||||
- Docker et Docker Compose installés
|
||||
- Réseau `btcnet` créé (via 4NK_node)
|
||||
- Services 4NK_node en cours d'exécution
|
||||
|
||||
### 2. Intégration dans 4NK_node
|
||||
|
||||
```bash
|
||||
# Depuis le répertoire 4NK_node
|
||||
cd 4NK_node
|
||||
|
||||
# Ajouter le service ihm_client au docker-compose.yml
|
||||
# Copier les fichiers d'intégration depuis ihm_client
|
||||
cp ../ihm_client/Dockerfile.4nk-node ./ihm_client/
|
||||
cp ../ihm_client/nginx.4nk-node.conf ./ihm_client/
|
||||
cp ../ihm_client/start-4nk-node.sh ./ihm_client/
|
||||
|
||||
# Ajouter le service au docker-compose.yml principal
|
||||
```
|
||||
|
||||
### 3. Configuration du docker-compose.yml principal
|
||||
|
||||
Ajouter le service suivant au `docker-compose.yml` de 4NK_node :
|
||||
|
||||
```yaml
|
||||
ihm_client:
|
||||
build:
|
||||
context: ./ihm_client
|
||||
dockerfile: Dockerfile.4nk-node
|
||||
container_name: 4nk-ihm-client
|
||||
ports:
|
||||
- "8080:80"
|
||||
environment:
|
||||
- SDK_RELAY_WS_URL=ws://sdk_relay_1:8090
|
||||
- SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091
|
||||
- BITCOIN_RPC_URL=http://bitcoin:18443
|
||||
- BLINDBIT_URL=http://blindbit:8000
|
||||
volumes:
|
||||
- ihm_client_logs:/var/log/nginx
|
||||
networks:
|
||||
- btcnet
|
||||
depends_on:
|
||||
- sdk_relay_1
|
||||
- sdk_relay_2
|
||||
- sdk_relay_3
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
### 4. Démarrage
|
||||
|
||||
```bash
|
||||
# Redémarrer l'infrastructure complète
|
||||
./restart_4nk_node.sh
|
||||
|
||||
# Ou démarrer uniquement l'interface
|
||||
docker-compose up -d ihm_client
|
||||
```
|
||||
|
||||
## 🔧 Configuration
|
||||
|
||||
### Variables d'Environnement
|
||||
|
||||
| Variable | Défaut | Description |
|
||||
|----------|--------|-------------|
|
||||
| `SDK_RELAY_WS_URL` | `ws://sdk_relay_1:8090` | URL WebSocket du relais principal |
|
||||
| `SDK_RELAY_HTTP_URL` | `http://sdk_relay_1:8091` | URL HTTP de l'API du relais |
|
||||
| `BITCOIN_RPC_URL` | `http://bitcoin:18443` | URL RPC de Bitcoin Core |
|
||||
| `BLINDBIT_URL` | `http://blindbit:8000` | URL du service Blindbit |
|
||||
|
||||
### Ports
|
||||
|
||||
| Port | Service | Description |
|
||||
|------|---------|-------------|
|
||||
| 8080 | HTTP | Interface utilisateur principale |
|
||||
| 3003 | Dev | Serveur de développement (optionnel) |
|
||||
|
||||
### Volumes
|
||||
|
||||
| Volume | Description |
|
||||
|--------|-------------|
|
||||
| `ihm_client_logs` | Logs nginx |
|
||||
| `ihm_client_data` | Données persistantes |
|
||||
|
||||
## 🔌 Connectivité
|
||||
|
||||
### Services Intégrés
|
||||
|
||||
1. **sdk_relay WebSocket** (`/ws/`)
|
||||
- Communication temps réel
|
||||
- Synchronisation des données
|
||||
- Notifications
|
||||
|
||||
2. **sdk_relay HTTP API** (`/api/`)
|
||||
- Endpoints REST
|
||||
- Gestion des paiements
|
||||
- Configuration
|
||||
|
||||
3. **Bitcoin Core RPC** (`/bitcoin/`)
|
||||
- Accès aux données blockchain
|
||||
- Gestion des transactions
|
||||
- Monitoring
|
||||
|
||||
4. **Blindbit** (`/blindbit/`)
|
||||
- Filtres de paiements silencieux
|
||||
- Services de validation
|
||||
|
||||
## 🧪 Tests d'Intégration
|
||||
|
||||
### Test de Connectivité
|
||||
|
||||
```bash
|
||||
# Test de l'interface principale
|
||||
curl -f http://localhost:8080
|
||||
|
||||
# Test de l'API sdk_relay
|
||||
curl -f http://localhost:8080/api/health
|
||||
|
||||
# Test WebSocket
|
||||
wscat -c ws://localhost:8080/ws/
|
||||
```
|
||||
|
||||
### Test de Fonctionnalités
|
||||
|
||||
```bash
|
||||
# Vérifier les logs
|
||||
docker logs 4nk-ihm-client
|
||||
|
||||
# Tester la santé du conteneur
|
||||
docker exec 4nk-ihm-client wget -q -O- http://localhost
|
||||
|
||||
# Vérifier la configuration
|
||||
docker exec 4nk-ihm-client cat /usr/share/nginx/html/config.js
|
||||
```
|
||||
|
||||
## 🔍 Monitoring
|
||||
|
||||
### Logs
|
||||
|
||||
```bash
|
||||
# Logs en temps réel
|
||||
docker logs -f 4nk-ihm-client
|
||||
|
||||
# Logs nginx
|
||||
docker exec 4nk-ihm-client tail -f /var/log/nginx/ihm_client_access.log
|
||||
docker exec 4nk-ihm-client tail -f /var/log/nginx/ihm_client_error.log
|
||||
```
|
||||
|
||||
### Métriques
|
||||
|
||||
- **Disponibilité** : Healthcheck automatique
|
||||
- **Performance** : Logs nginx avec métriques
|
||||
- **Erreurs** : Logs d'erreur centralisés
|
||||
|
||||
## 🛠️ Développement
|
||||
|
||||
### Mode Développement
|
||||
|
||||
```bash
|
||||
# Démarrer en mode développement
|
||||
docker-compose -f docker-compose.4nk-node.yml up -d
|
||||
|
||||
# Rebuild après modifications
|
||||
docker-compose -f docker-compose.4nk-node.yml build --no-cache ihm_client
|
||||
```
|
||||
|
||||
### Debugging
|
||||
|
||||
```bash
|
||||
# Accès au conteneur
|
||||
docker exec -it 4nk-ihm-client sh
|
||||
|
||||
# Vérifier la configuration nginx
|
||||
docker exec 4nk-ihm-client nginx -t
|
||||
|
||||
# Tester les services
|
||||
docker exec 4nk-ihm-client wget -q -O- http://sdk_relay_1:8091/health
|
||||
```
|
||||
|
||||
## 🔒 Sécurité
|
||||
|
||||
### Headers de Sécurité
|
||||
|
||||
- `X-Frame-Options: SAMEORIGIN`
|
||||
- `X-Content-Type-Options: nosniff`
|
||||
- `X-XSS-Protection: 1; mode=block`
|
||||
- `Referrer-Policy: strict-origin-when-cross-origin`
|
||||
|
||||
### Authentification
|
||||
|
||||
- Bitcoin RPC : Authentification basique
|
||||
- API sdk_relay : CORS configuré
|
||||
- WebSocket : Validation des connexions
|
||||
|
||||
## 📊 Performance
|
||||
|
||||
### Optimisations
|
||||
|
||||
- **Cache statique** : Assets avec expiration 1 an
|
||||
- **Compression** : Nginx gzip activé
|
||||
- **Proxy** : Connexions persistantes
|
||||
- **Healthcheck** : Monitoring automatique
|
||||
|
||||
### Ressources
|
||||
|
||||
- **CPU** : 0.5-1 core
|
||||
- **RAM** : 256-512 MB
|
||||
- **Stockage** : 100-200 MB
|
||||
|
||||
## 🚨 Dépannage
|
||||
|
||||
### Problèmes Courants
|
||||
|
||||
1. **Service non accessible**
|
||||
```bash
|
||||
# Vérifier les logs de démarrage
|
||||
docker logs 4nk-ihm-client
|
||||
|
||||
# Vérifier la connectivité réseau
|
||||
docker exec 4nk-ihm-client ping sdk_relay_1
|
||||
```
|
||||
|
||||
2. **Erreurs nginx**
|
||||
```bash
|
||||
# Vérifier la configuration
|
||||
docker exec 4nk-ihm-client nginx -t
|
||||
|
||||
# Redémarrer nginx
|
||||
docker exec 4nk-ihm-client nginx -s reload
|
||||
```
|
||||
|
||||
3. **Problèmes de build**
|
||||
```bash
|
||||
# Nettoyer et rebuilder
|
||||
docker-compose down
|
||||
docker system prune -f
|
||||
docker-compose build --no-cache ihm_client
|
||||
```
|
||||
|
||||
## 📈 Évolution
|
||||
|
||||
### Prochaines Étapes
|
||||
|
||||
1. **Intégration complète** dans 4NK_node
|
||||
2. **Tests automatisés** d'intégration
|
||||
3. **Monitoring avancé** avec métriques
|
||||
4. **Interface d'administration** pour 4NK_node
|
||||
5. **Documentation utilisateur** complète
|
||||
|
||||
### Améliorations Futures
|
||||
|
||||
- **Interface d'administration** pour gérer l'infrastructure
|
||||
- **Dashboard de monitoring** en temps réel
|
||||
- **Gestion des utilisateurs** et permissions
|
||||
- **API REST** pour l'automatisation
|
||||
- **Interface mobile** responsive
|
||||
|
||||
---
|
||||
|
||||
**Note** : Cette intégration est conçue pour être transparente et non intrusive dans l'infrastructure 4NK_node existante.
|
43
docker-compose.4nk-node.yml
Normal file
43
docker-compose.4nk-node.yml
Normal file
@ -0,0 +1,43 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
ihm_client:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.4nk-node
|
||||
container_name: 4nk-ihm-client
|
||||
ports:
|
||||
- "8080:80"
|
||||
- "3003:3003"
|
||||
environment:
|
||||
- SDK_RELAY_WS_URL=ws://sdk_relay_1:8090
|
||||
- SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091
|
||||
- BITCOIN_RPC_URL=http://bitcoin:18443
|
||||
- BLINDBIT_URL=http://blindbit:8000
|
||||
- NODE_ENV=production
|
||||
volumes:
|
||||
- ihm_client_logs:/var/log/nginx
|
||||
- ihm_client_data:/usr/share/nginx/html/data
|
||||
networks:
|
||||
- btcnet
|
||||
depends_on:
|
||||
- sdk_relay_1
|
||||
- sdk_relay_2
|
||||
- sdk_relay_3
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--quiet", "--tries=1", "--timeout=5", "--spider", "http://localhost"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
volumes:
|
||||
ihm_client_logs:
|
||||
driver: local
|
||||
ihm_client_data:
|
||||
driver: local
|
||||
|
||||
networks:
|
||||
btcnet:
|
||||
external: true
|
96
nginx.4nk-node.conf
Normal file
96
nginx.4nk-node.conf
Normal file
@ -0,0 +1,96 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
# Gestion des fichiers statiques
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
|
||||
# Headers de sécurité
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||
}
|
||||
|
||||
# Proxy vers sdk_relay WebSocket
|
||||
location /ws/ {
|
||||
proxy_pass http://sdk_relay_1:8090;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 86400;
|
||||
proxy_send_timeout 86400;
|
||||
}
|
||||
|
||||
# Proxy vers sdk_relay HTTP API
|
||||
location /api/ {
|
||||
proxy_pass http://sdk_relay_1:8091/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# CORS headers
|
||||
add_header Access-Control-Allow-Origin "*" always;
|
||||
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;
|
||||
add_header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,X-Requested-With" always;
|
||||
|
||||
# Gestion des requêtes OPTIONS
|
||||
if ($request_method = 'OPTIONS') {
|
||||
add_header Access-Control-Allow-Origin "*";
|
||||
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE";
|
||||
add_header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,X-Requested-With";
|
||||
add_header Content-Length 0;
|
||||
add_header Content-Type text/plain;
|
||||
return 204;
|
||||
}
|
||||
}
|
||||
|
||||
# Proxy vers Bitcoin Core RPC (si nécessaire)
|
||||
location /bitcoin/ {
|
||||
proxy_pass http://bitcoin:18443/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# Authentification basique pour Bitcoin RPC
|
||||
auth_basic "Bitcoin RPC";
|
||||
auth_basic_user_file /etc/nginx/.htpasswd;
|
||||
}
|
||||
|
||||
# Proxy vers Blindbit (si nécessaire)
|
||||
location /blindbit/ {
|
||||
proxy_pass http://blindbit:8000/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Cache pour les assets statiques
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
try_files $uri =404;
|
||||
}
|
||||
|
||||
# Gestion des erreurs
|
||||
error_page 404 /index.html;
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
||||
}
|
||||
|
||||
# Logs
|
||||
access_log /var/log/nginx/ihm_client_access.log;
|
||||
error_log /var/log/nginx/ihm_client_error.log;
|
||||
}
|
348
scripts/integrate-4nk-node.sh
Executable file
348
scripts/integrate-4nk-node.sh
Executable file
@ -0,0 +1,348 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||||
TARGET_DIR="${PROJECT_ROOT}/../4NK_node"
|
||||
|
||||
# Couleurs pour l'affichage
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Fonction d'affichage
|
||||
print_info() {
|
||||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}✅ $1${NC}"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}❌ $1${NC}"
|
||||
}
|
||||
|
||||
# Fonction d'aide
|
||||
show_help() {
|
||||
echo "Usage: $0 [options]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " --target-dir DIR Répertoire cible 4NK_node (défaut: ../4NK_node)"
|
||||
echo " --dry-run Simulation sans modification"
|
||||
echo " --backup Créer une sauvegarde avant intégration"
|
||||
echo " --help Afficher cette aide"
|
||||
echo ""
|
||||
echo "Exemples:"
|
||||
echo " $0 # Intégration standard"
|
||||
echo " $0 --dry-run # Simulation"
|
||||
echo " $0 --target-dir /path/to/4NK_node"
|
||||
}
|
||||
|
||||
# Variables
|
||||
DRY_RUN=false
|
||||
BACKUP=false
|
||||
TARGET_DIR="${PROJECT_ROOT}/../4NK_node"
|
||||
|
||||
# Parsing des arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--target-dir)
|
||||
TARGET_DIR="$2"
|
||||
shift 2
|
||||
;;
|
||||
--dry-run)
|
||||
DRY_RUN=true
|
||||
shift
|
||||
;;
|
||||
--backup)
|
||||
BACKUP=true
|
||||
shift
|
||||
;;
|
||||
--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_error "Option inconnue: $1"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Vérification des prérequis
|
||||
check_prerequisites() {
|
||||
print_info "Vérification des prérequis..."
|
||||
|
||||
# Vérifier que nous sommes dans le bon répertoire
|
||||
if [[ ! -f "${PROJECT_ROOT}/package.json" ]]; then
|
||||
print_error "Ce script doit être exécuté depuis le répertoire ihm_client"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier que le répertoire cible existe
|
||||
if [[ ! -d "$TARGET_DIR" ]]; then
|
||||
print_error "Répertoire cible 4NK_node non trouvé: $TARGET_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier que les fichiers d'intégration existent
|
||||
local required_files=(
|
||||
"Dockerfile.4nk-node"
|
||||
"nginx.4nk-node.conf"
|
||||
"start-4nk-node.sh"
|
||||
"docker-compose.4nk-node.yml"
|
||||
)
|
||||
|
||||
for file in "${required_files[@]}"; do
|
||||
if [[ ! -f "${PROJECT_ROOT}/$file" ]]; then
|
||||
print_error "Fichier requis manquant: $file"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
print_success "Prérequis vérifiés"
|
||||
}
|
||||
|
||||
# Création de la sauvegarde
|
||||
create_backup() {
|
||||
if [[ "$BACKUP" == "true" ]]; then
|
||||
print_info "Création de la sauvegarde..."
|
||||
|
||||
local backup_dir="${TARGET_DIR}/backup_$(date +%Y%m%d_%H%M%S)"
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
mkdir -p "$backup_dir"
|
||||
cp -r "${TARGET_DIR}/docker-compose.yml" "$backup_dir/" 2>/dev/null || true
|
||||
cp -r "${TARGET_DIR}/ihm_client" "$backup_dir/" 2>/dev/null || true
|
||||
print_success "Sauvegarde créée: $backup_dir"
|
||||
else
|
||||
print_info "DRY RUN: Sauvegarde serait créée: $backup_dir"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Création du répertoire ihm_client dans 4NK_node
|
||||
create_ihm_client_directory() {
|
||||
print_info "Création du répertoire ihm_client dans 4NK_node..."
|
||||
|
||||
local ihm_client_dir="${TARGET_DIR}/ihm_client"
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
mkdir -p "$ihm_client_dir"
|
||||
print_success "Répertoire créé: $ihm_client_dir"
|
||||
else
|
||||
print_info "DRY RUN: Répertoire serait créé: $ihm_client_dir"
|
||||
fi
|
||||
}
|
||||
|
||||
# Copie des fichiers d'intégration
|
||||
copy_integration_files() {
|
||||
print_info "Copie des fichiers d'intégration..."
|
||||
|
||||
local files_to_copy=(
|
||||
"Dockerfile.4nk-node:Dockerfile"
|
||||
"nginx.4nk-node.conf:nginx.conf"
|
||||
"start-4nk-node.sh:start.sh"
|
||||
"package.json:package.json"
|
||||
"tsconfig.json:tsconfig.json"
|
||||
"vite.config.ts:vite.config.ts"
|
||||
"index.html:index.html"
|
||||
)
|
||||
|
||||
for file_mapping in "${files_to_copy[@]}"; do
|
||||
local source_file=$(echo "$file_mapping" | cut -d: -f1)
|
||||
local target_file=$(echo "$file_mapping" | cut -d: -f2)
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
cp "${PROJECT_ROOT}/$source_file" "${TARGET_DIR}/ihm_client/$target_file"
|
||||
print_success "Copié: $source_file -> ihm_client/$target_file"
|
||||
else
|
||||
print_info "DRY RUN: Copié: $source_file -> ihm_client/$target_file"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Copie du code source
|
||||
copy_source_code() {
|
||||
print_info "Copie du code source..."
|
||||
|
||||
local source_dirs=("src" "public")
|
||||
|
||||
for dir in "${source_dirs[@]}"; do
|
||||
if [[ -d "${PROJECT_ROOT}/$dir" ]]; then
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
cp -r "${PROJECT_ROOT}/$dir" "${TARGET_DIR}/ihm_client/"
|
||||
print_success "Copié: $dir/"
|
||||
else
|
||||
print_info "DRY RUN: Copié: $dir/"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Mise à jour du docker-compose.yml
|
||||
update_docker_compose() {
|
||||
print_info "Mise à jour du docker-compose.yml..."
|
||||
|
||||
local docker_compose_file="${TARGET_DIR}/docker-compose.yml"
|
||||
local ihm_client_service="
|
||||
ihm_client:
|
||||
build:
|
||||
context: ./ihm_client
|
||||
dockerfile: Dockerfile
|
||||
container_name: 4nk-ihm-client
|
||||
ports:
|
||||
- \"8080:80\"
|
||||
environment:
|
||||
- SDK_RELAY_WS_URL=ws://sdk_relay_1:8090
|
||||
- SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091
|
||||
- BITCOIN_RPC_URL=http://bitcoin:18443
|
||||
- BLINDBIT_URL=http://blindbit:8000
|
||||
volumes:
|
||||
- ihm_client_logs:/var/log/nginx
|
||||
networks:
|
||||
- btcnet
|
||||
depends_on:
|
||||
- sdk_relay_1
|
||||
- sdk_relay_2
|
||||
- sdk_relay_3
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: [\"CMD\", \"wget\", \"--quiet\", \"--tries=1\", \"--timeout=5\", \"--spider\", \"http://localhost\"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s"
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
# Vérifier si le service existe déjà
|
||||
if grep -q "ihm_client:" "$docker_compose_file" 2>/dev/null; then
|
||||
print_warning "Service ihm_client existe déjà dans docker-compose.yml"
|
||||
else
|
||||
# Ajouter le service avant la section volumes
|
||||
sed -i '/^volumes:/i\'"$ihm_client_service" "$docker_compose_file"
|
||||
|
||||
# Ajouter les volumes ihm_client
|
||||
sed -i '/^volumes:/a\ ihm_client_logs:\n driver: local' "$docker_compose_file"
|
||||
|
||||
print_success "Service ihm_client ajouté au docker-compose.yml"
|
||||
fi
|
||||
else
|
||||
print_info "DRY RUN: Service ihm_client serait ajouté au docker-compose.yml"
|
||||
fi
|
||||
}
|
||||
|
||||
# Création du script de démarrage
|
||||
create_startup_script() {
|
||||
print_info "Création du script de démarrage..."
|
||||
|
||||
local startup_script="${TARGET_DIR}/start-ihm-client.sh"
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
cat > "$startup_script" << 'EOF'
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Démarrage de l'interface utilisateur 4NK..."
|
||||
|
||||
# Vérifier que nous sommes dans le bon répertoire
|
||||
if [[ ! -f "docker-compose.yml" ]]; then
|
||||
echo "❌ Ce script doit être exécuté depuis le répertoire 4NK_node"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Démarrer uniquement le service ihm_client
|
||||
echo "📦 Démarrage du service ihm_client..."
|
||||
docker-compose up -d ihm_client
|
||||
|
||||
# Attendre que le service soit prêt
|
||||
echo "⏳ Attente du démarrage..."
|
||||
sleep 10
|
||||
|
||||
# Vérifier la santé du service
|
||||
if docker-compose ps ihm_client | grep -q "Up"; then
|
||||
echo "✅ Interface utilisateur démarrée avec succès"
|
||||
echo " 📍 URL: http://localhost:8080"
|
||||
echo " 🔍 Logs: docker logs 4nk-ihm-client"
|
||||
else
|
||||
echo "❌ Échec du démarrage de l'interface utilisateur"
|
||||
docker-compose logs ihm_client
|
||||
exit 1
|
||||
fi
|
||||
EOF
|
||||
|
||||
chmod +x "$startup_script"
|
||||
print_success "Script de démarrage créé: $startup_script"
|
||||
else
|
||||
print_info "DRY RUN: Script de démarrage serait créé: $startup_script"
|
||||
fi
|
||||
}
|
||||
|
||||
# Validation de l'intégration
|
||||
validate_integration() {
|
||||
print_info "Validation de l'intégration..."
|
||||
|
||||
local validation_files=(
|
||||
"${TARGET_DIR}/ihm_client/Dockerfile"
|
||||
"${TARGET_DIR}/ihm_client/nginx.conf"
|
||||
"${TARGET_DIR}/ihm_client/start.sh"
|
||||
"${TARGET_DIR}/docker-compose.yml"
|
||||
)
|
||||
|
||||
for file in "${validation_files[@]}"; do
|
||||
if [[ -f "$file" ]]; then
|
||||
print_success "Validé: $(basename "$file")"
|
||||
else
|
||||
print_error "Fichier manquant: $(basename "$file")"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
|
||||
print_success "Validation terminée"
|
||||
}
|
||||
|
||||
# Fonction principale
|
||||
main() {
|
||||
echo "🔧 Intégration de ihm_client dans 4NK_node"
|
||||
echo " Source: $PROJECT_ROOT"
|
||||
echo " Cible: $TARGET_DIR"
|
||||
echo " Mode: $([ "$DRY_RUN" == "true" ] && echo "DRY RUN" || echo "EXÉCUTION")"
|
||||
echo ""
|
||||
|
||||
check_prerequisites
|
||||
create_backup
|
||||
create_ihm_client_directory
|
||||
copy_integration_files
|
||||
copy_source_code
|
||||
update_docker_compose
|
||||
create_startup_script
|
||||
|
||||
if [[ "$DRY_RUN" == "false" ]]; then
|
||||
validate_integration
|
||||
echo ""
|
||||
print_success "Intégration terminée avec succès !"
|
||||
echo ""
|
||||
echo "📋 Prochaines étapes:"
|
||||
echo " 1. Aller dans le répertoire 4NK_node: cd $TARGET_DIR"
|
||||
echo " 2. Démarrer l'interface: ./start-ihm-client.sh"
|
||||
echo " 3. Ou redémarrer tout: ./restart_4nk_node.sh"
|
||||
echo " 4. Accéder à l'interface: http://localhost:8080"
|
||||
else
|
||||
echo ""
|
||||
print_success "Simulation terminée - Aucune modification effectuée"
|
||||
fi
|
||||
}
|
||||
|
||||
# Exécution
|
||||
main "$@"
|
124
start-4nk-node.sh
Normal file
124
start-4nk-node.sh
Normal file
@ -0,0 +1,124 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Démarrage de l'interface utilisateur 4NK..."
|
||||
|
||||
# Variables d'environnement avec valeurs par défaut
|
||||
SDK_RELAY_WS_URL=${SDK_RELAY_WS_URL:-"ws://sdk_relay_1:8090"}
|
||||
SDK_RELAY_HTTP_URL=${SDK_RELAY_HTTP_URL:-"http://sdk_relay_1:8091"}
|
||||
BITCOIN_RPC_URL=${BITCOIN_RPC_URL:-"http://bitcoin:18443"}
|
||||
BLINDBIT_URL=${BLINDBIT_URL:-"http://blindbit:8000"}
|
||||
|
||||
# Fonction pour attendre qu'un service soit disponible
|
||||
wait_for_service() {
|
||||
local service_name=$1
|
||||
local service_url=$2
|
||||
local max_attempts=30
|
||||
local attempt=1
|
||||
|
||||
echo "⏳ Attente du service $service_name ($service_url)..."
|
||||
|
||||
while [ $attempt -le $max_attempts ]; do
|
||||
if wget --quiet --tries=1 --timeout=5 --spider "$service_url" 2>/dev/null; then
|
||||
echo "✅ Service $service_name disponible"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo " Tentative $attempt/$max_attempts - Service $service_name non disponible"
|
||||
sleep 2
|
||||
attempt=$((attempt + 1))
|
||||
done
|
||||
|
||||
echo "❌ Service $service_name non disponible après $max_attempts tentatives"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Fonction pour vérifier la connectivité WebSocket
|
||||
check_websocket() {
|
||||
local service_name=$1
|
||||
local ws_url=$2
|
||||
local max_attempts=10
|
||||
local attempt=1
|
||||
|
||||
echo "🔌 Vérification WebSocket $service_name ($ws_url)..."
|
||||
|
||||
while [ $attempt -le $max_attempts ]; do
|
||||
if nc -z $(echo $ws_url | sed 's|ws://||' | sed 's|wss://||' | cut -d: -f1) $(echo $ws_url | cut -d: -f3) 2>/dev/null; then
|
||||
echo "✅ WebSocket $service_name accessible"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo " Tentative $attempt/$max_attempts - WebSocket $service_name non accessible"
|
||||
sleep 3
|
||||
attempt=$((attempt + 1))
|
||||
done
|
||||
|
||||
echo "⚠️ WebSocket $service_name non accessible (continuera sans)"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Vérification des services critiques
|
||||
echo "🔍 Vérification des services 4NK_node..."
|
||||
|
||||
# Attendre sdk_relay HTTP (critique)
|
||||
if ! wait_for_service "sdk_relay HTTP" "$SDK_RELAY_HTTP_URL/health"; then
|
||||
echo "❌ Service sdk_relay HTTP critique non disponible"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier sdk_relay WebSocket (optionnel)
|
||||
check_websocket "sdk_relay WebSocket" "$SDK_RELAY_WS_URL"
|
||||
|
||||
# Vérifier Bitcoin Core (optionnel)
|
||||
if ! wait_for_service "Bitcoin Core" "$BITCOIN_RPC_URL" 2>/dev/null; then
|
||||
echo "⚠️ Bitcoin Core non disponible (optionnel)"
|
||||
fi
|
||||
|
||||
# Vérifier Blindbit (optionnel)
|
||||
if ! wait_for_service "Blindbit" "$BLINDBIT_URL" 2>/dev/null; then
|
||||
echo "⚠️ Blindbit non disponible (optionnel)"
|
||||
fi
|
||||
|
||||
# Génération de la configuration dynamique
|
||||
echo "⚙️ Génération de la configuration dynamique..."
|
||||
|
||||
# Créer un fichier de configuration JavaScript pour l'application
|
||||
cat > /usr/share/nginx/html/config.js << EOF
|
||||
window.ENV_CONFIG = {
|
||||
SDK_RELAY_WS_URL: '$SDK_RELAY_WS_URL',
|
||||
SDK_RELAY_HTTP_URL: '$SDK_RELAY_HTTP_URL',
|
||||
BITCOIN_RPC_URL: '$BITCOIN_RPC_URL',
|
||||
BLINDBIT_URL: '$BLINDBIT_URL',
|
||||
ENVIRONMENT: '4nk-node'
|
||||
};
|
||||
EOF
|
||||
|
||||
# Démarrage de nginx
|
||||
echo "🌐 Démarrage de nginx..."
|
||||
nginx -g "daemon off;" &
|
||||
|
||||
# Attendre que nginx soit prêt
|
||||
sleep 2
|
||||
|
||||
# Vérifier que nginx fonctionne
|
||||
if ! wget --quiet --tries=1 --timeout=5 --spider http://localhost 2>/dev/null; then
|
||||
echo "❌ Nginx n'a pas démarré correctement"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Interface utilisateur 4NK démarrée avec succès"
|
||||
echo " 📍 URL: http://localhost"
|
||||
echo " 🔌 WebSocket: $SDK_RELAY_WS_URL"
|
||||
echo " 🌐 API: $SDK_RELAY_HTTP_URL"
|
||||
|
||||
# Maintenir le conteneur en vie
|
||||
while true; do
|
||||
sleep 30
|
||||
|
||||
# Vérification périodique de la santé
|
||||
if ! wget --quiet --tries=1 --timeout=5 --spider http://localhost 2>/dev/null; then
|
||||
echo "❌ Nginx ne répond plus, redémarrage..."
|
||||
nginx -s reload
|
||||
fi
|
||||
done
|
Loading…
x
Reference in New Issue
Block a user