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:
161
DOCTECH.md
161
DOCTECH.md
@@ -56,6 +56,8 @@ Client → Nginx(:443) → Sogoway(:8080) → Sogoms-* → MariaDB
|
||||
| `sogoms-db` | Accès MariaDB, pool par application | `/run/sogoms-db.1.sock` |
|
||||
| `sogoms-logs` | Logging centralisé, rotation auto | `/run/sogoms-logs.1.sock` |
|
||||
| `sogoms-smtp` | Envoi d'emails, templates YAML | `/run/sogoms-smtp.1.sock` |
|
||||
| `sogoms-cron` | Tâches planifiées, jobs périodiques | `/run/sogoms-cron.1.sock` |
|
||||
| `sogoms-admin` | Interface web d'administration | TCP :9000 |
|
||||
|
||||
### sogoctl (Superviseur)
|
||||
|
||||
@@ -63,6 +65,9 @@ Client → Nginx(:443) → Sogoway(:8080) → Sogoms-* → MariaDB
|
||||
- Health checks périodiques (socket ou HTTP)
|
||||
- Redémarrage automatique en cas de crash
|
||||
- Arrêt gracieux sur SIGTERM/SIGINT
|
||||
- **Socket de contrôle** `/run/sogoctl.sock` pour commandes runtime :
|
||||
- `reload <service>` : envoie SIGHUP au service (rechargement config)
|
||||
- `status` : affiche l'état des services
|
||||
|
||||
```yaml
|
||||
# config/sogoctl.yaml
|
||||
@@ -96,6 +101,7 @@ services:
|
||||
- Authentification JWT (HS256)
|
||||
- CRUD générique paramétré par YAML
|
||||
- Logging des événements (login, register)
|
||||
- **Rechargement à chaud** : SIGHUP recharge registry + JWT sans restart
|
||||
|
||||
### sogoms-db (Base de données)
|
||||
|
||||
@@ -151,6 +157,118 @@ body_html: |
|
||||
<p>Bienvenue sur notre plateforme.</p>
|
||||
```
|
||||
|
||||
### sogoms-cron (Tâches planifiées)
|
||||
|
||||
Exécute des jobs périodiques définis en YAML avec support cron standard.
|
||||
|
||||
Actions disponibles :
|
||||
- `list` : liste les jobs configurés avec prochain run
|
||||
- `trigger` : déclenche un job manuellement
|
||||
- `status` : historique des dernières exécutions
|
||||
- `health` : statut OK
|
||||
|
||||
Types de jobs :
|
||||
- `query_email` : requête DB + envoi email groupé par utilisateur
|
||||
- `http` : appel HTTP (GET/POST) vers endpoint interne ou externe
|
||||
- `service` : appel service interne (sogoms-db, sogoms-smtp, etc.)
|
||||
|
||||
Configuration dans `config/apps/{app}/cron.yaml` :
|
||||
```yaml
|
||||
timezone: Europe/Paris
|
||||
retry:
|
||||
max_attempts: 3
|
||||
delay: 5m
|
||||
history_days: 7
|
||||
|
||||
jobs:
|
||||
tasks_today:
|
||||
schedule: "0 8 * * 1-5" # 8h00 lun-ven
|
||||
type: query_email
|
||||
query: |
|
||||
SELECT u.id AS user_id, u.email, u.name AS user_name,
|
||||
t.title, p.name AS project_name, s.name AS status_name
|
||||
FROM users u
|
||||
INNER JOIN tasks t ON t.user_id = u.id
|
||||
LEFT JOIN projects p ON t.project_id = p.id
|
||||
LEFT JOIN statuses s ON t.status_id = s.id
|
||||
WHERE t.date_end <= CURDATE()
|
||||
group_by: user_id
|
||||
template: tasks_today
|
||||
enabled: true
|
||||
```
|
||||
|
||||
Format cron : `minute heure jour mois jour_semaine`
|
||||
- `0 8 * * 1-5` : 8h00 du lundi au vendredi
|
||||
- `*/15 * * * *` : toutes les 15 minutes
|
||||
- `0 9 1 * *` : 9h00 le premier de chaque mois
|
||||
|
||||
### sogoms-admin (Interface web)
|
||||
|
||||
Interface d'administration web pour gérer les applications SOGOMS.
|
||||
|
||||
**Rôles :**
|
||||
- `super_admin` : accès global à toutes les apps et services
|
||||
- `app_admin` : accès limité aux apps assignées avec permissions fines
|
||||
|
||||
**Stack :**
|
||||
- Backend : Go net/http
|
||||
- Frontend : Go templates + htmx + Pico.css (embarqués via go:embed)
|
||||
- Auth : sessions cookies signées (HMAC-SHA256)
|
||||
|
||||
**Sécurité :**
|
||||
- Passwords : bcrypt cost=12
|
||||
- Sessions : Cookie HttpOnly + Secure + SameSite=Strict
|
||||
- CSRF : Token par session
|
||||
- Rate limiting : 5 tentatives/min par IP
|
||||
|
||||
**Routes :**
|
||||
- `GET /admin/login` : page de connexion
|
||||
- `POST /admin/login` : authentification
|
||||
- `GET /admin/` : dashboard principal
|
||||
- `POST /admin/logout` : déconnexion
|
||||
- `GET /admin/api/apps` : liste apps (htmx partial)
|
||||
- `GET /admin/api/services/health` : statut services (htmx partial)
|
||||
|
||||
**Configuration :**
|
||||
```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
|
||||
|
||||
- username: client1
|
||||
password_hash: "$2a$12$..."
|
||||
role: app_admin
|
||||
apps: [prokov]
|
||||
permissions:
|
||||
- schema:read
|
||||
- queries:read
|
||||
- cron:read
|
||||
- logs:read
|
||||
```
|
||||
|
||||
**Permissions disponibles :**
|
||||
- `schema:read/write/upload` : gestion schema
|
||||
- `queries:read/write` : requêtes SQL
|
||||
- `emails:read/write` : templates email
|
||||
- `cron:read/write/trigger` : jobs cron
|
||||
- `logs:read` : consultation logs
|
||||
- `db:introspect` : introspection DB
|
||||
- `*` : toutes (super_admin)
|
||||
|
||||
**Accès externe :** `admin.sogoms.com` via Nginx → :9000
|
||||
|
||||
---
|
||||
|
||||
## Communication IPC
|
||||
@@ -461,7 +579,15 @@ sogoms/
|
||||
│ └── sogoms/
|
||||
│ ├── db/main.go # Microservice DB
|
||||
│ ├── logs/main.go # Microservice Logs
|
||||
│ └── smtp/main.go # Microservice SMTP
|
||||
│ ├── smtp/main.go # Microservice SMTP
|
||||
│ ├── cron/main.go # Microservice Cron
|
||||
│ └── admin/ # Interface web admin
|
||||
│ ├── main.go
|
||||
│ ├── handlers.go
|
||||
│ ├── middleware.go
|
||||
│ ├── session.go
|
||||
│ ├── services.go
|
||||
│ └── templates/
|
||||
├── internal/
|
||||
│ ├── protocol/
|
||||
│ │ ├── message.go # Structs Request/Response
|
||||
@@ -469,30 +595,31 @@ sogoms/
|
||||
│ │ └── client.go # Client + Pool connexions
|
||||
│ ├── config/
|
||||
│ │ └── config.go # Registry, Queries, CUD
|
||||
│ ├── cron/
|
||||
│ │ └── scheduler.go # Parser cron, calcul next run
|
||||
│ ├── auth/
|
||||
│ │ ├── jwt.go # Génération/validation JWT
|
||||
│ │ └── password.go # Hash bcrypt
|
||||
│ ├── admin/
|
||||
│ │ ├── config.go # Chargement admin_users.yaml
|
||||
│ │ ├── permissions.go # Vérification droits
|
||||
│ │ └── audit.go # Logging actions
|
||||
│ └── version/
|
||||
│ └── version.go # Version, BuildTime
|
||||
├── config/
|
||||
│ ├── sogoctl.yaml
|
||||
│ ├── routes/
|
||||
│ │ └── prokov.yaml # Config app (DB, auth, SMTP)
|
||||
│ ├── queries/
|
||||
│ │ └── prokov/
|
||||
│ │ ├── auth.yaml
|
||||
│ │ ├── projects.yaml
|
||||
│ │ ├── tasks.yaml
|
||||
│ │ ├── tags.yaml
|
||||
│ │ └── statuses.yaml
|
||||
│ └── emails/
|
||||
│ └── apps/
|
||||
│ └── prokov/
|
||||
│ ├── welcome.yaml
|
||||
│ ├── password_reset.yaml
|
||||
│ ├── task_assigned.yaml
|
||||
│ └── tasks_today.yaml
|
||||
├── clients/
|
||||
│ └── prokov.sql # Schéma DB
|
||||
│ ├── app.yaml # Config app (DB, auth, SMTP)
|
||||
│ ├── schema.yaml # Schema DB généré
|
||||
│ ├── cron.yaml # Jobs planifiés
|
||||
│ ├── queries/ # Requêtes SQL
|
||||
│ │ ├── auth.yaml
|
||||
│ │ ├── projects.yaml
|
||||
│ │ └── ...
|
||||
│ └── emails/ # Templates email
|
||||
│ ├── welcome.yaml
|
||||
│ └── tasks_today.yaml
|
||||
├── bin/ # Binaires compilés
|
||||
├── deploy.sh # Script déploiement
|
||||
├── VERSION # Numéro de version
|
||||
|
||||
Reference in New Issue
Block a user