[TUT] Cronicle - Aufgabenplaner für Cronjobs

  • Alles Screenshots in diesem Tutorial stammen aus meiner eigenen Testumgebung. Der gesamte Text wurde eigenständig verfasst. Codepassagen stammen zum Teil von der GitHub Seite github.com/soulteary/docker-cronicle.
    Yes

    Liebe Forengemeinde,
    da der fehlende Aufgabenplaner in UGOS Pro immer wieder ein Thema ist, stelle ich in diesem Tutorial eine Anleitung zur Verfügung, mit welcher Ihr einen solchen mit dem Tool "Cronicle" auf Eurem NAS installieren könnt. An dieser Stelle sei gesagt, dass es in vereinzelten Threads zwar bereits Informationen dazu gibt, jedoch keine zusammenfassende Schritt-für-Schritt-Anleitung, welche auch für Anfänger einfach nachvollziehbar wäre.

    Voraussetzung zur Umsetzung ist, wie in allen meinen Tutorials, die Verwendung von Portainer.
    An dieser Stelle nochmals ein großes DANKE an unser Mitglied @florian-muc, der Cronicle hier im Forum erstmals ins Spiel gebracht hat.

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    Anleitung:

    1. Dateimanager öffnen
    2. In den Ordner docker wechseln
    3. Erstellen des Ordners cronicle
    4. In den Ordner cronicle wechseln
    5. Erstellen folgender vier Unterordner: conf data logs plugins

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    6. In den Ordner conf wechseln und folgenden Unterordner erstellen: emails

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    7. Dateimanager schließen
    8. Das Zip-Archiv cronicle.zip aus der Filebase herunterladen und dieses extrahieren

    Willi
    October 19, 2025 at 2:58 PM


    9. Kopiere die Dateien job_fail.txt und job_success.txt in den Ordner emails
    10. Generieren einer zufälligen 128-stelligen Zeichenfolge, z.B. mit den IT-Tools-Token-Generator

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    11. Anschließend durch einen Klick auf "Copy" in die Zwischenablage kopieren
    12. Öffnen der Datei stack.env in einem Texteditor
    13. Anschließend alle Parameter in dieser Datei pflegen

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    14. Speichern und schließen der Datei stack.env
    15. Öffnen der Datei Datei cronicle.yml und editieren aller kommentierten Stellen, anschließend speichern
    16. Portainer öffnen und einloggen
    17. "Live Connect" anklicken

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    18. Im linken Menü auf den Punkt Networks und danach rechts auf "+ Add network" klicken

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    19. Bei "Name" cronicle_default eingeben, ansonnsten nichts ändern

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    20. Ganz nach unten scrollen und auf "Create the network" klicken

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    21. Im linken Menü auf den Punkt "Stacks" klicken und danach rechts auf "+ Add Stack"

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    22. Unter Name nun cronicle (oder einen Namen eurer Wahl) eingeben

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    23. Nun den gesamten Inhalt der Datei cronicle.yml kopieren und in den darunterliegenden "Web editor" einfügen

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    24.Schließen der Datei cronicle.yml
    25. Nach unten scrollen und auf "Load variables from .env file" klicken

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    26. Nun zum Speicherpfad der Datei stack.env navigieren, diese auswählen und auf "Öffnen" klicken

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    27. Alle Variablen werden nun geladen, dies dauert nur eine Sekunde
    28. Anschließend etwasnach unten scrollen und auf "Deploy the stack" klicken

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    29. Das Image wird und heruntergeladen und mit allen angegebenen Parametern installiert, dies dauert ein paar Minuten
    30. Klicke im linken Menü auf "Container", cronicle sollte im linken Bereich nun mit dem Status "healthy" angezeigt werden

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    31. Anschließend kann "Cronicle" wie folgt aufgerufen werden: http://ip-deines-nas:3012 (z.B. http://192.168.178.95:3012)

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    32. Der Standard-Login lautet wie folgt: Benutzername = admin, Passwort = admin
    33. Das Passwort sollte nach dem ersten Login unbedingt unter "My account" geändert werden

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    Lass uns nun testen, ob alles wie gewünscht funktioniert, erstellen wir dazu unseren ersten Cronjob...

    1. Klicke im Head-Menü auf "Schedule" und danach auf "+ Add event"

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    2. Fülle folgende Parameter für einen Test wie folgt aus, ersetze die E-Mail-Adresse unter "Notification" durch deine Eigene

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    3. Klicke danach auf "Create event"
    4. Klicke danach auf "Run", bei Erfolg sollte "Success" angezeigt werden und du solltest eine E-Mail erhalten haben

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    6. Unter "History" kannst du den Log zur Ausführung anzeigen

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.


    7. FERTIG - Wenn alles geklappt hat, bist du startklar!

    Wichtige Hinweise:

    1. In der Datei cronicle.yml haben wir die Laufwerke wie folgt gemappt:

    Code
    volumes:
    	- /volume1:/app/volume1
    	- /volume2:/app/volume2

    Dies bedeutet, dass wir uns bei der Erstellung von Scripts immer auf app/volume1 bzw. /app/volume2 beziehen müssen, wenn Operationen auf diesen Laufwerken durchgeführt werden sollen.

    2. Die Dateien job_fail.txt und job_success.txtim Ordner emails können nach Belieben editiert und an eure jeweiligen Vorlieben, wie die Benachrichtigungs-E-Mails auszusehen haben, angepasst werden.

    Weiterführende Links:

  • Moin Moin,

    vielen herzlichen Dank für das ausführliche Tutorial.

    Ich würde gerne die Anleitung ohne Portainer nutzen, sondern mit der Docker App von Ugreen. Weiß jemand zufällig, wie ich dann die stack.env Variabel laden kann? Ich habe in einem Video gesehen, wo diese Datei einfach in das entsprechende Verzeichnis gelegt wird, aber irgendwie hat er beim erstellen die Daten nicht geladen. Dann habe ich die Infos einfach in die YAML Datei reingeschrieben und das Projekt neu erstellt. Nun weiß ich natürlich nicht, ob der die Daten auch gezogen hat, bei der Neuerstellung. kann ich das irgendwo einsehen?

    Dabei ist mir folgendes noch aufgefallen: Gehört das SRV-WirZwei vor der eMail Adresse?

    - CRONICLE_email_from=SRV-WirZwei <${C_SMTP_USER}>

    Mein System:

    DXP4800Plus, 2× 1TB Lexar NM790, 3x Toshiba 8TB MG10ADA800E, 2x 32GB Crucial DDR5 - 5600 S0DIMM CT32G56C46S5, UGOS 1.14.1.0107
    DS918+, 12GB RAM, Volume1 -> 3x 4TB WD RED WD40EFRX / 1x 4TB WD RED WD40EFAX, Volume2 -> 1x 500GB NVMe M.2 Crucial CT500P1SSD8
    Fritzbox 7590 mit OS 8.x mit Wireguard, TNG Glasfaser, Linux Mint 22.x / Ubuntu - Server 24.x

  • Das mit env-Datei im selben Ordner kenne ich bei der Umsetzung über Docker Compose. Ob es die Ugreen App, als reine(?) GUI auch so umsetzt, weiß ich nicht.

    Bei meinen ganzen Stacks über die Docker App hab ich die env-Daten in der yaml und es funktioniert alles. Grundsätzlich werden sie also umgesetzt.

    Werde mich spätestens morgen auch mal an Cronicle machen. Mal schauen, ob ich drüber stolpere. ;)

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • Gehört das SRV-WirZwei vor der eMail Adresse?

    - CRONICLE_email_from=SRV-WirZwei <${C_SMTP_USER}>

    Nein, das gehört nicht vor die eMail-Adresse, das ist ein Relikt aus meiner Testumgebung. Statt SRV-WirZwei solltest du den Hostnamen deines NAS eintragen. Ich werde die Yaml dahingehend zeitnahe korrigieren.

    PS: Die fehlende Import-Funktion von Umgebungsvariablen in der regulären GUI ist u.a. einer der Gründe, weshalb ich die Verwendung von Portainer empfehle. Ich trenne sensible Daten ganz gerne vom Code (YAML), daher in diesem Falle auch die exklusive stack.env. Aber natürlich könnte man in der YAML auch alle Variablen im Klartext angeben.

  • Das hat mich jetzt doch neugierig gemacht. Im Zusammenhang mit der Immich-Installation unter UGOS, bin ich über diesen Artikel gestolpert, in dem es auch um die Integration der env-Daten ging.

    Im Verlauf kam der Hinweis für die yaml (ich hab's zu Verdeutlichung angepasst):

    Code
    env_file:
          - deinedaten.env

    Laut Rückmeldung klingt es so, dass es auch mit der hauseigenen Docker App funktioniert hat.

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • Die App wird doch auch nur ein Wrapper für Docker bzw. Docker Compose sein. Daher wird sich das auch genau so verhalten wie Docker bzw. Docker Compose.

  • Jo,

    ich hatte das hier gesehen: This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    und mit deinem Hinweis weiß ich jetzt auch, warum das nicht geklappt hatte:

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    Ich hatte den Verweis auf das env_file nicht gesehen. Werde das nochmal anpassen.


    Danke für den Hinweis :)

    Mein System:

    DXP4800Plus, 2× 1TB Lexar NM790, 3x Toshiba 8TB MG10ADA800E, 2x 32GB Crucial DDR5 - 5600 S0DIMM CT32G56C46S5, UGOS 1.14.1.0107
    DS918+, 12GB RAM, Volume1 -> 3x 4TB WD RED WD40EFRX / 1x 4TB WD RED WD40EFAX, Volume2 -> 1x 500GB NVMe M.2 Crucial CT500P1SSD8
    Fritzbox 7590 mit OS 8.x mit Wireguard, TNG Glasfaser, Linux Mint 22.x / Ubuntu - Server 24.x

  • Im Zusammenhang mit dieser Thematik, hier mal eine "Docker App-konforme" Variante ohne .env-file.

    Die Docker-App setzte das cronicle_default Netzwerk nicht um, das habe ich händisch angelegt. Danach lief die yaml fehlerfrei durch.

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • Im Zusammenhang mit dieser Thematik, hier mal eine "Docker App-konforme" Variante ohne .env-file.

    Die Docker-App setzte das cronicle_default Netzwerk nicht um, das habe ich händisch angelegt. Danach lief die yaml fehlerfrei durch.

    Aber in dem TUT von Willi legt er das Netzwerk ja auch händisch in Portainer an, und sagt dem Container dann, das er das Netzwerk nehmen soll.

    Ich habe das Netzwerk in der Docker App ganz normal unter Netzwerk angelegt:

    This image is exclusive to our members!
    Please log in or register for free to view graphics and attachments.

    Mein System:

    DXP4800Plus, 2× 1TB Lexar NM790, 3x Toshiba 8TB MG10ADA800E, 2x 32GB Crucial DDR5 - 5600 S0DIMM CT32G56C46S5, UGOS 1.14.1.0107
    DS918+, 12GB RAM, Volume1 -> 3x 4TB WD RED WD40EFRX / 1x 4TB WD RED WD40EFAX, Volume2 -> 1x 500GB NVMe M.2 Crucial CT500P1SSD8
    Fritzbox 7590 mit OS 8.x mit Wireguard, TNG Glasfaser, Linux Mint 22.x / Ubuntu - Server 24.x

  • deltapapa mag sein, dass ich das überlesen habe. Schön, aber zur selben Erkenntnis gekommen zu sein. ;)

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • Ich finde die Docker App auch wesentlich schneller als Portainer, oder meine 64GB RAM Warp 1 Maschine flash mich da noch immer total (laufen Syno's eigentlich noch mit Damp oder sind die schon auf Diesel umgestiegen, hüstl :)

    Mein System:

    DXP4800Plus, 2× 1TB Lexar NM790, 3x Toshiba 8TB MG10ADA800E, 2x 32GB Crucial DDR5 - 5600 S0DIMM CT32G56C46S5, UGOS 1.14.1.0107
    DS918+, 12GB RAM, Volume1 -> 3x 4TB WD RED WD40EFRX / 1x 4TB WD RED WD40EFAX, Volume2 -> 1x 500GB NVMe M.2 Crucial CT500P1SSD8
    Fritzbox 7590 mit OS 8.x mit Wireguard, TNG Glasfaser, Linux Mint 22.x / Ubuntu - Server 24.x

  • Das macVLAN lässt sich auch einfach damit umsetzen (brauche es selbst nicht, hab's ausprobiert) und wenn's dann noch die "env-Funktionalität" bekommt, ist wirklich alles fein.

    Na gut, eine Export-Sicherungsfunktion wäre nice to have, aber dafür gibt's auch andere Lösungen.

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • Moin Moin,

    Feiertag, Basteltag :) Wie früher mit Lego, kann es morgens gar nicht erwarten aufzustehen und einfach Dinge auszuprobieren, ob sie klappen oder nicht. TOTAL verrückt.

    Naja, zum Thema. Ich habe das YAML File jetzt so umgebaut. Im Prinzip habe ich die enviroment Aufrufe aus der YAML rausgenommen.

    Code
        env_file: docker-compose.env
        environment:
          - TZ=Europe/Berlin     
          - CRONICLE_base_app_url=http://192.168.10.20:3012
          - CRONICLE_mail_options__secure=true
          - CRONICLE_queue_dir=/opt/cronicle/data/queue

    Die docker-compose.env liegt bei dem yaml File im gleichen Verzeichnis, das könnte man sicher woanders hinlegen und unter
    env_file: DerPfadZuDeinemEnvFile/docker-compose.env
    entsprechend aufrufen. habe ich aber nicht getestet. Auch könnte man die env Datei sicher anders benennen. Habe ich aber auch nicht getestet.

    Jetzt zum Inhalt. Ich habe erst versucht, es so wie Willi mit Variable zu machen. Leider werden die Variable aber nicht von der Docker App eingelesen. Zum Beispiel habe ich den ursprünglichen Aufruf

    Code
          - CRONICLE_email_from=kontakt@deltapapa.de

    ersetzt durch

    Code
          - CRONICLE_email_from=${Email_From}

    Dann habe ich in der .env Datei folgendes Aufgerufen:

    Code
           Email_From=kontakt@deltapapa.de

    Damit kommt die Docker App aber leider nicht klar, die Variable Email_From wird nicht ausgelesen.

    Wenn ich jetzt jedoch den Aufruf in der YAML einfach weglasse, und diesen Aufruf direkt in der docker-compose.env Datei schreibe funktioniert es hervorragend:

    Code
    CRONICLE_email_from=kontakt@deltapapa.de

    Für mich gehupt wie gesprungen, damit kann ich leben. Aber warum die Variabel nicht gelesen werden, ist mir leider ein Rätsel, habe dazu aber einige Forum - Beiträge gefunden, die jedoch häufig die Syno betrafen.

    In diesem Sinne, schönen Feiertag und Happy Halloween 🎃👻,

    deltapapa


    Und weil es so schön ist, mache ich es wie Tommes und veröffentliche meine docker-compose Files auch für euch auf GitHub:

    GitHub - deltapapa01/Docker_DXP4800PLUS
    Contribute to deltapapa01/Docker_DXP4800PLUS development by creating an account on GitHub.
    github.com
    Mein System:

    DXP4800Plus, 2× 1TB Lexar NM790, 3x Toshiba 8TB MG10ADA800E, 2x 32GB Crucial DDR5 - 5600 S0DIMM CT32G56C46S5, UGOS 1.14.1.0107
    DS918+, 12GB RAM, Volume1 -> 3x 4TB WD RED WD40EFRX / 1x 4TB WD RED WD40EFAX, Volume2 -> 1x 500GB NVMe M.2 Crucial CT500P1SSD8
    Fritzbox 7590 mit OS 8.x mit Wireguard, TNG Glasfaser, Linux Mint 22.x / Ubuntu - Server 24.x

    Edited once, last by deltapapa: Ein Beitrag von deltapapa mit diesem Beitrag zusammengefügt. (October 31, 2025 at 8:00 AM).

  • deltapapa solange sich die Docker-App halbwegs an den Standard hält (s.o.), muss die .env im selben Verzeichnis liegen. Ansonsten bräuchte es eine Importfunktion wie unter Portainer.

    Gibt aktuell also nur zwei Varianten

    1. yaml + env: nur über Container Erstellung, dann mit Variablen möglich
    2. Docker App Project: yaml mit eingebetteten Environments

    warum die Variabel nicht gelesen werden

    Erklärung s.o. Support

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • *kw*

    Hello, also ich habe wie in 2 deiner Varianten ja ein Projekt angelegt, nutze die .env Datei, nur geht eben die Umsetzung mit Variabel nicht. Aber im Kern, die sensiblen Daten aus der YAML Datei zu nehmen, funktioniert ja ohne Probleme, und mehr wollte ich nicht.

    Mein System:

    DXP4800Plus, 2× 1TB Lexar NM790, 3x Toshiba 8TB MG10ADA800E, 2x 32GB Crucial DDR5 - 5600 S0DIMM CT32G56C46S5, UGOS 1.14.1.0107
    DS918+, 12GB RAM, Volume1 -> 3x 4TB WD RED WD40EFRX / 1x 4TB WD RED WD40EFAX, Volume2 -> 1x 500GB NVMe M.2 Crucial CT500P1SSD8
    Fritzbox 7590 mit OS 8.x mit Wireguard, TNG Glasfaser, Linux Mint 22.x / Ubuntu - Server 24.x

    Edited once, last by Willi: Vollkommentar entfernt (October 31, 2025 at 8:22 AM).

  • :thumbup:

    Ich dachte nur, du wolltest den Feiertag dazu nutzen, der Docker App auf irgendeine andere Art und Weise einzutrichtern, die .env über die Datei einzulesen. Quasi untauglicher Versuch am untauglichen Objekt. 😂

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • es heißt Cronicle

    Meine Hardware

    iDX6011 Pro in Späh ^^

    DXP4800+ 2x8TB WDRedPl Btrfs Raid1 2x 2TB Lexar NM790 Raid1, 64GB RAM Kingst. KVR48S40BD8-32 DDR5/4800MH

    DXP2800 1x 12TB Seag. 1x 12TB WDRedPl, Raid1 Btrfs 16GB RAM Cruc. CT16G56C46S5.C8B2, 2x NVME Samsg,

    DS1525+ 2x8TB WD, Btrfs SHR, 2x 2TB NVME Lexar NM790 Raid1. 40GB ECC RAM_Speicher.de

    DS920+ DSM 7.3.2 Btrfs Raid1 2x8TB WD, 2x2TB Samsg. 970 EVOPlus, RAM 20GB DDR4-2666MHZ Speicher.de

    USV US3000, EatonEllip.PRO 850DIN, Switch Zyxel GS1200-8 1GB, Zyxel XMG-108 8 x 2,5GB

Participate now!

Join our community with over 10,000 members!

Register yourself now for free to get full access to all content, graphics, downloads and other exclusive features!