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:
Nicolas Cantu 2025-08-25 16:43:38 +02:00
parent 484b5ea250
commit c563d7b16c
21 changed files with 1941 additions and 43 deletions

11
.cursor/.cursorignore Normal file
View 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.*

View File

@ -0,0 +1,59 @@
---
alwaysApply: true
---
# Fondations de rédaction et de comportement
[portée]
Sapplique à tout le dépôt 4NK/4NK_node pour toute génération, refactorisation, édition inline ou discussion dans Cursor.
[objectifs]
- Garantir lusage exclusif du français.
- Proscrire linjection dexemples 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 dexemples exécutables ou de quickstarts dans la base ; préférer des descriptions prescriptives.
- Tout contenu produit doit mentionner explicitement les artefacts à mettre à jour lorsquil impacte docs/ et tests/.
- Préserver la typographie française (capitaliser uniquement le premier mot dun titre et les noms propres).
[validations]
- Relecture linguistique et technique systématique.
- Refuser toute sortie avec exemples de code applicatif.
- Vérifier que lissue 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]
Sapplique à tout le dépôt 4NK/4NK_node pour toute génération, refactorisation, édition inline ou discussion dans Cursor.
[objectifs]
- Garantir lusage exclusif du français.
- Proscrire linjection dexemples 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 dexemples exécutables ou de quickstarts dans la base ; préférer des descriptions prescriptives.
- Tout contenu produit doit mentionner explicitement les artefacts à mettre à jour lorsquil impacte docs/ et tests/.
- Préserver la typographie française (capitaliser uniquement le premier mot dun titre et les noms propres).
[validations]
- Relecture linguistique et technique systématique.
- Refuser toute sortie avec exemples de code applicatif.
- Vérifier que lissue traitée se conclut par un rappel des fichiers à mettre à jour.
[artefacts concernés]
- README.md, docs/**, tests/**, CHANGELOG.md, .gitea/**.

View File

@ -0,0 +1,139 @@
---
alwaysApply: true
---
# Structure projet 4NK_node
[portée]
Maintenance de larborescence canonique, création/mise à jour/suppression de fichiers et répertoires.
[objectifs]
- Garantir lalignement strict avec larborescence 4NK_node.
- Prévenir toute dérive structurelle.
[directives]
- Sassurer que larborescence 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 larborescence canonique, création/mise à jour/suppression de fichiers et répertoires.
[objectifs]
- Garantir lalignement strict avec larborescence 4NK_node.
- Prévenir toute dérive structurelle.
[directives]
- Sassurer que larborescence 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.

View 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 dacceptation).
- 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 dhypothèses multiples avant résolution dans archive/.
[validations]
- Cohérence croisée entre README.md et INDEX.md.
- Refus si une modification de code na 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 dacceptation).
- 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 dhypothèses multiples avant résolution dans archive/.
[validations]
- Cohérence croisée entre README.md et INDEX.md.
- Refus si une modification de code na pas de trace dans docs/** correspondants.
[artefacts concernés]
- docs/**, README.md, archive/**.

View 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 limpact.
- 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 nest pas appliquée.
[validations]
- Refus dun 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 limpact.
- 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 nest pas appliquée.
[validations]
- Refus dun 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.

View 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]
- Lorsquune fonctionnalité nécessite une dépendance, lajouter 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 dune 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]
- Lorsquune fonctionnalité nécessite une dépendance, lajouter 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 dune 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.

View 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 den-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 den-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.

View 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 dune 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 dune 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/**.

View 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 dabstraction à interface stable.
- Interdire lajout dexemples front dans la base de code.
[validations]
- Vérifier que les points dentrée sont minimes et que les segments non critiques sont chargés à la demande.
- Sassurer que docs/ARCHITECTURE.md décrit les décisions et les points dextension.
[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 dabstraction à interface stable.
- Interdire lajout dexemples front dans la base de code.
[validations]
- Vérifier que les points dentrée sont minimes et que les segments non critiques sont chargés à la demande.
- Sassurer que docs/ARCHITECTURE.md décrit les décisions et les points dextension.
[artefacts concernés]
- docs/ARCHITECTURE.md, docs/TESTING.md.

View 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 limpact.
- 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 limpact.
- 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.

View 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 lactualité 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 lactualité 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.

View 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 lavancement tant que les erreurs ne sont pas corrigées.
[directives]
- Étapes obligatoires : reproduction minimale, inspection des logs, bissection des changements, formulation dhypothè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 dAPI, 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 lavancement tant que les erreurs ne sont pas corrigées.
[directives]
- Étapes obligatoires : reproduction minimale, inspection des logs, bissection des changements, formulation dhypothè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 dAPI, 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.

View File

@ -0,0 +1,15 @@
# Index des règles .cursor/rules
- 00-foundations.mdc : règles linguistiques et éditoriales (français, pas dexemples 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 linterface (@Cursor Rules) et sappuient sur le mécanisme de règles projet stockées dans `.cursor/rules/`. :contentReference[oaicite:3]{index=3}

View File

@ -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
View 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).
Lobjectif est dassurer une maintenance cohérente de larborescence, 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 labsence dexemples de code applicatif dans la base de code.
- Imposer lintroduction et/ou conclusion dans chaque contenu.
**Artefacts :**
- Tous fichiers.
---
### Agent Structure
**Rôle (Responsable)** :
- Maintenir larborescence 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 limpact 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 limpact 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 derreurs.
---
### 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 dhypothè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 dabstraction 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 lalignement continu avec `4NK_node`.
---
### Agent Gitea
**Rôle (Responsable)** :
- Vérifier la présence et lactualité 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 dun 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 laccessibilité.
---
### Agent Release Manager
**Rôle (Responsable)** :
- Superviser le passage dune version à lautre.
- 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 lagent 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)** :
- Sassurer que `COMMUNITY_GUIDE.md` et `OPEN_SOURCE_CHECKLIST.md` sont accessibles, clairs et alignés avec lexpé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
View 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
View 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.

View 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
View 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
View 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
View 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