Jede Komponente — und wo sie läuft

EU-gehostet auf einer Hetzner-VM in Deutschland, hinter Cloudflare. Das gesamte System passt in eine Ansicht — und die einzigen Unterauftragsverarbeiter sind Cloudflare, Paddle und SMTP2GO.

Clients

Browser

steadycron.com

Landingpage & Doku

Browser

app.steadycron.com

Dashboard-Oberfläche

CLI / scripts

api.steadycron.com

REST + Manifeste

Your cron

ping.steadycron.com

Heartbeat-Pings

Cloudflare

DNS · TLS · WAF · CDN

Edge-Proxy, Firewall und Rate-Limiting vor allem anderen.

Cloudflare Pages

Astro · static

Diese Landingpage, am Edge ausgeliefert — erreicht die VM nie.

Caddy

reverse proxy

Auf der VM: automatisches TLS, leitet app. / api. / ping. an die Container.

Hetzner-VM · Deutschland · Docker Compose

Dashboard

steadycron-dashboard

Next.js. Authentifizierte UI; ruft die API über das interne Netz auf.

API + Ping

steadycron-api · .NET

REST · Ping-Ingest · Cron-Vorschau · Template-Variablen · Aktivität · Admin.

steadycron-scheduler · Quartz.NET clustered

HTTP executor

Polly · SSRF guard

Führt die geplanten HTTPS-Aufrufe aus — Retries, Timeouts, Redirect-Prüfung.

Heartbeat watcher

30s tick

Erkennt verpasste und hängende Läufe anhand der Kulanzzeit.

Alert dispatcher

outbox · NOTIFY

Leert die Outbox; formt, stellt zu und wiederholt Alerts.

Background workers

×4 services

Delivery-Flush, Anomalie-Erkennung, Retention-Prune, Paddle-Abgleich.

PostgreSQL 17

app · Quartz · outbox

Eine Instanz für alles. LISTEN/NOTIFY ersetzt einen Broker — kein Redis.

Backups

nightly · encrypted

Verschlüsselter pg_dump, extern gespeichert; vierteljährliche Restore-Tests.

Externe Dienste & Ihre Systeme

Your endpoints

the jobs we call

Ihre HTTPS-Handler, planmäßig aufgerufen.

Alert channels

Slack · Discord · …

Telegram, Webhook, E-Mail — nur ausgehend.

Paddle

billing · MoR

Merchant of Record — übernimmt die Steuer. Keine Kartendaten hier.

SMTP2GO

email

Verifizierung, Passwort-Reset und E-Mail-Alerts.

Observability · OpenTelemetry → selbstgehostetes Grafana Infrastructure-as-Code · Terraform (Cloudflare + Hetzner) Scheduling · Quartz.NET geclustert (AdoJobStore)

HTTP-Job-Ausführung

Wir rufen Ihren Endpunkt planmäßig auf; Sie kümmern sich um den Handler. Ein echter Request-Builder — keine bloße URL-Zeile — mit den Kontrollen, die Sie sich um System-Cron sonst selbst bauen müssten.

  • Jede Methode — GET, POST, PUT, PATCH, DELETE — mit eigenen Headern und JSON-Body
  • Template-Variablen: {{var}} in URL, Header oder Body — serverseitig zur Laufzeit aufgelöst
  • Jobs mit Tags wie env:prod oder team:backend ordnen, dann das Dashboard danach gruppieren und filtern
  • Konfigurierbare Wiederholungen mit exponentiellem Backoff — und nur bei den Statuscodes Ihrer Wahl
  • Timeout pro Job plus „überspringen, wenn noch läuft“ — ein langsamer Lauf überlappt nie den nächsten
  • Zeitzone pro Job mit korrekter Sommerzeit — in Ortszeit planen, ganzjährig korrekt ausführen
  • Jeder Lauf vollständig protokolliert: Antwortstatus, Body und Dauer, revisionssicher aufbewahrt
  • Jetzt ausführen, pausieren oder fortsetzen — oder den ganzen Job per YAML oder CLI synchronisieren
app.steadycron.com/jobs/new
invoice-send

