# 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 : ```rust // 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 : ```toml # .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` ```toml [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 :** ```bash # 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 ```bash # 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` : ```rust impl SyncManager { pub fn load_external_config(&self) -> Result { 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 ```bash # 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 ! 🎉