183 lines
2.7 KiB
Markdown
183 lines
2.7 KiB
Markdown
# Cron API
|
|
|
|
Ripster enthält ein eingebautes Cron-System für Skripte und Skript-Ketten (`sourceType: script|chain`).
|
|
|
|
---
|
|
|
|
## GET /api/crons
|
|
|
|
Listet alle Cron-Jobs.
|
|
|
|
```json
|
|
{
|
|
"jobs": [
|
|
{
|
|
"id": 1,
|
|
"name": "Nachtlauf Backup",
|
|
"cronExpression": "0 2 * * *",
|
|
"sourceType": "script",
|
|
"sourceId": 3,
|
|
"sourceName": "Backup-Skript",
|
|
"enabled": true,
|
|
"pushoverEnabled": true,
|
|
"lastRunAt": "2026-03-10T02:00:00.000Z",
|
|
"lastRunStatus": "success",
|
|
"nextRunAt": "2026-03-11T02:00:00.000Z",
|
|
"createdAt": "2026-03-01T10:00:00.000Z",
|
|
"updatedAt": "2026-03-10T02:00:05.000Z"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## POST /api/crons
|
|
|
|
Erstellt Cron-Job.
|
|
|
|
```json
|
|
{
|
|
"name": "Nachtlauf Backup",
|
|
"cronExpression": "0 2 * * *",
|
|
"sourceType": "script",
|
|
"sourceId": 3,
|
|
"enabled": true,
|
|
"pushoverEnabled": true
|
|
}
|
|
```
|
|
|
|
Response: `201` mit `{ "job": { ... } }`
|
|
|
|
---
|
|
|
|
## GET /api/crons/:id
|
|
|
|
Response:
|
|
|
|
```json
|
|
{ "job": { "id": 1, "name": "..." } }
|
|
```
|
|
|
|
---
|
|
|
|
## PUT /api/crons/:id
|
|
|
|
Aktualisiert Cron-Job. Felder wie bei `POST`.
|
|
|
|
Response:
|
|
|
|
```json
|
|
{ "job": { ... } }
|
|
```
|
|
|
|
---
|
|
|
|
## DELETE /api/crons/:id
|
|
|
|
Response:
|
|
|
|
```json
|
|
{ "removed": { "id": 1, "name": "Nachtlauf Backup" } }
|
|
```
|
|
|
|
---
|
|
|
|
## GET /api/crons/:id/logs
|
|
|
|
Liefert Ausführungs-Logs.
|
|
|
|
**Query-Parameter:**
|
|
|
|
| Parameter | Typ | Default | Beschreibung |
|
|
|-----------|-----|---------|-------------|
|
|
| `limit` | number | `20` | Anzahl Einträge, max. `100` |
|
|
|
|
**Response:**
|
|
|
|
```json
|
|
{
|
|
"logs": [
|
|
{
|
|
"id": 42,
|
|
"cronJobId": 1,
|
|
"startedAt": "2026-03-10T02:00:01.000Z",
|
|
"finishedAt": "2026-03-10T02:00:05.000Z",
|
|
"status": "success",
|
|
"output": "Backup abgeschlossen.",
|
|
"errorMessage": null
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
`status`: `running` | `success` | `error`
|
|
|
|
---
|
|
|
|
## POST /api/crons/:id/run
|
|
|
|
Triggert Job manuell (asynchron).
|
|
|
|
**Response:**
|
|
|
|
```json
|
|
{ "triggered": true, "cronJobId": 1 }
|
|
```
|
|
|
|
Wenn Job bereits läuft: `409`.
|
|
|
|
---
|
|
|
|
## POST /api/crons/validate-expression
|
|
|
|
Validiert 5-Felder-Cron-Ausdruck und berechnet nächsten Lauf.
|
|
|
|
**Request:**
|
|
|
|
```json
|
|
{ "cronExpression": "*/15 * * * *" }
|
|
```
|
|
|
|
**Gültige Response:**
|
|
|
|
```json
|
|
{
|
|
"valid": true,
|
|
"nextRunAt": "2026-03-10T14:15:00.000Z"
|
|
}
|
|
```
|
|
|
|
**Ungültige Response:**
|
|
|
|
```json
|
|
{
|
|
"valid": false,
|
|
"error": "Cron-Ausdruck muss genau 5 Felder haben (Minute Stunde Tag Monat Wochentag).",
|
|
"nextRunAt": null
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Cron-Format
|
|
|
|
Ripster unterstützt 5 Felder:
|
|
|
|
```text
|
|
Minute Stunde Tag Monat Wochentag
|
|
```
|
|
|
|
Beispiele:
|
|
|
|
- `0 2 * * *` täglich 02:00
|
|
- `*/15 * * * *` alle 15 Minuten
|
|
- `0 6 * * 1-5` Mo-Fr 06:00
|
|
|
|
---
|
|
|
|
## WebSocket-Events zu Cron
|
|
|
|
- `CRON_JOBS_UPDATED` bei Create/Update/Delete
|
|
- `CRON_JOB_UPDATED` bei Laufzeitstatus (`running` -> `success|error`)
|