1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
# Orchestrator - Gestionnaire de bases de données
Le package `orchestrator` permet de gérer automatiquement des instances de bases de données PostgreSQL via Docker/Podman ou Kubernetes.
## Fonctionnalités
- ✅ Création automatique de conteneurs PostgreSQL par projet
- ✅ Gestion des conflits et détection des bases existantes
- ✅ Assignment automatique des ports
- ✅ Génération sécurisée des mots de passe
- ✅ Limites de ressources (CPU/Mémoire)
- ✅ Attente automatique du démarrage de PostgreSQL
- ✅ Suppression propre des conteneurs et volumes
- ✅ Liste de toutes les bases gérées
- ✅ Support Docker, Podman et Kubernetes (en cours)
## Configuration
Fichier `config.toml` :
```toml
[orchestrator]
type = "docker"
docker_host = "unix:///mnt/wsl/podman-sockets/podman-machine-default/podman-root.sock"
# Pour Docker standard
# docker_host = "unix:///var/run/docker.sock"
# Pour Podman rootless
# docker_host = "unix:///run/user/1000/podman/podman.sock"
# Pour Kubernetes
# type = "kubernetes"
# kube_api = "https://kubernetes.default.svc"
# kube_token = "your-token"
# namespace = "sovrabase-databases"
```
## Utilisation
### Création d'un orchestrateur
```go
import (
"github.com/ketsuna-org/sovrabase/internal/config"
"github.com/ketsuna-org/sovrabase/internal/orchestrator"
)
// Charger la configuration
cfg, err := config.LoadConfig("config.toml")
if err != nil {
log.Fatal(err)
}
// Créer l'orchestrateur
orch, err := orchestrator.NewOrchestrator(&cfg.Orchestrator)
if err != nil {
log.Fatal(err)
}
```
### Créer une base de données
```go
ctx := context.Background()
options := &orchestrator.DatabaseOptions{
PostgresVersion: "16-alpine",
Port: 5434, // Auto-assigné si 0
Memory: "512m", // Optionnel
CPUs: "0.5", // Optionnel
Password: "", // Généré si vide
}
dbInfo, err := orch.CreateDatabase(ctx, "my-project", options)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Connection: %s\n", dbInfo.ConnectionString)
```
### Récupérer les informations
```go
dbInfo, err := orch.GetDatabaseInfo(ctx, "my-project")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Database: %s\n", dbInfo.Database)
fmt.Printf("Port: %s\n", dbInfo.Port)
fmt.Printf("Status: %s\n", dbInfo.Status)
```
### Lister toutes les bases
```go
databases, err := orch.ListDatabases(ctx)
if err != nil {
log.Fatal(err)
}
for _, db := range databases {
fmt.Printf("%s - %s (port %s)\n", db.ProjectID, db.Status, db.Port)
}
```
### Supprimer une base
```go
err := orch.DeleteDatabase(ctx, "my-project")
if err != nil {
log.Fatal(err)
}
```
### Vérifier l'existence
```go
exists, err := orch.DatabaseExists(ctx, "my-project")
if err != nil {
log.Fatal(err)
}
```
## Structure DatabaseInfo
```go
type DatabaseInfo struct {
ProjectID string // ID du projet
ContainerID string // ID du conteneur
ContainerName string // Nom du conteneur
Status string // "running" ou "stopped"
PostgresVersion string // Version PostgreSQL
Host string // Hôte (localhost)
Port string // Port de connexion
Database string // Nom de la DB
User string // Utilisateur
Password string // Mot de passe
ConnectionString string // String de connexion complète
CreatedAt time.Time // Date de création
}
```
## Gestion des erreurs
Le package gère automatiquement :
- **Conflits** : Détecte si une base existe déjà
- **Ports occupés** : Trouve automatiquement un port libre (5433-6000)
- **Échec de démarrage** : Nettoie le conteneur si PostgreSQL ne démarre pas
- **Timeout** : Attend max 30 secondes le démarrage de PostgreSQL
- **Nettoyage** : Supprime les volumes lors de la suppression
## Labels des conteneurs
Tous les conteneurs créés ont les labels suivants :
```
sovrabase.managed=true
sovrabase.project_id=<project-id>
sovrabase.type=postgres
sovrabase.version=<pg-version>
sovrabase.created_at=<timestamp>
```
## Scripts de test
### Test complet de l'API
```bash
cd scripts
go run test_orchestrator_api.go
```
### Test simple de création
```bash
cd scripts
go run test_orchestrator.go
```
### Nettoyage
```bash
cd scripts
go run cleanup_test.go
```
## Commandes utiles
```bash
# Voir tous les conteneurs Sovrabase
podman ps -a --filter "label=sovrabase.managed=true"
# Logs d'un conteneur
podman logs sovrabase-db-<project-id>
# Se connecter à la DB
podman exec -it sovrabase-db-<project-id> psql -U <user> -d <database>
# Supprimer tous les conteneurs Sovrabase
podman rm -f $(podman ps -aq --filter "label=sovrabase.managed=true")
```
## Architecture
```
orchestrator/
├── orchestrator.go # Interface et implémentations
├── docker.go # Logique Docker/Podman
└── kubernetes.go # Logique Kubernetes (TODO)
```
## Roadmap
- [x] Support Docker/Podman
- [x] Gestion des conflits
- [x] Assignment automatique des ports
- [x] Limites de ressources
- [x] Attente du démarrage
- [ ] Support Kubernetes
- [ ] Backup/Restore automatique
- [ ] Métriques et monitoring
- [ ] Mise à jour des versions PostgreSQL
- [ ] Réplication et haute disponibilité
## Contribution
Les contributions sont les bienvenues ! Assurez-vous que tous les tests passent :
```bash
go test ./internal/orchestrator/...
```
|