Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 36 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ regex = "1.12"
url = "2.5.8"
uuid = { version = "1.23", features = ["v4", "serde"] }
chrono = { version = "0.4.44", features = ["serde"] }
# IANA zone database, for evaluating cron schedules in the operator's
# local time instead of UTC (#1042). Pure data + arithmetic — no I/O, so
# it's admissible in the pure-domain `ruscker-config` crate.
chrono-tz = "0.10"
dashmap = "6.2"
ordered-float = { version = "5.3", features = ["serde"] }

Expand Down
14 changes: 10 additions & 4 deletions book/src/admin.md
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,13 @@ nothing to run.
Semantics worth knowing:

- **No run on creation.** A new schedule waits for its next cron
occurrence (times are UTC).
occurrence.
- **Which clock.** Cron expressions are evaluated in `server.timezone`
(an IANA name like `America/Recife` in `ruscker.yml`), and the
next/last run columns are shown in that same zone, labelled with it.
Unset ⇒ **UTC**, the historical behaviour — so `0 8 * * *` fires at
08:00 UTC until you configure a zone. Setting one shifts existing
schedules by your offset; review them afterwards.
- **Downtime collapses.** If the server was down across several
occurrences, the schedule fires **once** on the next tick — ETL
semantics, not a message queue.
Expand Down Expand Up @@ -450,9 +456,9 @@ too; rows with a change diff expand to show it.

Timestamps are stored in UTC and rendered in **your browser's timezone**, so
two operators in different zones each read the local wall clock of the same
event. Hovering a timestamp shows the full date with the zone name. (The
scheduler's own times — next occurrence and last run on the Schedules page —
are still labelled UTC.)
event. Hovering a timestamp shows the full date with the zone name. (The Schedules page is
deliberately different: those times are when the *server* will fire a job,
so they follow `server.timezone` — see the Schedules section.)

### System

Expand Down
1 change: 1 addition & 0 deletions crates/ruscker-admin/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ serde = { workspace = true }
serde_json = { workspace = true }
serde_yaml_ng = { workspace = true }
chrono = { workspace = true }
chrono-tz = { workspace = true }
regex = { workspace = true }
url = { workspace = true }
uuid = { workspace = true }
Expand Down
2 changes: 1 addition & 1 deletion crates/ruscker-admin/assets/i18n/en/landing.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -993,7 +993,7 @@ admin-schedules-subtitle = Run an app's image to completion on a cron schedule (
admin-schedules-create = New schedule
admin-schedules-spec = App
admin-schedules-cron = Cron
admin-schedules-cron-help = Standard 5-field cron, UTC. Examples: "0 3 * * *" = every day at 03:00; "*/15 * * * *" = every 15 minutes.
admin-schedules-cron-help = Standard 5-field cron, in the server timezone. Examples: "0 3 * * *" = every day at 03:00; "*/15 * * * *" = every 15 minutes.
admin-schedules-cmd = Command
admin-schedules-cmd-help = One line per argument (argv). Empty = the app's own command (its container-cmd, else the image's CMD).
admin-schedules-timeout = Timeout (minutes)
Expand Down
2 changes: 1 addition & 1 deletion crates/ruscker-admin/assets/i18n/es/landing.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -993,7 +993,7 @@ admin-schedules-subtitle = Ejecuta la imagen de una app hasta terminar según un
admin-schedules-create = Nueva programación
admin-schedules-spec = App
admin-schedules-cron = Cron
admin-schedules-cron-help = Cron estándar de 5 campos, en UTC. Ejemplos: "0 3 * * *" = cada día a las 03:00; "*/15 * * * *" = cada 15 minutos.
admin-schedules-cron-help = Cron estándar de 5 campos, en el huso horario del servidor. Ejemplos: "0 3 * * *" = cada día a las 03:00; "*/15 * * * *" = cada 15 minutos.
admin-schedules-cmd = Comando
admin-schedules-cmd-help = Un argumento por línea (argv). Vacío = el comando de la propia app (su container-cmd, si no el CMD de la imagen).
admin-schedules-timeout = Timeout (minutos)
Expand Down
2 changes: 1 addition & 1 deletion crates/ruscker-admin/assets/i18n/fr/landing.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -993,7 +993,7 @@ admin-schedules-subtitle = Exécute l'image d'une app jusqu'au bout selon un hor
admin-schedules-create = Nouvelle planification
admin-schedules-spec = App
admin-schedules-cron = Cron
admin-schedules-cron-help = Cron standard à 5 champs, en UTC. Exemples : "0 3 * * *" = chaque jour à 03:00 ; "*/15 * * * *" = toutes les 15 minutes.
admin-schedules-cron-help = Cron standard à 5 champs, dans le fuseau horaire du serveur. Exemples : "0 3 * * *" = chaque jour à 03:00 ; "*/15 * * * *" = toutes les 15 minutes.
admin-schedules-cmd = Commande
admin-schedules-cmd-help = Un argument par ligne (argv). Vide = la commande de l'app elle-même (son container-cmd, sinon le CMD de l'image).
admin-schedules-timeout = Timeout (minutes)
Expand Down
2 changes: 1 addition & 1 deletion crates/ruscker-admin/assets/i18n/pt/landing.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -997,7 +997,7 @@ admin-schedules-subtitle = Executa a imagem de um app até o fim em um horário
admin-schedules-create = Novo agendamento
admin-schedules-spec = App
admin-schedules-cron = Cron
admin-schedules-cron-help = Cron padrão de 5 campos, em UTC. Exemplos: "0 3 * * *" = todo dia às 03:00; "*/15 * * * *" = a cada 15 minutos.
admin-schedules-cron-help = Cron padrão de 5 campos, no fuso horário do servidor. Exemplos: "0 3 * * *" = todo dia às 03:00; "*/15 * * * *" = a cada 15 minutos.
admin-schedules-cmd = Comando
admin-schedules-cmd-help = Um argumento por linha (argv). Vazio = o comando do próprio app (o container-cmd, senão o CMD da imagem).
admin-schedules-timeout = Timeout (minutos)
Expand Down
Loading