SOGOMS v1.0.3 - Admin UI, Cron, Config reload
Phase 13 : sogoms-cron
- Jobs planifiés avec schedule cron standard
- Types: query_email, http, service
- Actions: list, trigger, status
Phase 16 : Réorganisation config/apps/{app}/
- Tous les fichiers d'une app dans un seul dossier
- Migration prokov vers nouvelle structure
Phase 17 : sogoms-admin
- Interface web d'administration (Go templates + htmx)
- Auth sessions cookies signées HMAC-SHA256
- Rôles super_admin / app_admin avec permissions
Phase 19 : Création d'app via Admin UI
- Formulaire création app avec config DB/auth
- Bouton "Scanner la base" : introspection + schema.yaml
- Rechargement automatique sogoway via SIGHUP
Infrastructure :
- sogoctl : socket de contrôle /run/sogoctl.sock
- sogoway : reload config sur SIGHUP sans restart
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
245
TODO.md
245
TODO.md
@@ -161,18 +161,24 @@ curl https://prokov.unikoffice.com/api/auth/me \
|
||||
|
||||
## Phase 13 : Microservice Cron
|
||||
|
||||
- [ ] `cmd/sogoms/cron/main.go` : point d'entrée
|
||||
- [ ] Écoute sur Unix socket `/run/sogoms-cron.1.sock`
|
||||
- [ ] Config YAML par application (`config/cron/{app}.yaml`)
|
||||
- [ ] Parser cron schedule (format standard `* * * * *`)
|
||||
- [ ] Action `list` : liste les jobs configurés
|
||||
- [ ] Action `trigger` : déclenche un job manuellement
|
||||
- [ ] Action `status` : statut des dernières exécutions
|
||||
- [ ] Type `service` : appel service interne (sogoms-smtp, sogoms-db, etc.)
|
||||
- [ ] Type `http` : appel HTTP (GET/POST) vers endpoint interne ou externe
|
||||
- [ ] Type `query_email` : requête DB + envoi email avec résultat
|
||||
- [ ] Logging des exécutions dans sogoms-logs
|
||||
- [ ] Application Prokov : email quotidien `tasks_today`
|
||||
- [x] `cmd/sogoms/cron/main.go` : point d'entrée
|
||||
- [x] `internal/cron/scheduler.go` : parser cron + calcul next run
|
||||
- [x] Écoute sur Unix socket `/run/sogoms-cron.1.sock`
|
||||
- [x] Config YAML par application (`config/apps/{app}/cron.yaml`)
|
||||
- [x] Parser cron schedule (format standard `* * * * *`)
|
||||
- [x] Support timezone (Europe/Paris)
|
||||
- [x] Retry configurable (max_attempts, delay)
|
||||
- [x] Historique des exécutions (configurable, défaut 7 jours)
|
||||
- [x] Action `list` : liste les jobs configurés avec prochain run
|
||||
- [x] Action `trigger` : déclenche un job manuellement
|
||||
- [x] Action `status` : historique des dernières exécutions
|
||||
- [x] Type `service` : appel service interne (sogoms-smtp, sogoms-db, etc.)
|
||||
- [x] Type `http` : appel HTTP (GET/POST) vers endpoint interne ou externe
|
||||
- [x] Type `query_email` : requête DB + envoi email groupé par user
|
||||
- [x] Logging des exécutions dans sogoms-logs
|
||||
- [x] Application Prokov : email quotidien `tasks_today` (8h00 lun-ven)
|
||||
- [x] Intégration sogoctl.yaml
|
||||
- [x] Intégration deploy.sh
|
||||
|
||||
## Phase 14 : Push Temps Réel (MQTT)
|
||||
|
||||
@@ -210,32 +216,35 @@ Cette phase transforme SOGOMS en générateur d'API automatique.
|
||||
|
||||
### 15a. Définition du Schema
|
||||
|
||||
- [ ] Format `config/schema/{app}.yaml` : tables, fields, relations
|
||||
- [ ] Types supportés : int, string, text, bool, date, datetime, json
|
||||
- [ ] Contraintes : primary, auto, unique, required, default
|
||||
- [ ] Relations : foreign key avec `foreign: table.field`
|
||||
- [ ] Sécurité : `filter: owner` pour filtrage auto par user_id
|
||||
- [x] Format `config/schemas/{app}.yaml` : tables, fields, relations
|
||||
- [x] Types supportés : int, string, text, float, date, datetime, json
|
||||
- [x] Contraintes : primary, auto, unique, required, default
|
||||
- [x] Relations : foreign key avec `foreign: table.field`
|
||||
- [x] Sécurité : `filter: owner` pour filtrage auto par user_id
|
||||
- [ ] Auth : `auth: login`, `auth: password` pour détection auto
|
||||
- [ ] CRUD : liste des opérations autorisées par table
|
||||
- [x] CRUD : liste des opérations autorisées par table
|
||||
- [ ] Filtres custom : définition de filtres nommés
|
||||
- [ ] Ordre par défaut : `order: "position ASC"`
|
||||
|
||||
### 15b. sogoms-schema (Générateur)
|
||||
### 15b. Introspection DB (via API admin)
|
||||
|
||||
- [ ] `cmd/sogoms/schema/main.go` : outil CLI
|
||||
- [ ] Commande `generate {app}` : génère queries YAML depuis schema
|
||||
- [x] Action `introspect` dans sogoms-db : scan INFORMATION_SCHEMA
|
||||
- [x] Endpoint `GET /api/_admin/schema/introspect` : retourne JSON
|
||||
- [x] Endpoint `POST /api/_admin/schema/generate` : génère schema.yaml
|
||||
- [x] Détection auto : types, clés primaires/étrangères, contraintes
|
||||
- [x] Détection pattern `filter: owner` sur colonnes `user_id`
|
||||
- [ ] Commande `validate {app}` : valide le schema
|
||||
- [ ] Commande `diff {app}` : compare schema vs DB réelle
|
||||
- [ ] Commande `migrate {app}` : génère SQL de migration
|
||||
- [ ] Commande `init {app}` : crée schema depuis DB existante (reverse)
|
||||
|
||||
### 15c. Runtime Dynamique (sogoway)
|
||||
|
||||
- [ ] Chargement schema au démarrage
|
||||
- [ ] Routes CRUD auto-générées depuis schema
|
||||
- [ ] Validation des inputs selon types/contraintes
|
||||
- [ ] Filtrage user_id automatique (filter: owner)
|
||||
- [x] Chargement schema au démarrage
|
||||
- [x] Routes CRUD auto-générées depuis schema
|
||||
- [x] Validation des inputs selon types/contraintes
|
||||
- [x] Filtrage user_id automatique (filter: owner)
|
||||
- [ ] Gestion relations (include, nested)
|
||||
- [ ] Pas de fichiers queries YAML requis (optionnels pour override)
|
||||
- [x] Pas de fichiers queries YAML requis (optionnels pour override)
|
||||
|
||||
### 15d. Dictionnaire de Données
|
||||
|
||||
@@ -244,6 +253,115 @@ Cette phase transforme SOGOMS en générateur d'API automatique.
|
||||
- [ ] Documentation auto-générée
|
||||
- [ ] Utilisable par Flutter pour génération de formulaires
|
||||
|
||||
## Phase 16 : Réorganisation Config par Application
|
||||
|
||||
Objectif : regrouper tous les fichiers d'une application dans un seul dossier.
|
||||
|
||||
### 16a. Nouvelle structure
|
||||
|
||||
```
|
||||
config/
|
||||
├── apps/
|
||||
│ └── {app}/
|
||||
│ ├── app.yaml ← config principale (ex routes/{app}.yaml)
|
||||
│ ├── schema.yaml ← schema DB généré
|
||||
│ ├── queries/ ← requêtes SQL
|
||||
│ │ ├── auth.yaml
|
||||
│ │ ├── projects.yaml
|
||||
│ │ └── ...
|
||||
│ ├── scenarios/ ← orchestrations complexes
|
||||
│ │ └── auth/
|
||||
│ │ └── login.yaml
|
||||
│ └── emails/ ← templates email
|
||||
│ └── welcome.yaml
|
||||
└── sogoctl.yaml
|
||||
```
|
||||
|
||||
### 16b. Migration
|
||||
|
||||
- [x] Créer `config/apps/prokov/` avec nouvelle structure
|
||||
- [x] Migrer `config/routes/prokov.yaml` → `config/apps/prokov/app.yaml`
|
||||
- [x] Migrer `config/schemas/prokov.yaml` → `config/apps/prokov/schema.yaml`
|
||||
- [x] Migrer `config/queries/prokov/` → `config/apps/prokov/queries/`
|
||||
- [x] Migrer `config/scenarios/prokov/` → `config/apps/prokov/scenarios/`
|
||||
- [x] Migrer `config/emails/prokov/` → `config/apps/prokov/emails/`
|
||||
|
||||
### 16c. Adaptation du code
|
||||
|
||||
- [x] `internal/config/config.go` : nouveau chemin de chargement
|
||||
- [x] `internal/config/config.go` : charger schema.yaml (optionnel)
|
||||
- [x] `cmd/sogoway/main.go` : adapter handleSchemaGenerate()
|
||||
- [x] `deploy.sh` : adapter les chemins de déploiement
|
||||
- [x] Supprimer anciens dossiers après validation
|
||||
|
||||
### 16d. Avantages
|
||||
|
||||
- Clarté : tout ce qui concerne une app dans un seul dossier
|
||||
- Portabilité : copier/sauvegarder une app = copier un dossier
|
||||
- Scalabilité : ajouter une app = créer un dossier dans `apps/`
|
||||
- Cohérence : plus de répétition du nom d'app partout
|
||||
|
||||
## Phase 17 : Interface Web Administration (sogoms-admin)
|
||||
|
||||
### 17a. Backend Go
|
||||
|
||||
- [x] `internal/admin/config.go` : chargement admin_users.yaml
|
||||
- [x] `internal/admin/permissions.go` : vérification des droits
|
||||
- [x] `internal/admin/audit.go` : logging des actions vers sogoms-logs
|
||||
- [x] `cmd/sogoms/admin/session.go` : sessions en mémoire, cookies signés HMAC-SHA256
|
||||
- [x] `cmd/sogoms/admin/middleware.go` : auth, CSRF, rate limiting
|
||||
- [x] `cmd/sogoms/admin/services.go` : appels vers services (db, logs, cron)
|
||||
- [x] `cmd/sogoms/admin/handlers.go` : handlers HTTP (login, dashboard, logout)
|
||||
- [x] `cmd/sogoms/admin/main.go` : serveur HTTP :9000
|
||||
|
||||
### 17b. Frontend Templates
|
||||
|
||||
- [x] `templates/layout.html` : layout commun avec htmx + Pico.css
|
||||
- [x] `templates/login.html` : page de connexion avec CSRF
|
||||
- [x] `templates/dashboard.html` : dashboard principal
|
||||
- [x] `templates/partials/apps_list.html` : liste apps (htmx)
|
||||
- [x] `templates/partials/services_status.html` : statut services (htmx)
|
||||
|
||||
### 17c. Sécurité
|
||||
|
||||
- [x] Passwords : bcrypt cost=12
|
||||
- [x] Sessions : Cookie HttpOnly + Secure + SameSite=Strict
|
||||
- [x] CSRF : Token par session, vérifié sur POST
|
||||
- [x] Rate limiting : 5 tentatives/min par IP sur login
|
||||
- [x] Audit : Toutes actions loggées vers sogoms-logs
|
||||
|
||||
### 17d. Rôles et Permissions
|
||||
|
||||
- [x] Super-admin : accès global à toutes les apps et services
|
||||
- [x] App-admin : accès limité aux apps assignées avec permissions fines
|
||||
- [x] Permissions granulaires : schema:*, queries:*, emails:*, cron:*, logs:*, db:*
|
||||
|
||||
### 17e. Intégration
|
||||
|
||||
- [x] `config/sogoctl.yaml` : ajout service sogoms-admin
|
||||
- [x] `deploy.sh` : build et déploiement sogoms-admin
|
||||
- [x] Configuration Nginx : admin.sogoms.com → :9000
|
||||
|
||||
### 17f. Configuration requise
|
||||
|
||||
```yaml
|
||||
# /secrets/admin_users.yaml
|
||||
session:
|
||||
secret_file: /secrets/admin_session_secret
|
||||
max_age: 3600
|
||||
cookie_name: sogoms_admin_sid
|
||||
|
||||
rate_limit:
|
||||
login_max: 5
|
||||
login_window: 60
|
||||
|
||||
users:
|
||||
- username: pierre
|
||||
password_hash: "$2a$12$..."
|
||||
role: super_admin
|
||||
email: pierre@example.com
|
||||
```
|
||||
|
||||
## Hors scope V1
|
||||
|
||||
- sogorch (orchestrateur scénarios)
|
||||
@@ -251,3 +369,76 @@ Cette phase transforme SOGOMS en générateur d'API automatique.
|
||||
- Multi-tenant avancé (workspaces, partage)
|
||||
- Rate limiting
|
||||
- Rôles utilisateurs (admin, manager, user)
|
||||
|
||||
## Phase 19 : Création d'App via Admin UI
|
||||
|
||||
Objectif : permettre la création et configuration d'une app directement depuis l'interface admin.
|
||||
|
||||
### 19a. Formulaire de création
|
||||
|
||||
- [x] Page `/admin/apps/new` : formulaire création app
|
||||
- [x] Champs : nom app, version, base_path
|
||||
- [x] Champs hosts : liste des domaines
|
||||
- [x] Champs database : host, port, user, password, name
|
||||
- [x] Champs auth : JWT secret (auto-généré ou manuel), expiry
|
||||
- [ ] Validation : test connexion DB avant création
|
||||
- [x] Création : génère `config/apps/{app}/app.yaml`
|
||||
|
||||
### 19b. Introspection et génération schema
|
||||
|
||||
- [x] Bouton "Scanner la base" : appelle introspection DB
|
||||
- [x] Génération automatique `schema.yaml` depuis INFORMATION_SCHEMA
|
||||
- [x] Détection : types, clés primaires/étrangères, contraintes
|
||||
- [x] Détection auto `filter: owner` sur colonnes `user_id`
|
||||
- [x] Sauvegarde `config/apps/{app}/schema.yaml`
|
||||
|
||||
### 19c. Bouton "Update Schema"
|
||||
|
||||
- [x] Relecture structure DB (nouvelle introspection)
|
||||
- [x] Mise à jour schema.yaml (nouvelles tables/colonnes)
|
||||
- [x] Régénération routes CRUD automatiques
|
||||
- [x] Rechargement registry après scan
|
||||
- [x] Rechargement automatique sogoway via SIGHUP (socket sogoctl)
|
||||
|
||||
Note : le bouton "Scanner la base" (19b) fait office d'Update Schema.
|
||||
|
||||
### 19d. Affichage dans Admin
|
||||
|
||||
- [ ] Page détail app : liste tables avec colonnes
|
||||
- [ ] Page détail app : liste routes générées
|
||||
- [ ] Page détail app : dictionnaire des données (types, contraintes)
|
||||
- [ ] Indicateur : schema synchronisé / désynchronisé avec DB
|
||||
|
||||
### 19e. Gestion des secrets
|
||||
|
||||
- [ ] Génération auto fichiers secrets (`/secrets/{app}_*`)
|
||||
- [ ] DB password : saisi une fois, stocké dans fichier
|
||||
- [ ] JWT secret : auto-généré (openssl rand -base64 32)
|
||||
- [ ] Permissions fichiers : 600
|
||||
|
||||
## Phase 18 : Application Geosector (Janvier-Février 2026)
|
||||
|
||||
Migration de l'API PHP 8.3 existante vers SOGOMS pour l'application Flutter (Web + mobiles).
|
||||
|
||||
### 18a. Préparation
|
||||
|
||||
- [ ] Introspection DB MariaDB existante
|
||||
- [ ] Génération schema.yaml depuis introspection
|
||||
- [ ] Création `config/apps/geosector/`
|
||||
- [ ] Analyse des endpoints PHP existants
|
||||
|
||||
### 18b. Migration
|
||||
|
||||
- [ ] Configuration app.yaml (DB, auth, hosts)
|
||||
- [ ] Adaptation des queries spécifiques
|
||||
- [ ] Migration des endpoints custom si nécessaire
|
||||
- [ ] Configuration jobs cron (si applicable)
|
||||
- [ ] Configuration emails (si applicable)
|
||||
|
||||
### 18c. Tests et bascule
|
||||
|
||||
- [ ] Tests avec app Flutter (web)
|
||||
- [ ] Tests avec app Flutter (iOS/Android)
|
||||
- [ ] Configuration Nginx geosector.sogoms.com
|
||||
- [ ] Bascule DNS production
|
||||
- [ ] Monitoring post-migration
|
||||
|
||||
Reference in New Issue
Block a user