- Ajout du script add_external_node.sh pour gérer les nœuds externes - Configuration external_nodes.conf avec dev3-relay - Scripts de test pour dev3.4nkweb.com (connectivité WSS) - Documentation complète (CONFIGURATION_DEV3.md, RESUME_AJOUT_DEV3.md) - Scripts de test de synchronisation et monitoring - Configuration multi-relais avec 3 instances - Mise à jour de la documentation technique et fonctionnelle - Scripts de démarrage et monitoring pour les 3 relais
207 lines
5.7 KiB
Markdown
207 lines
5.7 KiB
Markdown
# 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<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
|
||
|
||
```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 ! 🎉
|