33800 Docs

← Retour

Proposition : Convention scheduler.json pour containers

Date : 11/01/2026 17:30 Statut : EN ATTENTE VALIDATION


Objectif

Permettre à collect.sh de détecter automatiquement :

  1. Les schedulers/crons internes aux containers
  2. Les chemins des logs (access, error, app)

Format du fichier manifest

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"
  }
}

Champs du manifest

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

Exemples par container

needfinder-collector

{
  "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"
  }
}

baserow

{
  "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
  }
}

nextcloud (via nextcloud-cron)

{
  "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
  }
}

Intégration dans collect.sh

# 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
}

Où placer le fichier dans les projets

/app/
├── src/
├── package.json
├── Dockerfile
└── scheduler.json     # ← À la racine de l'app

Dans le Dockerfile :

COPY scheduler.json /app/scheduler.json

Plan d'implémentation

  1. Créer le fichier template scheduler.json.template dans 33800-stack
  2. Ajouter à needfinder-collector (premier test)
  3. Ajouter à baserow, nextcloud-cron si pertinent
  4. Modifier collect.sh pour détecter ces manifests
  5. Modifier generate.sh pour afficher dans le dashboard

Validation