Reviewed-on: #1 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
6.7 KiB
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 :
OneToManyversEnvironment(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 :
OneToManyversLogFile(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 applicationsservices/environments.ts: CRUD environnements + toggle maintenanceservices/dto/application.ts: types TypeScriptservices/dto/environment.ts: types TypeScript (inclut LogFile)
i18n
- Nouvelles cles dans
fr.jsonpour 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.phpsrc/State/ManagedApplicationProvider.phpsrc/State/MaintenanceToggleProcessor.phpservices/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)