feat: Initial commit
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is passing

This commit is contained in:
2026-03-01 14:53:04 +01:00
commit 9108981868
13 changed files with 3404 additions and 0 deletions

83
README.md Normal file
View File

@@ -0,0 +1,83 @@
# pg-instance-handler
Reconcilie des bases PostgreSQL à partir dun fichier YAML et gère leur cycle de vie (bases, utilisateurs, droits `CONNECT`, ownership).
## Sommaire
- Aperçu rapide
- Démarrage rapide (Docker Compose)
- Spécification YAML
- Variables denvironnement
- Build local et exécution
- Opérations et sécurité
- Dépannage
## Aperçu rapide
- Crée les bases manquantes et supprime celles non listées (sauf `postgres`).
- Crée/actualise un utilisateur par base, lui donne laccès et lownership de la base.
- Définition de létat désiré via un YAML monté dans le conteneur.
Code pertinent:
- Reconciliation: [src/app/database/database_service.rs](src/app/database/database_service.rs)
- Spéc YAML / lecture état désiré: [src/actors/driven/database_file_retriever.rs](src/actors/driven/database_file_retriever.rs)
- Accès Postgres (sqlx): [src/actors/driven/sqlx_handler.rs](src/actors/driven/sqlx_handler.rs)
- Entrée: [src/main.rs](src/main.rs)
- Conteneurs: [Dockerfile](Dockerfile), [docker-compose.yml](docker-compose.yml)
## Démarrage rapide (Docker Compose)
1) Préparez votre fichier YAML (exemple ci-dessous) à la racine du projet sous `database.yaml`.
2) Lancez:
```bash
docker compose up --build
```
Le service va:
- se connecter à PostgreSQL via `DATABASE_URL` (admin),
- réconcilier les bases selon `database.yaml`,
- créer/mettre à jour les utilisateurs et donner lownership,
## Spécification YAML
Exemple minimal: [database.yaml](database.yaml)
```yaml
databases:
- name: hello
user: hello_user
password: hello_password
```
- `name`: nom de la base à gérer
- `user`: utilisateur propriétaire/consommateur de la base
- `password`: mot de passe de cet utilisateur
Notes:
- Les noms (`name`, `user`) sont validés (lettres, chiffres, underscore; commencent par lettre/underscore).
- Le programme ne supprime jamais la base `postgres`.
## Variables denvironnement
- `DATABASE_URL`: URL admin PostgreSQL pour lorchestrateur (ex: `postgres://postgres:postgres@postgres:5432/postgres`).
Les exemples dENV sont indiqués dans [docker-compose.yml](docker-compose.yml).
## Build local et exécution
```bash
cargo build
```
Exécution locale (besoin dun Postgres accessible et dun `database.yaml`):
```bash
export DATABASE_URL="postgres://postgres:postgres@localhost:5432/postgres"
cargo run
```
## Opérations et sécurité
- Suppression: par défaut, toute base non listée est supprimée (sauf `postgres`). Pour un MVP, gardez le YAML strict et versionné. On pourra ajouter un mode « dry-run » et/ou restreindre la gestion à un préfixe (ex: `managed_`).
- Permissions: lutilisateur est `LOGIN PASSWORD`, reçoit `CONNECT` et devient owner de sa base.
- Droits DB: `DATABASE_URL` doit pointer une base admin avec droits de création/suppression et gestion des rôles.
## Dépannage
- `DROP DATABASE` échoue: des connexions actives empêchent la suppression. Le programme essaie de terminer les sessions avant `DROP`; réessayez.
---
Contributions bienvenues. Pour toute évolution (dry-run, périmètre géré, migrations), ouvrez une issue/PR.