Request

Configure the HTTP request sent on each execution. Use {{variable}} for template substitution.

POST
{{baseUrl}}/v1/invoices/{{invoiceId}}/send
Send
Params Headers 1 Body

Headers

Authorization Bearer {{apiToken}}
Body raw · JSON
{
  "account_id": "{{accountId}}",
  "amount_cents": 4900,
  "send_email": true
}

Valid JSON

Schedule

When it runs — cron or interval, with DST-correct timezones and a live next-runs preview.

Cron Interval

Cron expression

0 9 * * 1-5

Weekdays at 09:00

Timezone

Europe/Berlin

Next runs

Mon 09:00Tue 09:00Wed 09:00Thu 09:00
timeout 30sretries 3skip if still running

Heartbeat-Monitoring

Überwachen Sie die Cronjobs, die Sie ohnehin schon betreiben — egal wo. Ihr Job pingt uns; wir behalten die Uhr im Blick. Bleibt der Ping aus — Prozess abgestürzt, Server neu gestartet, Job hängt — erfahren Sie es, bevor Ihre Nutzer es tun.

  • Ein Totmannschalter für jeden Cron, jedes Skript, jeden Worker — in jeder Sprache oder Shell
  • /start, dann /success oder /fail pingen — misst die Dauer und erkennt mitten im Lauf gestorbene Jobs
  • Kulanzzeiten federn normale Schwankungen ab — Alert nur, wenn ein Lauf wirklich zu spät ist
  • Erkennt drei Fehlerarten: verpasste Läufe, echte Fehler und hängende Jobs, die nie enden
  • Jeder Check hat eine stabile Ping-URL — Job frei umbenennen, Ihre Skripte laufen weiter
  • Alert per E-Mail, Slack, Discord, Telegram oder Webhook — löst sich bei Erholung automatisch auf
  • Nach Tag gruppieren und filtern — eine fehlerhafte Umgebung steht ganz oben
  • Eine Zeile genügt: am Ende des Jobs einfach die Ping-URL mit curl aufrufen
app.steadycron.com/jobs

Jobs

New job
Search jobs…
All HTTP Heartbeat
Status Group: env
env:prod 5 jobs 1 failing
weekly-digest-email HTTP 0 9 * * 1 in 2 days 3 days ago
nightly-db-backup Heartbeat 0 2 * * * in 19 h 5 h ago
stripe-reconciliation HTTP 0 */4 * * * in 38 min 3 h ago
cache-warmup HTTP */15 * * * * in 11 min now
search-index-sync Heartbeat */30 * * * * in 6 min 24 min ago
env:dev 3 jobs
seed-test-data HTTP 0 4 * * * in 14 h 10 h ago
preview-env-cleanup Heartbeat 0 */6 * * * in 2 h 4 h ago
trial-expiry-sweep HTTP 0 6 * * * yesterday

Alles als Code definieren

Deklarieren Sie Ihr gesamtes Konto — Jobs, Heartbeats, Kanäle, Tags und Variablen — in einem versionierten YAML-Manifest. Abgleich per CLI oder direkt aus der CI.

  • Ein versioniertes YAML-Manifest definiert Jobs, Heartbeats, Kanäle, Tags und Variablen
  • Bestehendes Konto in Sekunden übernehmen — steadycron export erzeugt daraus ein Manifest
  • validate → plan → apply, mit Terraform-artigen Diffs, die Sie im Pull Request prüfen
  • --prune löscht Entferntes; Namespaces trennen IaC- und Klick-Jobs sauber voneinander
  • Stabile IDs: Umbenennen bleibt Umbenennen — keine Neuanlage, Heartbeat-URLs bleiben erhalten
  • Secrets landen nie in Git: ${ENV} löst die CLI auf, {{template}} der Server
  • GitHub Action postet den Plan bei jedem PR und wendet ihn beim Merge an
  • Alles, was die CLI kann, ist auch eine REST-API — mit scoped, schreibgeschützten oder vollen Keys
