summaryrefslogtreecommitdiff
path: root/internal/orchestrator/README.md
blob: d681bd1fd4d08a6d298f9d491298a25ac408e0e9 (plain)
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/...
```