summaryrefslogtreecommitdiff
path: root/docs/config.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/config.md')
-rw-r--r--docs/config.md166
1 files changed, 166 insertions, 0 deletions
diff --git a/docs/config.md b/docs/config.md
new file mode 100644
index 0000000..f3236f3
--- /dev/null
+++ b/docs/config.md
@@ -0,0 +1,166 @@
+# Configuration
+
+Ce document décrit le format du fichier de configuration pour Sovrabase. La configuration est stockée dans un fichier TOML (généralement `config.toml`) et contient tous les paramètres nécessaires au fonctionnement de l'application.
+
+## Emplacement du fichier
+
+Le fichier de configuration doit être placé dans le répertoire racine du projet et nommé `config.toml`.
+
+## Structure de la configuration
+
+La configuration est organisée en plusieurs sections pour une meilleure organisation et lisibilité.
+
+### Niveau racine
+
+| Champ | Type | Défaut | Description |
+|-------|------|---------|-------------|
+| `region` | string | "supabase" | L'identifiant de région pour l'application |
+
+### Section [rpc]
+
+Configuration pour le service RPC (Remote Procedure Call).
+
+| Champ | Type | Description |
+|-------|------|-------------|
+| `rpc_secret` | string | Clé secrète utilisée pour l'authentification RPC. **Doit être identique sur tous les nœuds du cluster** pour permettre la communication inter-nœuds. |
+| `rpc_addr` | string | Adresse réseau et port pour le serveur RPC (ex: "[::]:8080") |
+
+### Section [api]
+
+Configuration pour le service API principal.
+
+| Champ | Type | Description |
+|-------|------|-------------|
+| `api_addr` | string | Adresse réseau et port pour le serveur API (ex: "0.0.0.0:3000") |
+| `api_domain` | string | Nom de domaine pour l'API (ex: "example.com") |
+
+### Section [internal_db]
+
+Configuration pour la base de données interne utilisée par l'application.
+
+| Champ | Type | Description |
+|-------|------|-------------|
+| `manager` | string | Type de base de données. Valeurs supportées : "postgres", "mysql", "sqlite" |
+| `uri` | string | URI de connexion à la base de données. Pour SQLite, utiliser un chemin de fichier (ex: "./database/internal.db") |
+
+### Section [external_db]
+
+Configuration pour les bases de données externes auxquelles l'application peut se connecter.
+
+| Champ | Type | Description |
+|-------|------|-------------|
+| `manager` | string | Type de base de données. Valeurs supportées : "postgres", "mysql" |
+| `uri` | string | URI de connexion à la base de données pour l'utilisateur root. Doit pointer vers l'adresse du serveur de base de données sans spécifier de base de données particulière (ex: "postgres://root:password@localhost:5432/") |
+
+### Section [s3_api]
+
+Configuration pour le service API compatible S3.
+
+| Champ | Type | Description |
+|-------|------|-------------|
+| `s3_region` | string | Identifiant de région S3 (ex: "garage") |
+| `api_bind_addr` | string | Adresse réseau et port pour le serveur API S3 (ex: "[::]:3900") |
+| `root_domain` | string | Domaine racine pour les buckets S3 (ex: ".s3.garage") |
+
+### Section [cluster]
+
+Configuration pour le système distribué et multi-nœuds (prise en charge de l'architecture multi-région).
+
+| Champ | Type | Description |
+|-------|------|-------------|
+| `node_id` | string | Identifiant unique du nœud dans le cluster |
+| `is_rpc_server` | bool | Indique si ce nœud agit comme serveur RPC pour les autres nœuds |
+| `rpc_servers` | []string | Liste des **adresses réseau** (IP:port ou hostname:port) des serveurs RPC dans le cluster pour la découverte et connexion |
+
+**⚠️ Important** : La clé `rpc_secret` (section [rpc]) doit être **identique sur tous les nœuds** du cluster pour permettre l'authentification mutuelle entre nœuds.
+
+## Exemple de configuration
+
+```toml
+region = "supabase"
+
+[rpc]
+rpc_secret = "random_secret_12345"
+rpc_addr = "0.0.0.0:8080"
+
+[api]
+api_addr = "0.0.0.0:3000"
+api_domain = "example.com"
+
+[internal_db]
+manager = "sqlite"
+uri = "./database/internal.db"
+
+[external_db]
+manager = "postgres"
+uri = "postgres://root:password@localhost:5432/"
+
+[s3_api]
+s3_region = "garage"
+api_bind_addr = "[::]:3900"
+root_domain = ".s3.garage"
+
+[cluster]
+node_id = "node-01"
+is_rpc_server = true
+rpc_servers = ["192.168.1.10:8080"]
+```
+
+## Chargement de la configuration
+
+La configuration est chargée en utilisant la fonction `config.LoadConfig()` :
+
+```go
+cfg, err := config.LoadConfig("config.toml")
+if err != nil {
+ log.Fatal("Échec du chargement de la configuration:", err)
+}
+
+// Accès aux valeurs de configuration
+fmt.Println("Adresse RPC:", cfg.RPC.RPCAddr)
+fmt.Println("Domaine API:", cfg.API.APIDomain)
+fmt.Println("BD interne:", cfg.InternalDB.Manager)
+fmt.Println("ID du nœud:", cfg.Cluster.NodeID)
+fmt.Println("Serveur RPC:", cfg.Cluster.IsRPCServer)
+```
+
+## Bonnes pratiques de déploiement cluster
+
+### Configuration RPC dans un cluster
+
+Pour un déploiement multi-nœuds, assurez-vous que :
+
+- **Clé RPC commune** : Tous les nœuds utilisent la **même valeur** pour `rpc_secret`
+- **Serveurs RPC désignés** : Au moins un nœud par région doit avoir `is_rpc_server = true`
+- **Liste de découverte** : Tous les nœuds doivent lister les **adresses réseau réelles** (IP:port) des serveurs RPC dans `rpc_servers`
+- **IDs uniques** : Chaque nœud doit avoir un `node_id` unique dans le cluster
+
+**Comprendre `rpc_servers`** : Cette liste contient les adresses réseau des nœuds qui agissent comme serveurs RPC. Les clients RPC utilisent cette liste pour découvrir et se connecter aux serveurs disponibles dans le cluster.
+
+**Exemple de configuration cluster** :
+```toml
+# Nœud 1 (serveur RPC) - Région Europe
+[cluster]
+node_id = "node-01"
+is_rpc_server = true
+rpc_servers = ["192.168.1.10:8080"] # Son propre adresse RPC
+
+# Nœud 2 (client RPC) - Région Europe
+[cluster]
+node_id = "node-02"
+is_rpc_server = false
+rpc_servers = ["192.168.1.10:8080", "192.168.1.11:8080"] # Liste des serveurs RPC disponibles
+
+# Nœud 3 (serveur RPC) - Région Asie
+[cluster]
+node_id = "node-03"
+is_rpc_server = true
+rpc_servers = ["192.168.2.10:8080"] # Son propre adresse RPC
+```
+
+## Notes de sécurité
+
+- Stockez le fichier de configuration de manière sécurisée et évitez de commiter les secrets dans le contrôle de version
+- Utilisez des valeurs fortes et générées aléatoirement pour `rpc_secret`
+- Assurez-vous que les credentials de base de données dans les URI ont les permissions appropriées (accès root pour external_db)
+- Envisagez d'utiliser des variables d'environnement ou des systèmes de gestion des secrets pour les valeurs sensibles en production