# Installation

> Schritt-für-Schritt-Installation und Trigger-Setup

---

1. Modulordner nach `modules_v4/cronjob/` kopieren (ZIP-Installation geht auch). Die Cron-Bibliothek ist im Modul enthalten — nichts zu holen.
2. Webtrees einmal öffnen (irgendeine Seite als Admin), damit das Modul-`boot()` seine Tabellen erstellt.
3. Trigger installieren (klassisches Cron, systemd-Timer oder Windows Task Scheduler — die Admin-Seite des Moduls generiert den Block für Ihr OS mit den Pfaden *dieser* Installation bereits ausgefüllt).
4. Trigger-Installation (einmalig) — siehe unten.
5. Erstellen Sie Ihren ersten Job in der Admin-UI oder konfigurieren und aktivieren Sie registrierte Jobs.

## Trigger-Installation (einmalig)

![Installation](img/cj/installation.png)

> **Wichtig — PHP-CLI-Binary:** Die *Installation*-Akkordeon auf der Admin-Seite zeigt, welcher PHP-CLI-Interpreter derzeit aufgelöst wird (Badge: *auto-erkannt* / *manueller Pfad*) und erlaubt das Festpinnen eines manuellen Pfads.

Es ist wichtig zu prüfen, ob Ihr Webserver eine PHP-CLI-Binary (SAPI) bereitstellt und ob das Modul korrekt konfiguriert ist, um sie zu verwenden. Andernfalls wird **Tick** nicht funktionieren.

Der Tick ist so konzipiert, dass er alle 60 Sekunden läuft. Er erfasst Cron-Jobs, Commands und Events, triggert Events und verarbeitet die Task-Queue.

Wählen Sie **eine** der auf der Admin-Seite gezeigten Optionen:

### Option A — klassisches Cron

Eine Zeile in der Crontab des Webserver-Nutzers, läuft jede Minute:

```
* * * * * cd "/path/to/webtrees" && mkdir -p data/cronjob && "/usr/bin/php" modules_v4/cronjob/cli/tick.php cron:tick >> "/path/to/webtrees/data/cronjob/tick.log" 2>&1
```

### Option B — systemd-Timer

Zwei Unit-Dateien (werden auch auf der Admin-Seite angezeigt):

```ini
# /etc/systemd/system/cronjob-tick.service
[Unit]
Description=webtrees cronjob module tick (runs due maintenance jobs)

[Service]
Type=oneshot
User=<webserver-user>
WorkingDirectory="/path/to/webtrees"
ExecStart="/usr/bin/php" ./modules_v4/cronjob/cli/tick.php cron:tick
```

```ini
# /etc/systemd/system/cronjob-tick.timer
[Unit]
Description=Run the webtrees cronjob tick every minute

[Timer]
OnBootSec=1min
OnCalendar=*:*:00
Persistent=true

[Install]
WantedBy=timers.target
```

```bash
sudo systemctl daemon-reload
sudo systemctl enable --now cronjob-tick.timer
```

### Option C — Watch-Daemon (kein OS-Timer)

Klicken Sie *Start watch* auf der Admin-Seite. Ein Resident-Prozess führt den Tick alle 60 Sekunden aus, und ein Page-Load-Watchdog startet ihn neu, falls er stirbt. Verwenden Sie es, wenn der Host kein Cron und keinen systemd-Zugriff hat, oder für Tests — auf Windows-Hosts ist dies die einfachste Option.




<pre class="mermaid">stateDiagram-v2
    [*] --&gt; Stopped: (initial)
    Stopped --&gt; Running: Watch starten (Admin-UI)
    Running --&gt; TickLoop: tick alle 60 s
    TickLoop --&gt; TickLoop: Job ausführen
    TickLoop --&gt; Dead: ⚠ Prozess stirbt
    Dead --&gt; Running: 🔄 Watchdog respawn&lt;br/&gt;(nächster Page-Load&lt;br/&gt;Cooldown 5 min)
    Running --&gt; Stopped: Watch stoppen
    Dead --&gt; Stopped: Watch stoppen&lt;br/&gt;(kein Respawn)

    note right of Running
        🔒 Hält data/cronjob/watch.lock
        🆔 PID sichtbar in Admin-UI
        🛡 Überlebt FPM-Worker-Recycle (setsid)
    end note
</pre>

### Option D — Windows Task Scheduler

Die Admin-Seite generiert das XML mit bereits ausgefüllten Pfaden. Speichern Sie es als `wt-cronjob-tick.xml` (UTF-8) und führen Sie `schtasks /Create /F /XML wt-cronjob-tick.xml` einmal in einer erhöhten Eingabeaufforderung aus.