steadycron — bash
$ steadycron jobs list
╭────────────────┬───────────┬─────────┬────────────────────┬──────────┬──────────╮
Name Kind Status Schedule Next run Last run
├────────────────┼───────────┼─────────┼────────────────────┼──────────┼──────────┤
weekly-digest http success 0 9 * * 1 (UTC) in 2d 3d ago
nightly-backup heartbeat late 0 2 * * * (UTC) 5h ago
stripe-recon http failure 0 */4 * * * (UTC) in 38m 3h ago
cache-warmup http running */15 * * * * (UTC) in 11m now
search-sync heartbeat success */30 * * * * (UTC) 24m ago
report-export http success 0 6 * * * (UTC) in 14h 10h ago
token-refresh http success 0 */6 * * * (UTC) in 2h 4h ago
trial-sweep http paused 0 6 * * * (UTC) 1d ago
╰────────────────┴───────────┴─────────┴────────────────────┴──────────┴──────────╯
8 job(s).
$ steadycron cron preview "0 9 * * 1-5" --timezone Europe/Berlin
Next 5 fires of 0 9 * * 1-5 (Europe/Berlin):
╭───┬───────────────────────────┬──────────╮
# Fire time (Europe/Berlin) Relative
├───┼───────────────────────────┼──────────┤
1 2026-06-08 09:00:00 in 3d
2 2026-06-09 09:00:00 in 4d
3 2026-06-10 09:00:00 in 5d
4 2026-06-11 09:00:00 in 6d
5 2026-06-12 09:00:00 in 7d
╰───┴───────────────────────────┴──────────╯
$ steadycron jobs run cache-warmup
triggered cache-warmup · 200 OK · 412 ms
$ steadycron validate manifests/production.yaml
manifest valid · 0 errors
$ steadycron plan manifests/production.yaml
~ weekly-digest update retries: 2 → 3
+ invoice-reminder create kind: http · 0 17 * * 5
- legacy-report destroy (absent from manifest)
Plan: 1 to add · 1 to change · 1 to destroy
$ steadycron apply --prune manifests/production.yaml
apply complete · 1 added · 1 changed · 1 destroyed

Fragen, beantwortet

Wo werden meine Daten gespeichert?

Alles läuft auf Hetzner-Infrastruktur in Deutschland, unter deutschem Recht. Die Kernausführung nutzt keine US-Subdienstleister, und ein DSGVO-AVV ist verfügbar.

Kann ich Cronjobs überwachen, die auf meinen eigenen Servern laufen?

Ja. Legen Sie einen Heartbeat-Check an und lassen Sie Ihren Job beim Abschluss einen Ping senden (ein einziges curl am Ende Ihres Skripts). Kommt der Ping nicht planmäßig an, alarmiert Sie SteadyCron. Das funktioniert aus jeder Sprache oder Shell.

Ersetzt SteadyCron AWS EventBridge oder Cloudflare/Vercel Cron?

Für geplante HTTP-Aufgaben ja. SteadyCron ruft Ihren Endpunkt planmäßig auf — mit konfigurierbaren Wiederholungen, Timeouts und vollständigen Request-/Response-Logs, ohne Sie an eine Cloud zu binden. Monitoring und Alerting gibt es am selben Ort.

Worin unterscheidet es sich von Healthchecks.io?

Healthchecks ist hervorragend im Heartbeat-Monitoring. SteadyCron macht beide Hälften — es führt Ihre HTTP-Jobs aus und überwacht Heartbeats aus einem Dashboard — und ist EU-gehostet mit eingebauten Infrastructure-as-Code-Workflows.

Gibt es einen kostenlosen Tarif?

Ja — 4 HTTP-Jobs und 12 Heartbeat-Checks, dauerhaft kostenlos, ohne Kreditkarte. Bezahlte Tarife beginnen bei 10 €/Monat.

Kann ich meine Jobs als Code definieren?

Ja. Definieren Sie Jobs in einem YAML-Manifest und gleichen Sie sie per steadycron sync jobs.yaml über die CLI ab, oder nutzen Sie direkt die REST-API. Kein Click-Ops, keine Abweichung zwischen Umgebungen.