diff --git a/README.md b/README.md new file mode 100644 index 0000000..fdfbfb9 --- /dev/null +++ b/README.md @@ -0,0 +1,218 @@ +# 🕐 CronHub + +**CronHub** est un gestionnaire de cron jobs avec interface web et API REST, auto-hĂ©bergĂ© sur NAS. + +🌐 **URL** : [https://cronhub.nas.percolouco.com](https://cronhub.nas.percolouco.com) + +--- + +## 📋 Description + +CronHub permet de crĂ©er, gĂ©rer et monitorer des tĂąches planifiĂ©es (cron jobs) depuis une interface web simple et intuitive. Chaque job est exĂ©cutĂ© via `subprocess` dans le conteneur Docker, avec capture des logs (stdout/stderr) et historique d'exĂ©cution. + +--- + +## đŸ› ïž Stack technique + +| Composant | Technologie | +|-----------|-------------| +| Backend / API | [FastAPI](https://fastapi.tiangolo.com/) | +| Scheduler | [APScheduler 3.x](https://apscheduler.readthedocs.io/) | +| Base de donnĂ©es | SQLite (WAL mode) | +| Templates UI | Jinja2 | +| CSS | Tailwind CSS (via CDN) + styles custom | +| Serveur ASGI | Uvicorn | +| Containerisation | Docker | + +--- + +## ✹ FonctionnalitĂ©s + +- **CRUD complet** — CrĂ©er, lire, modifier, supprimer des jobs +- **Toggle actif/inactif** — Activer ou dĂ©sactiver un job sans le supprimer +- **Run immĂ©diat** — DĂ©clencher un job manuellement hors schedule +- **Logs d'exĂ©cution** — Historique complet avec stdout, stderr, exit code, durĂ©e +- **Statuts visuels** — Dashboard avec compteurs (total, actifs, succĂšs, Ă©checs) +- **API Swagger** — Documentation interactive disponible sur `/docs` +- **Timezone** — Europe/Paris (configurable via `TZ`) +- **Persistance** — SQLite dans volume Docker `/data` + +--- + +## 🔌 API Endpoints + +### SantĂ© +| MĂ©thode | Route | Description | +|---------|-------|-------------| +| `GET` | `/api/health` | VĂ©rification de l'Ă©tat de l'API | + +### Jobs +| MĂ©thode | Route | Description | +|---------|-------|-------------| +| `GET` | `/api/jobs` | Lister tous les jobs | +| `POST` | `/api/jobs` | CrĂ©er un job | +| `GET` | `/api/jobs/{id}` | DĂ©tail d'un job | +| `PUT` | `/api/jobs/{id}` | Modifier un job | +| `DELETE` | `/api/jobs/{id}` | Supprimer un job | +| `POST` | `/api/jobs/{id}/toggle` | Activer/dĂ©sactiver un job | +| `POST` | `/api/jobs/{id}/run` | DĂ©clencher un job manuellement | +| `GET` | `/api/jobs/{id}/logs` | Logs d'exĂ©cution d'un job | + +### UI (HTML) +| MĂ©thode | Route | Description | +|---------|-------|-------------| +| `GET` | `/` | Dashboard principal | +| `GET` | `/jobs/new` | Formulaire crĂ©ation | +| `GET` | `/jobs/{id}` | DĂ©tail + logs UI | +| `GET` | `/jobs/{id}/edit` | Formulaire Ă©dition | +| `POST` | `/jobs/{id}/run-now` | Run immĂ©diat (UI) | +| `GET` | `/docs` | Documentation Swagger | + +### Exemple d'appel API + +```bash +# CrĂ©er un job +curl -X POST https://cronhub.nas.percolouco.com/api/jobs \ + -H "Content-Type: application/json" \ + -d '{ + "name": "Mon backup", + "schedule": "0 3 * * *", + "command": "/scripts/backup.sh", + "description": "Backup quotidien Ă  3h", + "enabled": true + }' + +# Lister les jobs +curl https://cronhub.nas.percolouco.com/api/jobs + +# DĂ©clencher manuellement +curl -X POST https://cronhub.nas.percolouco.com/api/jobs/{id}/run + +# Consulter les logs +curl https://cronhub.nas.percolouco.com/api/jobs/{id}/logs?limit=20 +``` + +--- + +## đŸ—‚ïž Structure du projet + +``` +cronhub/ +├── app/ +│ ├── __init__.py +│ └── main.py # Application FastAPI (routes, scheduler, DB) +├── templates/ +│ ├── index.html # Dashboard +│ ├── job_detail.html # DĂ©tail d'un job + logs +│ └── job_form.html # Formulaire crĂ©ation/Ă©dition +├── data/ # Volume persistant (SQLite) +├── Dockerfile +├── docker-compose.yml +└── requirements.txt +``` + +--- + +## 🐳 Installation Docker + +### PrĂ©requis + +- Docker + Docker Compose +- (Optionnel) Traefik comme reverse proxy + +### docker-compose.yml + +```yaml +version: "3.8" + +services: + cronhub: + build: . + container_name: cronhub + restart: unless-stopped + volumes: + - ./data:/data # Persistance SQLite + - /opt/container/cronmaster/scripts:/scripts:ro # Scripts montĂ©s en lecture seule + - /var/run/docker.sock:/var/run/docker.sock # AccĂšs Docker (optionnel) + environment: + - DB_PATH=/data/cronhub.db + - TZ=Europe/Paris + networks: + - proxy + labels: + - "traefik.enable=true" + - "traefik.http.routers.cronhub.rule=Host(`cronhub.nas.percolouco.com`)" + - "traefik.http.routers.cronhub.entrypoints=websecure" + - "traefik.http.routers.cronhub.tls=true" + - "traefik.http.routers.cronhub.tls.certresolver=letsencrypt" + - "traefik.http.services.cronhub.loadbalancer.server.port=8000" + +networks: + proxy: + external: true +``` + +### DĂ©marrage + +```bash +cd /opt/container/cronhub +docker compose up -d --build +``` + +### Variables d'environnement + +| Variable | DĂ©faut | Description | +|----------|--------|-------------| +| `DB_PATH` | `/data/cronhub.db` | Chemin de la base SQLite | +| `TZ` | `Europe/Paris` | Timezone pour le scheduler | + +--- + +## 📩 ModĂšle de donnĂ©es + +### Job + +```json +{ + "id": "uuid", + "name": "Mon job", + "schedule": "0 8 * * *", + "command": "/scripts/mon-script.sh", + "description": "Description optionnelle", + "enabled": true, + "last_run": "2026-03-15T08:00:00", + "last_status": "success", + "created_at": "2026-03-01T12:00:00" +} +``` + +### Log d'exĂ©cution + +```json +{ + "id": 42, + "job_id": "uuid", + "started_at": "2026-03-15T08:00:00", + "ended_at": "2026-03-15T08:00:01", + "status": "success", + "exit_code": 0, + "stdout": "...", + "stderr": "" +} +``` + +--- + +## 🔧 Notes de dĂ©ploiement + +- Les scripts dans `/scripts` sont montĂ©s depuis `/opt/container/cronmaster/scripts` (lecture seule) +- La commande doit ĂȘtre exĂ©cutable **depuis l'intĂ©rieur du container** +- Le scheduler APScheduler dĂ©marre automatiquement au lancement et recharge tous les jobs actifs +- Les jobs sont exĂ©cutĂ©s en `shell=True` avec un timeout de 3600 secondes +- Stdout/stderr sont limitĂ©s Ă  10 000 caractĂšres par exĂ©cution + +--- + +## 📄 Licence + +Projet privĂ© — perco / NAS domestique