All checks were successful
Auto Tag Develop / tag (push) Successful in 6s
Reviewed-on: #1 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
173 lines
6.7 KiB
Markdown
173 lines
6.7 KiB
Markdown
# Phase 1 — Gestion des applications et environnements
|
|
|
|
## Contexte
|
|
|
|
Central est un outil d'ops pour l'equipe technique Malio. Il gere les applications du SI deployees en Docker sur une meme machine (recette + prod).
|
|
|
|
Aujourd'hui les applications gerees sont definies en YAML (`config/applications.yaml`) avec des chemins maintenance en variables d'env. Cette phase remplace ce systeme statique par une gestion dynamique en base de donnees avec une UI complete.
|
|
|
|
## Roadmap globale
|
|
|
|
- **Phase 1** (ce spec) : Modele de donnees apps/envs + UI CRUD
|
|
- **Phase 2** : Deploiement de version, dashboard sante, logs
|
|
- **Phase 3** : Historique deploys, rollback, gestion containers, notifications
|
|
|
|
## Modele de donnees
|
|
|
|
### Entity `Application`
|
|
|
|
| Champ | Type | Contraintes |
|
|
|-------|------|-------------|
|
|
| `id` | int | PK, auto-generated |
|
|
| `name` | string (255) | not null |
|
|
| `slug` | string (255) | not null, unique |
|
|
| `registryImage` | string (255) | not null, ex: `gitea.malio.fr/malio-dev/sirh` |
|
|
| `description` | text | nullable |
|
|
| `giteaUrl` | string (255) | nullable |
|
|
| `createdAt` | DateTimeImmutable | not null, set on construct |
|
|
|
|
- Relation : `OneToMany` vers `Environment` (cascade persist + remove, orphanRemoval)
|
|
|
|
### Entity `Environment`
|
|
|
|
| Champ | Type | Contraintes |
|
|
|-------|------|-------------|
|
|
| `id` | int | PK, auto-generated |
|
|
| `name` | string (255) | not null, ex: "production", "recette" |
|
|
| `containerName` | string (255) | not null, ex: "sirh-app" |
|
|
| `deployScriptPath` | string (255) | not null |
|
|
| `maintenanceFilePath` | string (255) | not null |
|
|
| `appUrl` | string (255) | nullable |
|
|
| `application` | ManyToOne | not null, vers Application |
|
|
|
|
- Relation : `OneToMany` vers `LogFile` (cascade persist + remove, orphanRemoval)
|
|
|
|
### Entity `LogFile`
|
|
|
|
| Champ | Type | Contraintes |
|
|
|-------|------|-------------|
|
|
| `id` | int | PK, auto-generated |
|
|
| `label` | string (255) | not null, ex: "prod", "cron" |
|
|
| `path` | string (255) | not null |
|
|
| `environment` | ManyToOne | not null, vers Environment |
|
|
|
|
## API Endpoints
|
|
|
|
Tous les endpoints sont proteges par `ROLE_ADMIN`. Le slug est utilise comme identifiant URL pour Application.
|
|
|
|
### Application
|
|
|
|
| Route | Methode | Description | Provider/Processor |
|
|
|-------|---------|-------------|--------------------|
|
|
| `GET /api/applications` | GET | Liste des apps avec envs et logfiles | Doctrine (default) |
|
|
| `POST /api/applications` | POST | Creer une app | Doctrine (default) |
|
|
| `GET /api/applications/{slug}` | GET | Detail d'une app avec envs | Doctrine (default) |
|
|
| `PATCH /api/applications/{slug}` | PATCH | Modifier une app | Doctrine (default) |
|
|
| `DELETE /api/applications/{slug}` | DELETE | Supprimer une app (cascade envs) | Doctrine (default) |
|
|
|
|
Groupes de serialisation :
|
|
- Lecture : `app:read` (tous les champs + envs embarques)
|
|
- Ecriture : `app:write` (name, slug, registryImage, description, giteaUrl)
|
|
|
|
### Environment
|
|
|
|
| Route | Methode | Description | Provider/Processor |
|
|
|-------|---------|-------------|--------------------|
|
|
| `POST /api/applications/{slug}/environments` | POST | Ajouter un env a une app | Custom processor pour lier a l'app |
|
|
| `PATCH /api/environments/{id}` | PATCH | Modifier un env | Doctrine (default) |
|
|
| `DELETE /api/environments/{id}` | DELETE | Supprimer un env | Doctrine (default) |
|
|
|
|
Groupes de serialisation :
|
|
- Lecture : `env:read` (tous les champs + logfiles embarques)
|
|
- Ecriture : `env:write` (name, containerName, deployScriptPath, maintenanceFilePath, appUrl, logFiles)
|
|
|
|
Les LogFiles sont geres en embedded dans l'environnement : envoyes dans le body du POST/PATCH de l'env, pas d'endpoint separe.
|
|
|
|
### Maintenance
|
|
|
|
| Route | Methode | Description |
|
|
|-------|---------|-------------|
|
|
| `POST /api/environments/{id}/maintenance` | POST | Toggle maintenance (body: `{ "maintenance": true/false }`) |
|
|
|
|
Remplace l'ancien endpoint `POST /api/applications/{slug}/maintenance`. Le processor cree ou supprime le fichier maintenance sur le filesystem.
|
|
|
|
## Frontend
|
|
|
|
### Page liste — `/applications`
|
|
|
|
- Grille des applications (cards)
|
|
- Chaque card : nom, description (tronquee), nombre d'environnements, lien Gitea (icone externe)
|
|
- Bouton "Ajouter une application" en haut
|
|
- Clic sur une card → navigation vers `/applications/{slug}`
|
|
|
|
### Page detail — `/applications/{slug}`
|
|
|
|
**Section haute : infos application**
|
|
- Nom, description, image registry, lien Gitea
|
|
- Bouton editer → formulaire inline ou modale avec les champs app:write
|
|
- Bouton supprimer (avec confirmation)
|
|
|
|
**Section basse : environnements**
|
|
- Liste des environnements de l'app
|
|
- Chaque env affiche : nom, container, URL (lien cliquable), statut maintenance (badge)
|
|
- Actions par env : editer, supprimer, toggle maintenance
|
|
- Sous chaque env : liste des fichiers de log configures (label + path)
|
|
- Bouton "Ajouter un environnement" → formulaire avec champs env + logfiles dynamiques (ajouter/supprimer des lignes de log)
|
|
|
|
### Sidebar
|
|
|
|
- Lien "Applications" ajoute dans la sidebar (remplace ou complete le lien Dashboard actuel)
|
|
|
|
### Services frontend
|
|
|
|
- `services/applications.ts` : CRUD applications
|
|
- `services/environments.ts` : CRUD environnements + toggle maintenance
|
|
- `services/dto/application.ts` : types TypeScript
|
|
- `services/dto/environment.ts` : types TypeScript (inclut LogFile)
|
|
|
|
### i18n
|
|
|
|
- Nouvelles cles dans `fr.json` pour toutes les labels, messages de succes/erreur, confirmations de suppression
|
|
|
|
## Migration des donnees existantes
|
|
|
|
### Ce qui est cree
|
|
|
|
Une DataFixture (ou migration SQL) cree les 3 apps existantes :
|
|
|
|
**SIRH**
|
|
- slug: `sirh`, image: `gitea.malio.fr/malio-dev/sirh`
|
|
- Env prod : container `sirh-app`, deploy `/home/m-tristan/workspace/SIRH/deploy/docker/deploy.sh`
|
|
- Env recette : container `sirh-test-app` (si existant)
|
|
|
|
**Lesstime**
|
|
- slug: `lesstime`, image: `gitea.malio.fr/malio-dev/lesstime`
|
|
- Env prod : container `lesstime-app`
|
|
|
|
**Inventory**
|
|
- slug: `inventory`, image: `gitea.malio.fr/malio-dev/inventory`
|
|
- Env prod : container `inventory-app`
|
|
- Env recette : container `inventory-test-app`
|
|
|
|
Les chemins exacts (deploy, maintenance, logs) seront renseignes lors de l'implementation en inspectant chaque projet.
|
|
|
|
### Ce qui est supprime
|
|
|
|
- `config/applications.yaml`
|
|
- Variables d'env `SIRH_MAINTENANCE_PATH`, `LESSTIME_MAINTENANCE_PATH`, `INVENTORY_MAINTENANCE_PATH`
|
|
- `src/ApiResource/ManagedApplication.php`
|
|
- `src/State/ManagedApplicationProvider.php`
|
|
- `src/State/MaintenanceToggleProcessor.php`
|
|
- `services/dto/managed-application.ts` (frontend)
|
|
- `services/managed-applications.ts` (frontend)
|
|
|
|
La page d'accueil actuelle (dashboard avec toggle maintenance) est remplacee par la nouvelle page liste/detail.
|
|
|
|
## Hors scope
|
|
|
|
- Deploiement de version (phase 2)
|
|
- Logs en temps reel (phase 2)
|
|
- Dashboard sante containers (phase 2)
|
|
- Historique de deploiements (phase 3)
|
|
- Gestion multi-roles (pas de ROLE_USER pour l'instant)
|