4NK_node/archive/docs/RESUME_DECOUVERTE_NOEUDS.md
Nicolas Cantu b935cbab20 Réorganisation complète : tests, documentation et nettoyage
- Réorganisation des tests par catégorie (unit, integration, connectivity, external)
- Création de scripts d'exécution automatisés pour les tests
- Création de guides techniques complets (ARCHITECTURE.md, API.md)
- Transfert des informations depuis specs/ vers docs/
- Nettoyage et archivage des fichiers obsolètes
- Documentation complète des tests avec exemples
- Scripts de maintenance et nettoyage automatique
- Structure professionnelle prête pour l'évolution
2025-08-25 14:13:26 +02:00

5.7 KiB
Raw Blame History

Résumé : Découverte des Nœuds et Ajout de Nœuds Externes

🔍 Comment les relais découvrent-ils initialement les autres nœuds ?

Mécanisme actuel (Découverte statique)

Les relais sdk_relay utilisent actuellement une découverte statique basée sur les noms de conteneurs Docker :

// Dans sync.rs - discover_relays()
let relay_hosts = vec![
    "sdk_relay_1",
    "sdk_relay_2",
    "sdk_relay_3",
];

Processus de découverte :

  1. Liste prédéfinie : Chaque relais a une liste codée en dur des autres relais
  2. Auto-exclusion : Il ignore son propre relay_id
  3. Connexion automatique : Il tente de se connecter à chaque relais de la liste
  4. Partage de liste : Une fois connectés, ils partagent leur liste via des messages RelaySync

Configuration par relay_id

Chaque relais a un identifiant unique :

# .conf.docker.relay1
relay_id=relay-1

# .conf.docker.relay2
relay_id=relay-2

# .conf.docker.relay3
relay_id=relay-3

🌐 Comment ajouter un nœud externe ?

Solution implémentée : Configuration externe

Nous avons créé un système de configuration externe qui permet d'ajouter des nœuds sans modifier le code :

1. Fichier de configuration external_nodes.conf

[relays]
external-relay-1 = "external-relay-1.example.com:8090"
external-relay-2 = "192.168.1.100:8090"

[discovery]
auto_discover = true
bootstrap_nodes = []

[security]
allowed_domains = [
    "*.4nk.net",
    "*.example.com",
    "localhost",
    "127.0.0.1"
]

2. Script d'administration add_external_node.sh

Commandes disponibles :

# Ajouter un nœud externe
./add_external_node.sh add external-relay-1 external-relay-1.example.com:8090

# Supprimer un nœud externe
./add_external_node.sh remove external-relay-1

# Lister tous les nœuds externes
./add_external_node.sh list

# Tester la connectivité
./add_external_node.sh test external-relay-1

# Valider une adresse
./add_external_node.sh validate 192.168.1.100:8090

3. Exemple d'utilisation

# Ajouter un nœud externe
./add_external_node.sh add external-relay-1 external-relay-1.example.com:8090

# Vérifier la liste
./add_external_node.sh list
# Output:
#   Nœuds externes configurés:
#   🔸 external-relay-1 -> external-relay-1.example.com:8090

# Redémarrer les relais pour appliquer
docker-compose restart sdk_relay_1 sdk_relay_2 sdk_relay_3

🔧 Modifications nécessaires dans le code

Pour supporter les nœuds externes, il faut modifier sync.rs :

impl SyncManager {
    pub fn load_external_config(&self) -> Result<ExternalConfig> {
        let config_content = fs::read_to_string("external_nodes.conf")?;
        let config: ExternalConfig = toml::from_str(&config_content)?;
        Ok(config)
    }

    pub async fn discover_relays(&self) -> Result<()> {
        // Découverte locale (existante)
        let local_hosts = vec!["sdk_relay_1", "sdk_relay_2", "sdk_relay_3"];
        for host in local_hosts {
            // ... logique existante
        }

        // Découverte externe (nouvelle)
        if let Ok(config) = self.load_external_config() {
            for (relay_id, address) in &config.relays {
                let relay_info = RelayInfo {
                    relay_id: relay_id.clone(),
                    address: address.clone(),
                    // ... autres champs
                };
                self.add_relay(relay_info)?;
            }
        }

        Ok(())
    }
}

🛡️ Sécurité et validation

Validation des nœuds externes

Le script inclut des validations :

  • Format d'adresse : hostname:port ou ip:port
  • Port valide : Entre 1 et 65535
  • Connectivité : Test de connexion TCP
  • WebSocket : Test de réponse WebSocket
  • Domaines autorisés : Contrôle des domaines autorisés

Gestion des erreurs

# Test de connectivité échoué
❌ Impossible de se connecter à external-relay-1.example.com:8090
⚠️  Connectivité échouée - le nœud sera testé au prochain redémarrage

# Test de connectivité réussi
✅ Port 8090 accessible sur localhost
✅ WebSocket répond

📊 Avantages de cette approche

Flexibilité

  • Ajout de nœuds sans recompilation
  • Configuration par fichier
  • Gestion dynamique

Sécurité

  • Contrôle des domaines autorisés
  • Validation des adresses
  • Tests de connectivité

Simplicité

  • Script d'administration simple
  • Configuration TOML lisible
  • Commandes intuitives

Évolutivité

  • Support pour la découverte automatique
  • Architecture extensible
  • Compatible avec les futures améliorations

🚀 Prochaines étapes

1. Implémentation dans le code

  • Modifier sync.rs pour charger external_nodes.conf
  • Ajouter la validation des nœuds externes
  • Tester avec des nœuds externes réels

2. Améliorations futures

  • Découverte via DNS (enregistrements SRV)
  • API REST pour l'enregistrement
  • Découverte automatique via bootstrap nodes
  • Chiffrement des communications

3. Tests et validation

  • Tests avec des nœuds externes
  • Validation de la synchronisation
  • Tests de sécurité

📝 Conclusion

  1. Découverte initiale : Les relais utilisent une liste prédéfinie de noms de conteneurs Docker
  2. Ajout de nœuds externes : Nous avons créé un système de configuration externe avec un script d'administration

Solution recommandée : Utiliser le script add_external_node.sh pour gérer les nœuds externes de manière flexible et sécurisée, sans modifier le code source.

Le système est maintenant prêt pour l'ajout de nœuds externes ! 🎉