Date : 11/01/2026 17:30 Statut : EN ATTENTE VALIDATION
Permettre à collect.sh de détecter automatiquement :
Chaque container expose un fichier /app/scheduler.json (ou /scheduler.json) :
{
"name": "needfinder-collector",
"version": "0.3.0",
"schedules": [
{
"name": "collect-analyze",
"cron": "0 */6 * * *",
"description": "Collecte Reddit + HN + Analyse IA",
"timezone": "UTC"
}
],
"logs": {
"app": "/app/logs/app.log",
"error": "/app/logs/error.log",
"access": null
},
"endpoints": {
"health": "/health",
"scheduler": "/api/stats",
"trigger": "/api/collect"
}
}
schedules[]| Champ | Type | Requis | Description |
|---|---|---|---|
name |
string | ✅ | Nom unique du job |
cron |
string | ✅ | Expression cron (ou "continuous" pour Celery/workers) |
description |
string | ✅ | Description courte |
timezone |
string | ❌ | Timezone (défaut: UTC) |
enabled |
boolean | ❌ | Actif ou non (défaut: true) |
logs| Champ | Type | Description |
|---|---|---|
app |
string/null | Log applicatif principal |
error |
string/null | Log erreurs |
access |
string/null | Log accès HTTP (si API) |
null= pas de fichier log (ou stdout uniquement)
endpoints| Champ | Type | Description |
|---|---|---|
health |
string | Endpoint healthcheck |
scheduler |
string | Endpoint pour voir l'état du scheduler |
trigger |
string | Endpoint pour déclencher manuellement |
{
"name": "needfinder-collector",
"version": "0.3.0",
"schedules": [
{
"name": "collect-analyze",
"cron": "0 */6 * * *",
"description": "Collecte Reddit + HN + Analyse IA"
}
],
"logs": {
"app": "stdout",
"error": "stderr",
"access": null
},
"endpoints": {
"health": "/health",
"scheduler": "/api/stats",
"trigger": "/api/collect"
}
}
{
"name": "baserow",
"version": "1.24.2",
"schedules": [
{
"name": "celery-beat",
"cron": "continuous",
"description": "Celery Beat - tâches async (exports, cleanup)"
}
],
"logs": {
"app": "/baserow/data/logs/baserow.log",
"error": "/baserow/data/logs/error.log",
"access": null
},
"endpoints": {
"health": "/api/health/",
"scheduler": null,
"trigger": null
}
}
{
"name": "nextcloud-cron",
"version": "latest",
"schedules": [
{
"name": "maintenance",
"cron": "*/5 * * * *",
"description": "Tâches maintenance Nextcloud (cleanup, notifications)"
}
],
"logs": {
"app": "stdout",
"error": "stderr",
"access": null
},
"endpoints": {
"health": null,
"scheduler": null,
"trigger": null
}
}
# Collecter les manifests de tous les containers
collect_container_schedulers() {
local host=$1
local containers=$(ssh_cmd $host "docker ps --format '{{.Names}}'")
for container in $containers; do
# Tenter de lire le manifest
manifest=$(ssh_cmd $host "docker exec $container cat /app/scheduler.json 2>/dev/null || docker exec $container cat /scheduler.json 2>/dev/null || echo '{}'")
if [ "$manifest" != "{}" ]; then
echo "$container: $manifest" >> $DATA_DIR/container-schedulers.json
fi
done
}
/app/
├── src/
├── package.json
├── Dockerfile
└── scheduler.json # ← À la racine de l'app
Dans le Dockerfile :
COPY scheduler.json /app/scheduler.json
scheduler.json.template dans 33800-stack