Zum Inhalt springen
use-cases / three-cadences-one-container / hero
CRON · EINE CRONTAB · EIN CONTAINER

Drei Kadenzen, ein Container, auf einem Pauschalserver

Stündlicher Browser-Scrape, tägliches SQLite-Digest, wöchentliches File-Archiv. Drei Rhythmen nisten sauber in einer crontab — sie sind nur drei Zeilen `* * * * *`, die auf drei Skripte zeigen. Kein Scheduler-Service, keine Job-Queue, kein Worker-Pool.

Cron-Docs lesen
Abrechnung
diesen Monat
PauschalpreisServer / Monat
  • läuft innerhalb eines Servers
  • drei Kadenzen
  • null Scheduler-Services
Container-CPU · 24h
−24h → jetzt
Idle-Baseline~4%
Spikes nur zu den 3 Trigger-Zeiten — flach dazwischen
use-cases / three-cadences-one-container / mechanism

Ein PUT schreibt den ganzen Zeitplan

Der Hoody-Cron-Service exponiert die Raw-crontab als REST-Ressource. PUTe die Datei einmal, und der Kernel führt sie für immer aus. Drei Zeilen, drei Skripte — jedes ein One-Liner, der schon HTTP spricht.

request · /users/root/crontab
PUT · raw crontab
# Ersetze die ganze crontab in einem Call.
PUT /users/root/crontab
Content-Type: text/plain

@hourly  bash /scripts/scrape.sh
0 9 * * * bash /scripts/digest.sh
0 0 * * 0 bash /scripts/archive.sh

