diff --git a/.cursor/.cursorignore b/.cursor/.cursorignore new file mode 100644 index 0000000..6d5821d --- /dev/null +++ b/.cursor/.cursorignore @@ -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.* \ No newline at end of file diff --git a/.cursor/rules/00-foundations.mdc b/.cursor/rules/00-foundations.mdc new file mode 100644 index 0000000..aec1066 --- /dev/null +++ b/.cursor/rules/00-foundations.mdc @@ -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/**. diff --git a/.cursor/rules/10-project-structure.mdc b/.cursor/rules/10-project-structure.mdc new file mode 100644 index 0000000..6486651 --- /dev/null +++ b/.cursor/rules/10-project-structure.mdc @@ -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. diff --git a/.cursor/rules/20-documentation.mdc b/.cursor/rules/20-documentation.mdc new file mode 100644 index 0000000..4070c4a --- /dev/null +++ b/.cursor/rules/20-documentation.mdc @@ -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/**. diff --git a/.cursor/rules/30-testing.mdc b/.cursor/rules/30-testing.mdc new file mode 100644 index 0000000..7178c27 --- /dev/null +++ b/.cursor/rules/30-testing.mdc @@ -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. diff --git a/.cursor/rules/40-dependencies-and-build.mdc b/.cursor/rules/40-dependencies-and-build.mdc new file mode 100644 index 0000000..c1ece2d --- /dev/null +++ b/.cursor/rules/40-dependencies-and-build.mdc @@ -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. diff --git a/.cursor/rules/50-data-csv-models.mdc b/.cursor/rules/50-data-csv-models.mdc new file mode 100644 index 0000000..c686e3d --- /dev/null +++ b/.cursor/rules/50-data-csv-models.mdc @@ -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. diff --git a/.cursor/rules/60-office-docs.mdc b/.cursor/rules/60-office-docs.mdc new file mode 100644 index 0000000..7f57891 --- /dev/null +++ b/.cursor/rules/60-office-docs.mdc @@ -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/**. diff --git a/.cursor/rules/70-frontend-architecture.mdc b/.cursor/rules/70-frontend-architecture.mdc new file mode 100644 index 0000000..65d9c40 --- /dev/null +++ b/.cursor/rules/70-frontend-architecture.mdc @@ -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. diff --git a/.cursor/rules/80-versioning-and-release.mdc b/.cursor/rules/80-versioning-and-release.mdc new file mode 100644 index 0000000..24d213a --- /dev/null +++ b/.cursor/rules/80-versioning-and-release.mdc @@ -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. diff --git a/.cursor/rules/90-gitea-and-oss.mdc b/.cursor/rules/90-gitea-and-oss.mdc new file mode 100644 index 0000000..f9da399 --- /dev/null +++ b/.cursor/rules/90-gitea-and-oss.mdc @@ -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. diff --git a/.cursor/rules/95-triage-and-problem-solving.mdc b/.cursor/rules/95-triage-and-problem-solving.mdc new file mode 100644 index 0000000..4df091a --- /dev/null +++ b/.cursor/rules/95-triage-and-problem-solving.mdc @@ -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. diff --git a/.cursor/rules/ruleset-index.md b/.cursor/rules/ruleset-index.md new file mode 100644 index 0000000..b92847a --- /dev/null +++ b/.cursor/rules/ruleset-index.md @@ -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} diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml deleted file mode 100644 index 5ce3f43..0000000 --- a/.github/workflows/cicd.yml +++ /dev/null @@ -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 }} \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..f5f1e06 --- /dev/null +++ b/AGENTS.md @@ -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. diff --git a/Dockerfile.4nk-node b/Dockerfile.4nk-node new file mode 100644 index 0000000..e3e3740 --- /dev/null +++ b/Dockerfile.4nk-node @@ -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"] diff --git a/INTEGRATION_4NK_NODE.md b/INTEGRATION_4NK_NODE.md new file mode 100644 index 0000000..399943c --- /dev/null +++ b/INTEGRATION_4NK_NODE.md @@ -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. diff --git a/docker-compose.4nk-node.yml b/docker-compose.4nk-node.yml new file mode 100644 index 0000000..a35dd3b --- /dev/null +++ b/docker-compose.4nk-node.yml @@ -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 diff --git a/nginx.4nk-node.conf b/nginx.4nk-node.conf new file mode 100644 index 0000000..b0d2cee --- /dev/null +++ b/nginx.4nk-node.conf @@ -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; +} diff --git a/scripts/integrate-4nk-node.sh b/scripts/integrate-4nk-node.sh new file mode 100755 index 0000000..9917b09 --- /dev/null +++ b/scripts/integrate-4nk-node.sh @@ -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 "$@" diff --git a/start-4nk-node.sh b/start-4nk-node.sh new file mode 100644 index 0000000..93b6746 --- /dev/null +++ b/start-4nk-node.sh @@ -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