HTTP/1.1 204 No Content
der Kernel macht den Rest
scripts · /scripts/*.sh
exec · drei Bodies
# scrape.sh — jede Stunde, einen Screenshot in sqlite fächern
curl -sS https://browser.containers.hoody.com/screenshot \
  --data-urlencode "url=https://store.hoody.com/p/123" | sqlite3 /data/prices.db \
  "INSERT INTO rows VALUES (?, ?, ?)"

# digest.sh — um 9 Uhr, Deltas berechnen und das Digest piping
sqlite3 /data/prices.db < /scripts/digest.sql \
  > /tmp/digest.txt && curl -T /tmp/digest.txt \
  https://pipe.hoody.com/api/v1/pipe/digest

# archive.sh — Sonntag um Mitternacht, dumpen und ablegen
sqlite3 /data/prices.db ".dump" | curl -T - \
  https://files.containers.hoody.com/archives/$(date +%Y-w%V).sql

Drei Skripte. Drei URLs, die sie schon aufrufen können. Ein PUT-Request, um den Zeitplan zu installieren. Es gibt keinen Scheduler-Service davor — der crond des Kernels liest die Datei, die du geschrieben hast, und führt sie aus.

use-cases / three-cadences-one-container / cadences

Drei Rhythmen, drei Skripte

Jede Kadenz hat einen einzigen 5-Feld-Ausdruck und eine einzige Shell-Zeile dahinter. Keiner muss von den anderen zwei wissen — sie teilen sich nur eine Disk und eine Uhr.

STÜNDLICH · SCRAPE

Konkurrenzseiten in SQLite ziehen

hoody-browser screenshotet eine Liste von Produkt-URLs. Jede Zeile geht direkt in eine SQLite-Tabelle auf dem Volume des Containers. Kein Scrape-Worker-Pool — die Cron-Zeile ist der Worker-Pool.

@hourly bash /scripts/scrape.sh
TÄGLICH · DIGEST

Deltas berechnen, ein Digest pushen

Um 9 Uhr liest das Digest-Skript die letzten 24 Stunden Zeilen, berechnet Preisdeltas und curlt das Digest an eine Pipe-URL. Dein Posteingang / Dashboard liest aus derselben Pipe.

0 9 * * * bash /scripts/digest.sh
WÖCHENTLICH · ARCHIV

Die Woche in eine Files-URL dumpen

Sonntag um Mitternacht macht das Archiv-Skript ein `.dump` von SQLite, benennt die Datei nach ISO-Woche und PUTet sie an hoody-files. Alte Zeilen werden weggeschnitten. Das Volume bleibt für immer klein.

0 0 * * 0 bash /scripts/archive.sh
use-cases / three-cadences-one-container / powers

Was drei Zeilen freischalten

Drei Kadenzen in einem Container sind kein Hack — es ist die natürliche Form von Cron. Die Plattform hat dir den Scheduler schon gegeben; du hast einfach aufgehört, dreimal dafür zu zahlen.

STORAGE

Alle drei Skripte teilen sich eine Disk

Der stündliche Scrape schreibt die Zeilen, die das tägliche Digest liest. Das tägliche Digest schreibt die Deltas, die das wöchentliche Archiv dumpt. Es gibt keine IPC zwischen ihnen — sie sind nur drei Prozesse auf demselben Volume.

OPERATIONS

Ein Container zum Neustarten, nicht drei

Wenn du re-deployst, deployst du ein Image. Wenn du Logs checkst, tailst du eine Logdatei. Wenn die Disk vollläuft, läuft sie einmal voll. Der Blast Radius jeder Kadenz ist derselbe wie jeder anderen.

ÖKONOMIE

Ein Pauschalserver, kein Scheduler-Tier

Lambda/EventBridge berechnet pro Invocation; ECS Scheduled Tasks berechnet das immer-an-Cluster. Bei Hoody läuft dies innerhalb des Pauschalservers, den du eh schon zahlst. Drei Kadenzen kosten nicht mehr als eine.

use-cases / three-cadences-one-container / operations

Wie du es tatsächlich nutzt

Die crontab ist eine Datei. Die Datei hat eine URL. Alles, was du mit der Datei machen würdest, kannst du über HTTP machen.

  1. EINEN VIERTEN HINZUFÜGEN

    POST /users/root/entries

    Erstelle einen verwalteten Eintrag mit einer UUID und einem optionalen Kommentar. Die API injiziert die Zeile für dich in die crontab und gibt dir einen Handle, um sie später zu aktivieren, deaktivieren oder löschen.

  2. DEAKTIVIEREN OHNE LÖSCHEN

    PATCH enabled: false

    Pause eine Kadenz während eines Vorfalls, ohne ihre Definition zu verlieren. Schalte sie wieder an, wenn der Vorfall geschlossen ist. Die Zeile bleibt in der Datei, kommentiert als managed-disabled.

  3. DIE DATEI LESEN

    GET /users/root/crontab

    Hole die Raw-crontab jederzeit zurück, inklusive aller verwalteten Einträge. Diff sie gegen dein Repo. Pipe sie in Versionskontrolle. Cron ist eine Datei, und jetzt ist die Datei eine URL.

Endpoints aus der Hoody Cron API: verwaltete-Eintrag-CRUD plus volle Raw-crontab-Lese-/Schreibe-Operationen pro User. Standard-5-Feld-Ausdrücke und Makros (@hourly, @daily, @weekly).

use-cases / three-cadences-one-container / economics

Wofür du nicht zahlst

Drei Zahlen aus dem tatsächlichen Mechanismus. Zahlen kommen aus den Hoody-Cron-API-Garantien und dem Pauschalserver-Modell — keine erfundenen Benchmarks.

  1. SERVER

    Alle drei Kadenzen laufen innerhalb des gleichen Pauschalservers. Einstiegsserver starten bei $29/Monat; extra Cron-Zeilen addieren keine zusätzliche Gebühr.

  2. CRON-ZEILEN

    Eine @hourly, eine täglich-um-9, eine wöchentlich-am-Sonntag. Drei Zeilen in /users/root/crontab. Der ganze Orchestrator passt in einen PUT-Request.

  3. EXTRA-SERVICES0

    Kein Lambda, kein EventBridge, kein Sidekiq, kein Airflow-Scheduler, keine ECS-Scheduled-Task-Definition. Die HTTP-API für Cron IST der Scheduler.

Laut Hoody Cron API: verwaltete Einträge per JSON-CRUD, Raw-crontab-Lesen/Schreiben, Auto-Expiration via expires_at, und Per-User-crontab-Isolation. Makros @hourly / @daily / @weekly werden neben 5-Feld-Ausdrücken akzeptiert.

use-cases / three-cadences-one-container / punchline

Drei Kadenzen, drei Cron-Zeilen, ein Container auf einem Pauschalserver mit $29/Monat Einstiegspreis.

STÜNDLICH@hourly bash /scripts/scrape.shKonkurrenzpreise → sqlite
TÄGLICH0 9 * * * bash /scripts/digest.sh9 Uhr — Deltas zusammenrollen
WÖCHENTLICH0 0 * * 0 bash /scripts/archive.shSonntag — Parquet zu Files
vorher · drei Lambdas, drei Rechnungennachher · ein Pauschalserver, viele Cron-Zeilen
Cron-Docs lesen
use-cases / three-cadences-one-container / replaces

Was das ersetzt

Drei Lambdas, drei GitHub Actions, drei ECS-Scheduled-Tasks — die Standardstacks, zu denen du für drei Kadenzen greifst. Jeder berechnet dir pro Kadenz oder Aufruf; Hoody rechnet den Server ab.

  • drei AWS-Lambda-FunktionenPro-Invocation-Abrechnung für das, was nur drei Shell-Skripte auf einer Disk sind
  • drei GitHub-Actions-SchedulesEin ganzer CI-Runner hochgefahren für eine 5-Sekunden-SQLite-Query
  • drei Sidekiq-WorkerEin Redis-gestützter Worker-Pool für Jobs, die keinen State außer der Disk teilen
  • drei Serverless-Funktionen / drei RechnungenDrei Deploys, drei Logs, drei Pricing-Meter für dieselbe Logik
  • Multi-Service-Orchestrierung (Airflow, Step Functions)Eine DAG-Engine für einen Graph mit null Kanten zwischen seinen drei Knoten
  • drei ECS-Scheduled-TasksDrei Task-Definitionen, drei IAM-Rollen, drei CloudWatch-Rules
use-cases / three-cadences-one-container / cta

Hör auf, einen Scheduler zu mieten. Schreib den Zeitplan in eine Datei. Der Container fährt schon Cron — drei Zeilen später hast du die ganze Pipeline ausgeliefert.

Cron-Docs lesen
use-cases / three-cadences-one-container / related

Lies die anderen